ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDdiZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFJ1bnRpbWUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMwZGYxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5kaWFncmFtZWRpdG9yLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJiZjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MWZiMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpwdC5wYXRjaC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTE1ZjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgMS4wLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+SlRQIDIuMC4yIFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qcHQucGF0Y2g8L2gyPgotPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9saT48L3VsPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yMjAyOTcnPjIyMDI5NzwvYT4uIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzLjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1N2VhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgUGF0Y2hlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scy4gXG5cCi1TZWUgYnVnIDIyMDI5NyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvMjIwMjk3KSBFbnRpdHkgZ2VuZXJhdGlvbiBjcmVhdGVzIEVtYmVkZGFibGVzIHdpdGggY29tcGlsZSBlcnJvcnMgaW4gc29tZSBjYXNlcyBcblwKLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFlOTJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3BhdGNoZXMvIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUGF0Y2hlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMi52MjAwODAyMTQwMTAwLTc3LTdfQ1lRQ0QyQ2FMWUNIQ0QiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIxZmFiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGRjNzRmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC50ZXN0c18xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ODk5Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjYjY1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI2MDI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NTBjYWMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YTI4MmYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+VW51c2VkIFByb2plY3Q8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjljMmYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+VW51c2VkIFByb2plY3Q8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJhYmY3Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0qLmJpbi5kaXN0LnppcAotYnVpbGQueG1sCi1mZWF0dXJlcwotcGx1Z2lucwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTAxMzcyLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNiMTE3Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBwcm9qZWN0IFNESwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2YWJjYS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0MDFhMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF8xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYjA0Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFlYzI5ZC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmJlZGQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQ7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDIuMy4xLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODhhMzI1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGExODYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjY2ZiMGUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmMTMzZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdCI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhmYWMxLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MwNTVhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5jbGFzc3BhdGggYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0ZmIzOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTEzYTE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0M2M3MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jRnJpIEphbiAyMSAxNTo0NTowNyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYTc3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmdlbjsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA4NzRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4YTRhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotTElCUkFSWV9WQUxJREFUT1JTPUxpYnJhcnkgVmFsaWRhdG9ycwotUkVTT1VSQ0VfTE9DQVRPUlM9UmVzb3VyY2UgTG9jYXRvcnMKLQotSkFSX0NPTlRFTlQgPSBKQVIgQ29udGVudAotSkFWQV9QQUNLQUdFX0lORk9fQ09OVEVOVCA9IHBhY2thZ2UtaW5mby5qYXZhCi0KLU5PX09QX0xJQlJBUllfUFJPVklERVJfV0FSTklORyA9IExpYnJhcnkgY29uZmlndXJhdGlvbiBpcyBkaXNhYmxlZC4gVGhlIHVzZXIgbWF5IG5lZWQgdG8gY29uZmlndXJlIGZ1cnRoZXIgY2xhc3NwYXRoIGNoYW5nZXMgbGF0ZXIuCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmU0ZjdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08IS0tCi0JQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQlUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLQl0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotCWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0JCi0JQ29udHJpYnV0b3JzOgotCQlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLSAKLTxwbHVnaW4+Ci0KLQk8IS0tICoqKioqIGV4dGVuc2lvbiBwb2ludHMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIgotCQluYW1lPSIlTElCUkFSWV9WQUxJREFUT1JTIgotCQlzY2hlbWE9InNjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkIi8+Ci0JCi0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlTG9jYXRvcnMiCi0JCW5hbWU9IiVSRVNPVVJDRV9MT0NBVE9SUyIKLQkJc2NoZW1hPSJzY2hlbWEvcmVzb3VyY2VMb2NhdG9ycy5leHNkIi8+Ci0KLQotCTwhLS0gKioqKiogRWNsaXBzZSBjb3JlIGV4dGVuc2lvbnMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQotCQk8IS0tIEpBUiBjb250ZW50IHR5cGUgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuY29udGVudC5qYXIiCi0JCQluYW1lPSIlSkFSX0NPTlRFTlQiCi0JCQlmaWxlLWV4dGVuc2lvbnM9ImphciwgemlwIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuQmluYXJ5U2lnbmF0dXJlRGVzY3JpYmVyIj4KLQkJCQk8cGFyYW1ldGVyIG5hbWU9InNpZ25hdHVyZSIgdmFsdWU9IjUwIDRCIDAzIDA0Ii8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotICAJCTwhLS0gcGFja2FnZS1pbmZvLmphdmEgY29udGVudCB0eXBlIChmb3IgcGFja2FnZSBhbm5vdGF0aW9ucykgLS0+Ci0JCTxjb250ZW50LXR5cGUKLSAgICAgICAJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuY29udGVudC5qYXZhUGFja2FnZUluZm8iCi0gICAgICAgIAluYW1lPSIlSkFWQV9QQUNLQUdFX0lORk9fQ09OVEVOVCIKLSAgICAgICAgCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YVNvdXJjZSIKLSAgICAgICAJIAlmaWxlLW5hbWVzPSJwYWNrYWdlLWluZm8uamF2YSIKLSAgICAgICAgCXByaW9yaXR5PSJub3JtYWwiPgotICAJCTwvY29udGVudC10eXBlPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuUmVzb3VyY2VBZGFwdGVyRmFjdG9yeSIKLQkJCWFkYXB0YWJsZVR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSVJlc291cmNlUGFydCIvPgotCQk8L2ZhY3Rvcnk+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0JCQotCQk8cHJvcGVydHlUZXN0ZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucHJvcGVydHlUZXN0ZXIubGlicmFyeVByb3ZpZGVyIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJpZCwgZXh0ZW5kc0lkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92LkxpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZUxvY2F0b3JzIj4KLQkJCi0JCTxyZXNvdXJjZUxvY2F0b3IKLQkJCWlkPSJzaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5TaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yIgotCQkJcHJpb3JpdHk9Imxvd2VzdCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icHJvamVjdCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQl2YWx1ZT0iamF2YSIgCi0JCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVzb3VyY2VMb2NhdG9yPgotCQkKLQkJPHJlc291cmNlTG9jYXRvcgotCQkJaWQ9Im1vZHVsZVJlc291cmNlTG9jYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuTW9kdWxlUmVzb3VyY2VMb2NhdG9yIgotCQkJcHJpb3JpdHk9Imxvd2VyIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJwcm9qZWN0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvamVjdE5hdHVyZSIgCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLk1vZHVsZUNvcmVOYXR1cmUiIAotCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Jlc291cmNlTG9jYXRvcj4KLQkJCi0JCTxyZXNvdXJjZUxvY2F0b3IKLQkJCWlkPSJ3ZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLldlYk1vZHVsZVJlc291cmNlTG9jYXRvciIKLQkJCXByaW9yaXR5PSJsb3ciPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9InByb2plY3QiPgotCQkJCQk8dGVzdCAKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImpzdC53ZWIiIAotCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Jlc291cmNlTG9jYXRvcj4KLQkJCi0JCTxyZXNvdXJjZUxvY2F0b3IKLQkJCWlkPSJwbHVnaW5SZXNvdXJjZUxvY2F0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlBsdWdpblJlc291cmNlTG9jYXRvciIKLQkJCXByaW9yaXR5PSJub3JtYWwiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9InByb2plY3QiPgotCQkJCQk8dGVzdCAKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIiAKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlIiAKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZXNvdXJjZUxvY2F0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJyYXJ5UHJvdmlkZXJzIj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJqcHQtbm8tb3AtbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJuby1vcC1saWJyYXJ5LXByb3ZpZGVyIgotCQkJYWJzdHJhY3Q9InRydWUiPgotCQkJPHBhcmFtIG5hbWU9Indhcm5pbmciIHZhbHVlPSIlTk9fT1BfTElCUkFSWV9QUk9WSURFUl9XQVJOSU5HIi8+Ci0JCTwvcHJvdmlkZXI+Ci0JCi0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2NvcmUucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3NDYwOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLURBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRT1EYWxpIEV2ZW50IEhhbmRsZXIKLUdFTkVSQVRJT05fQ1JFQVRJTkdfTEFVTkNIX0NPTkZJR19UQVNLPUNyZWF0aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uCi1HRU5FUkFUSU9OX1NBVklOR19MQVVOQ0hfQ09ORklHX1RBU0s9U2F2aW5nIGxhdW5jaCBjb25maWd1cmF0aW9uCi1HRU5FUkFUSU9OX0xBVU5DSElOR19DT05GSUdfVEFTSz1MYXVuY2hpbmcgY29uZmlndXJhdGlvbgotUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEU9TWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgJyd7MH0nJyBmb3IgZWxlbWVudCAnJ3sxfScnIGluIGV4dGVuc2lvbiAnJ3sxfScnIGZyb20gcGx1Zy1pbiAnJ3syfScnLgotUkVHSVNUUllfSU5WQUxJRF9WQUxVRT1JbnZhbGlkIHZhbHVlICcnezB9JycgZm9yICcnezF9JycgaW4gZXh0ZW5zaW9uICcnezJ9JycgZnJvbSBwbHVnLWluICcnezN9JycuCi1SRUdJU1RSWV9EVVBMSUNBVEU9QW4gZXh0ZW5zaW9uIG9mICcnezB9Jycgd2l0aCB0aGUgJyd7MX0nJyB2YWx1ZSBvZiAnJ3syfScnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLVJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FEPVVuYWJsZSB0byBsb2FkIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJy4KLVJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVD1VbmFibGUgdG8gYXNzaWduIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJyB0byB0aGUgaW50ZXJmYWNlICcnezN9JycuCi1SRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTj1VbmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGNsYXNzICcnezB9JycgZGVjbGFyZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQgJyd7MX0nJyBpbiB0aGUgcGx1Zy1pbiAnJ3syfScnLgotVVNFUl9MSUJSQVJZX1ZBTElEQVRPUl9fQ0xBU1NfTk9UX0ZPVU5EPVRoZSBjbGFzcyAnJ3swfScnIGlzIHJlcXVpcmVkIHRvIGJlIGluIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMuCi1WQUxJREFURV9DT05UQUlORVJfTk9UX1NQRUNJRklFRD1QYXJlbnQgZm9sZGVyIG11c3QgYmUgc3BlY2lmaWVkCi1WQUxJREFURV9GSUxFX05BTUVfTk9UX1NQRUNJRklFRD1GaWxlIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQKLVZBTElEQVRFX0ZJTEVfQUxSRUFEWV9FWElTVFM9RmlsZSBhbHJlYWR5IGV4aXN0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9saWJyYXJ5VmFsaWRhdG9ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZlMDNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvbGlicmFyeVZhbGlkYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBpZD0ibGlicmFyeVZhbGlkYXRvcnMiIG5hbWU9IkxpYnJhcnkgVmFsaWRhdG9ycyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBVc2VkIHRvIHByb3ZpZGUgY3VzdG9tIGxpYnJhcnkgdmFsaWRhdGlvbiB0byBKUFQgcHJvamVjdCBjb25maWd1cmF0aW9uLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8aW5jbHVkZSBzY2hlbWFMb2NhdGlvbj0ic2NoZW1hOi8vb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy9zY2hlbWEvZXhwcmVzc2lvbkxhbmd1YWdlLmV4c2QiLz4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImxpYnJhcnlWYWxpZGF0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJsaWJyYXJ5VmFsaWRhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIGxpYnJhcnkgdmFsaWRhdG9yLiAgU2VlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yJmx0Oy9zYW1wJmd0OyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBsaWJyYXJ5IHZhbGlkYXRvcnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjbGFyZWQgbGlicmFyeSB2YWxpZGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qcHQuY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBKUFQgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDticiZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHRoZSBpbmNsdWRlZCBnZW5lcmljIGxpYnJhcnkgdmFsaWRhdG9yLCB3aGljaCBpcyB1c2VkIGZvciB1c2VyIGxpYnJhcnkgdmFsaWRhdGlvbiBmb3IgcHJvamVjdHMgb2YgdGhlIGdlbmVyaWMgSlBBIHBsYXRmb3JtIGdyb3VwLgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbgotICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzJnF1b3Q7Jmd0OwotICAgJmx0O2xpYnJhcnlWYWxpZGF0b3IKLSAgICAgIGlkPSZxdW90O2dlbmVyaWNVc2VyTGlicmFyeVZhbGlkYXRvciZxdW90OwotICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlidmFsLkdlbmVyaWNKcGFVc2VyTGlicmFyeVZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgICAgJmx0O3dpdGggdmFyaWFibGU9JnF1b3Q7bGlicmFyeVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3Rlc3QgcHJvcGVydHk9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuZXh0ZW5kc0lkJnF1b3Q7IHZhbHVlPSZxdW90O2pwYS11c2VyLWxpYnJhcnktcHJvdmlkZXImcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy93aXRoJmd0OwotICAgICAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICAgJmx0Oy9saWJyYXJ5VmFsaWRhdG9yJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSBjb250cmlidXRlZCByZXNvdXJjZSBsb2NhdG9yIGNsYXNzIG11c3QgaW1wbGVtZW50ICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3ImbHQ7L2NvZGUmZ3Q7LgotJmx0O3AmZ3Q7Ci1UaGUgZW5hYmxlbWVudCB2YXJpYWJsZXMgaW5jbHVkZToKLSZsdDt1bCZndDsKLSZsdDtsaSZndDsmcXVvdDtsaWJyYXJ5UHJvdmlkZXImcXVvdDsgd2hpY2ggZ2l2ZXMgdGhlIGN1cnJlbnQgSUxpYnJhcnlQcm92aWRlci4mbHQ7L2xpJmd0OwotJmx0O2xpJmd0OyZxdW90O2pwYVBsYXRmb3JtJnF1b3Q7IHdoaWNoIGdpdmVzIHRoZSBjdXJyZW50IEpwYVBsYXRmb3JtRGVzY3JpcHRpb24uJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBvcmcuZWNsaXBzZS5qcHQuY29yZSBwbHVnLWluIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbGlicmFyeSB2YWxpZGF0b3JzOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O2dlbmVyaWNVc2VyTGlicmFyeVZhbGlkYXRvciZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7Z2VuZXJpY0VjbGlwc2VsaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3ImbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi1hbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIAotQ29udHJpYnV0b3JzOgotT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9yZXNvdXJjZUxvY2F0b3JzLmV4c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhZjU5Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBpZD0icmVzb3VyY2VMb2NhdG9ycyIgbmFtZT0iUmVzb3VyY2UgTG9jYXRvcnMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCB0byBwcm92aWRlIGN1c3RvbSAobm9uLWphdmEpIHJlc291cmNlIGxvY2F0aW9uIGxvZ2ljIHRvIEpQVCBwcm9qZWN0cy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvdXJjZUxvY2F0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VMb2NhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIHJlc291cmNlIGxvY2F0b3IuICBTZWUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcmVzb3VyY2UgbG9jYXRvcnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgbG9jYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5Ij4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgZXh0ZW5zaW9uIHRvIG90aGVyIGV4dGVuc2lvbnMuIFVzZWQgYnkgdGhlIHJlc291cmNlIGxvY2F0b3IgbWFuYWdlciB0byBkZXRlcm1pbmUgd2hpY2ggZXh0ZW5zaW9uIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYXNlIHRoYXQgbXVsdGlwbGUgZXh0ZW5zaW9ucyBhcHBseSB0byBhIGdpdmVuIHByb2plY3QuIERlZmF1bHRzIHRvICZxdW90O25vcm1hbCZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxvd2VzdCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3dlciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3ciPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibm9ybWFsIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2giPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaGlnaGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2hlc3QiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEpQVCAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2JyJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgdGhlIGluY2x1ZGVkIHNpbXBsZSBqYXZhIHJlc291cmNlIGxvY2F0b3IsIHdoaWNoIGlzIHVzZWQgZm9yIHNpbXBsZSBqYXZhIHByb2plY3RzLiAgSXQgaXMgb2YgJnF1b3Q7bG93ZXN0JnF1b3Q7IHByaW9yaXR5LCBzaW5jZSBhbGwgSlBUIHByb2plY3RzIHdpbGwgYXQgdGhlaXIgcm9vdHMgYmUgc2ltcGxlIGphdmEgcHJvamVjdHMuCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uICAKLSBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2VMb2NhdG9ycyZxdW90OyZndDsKLSAmbHQ7cmVzb3VyY2VMb2NhdG9yCi0gIGlkPSZxdW90O3NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImcXVvdDsKLSAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImcXVvdDsKLSAgcHJpb3JpdHk9JnF1b3Q7bG93ZXN0JnF1b3Q7Ci0gICZsdDtlbmFibGVtZW50Jmd0OwotICAgJmx0O3dpdGggdmFyaWFibGU9JnF1b3Q7cHJvamVjdCZxdW90OyZndDsKLSAgICAmbHQ7dGVzdCBwcm9wZXJ0eT0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQmcXVvdDsgdmFsdWU9JnF1b3Q7amF2YSZxdW90OyBmb3JjZVBsdWdpbkFjdGl2YXRpb249JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L3dpdGgmZ3Q7Ci0gICZsdDsvZW5hYmxlbWVudCZndDsKLSAmbHQ7L3Jlc291cmNlTG9jYXRvciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGUgY29udHJpYnV0ZWQgcmVzb3VyY2UgbG9jYXRvciBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qcHQuY285bW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvY29kZSZndDsuCi0mbHQ7cCZndDsKLVRoZSBlbmFibGVtZW50IHZhcmlhYmxlcyBpbmNsdWRlOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0OyZxdW90O3Byb2plY3QmcXVvdDsgd2hpY2ggZ2l2ZXMgdGhlIGN1cnJlbnQgSVByb2plY3QuJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUgcGx1Zy1pbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHJlc291cmNlIGxvY2F0b3JzOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O3NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImbHQ7L2xpJmd0OwotJmx0O2xpJmd0O21vZHVsZVJlc291cmNlTG9jYXRvciZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7d2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yJmx0Oy9saSZndDsKLSZsdDtsaSZndDtwbHVnaW5SZXNvdXJjZUxvY2F0b3ImbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi1hbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIAotQ29udHJpYnV0b3JzOgotT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSVJlc291cmNlUGFydC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSVJlc291cmNlUGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWU2YTQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0lSZXNvdXJjZVBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGRlc2NyaWJlZCBhcyBiZWluZyBwYXJ0IG9mIGFuIHtAbGluayBJUmVzb3VyY2V9Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVzb3VyY2VQYXJ0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBvZiB3aGljaCB0aGlzIG9iamVjdCBpcyBhIHBhcnQKLQkgKi8KLQlJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdENvbW1vbkNvcmVQbHVnaW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdENvbW1vbkNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmYzk5Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRDb21tb25Db3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uQ29yZVBsdWdpbgotCWV4dGVuZHMgUGx1Z2luCi17Ci0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBjb25zdGFudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHBsdWctaW4gaWRlbnRpZmllciBvZiB0aGUganB0IGNvbW1vbiBjb3JlIHN1cHBvcnQKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwotCi0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSA9IGdldENvbnRlbnRUeXBlKEphdmFDb3JlLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIEphdmEgc291cmNlIGNvZGUgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBKQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFID0gbmV3IEpwdFJlc291cmNlVHlwZShKQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCQotCS8qKgotCSAqIFRoZSBjb250ZW50IHR5cGUgZm9yIEphdmEgYXJjaGl2ZXMgKEpBUnMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEpBUl9DT05URU5UX1RZUEUgPSBnZXRKcHRDb250ZW50VHlwZSgiamFyIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgSmF2YSBhcmNoaXZlcyAoSkFScykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgSkFSX1JFU09VUkNFX1RZUEUgPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSk7Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBwYWNrYWdlLWluZm8gSmF2YSBjb2RlIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEpBVkFfU09VUkNFX1BBQ0tBR0VfSU5GT19DT05URU5UX1RZUEUgPSBnZXRKcHRDb250ZW50VHlwZSgiamF2YVBhY2thZ2VJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBwYWNrYWdlLWluZm8gSmF2YSBjb2RlIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgSkFWQV9TT1VSQ0VfUEFDS0FHRV9JTkZPX1JFU09VUkNFX1RZUEUgPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEpBVkFfU09VUkNFX1BBQ0tBR0VfSU5GT19DT05URU5UX1RZUEUpOwotCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQVF9DT05URU5UX1BSRUZJWCA9IFBMVUdJTl9JRF8gKyAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBUX0NPTlRFTlRfUFJFRklYXyA9IEpQVF9DT05URU5UX1BSRUZJWCArICcuJzsKLQkKLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0SnB0Q29udGVudFR5cGUoU3RyaW5nIGpwdENvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBnZXRDb250ZW50VHlwZShKUFRfQ09OVEVOVF9QUkVGSVhfICsganB0Q29udGVudFR5cGUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMb2NhdG9yIGdldFJlc291cmNlTG9jYXRvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBSZXNvdXJjZUxvY2F0b3JNYW5hZ2VyLmluc3RhbmNlKCkuZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yID0gZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpOwotCQlpZiAocmVzb3VyY2VMb2NhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlQYXRoIHNvdXJjZVBhdGggPSByZXNvdXJjZUxvY2F0b3IuZ2V0UmVzb3VyY2VQYXRoKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQkJaWYgKHNvdXJjZVBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoc291cmNlUGF0aCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxMaWJyYXJ5VmFsaWRhdG9yPiBnZXRMaWJyYXJ5VmFsaWRhdG9ycygKLQkJCUpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlci5pbnN0YW5jZSgpLmdldExpYnJhcnlWYWxpZGF0b3JzKGNvbmZpZyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0Q29tbW9uQ29yZVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIGpwdCBjb21tb24gY29yZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0Q29tbW9uQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2codGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0Q29tbW9uQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aGlzIGNvbnZlbnRpb24gaXMgKndhY2sqLi4uICB+Ymp2Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJLy8gbm90aGluZyB5ZXQuLi4JCQotCX0KLQotfQotCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMWNmMjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLS8qKgotICogTGlzdGVuZXJzIGFyZSBub3RpZmllZCB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgSlBUIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcHRSZXNvdXJjZU1vZGVsIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgbW9kZWwuICBUaGlzIG1heSBwb3RlbnRpYWxseSBjaGFuZ2UuCi0JICogUmV0dXJuIG51bGwgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBjb250ZW50IHR5cGUgb3IgdmVyc2lvbiBpcyBudWxsLgotCSAqLwotCUpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIENoYW5nZXMgdG8gdGhlIHJlc291cmNlIG1vZGVsIHJlc3VsdCBpbiBldmVudHMuCi0JICogSW4gcGFydGljdWxhciwgdGhlIEpQQSBwcm9qZWN0IHBlcmZvcm1zIGFuICJ1cGRhdGUiIHdoZW5ldmVyIGEgcmVzb3VyY2UKLQkgKiBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBAc2VlICNhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoUmVzb3VyY2VNb2RlbExpc3RlbmVyKQotCSAqLwotCXZvaWQgcmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWxMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDBkM2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIFRoZSBsaXN0ZW5lciBpcyBub3RpZmllZCB3aGVuZXZlciBhbnl0aGluZyBpbiB0aGUgSlBBIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIKLQlleHRlbmRzIEV2ZW50TGlzdGVuZXIKLXsKLQl2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCk7Ci0JCi0Jdm9pZCByZXNvdXJjZU1vZGVsUmV2ZXJ0ZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKTsKLQkKLQl2b2lkIHJlc291cmNlTW9kZWxVbmxvYWRlZChKcHRSZXNvdXJjZU1vZGVsIGpwYVJlc291cmNlTW9kZWwpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2MzU1ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBmaWxlIGNvbnRlbnQgdHlwZSBhbmQgdmVyc2lvbiBmb3IgSlBBIHJlc291cmNlcy4KLSAqIFRoaXMgaXMgYSB2YWx1ZSBvYmplY3QgdGhhdCBkZWZpbmVzIGFuIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IG1ldGhvZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgSnB0UmVzb3VyY2VUeXBlCi17Ci0JcHJpdmF0ZSBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGU7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB2ZXJzaW9uOwotCi0KLQkvKioKLQkgKiBWZXJzaW9uIHVzZWQgd2hlbiB2ZXJzaW9uIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCBvciB3aGVuIHRoZXJlIGlzIG5vCi0JICogc2Vuc2Ugb2YgdmVyc2lvbiAoZS5nLiBKYXZhKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFVEVSTUlORURfVkVSU0lPTiA9ICI8dW5kZXRlcm1pbmVkPiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJdGhpcyhjb250ZW50VHlwZSwgVU5ERVRFUk1JTkVEX1ZFUlNJT04pOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlzdXBlcigpOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb250ZW50IHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy52ZXJzaW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvYmogPT0gbnVsbCkgfHwgKG9iai5nZXRDbGFzcygpICE9IHRoaXMuZ2V0Q2xhc3MoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlKcHRSZXNvdXJjZVR5cGUgb3RoZXIgPSAoSnB0UmVzb3VyY2VUeXBlKSBvYmo7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlLmVxdWFscyhvdGhlci5jb250ZW50VHlwZSkgJiYgdGhpcy52ZXJzaW9uLmVxdWFscyhvdGhlci52ZXJzaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IGhhc2ggPSAxNzsKLQkJaGFzaCA9IGhhc2ggKiBwcmltZSArIHRoaXMuY29udGVudFR5cGUuaGFzaENvZGUoKTsKLQkJaGFzaCA9IGhhc2ggKiBwcmltZSArIHRoaXMudmVyc2lvbi5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoIihjb250ZW50ID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuY29udGVudFR5cGUpOwotCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCJ2ZXJzaW9uID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmVyc2lvbik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRDb21tb25Db3JlTWVzc2FnZXMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0pwdENvbW1vbkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYyYzYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL0pwdENvbW1vbkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgY29tbW9uIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREFMSV9FVkVOVF9IQU5ETEVSX1RIUkVBRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRJT05fQ1JFQVRJTkdfTEFVTkNIX0NPTkZJR19UQVNLOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRJT05fU0FWSU5HX0xBVU5DSF9DT05GSUdfVEFTSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFUSU9OX0xBVU5DSElOR19DT05GSUdfVEFTSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9NSVNTSU5HX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9JTlZBTElEX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0RVUExJQ0FURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9GQUlMRURfQ0xBU1NfTE9BRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9GQUlMRURfSU5URVJGQUNFX0FTU0lHTk1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfRkFJTEVEX0lOU1RBTlRJQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVNFUl9MSUJSQVJZX1ZBTElEQVRPUl9fQ0xBU1NfTk9UX0ZPVU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTlRBSU5FUl9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0ZJTEVfTkFNRV9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0ZJTEVfQUxSRUFEWV9FWElTVFM7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9jb21tb25fY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRDb21tb25Db3JlTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb21tb25Db3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL1Jlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL1Jlc291cmNlQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxNGUwNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9SZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5JUmVzb3VyY2VQYXJ0OwotCi0vKioKLSAqIEZhY3RvcnkgdG8gYnVpbGQgYWRhcHRlcnMgZm9yIGNvbnZlcnRpbmcgRWNsaXBzZSByZXNvdXJjZXMgdG8gRGFsaQotICogcmVzb3VyY2UgcGFydHMuCi0gKiA8cD4KLSAqIFNlZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUgcGx1Z2luLnhtbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSVJlc291cmNlUGFydC5jbGFzcyB9OwotCi0JcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElSZXNvdXJjZSkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIENsYXNzIDw/PmFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBJUmVzb3VyY2VQYXJ0LmNsYXNzKSB7Ci0JCQlyZXR1cm4gbmV3IElSZXNvdXJjZVBhcnQoKSB7Ci0JCQkJcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJCQkJcmV0dXJuIHJlc291cmNlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvZ2VuL0Fic3RyYWN0SnB0R2VuZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9nZW4vQWJzdHJhY3RKcHRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVlZTQ1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9nZW4vQWJzdHJhY3RKcHRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hlc0xpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TX0RJUiA9ICJwbHVnaW5zLyI7CSAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJVk1JbnN0YWxsIGpyZTsKLQlwcm90ZWN0ZWQgSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBsYXVuY2hDb25maWc7Ci0JcHJpdmF0ZSBJTGF1bmNoIGxhdW5jaDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcHJvamVjdExvY2F0aW9uOwotCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRGVidWcgPSB0cnVlOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0SnB0R2VuZXJhdG9yKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCXRoaXMucHJvamVjdExvY2F0aW9uID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1haW5UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhdW5jaENvbmZpZ05hbWUoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQm9vdHN0cmFwIEpBUiBub3Qgc3BlY2lmaWVkLiIpOyAgIC8vJE5PTi1OTFMtMSQ7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0cnkgewotCQkJdGhpcy5qcmUgPSB0aGlzLmdldFByb2plY3RKUkUoKTsKLQkJCWlmICh0aGlzLmpyZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGlkZW50aWZ5IHRoZSBWTS4iOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCQl9Ci0JCQl0aGlzLmxhdW5jaENvbmZpZyA9IHRoaXMuYnVpbGRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTApOwotCQl0aGlzLnByZUdlbmVyYXRlKHNtLm5ld0NoaWxkKDIpKTsKLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc20uc3ViVGFzayhKcHRDb21tb25Db3JlTWVzc2FnZXMuR0VORVJBVElPTl9DUkVBVElOR19MQVVOQ0hfQ09ORklHX1RBU0spOwotCQl0aGlzLmluaXRpYWxpemVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0aGlzLmFkZExhdW5jaExpc3RlbmVyKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQotCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhdW5jaCA9IHRoaXMuc2F2ZUFuZExhdW5jaENvbmZpZyhzbS5uZXdDaGlsZCg2KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbigpIHsKLQkJdGhpcy5zcGVjaWZ5SlJFKCk7Ci0JCQotCQl0aGlzLnNwZWNpZnlQcm9qZWN0KCk7IAotCQl0aGlzLnNwZWNpZnlNYWluVHlwZSgpOwkKLQkJCi0JCXRoaXMuc3BlY2lmeVByb2dyYW1Bcmd1bWVudHMoKTsKLQkJdGhpcy5zcGVjaWZ5V29ya2luZ0RpcigpOyAKLQotCQl0aGlzLnNwZWNpZnlDbGFzc3BhdGhQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMYXVuY2hMaXN0ZW5lcigpIHsKLQotCQl0aGlzLmdldExhdW5jaE1hbmFnZXIoKS5hZGRMYXVuY2hMaXN0ZW5lcih0aGlzLmJ1aWxkTGF1bmNoTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZUdlbmVyYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEdlbmVyYXRlKCkgewotCQl0cnkgewotCQkJaWYoICEgdGhpcy5pc0RlYnVnKSB7Ci0JCQkJdGhpcy5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUxhdW5jaGVzTGlzdGVuZXIyIGJ1aWxkTGF1bmNoTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSUxhdW5jaGVzTGlzdGVuZXIyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBsYXVuY2hlc1Rlcm1pbmF0ZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IGxhdW5jaGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlMYXVuY2ggbGF1bmNoID0gbGF1bmNoZXNbaV07Ci0JCQkJCWlmIChsYXVuY2guZXF1YWxzKEFic3RyYWN0SnB0R2VuZXJhdG9yLnRoaXMuZ2V0TGF1bmNoKCkpKSB7Ci0KLQkJCQkJCUFic3RyYWN0SnB0R2VuZXJhdG9yLnRoaXMucG9zdEdlbmVyYXRlKCk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzQWRkZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudAotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsYXVuY2hlc0NoYW5nZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudAotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsYXVuY2hlc1JlbW92ZWQoSUxhdW5jaFtdIGxhdW5jaGVzKSB7Ci0JCQkJLy8gbm90IGludGVyZXN0ZWQgdG8gdGhpcyBldmVudAotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogU2V0dGluZyBMYXVuY2ggQ29uZmlndXJhdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlKUkUoKSB7Ci0JCVN0cmluZyBqcmVOYW1lID0gdGhpcy5qcmUuZ2V0TmFtZSgpOyAKLQkJU3RyaW5nIHZtSWQgPSB0aGlzLmpyZS5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKTsKLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX0pSRV9DT05UQUlORVJfUEFUSCwganJlTmFtZSk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9KUkVfQ09OVEFJTkVSX1BBVEgsIHZtSWQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeVByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRoaXMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzcGVjaWZ5TWFpblR5cGUoKSB7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgdGhpcy5nZXRNYWluVHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5Q2xhc3NwYXRoUHJvcGVydGllcygpICB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGg7Ci0JCXRyeSB7Ci0JCQljbGFzc3BhdGggPSB0aGlzLmJ1aWxkQ2xhc3NwYXRoKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGVycm9yIG9jY3VyZWQgZ2VuZXJhdGluZyBhIG1lbWVudG8iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEgsIGNsYXNzcGF0aCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9ERUZBVUxUX0NMQVNTUEFUSCwgZmFsc2UpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2xhc3NwYXRoRW50cnkgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJUGF0aCBzeXN0ZW1MaWJzUGF0aCA9IG5ldyBQYXRoKEphdmFSdW50aW1lLkpSRV9DT05UQUlORVIpOwotCQlyZXR1cm4gSmF2YVJ1bnRpbWUubmV3UnVudGltZUNvbnRhaW5lckNsYXNzcGF0aEVudHJ5KHN5c3RlbUxpYnNQYXRoLCBJUnVudGltZUNsYXNzcGF0aEVudHJ5LlNUQU5EQVJEX0NMQVNTRVMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkgewotCi0JCUlSdW50aW1lQ2xhc3NwYXRoRW50cnkgcHJvamVjdEVudHJ5ID0gSmF2YVJ1bnRpbWUubmV3RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSh0aGlzLmphdmFQcm9qZWN0KTsKLQkJcHJvamVjdEVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKLQkJCi0JCXJldHVybiBwcm9qZWN0RW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShJUGF0aCBhcmNoaXZlUGF0aCkgewotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IGFyY2hpdmVFbnRyeSA9IEphdmFSdW50aW1lLm5ld0FyY2hpdmVSdW50aW1lQ2xhc3NwYXRoRW50cnkoYXJjaGl2ZVBhdGgpOwotCQlhcmNoaXZlRW50cnkuc2V0Q2xhc3NwYXRoUHJvcGVydHkoSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5VU0VSX0NMQVNTRVMpOwotCQkKLQkJcmV0dXJuIGFyY2hpdmVFbnRyeTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIExhdW5jaENvbmZpZyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBJTGF1bmNoIHNhdmVBbmRMYXVuY2hDb25maWcoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTApOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQkJSUxhdW5jaCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJc20uc3ViVGFzayhKcHRDb21tb25Db3JlTWVzc2FnZXMuR0VORVJBVElPTl9TQVZJTkdfTEFVTkNIX0NPTkZJR19UQVNLKTsKLQkJCWNvbmZpZ3VyYXRpb24gPSB0aGlzLmxhdW5jaENvbmZpZy5kb1NhdmUoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBzYXZlRXhjZXB0aW9uKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHNhdmUgTGF1bmNoQ29uZmlnIiwgc2F2ZUV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzbS53b3JrZWQoMSk7Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzbS5zdWJUYXNrKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5HRU5FUkFUSU9OX0xBVU5DSElOR19DT05GSUdfVEFTSyk7Ci0JCQlyZXN1bHQgPSBjb25maWd1cmF0aW9uLmxhdW5jaChJTGF1bmNoTWFuYWdlci5SVU5fTU9ERSwgc20ubmV3Q2hpbGQoOSkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGxhdW5jaEV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGxhdW5jaCIsIGxhdW5jaEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogTWFpbiBhcmd1bWVudHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlYnVnQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmICh0aGlzLmlzRGVidWcpIHsKLQkJCXNiLmFwcGVuZCgiIC1kZWJ1ZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBJTGF1bmNoIGdldExhdW5jaCgpIHsKLQkJcmV0dXJuIHRoaXMubGF1bmNoOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRQcm9qZWN0SlJFKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gSmF2YVJ1bnRpbWUuZ2V0Vk1JbnN0YWxsKHRoaXMuamF2YVByb2plY3QpOwotCX0KLQotCS8vICoqKioqKioqKiogVXRpbGl0aWVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEJvb3RzdHJhcEphckNsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gZ2V0QXJjaGl2ZUNsYXNzcGF0aEVudHJ5KHRoaXMuYnVpbGRCb290c3RyYXBKYXJQYXRoKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUGF0aCBidWlsZEJvb3RzdHJhcEphclBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmRHZW5KYXJTdGFydGluZ1dpdGgodGhpcy5nZXRCb290c3RyYXBKYXJQcmVmaXgoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBmaW5kR2VuSmFyU3RhcnRpbmdXaXRoKFN0cmluZyBnZW5KYXJOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlIGphckluc3RhbGxEaXIgPSB0aGlzLmdldEJ1bmRsZVBhcmVudERpcihKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCk7Ci0KLQkJCUxpc3Q8RmlsZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQkJdGhpcy5maW5kRmlsZVN0YXJ0aW5nV2l0aChnZW5KYXJOYW1lLCBqYXJJbnN0YWxsRGlyLCByZXN1bHQpOwotCQkJaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQ6ICIgKyBnZW5KYXJOYW1lICsgIiMuIy4jdiMjIy5qYXIgaW46ICIgKyBqYXJJbnN0YWxsRGlyKTsgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCUZpbGUgZ2VuSmFyRmlsZSA9IHJlc3VsdC5nZXQoMCk7Ci0JCQlTdHJpbmcgZ2VuSmFyUGF0aCA9IGdlbkphckZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJcmV0dXJuIG5ldyBQYXRoKGdlbkphclBhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgRmlsZSBnZXRCdW5kbGVQYXJlbnREaXIoU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCi0JCWlmIChQbGF0Zm9ybS5pbkRldmVsb3BtZW50TW9kZSgpKSB7Ci0JCQlMb2NhdGlvbiBlY2xpcHNlSG9tZUxvYyA9IFBsYXRmb3JtLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQkJU3RyaW5nIGVjbGlwc2VIb21lID0gZWNsaXBzZUhvbWVMb2MuZ2V0VVJMKCkuZ2V0UGF0aCgpOwotCQkJaWYgKCAhIGVjbGlwc2VIb21lLmVuZHNXaXRoKFBMVUdJTlNfRElSKSkgewotCQkJCWVjbGlwc2VIb21lICs9IFBMVUdJTlNfRElSOwotCQkJfQotCQkJcmV0dXJuIG5ldyBGaWxlKGVjbGlwc2VIb21lKTsKLQkJfQotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlyZXR1cm4gRmlsZUxvY2F0b3IuZ2V0QnVuZGxlRmlsZShidW5kbGUpLmdldFBhcmVudEZpbGUoKTsKLQl9Ci0KLQlwcml2YXRlIElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgYnVpbGRMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLnJlbW92ZUxhdW5jaENvbmZpZ3VyYXRpb24oKTsKLQotCQlJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExhdW5jaE1hbmFnZXIoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25UeXBlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9KQVZBX0FQUExJQ0FUSU9OKTsKLQotCQlyZXR1cm4gdHlwZS5uZXdJbnN0YW5jZShudWxsLCB0aGlzLmdldExhdW5jaENvbmZpZ05hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlMYXVuY2hNYW5hZ2VyIG1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgdHlwZSA9IG1hbmFnZXIuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0pBVkFfQVBQTElDQVRJT04pOwotCQotCQlJTGF1bmNoQ29uZmlndXJhdGlvbltdIGNvbmZpZ3VyYXRpb25zID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9ucyh0eXBlKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlpZiAoY29uZmlndXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKHRoaXMuZ2V0TGF1bmNoQ29uZmlnTmFtZSgpKSkgewotCQkJCWNvbmZpZ3VyYXRpb24uZGVsZXRlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmluZEZpbGVTdGFydGluZ1dpdGgoU3RyaW5nIGZpbGVOYW1lLCBGaWxlIGRpcmVjdG9yeSwgTGlzdDw/IHN1cGVyIEZpbGU+IGxpc3QpIHsKLQkJaWYoZGlyZWN0b3J5Lmxpc3RGaWxlcygpID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkpOyAgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoZmlsZU5hbWUpKSB7Ci0JCQkJbGlzdC5hZGQoZmlsZSk7Ci0JCQl9Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJdGhpcy5maW5kRmlsZVN0YXJ0aW5nV2l0aChmaWxlTmFtZSwgZmlsZSwgbGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlXb3JraW5nRGlyKCkgewotCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgUGF0aCh0aGlzLnByb2plY3RMb2NhdGlvbikudG9GaWxlKCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9XT1JLSU5HX0RJUkVDVE9SWSwgd29ya2luZ0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MWM3M2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlleHRlbmRzIFd0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlpbXBsZW1lbnRzIEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgewotCQotCXByb3RlY3RlZCBKcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0YXR1cyB2YWxpZGF0ZSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZSgpOwotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlmb3IgKExpYnJhcnlWYWxpZGF0b3IgbGlicmFyeVZhbGlkYXRvciA6IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0TGlicmFyeVZhbGlkYXRvcnModGhpcykpIHsKLQkJCXN0YXR1cyA9IGxpYnJhcnlWYWxpZGF0b3IudmFsaWRhdGUodGhpcyk7Ci0JCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQkJcmV0dXJuIHN0YXR1czsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRmNTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJZXh0ZW5kcyBXdHBVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlpbXBsZW1lbnRzIEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgewotCQotCXByb3RlY3RlZCBKcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWZvciAoTGlicmFyeVZhbGlkYXRvciBsaWJyYXJ5VmFsaWRhdG9yIDogSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRMaWJyYXJ5VmFsaWRhdG9ycyh0aGlzKSkgewotCQkJc3RhdHVzID0gbGlicmFyeVZhbGlkYXRvci52YWxpZGF0ZSh0aGlzKTsKLQkJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0xpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0xpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmI1NjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9MaWJyYXJ5UHJvdmlkZXJQcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVByb3ZpZGVyUHJvcGVydHlUZXN0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0JCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKCEgKHByb3BlcnR5LmVxdWFscygiaWQiKSB8fCBwcm9wZXJ0eS5lcXVhbHMoImV4dGVuZHNJZCIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl8fCAhIChyZWNlaXZlciBpbnN0YW5jZW9mIElMaWJyYXJ5UHJvdmlkZXIpIAotCQkJCXx8ICEgKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7IAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlJTGlicmFyeVByb3ZpZGVyIGxpYnJhcnlQcm92aWRlciA9IChJTGlicmFyeVByb3ZpZGVyKSByZWNlaXZlcjsKLQkJCi0JCWlmIChwcm9wZXJ0eS5lcXVhbHMoImlkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGxpYnJhcnlQcm92aWRlci5nZXRJZCgpLmVxdWFscyhleHBlY3RlZFZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eS5lcXVhbHMoImV4dGVuZHNJZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChsaWJyYXJ5UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWlmIChsaWJyYXJ5UHJvdmlkZXIuZ2V0SWQoKS5lcXVhbHMoZXhwZWN0ZWRWYWx1ZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWxpYnJhcnlQcm92aWRlciA9IGxpYnJhcnlQcm92aWRlci5nZXRCYXNlUHJvdmlkZXIoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZhbHNlOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGliVmFsVXRpbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYlZhbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhZmIwYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGliVmFsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5QTFVHSU5fSUQ7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLQotcHVibGljIGNsYXNzIExpYlZhbFV0aWwgewotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZShJdGVyYWJsZTxJUGF0aD4gbGlicmFyeVBhdGhzLCBTZXQ8U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCVNldDxTdHJpbmc+IGNsYXNzRmlsZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlNYXA8U3RyaW5nLFN0cmluZz4gY2xhc3NGaWxlTmFtZVRvQ2xhc3NOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgY2xhc3NOYW1lIDogY2xhc3NOYW1lcykgewotCQkJU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQkJY2xhc3NGaWxlTmFtZXMuYWRkKGNsYXNzRmlsZU5hbWUpOwotCQkJY2xhc3NGaWxlTmFtZVRvQ2xhc3NOYW1lLnB1dChjbGFzc0ZpbGVOYW1lLCBjbGFzc05hbWUpOwotCQl9Ci0JCQotCQlmaW5hbCBNYXA8U3RyaW5nLEludGVnZXI+IGNsYXNzQXBwZWFyYW5jZUNvdW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPigpOwotCQkKLQkJZm9yIChTdHJpbmcgY2xhc3NGaWxlTmFtZSA6IGNsYXNzRmlsZU5hbWVzKSB7Ci0JCQljbGFzc0FwcGVhcmFuY2VDb3VudHMucHV0KGNsYXNzRmlsZU5hbWUsIDApOwotCQl9Ci0JCQotCQlmb3IgKElQYXRoIGxpYnJhcnlQYXRoIDogbGlicmFyeVBhdGhzKSB7Ci0JCQlmaW5hbCBGaWxlIGZpbGUgPSBsaWJyYXJ5UGF0aC50b0ZpbGUoKTsKLQkJCQotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQlaaXBGaWxlIHppcCA9IG51bGw7Ci0JCQkJCi0JCQkJdHJ5IHsKLQkJCQkJemlwID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQkJCQotCQkJCQlmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gaXRyID0gemlwLmVudHJpZXMoKTsgaXRyLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQkJCWZpbmFsIFppcEVudHJ5IHppcEVudHJ5ID0gaXRyLm5leHRFbGVtZW50KCk7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQkJCQotCQkJCQkJSW50ZWdlciBjb3VudCA9IGNsYXNzQXBwZWFyYW5jZUNvdW50cy5nZXQobmFtZSk7Ci0JCQkJCQkKLQkJCQkJCWlmIChjb3VudCAhPSBudWxsKSB7Ci0JCQkJCQkJY2xhc3NBcHBlYXJhbmNlQ291bnRzLnB1dChuYW1lLCBjb3VudCArIDEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoemlwICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLEludGVnZXI+IGVudHJ5IDogY2xhc3NBcHBlYXJhbmNlQ291bnRzLmVudHJ5U2V0KCkpIHsKLQkJCWZpbmFsIGludCBjb3VudCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0JCQkKLQkJCWlmIChjb3VudCA9PSAwKSB7Ci0JCQkJZmluYWwgU3RyaW5nIGNsYXNzRmlsZU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NGaWxlTmFtZVRvQ2xhc3NOYW1lLmdldChjbGFzc0ZpbGVOYW1lKTsKLQkJCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IAotCQkJCQkJTkxTLmJpbmQoSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlVTRVJfTElCUkFSWV9WQUxJREFUT1JfX0NMQVNTX05PVF9GT1VORCwgY2xhc3NOYW1lKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvckNvbmZpZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdhODRhZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5sb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgTGlicmFyeVZhbGlkYXRvckNvbmZpZyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0VYUFJfVkFSID0gImNvbmZpZyI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9QUk9WSURFUl9FWFBSX1ZBUiA9ICJsaWJyYXJ5UHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOwotCXByaXZhdGUgRXhwcmVzc2lvbiBlbmFibGVtZW50Q29uZGl0aW9uOwotCQotCQotCUxpYnJhcnlWYWxpZGF0b3JDb25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCQotCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEVuYWJsZW1lbnRDb25kaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVuYWJsZW1lbnRDb25kaXRpb247Ci0JfQotCQotCXZvaWQgc2V0RW5hYmxlbWVudENvbmRpdGlvbihFeHByZXNzaW9uIGVuYWJsZW1lbnRDb25kaXRpb24pIHsKLQkJdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uID0gZW5hYmxlbWVudENvbmRpdGlvbjsKLQl9Ci0JCi0JcHVibGljIExpYnJhcnlWYWxpZGF0b3IgZ2V0TGlicmFyeVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIFhQb2ludFRvb2xzLmluc3RhbnRpYXRlKAotCQkJCXRoaXMucGx1Z2luSWQsIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyLlFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIAotCQkJCXRoaXMuY2xhc3NOYW1lLCBMaWJyYXJ5VmFsaWRhdG9yLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUV2YWx1YXRpb25Db250ZXh0IGV2YWxDb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIGNvbmZpZyk7Ci0JCWV2YWxDb250ZXh0LnNldEFsbG93UGx1Z2luQWN0aXZhdGlvbih0cnVlKTsKLQkJZXZhbENvbnRleHQuYWRkVmFyaWFibGUoQ09ORklHX0VYUFJfVkFSLCBjb25maWcpOwotCQlldmFsQ29udGV4dC5hZGRWYXJpYWJsZShMSUJSQVJZX1BST1ZJREVSX0VYUFJfVkFSLCBjb25maWcuZ2V0TGlicmFyeVByb3ZpZGVyKCkpOwotCQkKLQkJaWYgKHRoaXMuZW5hYmxlbWVudENvbmRpdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUV2YWx1YXRpb25SZXN1bHQgZXZhbFJlc3VsdCA9IHRoaXMuZW5hYmxlbWVudENvbmRpdGlvbi5ldmFsdWF0ZShldmFsQ29udGV4dCk7Ci0JCQkJCi0JCQkJaWYgKGV2YWxSZXN1bHQgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxvZyhlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3YzJlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLlhQb2ludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuS2V5ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImxpYnJhcnlWYWxpZGF0b3JzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQgPSBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRF8gKyBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElCUkFSWV9WQUxJREFUT1JfRUxFTUVOVCA9ICJsaWJyYXJ5VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFTUVOVF9FTEVNRU5UID0gImVuYWJsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnPiBsaWJyYXJ5VmFsaWRhdG9yQ29uZmlnczsKLQkKLQkKLQlwcml2YXRlIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyKCkgewotCQl0aGlzLmxpYnJhcnlWYWxpZGF0b3JDb25maWdzID0gbmV3IEtleWVkU2V0PFN0cmluZywgTGlicmFyeVZhbGlkYXRvckNvbmZpZz4oKTsKLQkJcmVhZEV4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgTGlicmFyeVZhbGlkYXRvcn1zIAotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxMaWJyYXJ5VmFsaWRhdG9yPiBnZXRMaWJyYXJ5VmFsaWRhdG9ycyhmaW5hbCBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPExpYnJhcnlWYWxpZGF0b3I+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExpYnJhcnlWYWxpZGF0b3JDb25maWcsIExpYnJhcnlWYWxpZGF0b3I+KAotCQkJCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPExpYnJhcnlWYWxpZGF0b3JDb25maWc+KAotCQkJCQkJCQl0aGlzLmxpYnJhcnlWYWxpZGF0b3JDb25maWdzLmdldEl0ZW1TZXQoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnIG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uaXNFbmFibGVkRm9yKGNvbmZpZyk7Ci0JCQkJCQkJfQotCQkJCQkJfSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpYnJhcnlWYWxpZGF0b3IgdHJhbnNmb3JtKExpYnJhcnlWYWxpZGF0b3JDb25maWcgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0TGlicmFyeVZhbGlkYXRvcigpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTGlicmFyeVZhbGlkYXRvciBvKSB7Ci0JCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRFeHRlbnNpb25zKCkgewotCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkKLQkJZmluYWwgSUV4dGVuc2lvblBvaW50IHhwb2ludCAKLQkJCQk9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQpOwotCQkKLQkJaWYgKHhwb2ludCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWdzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCQotCQlmb3IgKElFeHRlbnNpb24gZXh0ZW5zaW9uIDogeHBvaW50LmdldEV4dGVuc2lvbnMoKSkgewotICAgICAgICAJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkgewotICAgICAgICAJCWNvbmZpZ3MuYWRkKGVsZW1lbnQpOwotICAgICAgICAJfQotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogY29uZmlncykgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhMSUJSQVJZX1ZBTElEQVRPUl9FTEVNRU5UKSkgewotICAgICAgICAgICAgICAgIHJlYWRFeHRlbnNpb24oZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRFeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIExpYnJhcnlWYWxpZGF0b3JDb25maWcgbHZDb25maWcgPSBuZXcgTGlicmFyeVZhbGlkYXRvckNvbmZpZygpOwotCQkJCi0JCQkvLyBwbHVnLWluIGlkCi0JCQlsdkNvbmZpZy5zZXRQbHVnaW5JZChlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLQkJCQotCQkJLy8gcmVzb3VyY2UgbG9jYXRvciBpZAotCQkJbHZDb25maWcuc2V0SWQoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIElEX0FUVFJJQlVURSkpOwotCQkJCi0JCQlpZiAodGhpcy5saWJyYXJ5VmFsaWRhdG9yQ29uZmlncy5jb250YWluc0tleShsdkNvbmZpZy5nZXRJZCgpKSkgewotCQkJCWxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCBJRF9BVFRSSUJVVEUsIGx2Q29uZmlnLmdldElkKCkpOwotCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJLy8gcmVzb3VyY2UgbG9jYXRvciBjbGFzcyBuYW1lCi0JCQlsdkNvbmZpZy5zZXRDbGFzc05hbWUoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIENMQVNTX0FUVFJJQlVURSkpOwotCQkJCi0JCQkvLyBlbmFibGVtZW50Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA6IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQkJaWYgKGNoaWxkTmFtZS5lcXVhbHMoRU5BQkxFTUVOVF9FTEVNRU5UKSkgewotCQkJCQlFeHByZXNzaW9uIGV4cHI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlleHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nKGUpOwotCQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCWx2Q29uZmlnLnNldEVuYWJsZW1lbnRDb25kaXRpb24oZXhwcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0aGlzLmxpYnJhcnlWYWxpZGF0b3JDb25maWdzLmFkZEl0ZW0obHZDb25maWcuZ2V0SWQoKSwgbHZDb25maWcpOwotCQl9Ci0JCWNhdGNoIChYUG9pbnRFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlIGFuZCBjb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlcgotCQkJLy8gaW4gdGhlIGxvZy4KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWU5ODAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RGF0YU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUFJPSkVDVCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTlRBSU5FUl9QQVRIKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRklMRV9OQU1FKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05UQUlORVJfUEFUSCkpIHsKLQkJCUlDb250YWluZXIgc291cmNlTG9jYXRpb24gPSBnZXREZWZhdWx0Q29udGFpbmVyKCk7Ci0JCQlpZiAoc291cmNlTG9jYXRpb24gIT0gbnVsbCAmJiBzb3VyY2VMb2NhdGlvbi5leGlzdHMoKSkgewotCQkJCXJldHVybiBzb3VyY2VMb2NhdGlvbi5nZXRGdWxsUGF0aCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRklMRV9OQU1FKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRGaWxlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRGaWxlTmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OVEFJTkVSX1BBVEgpCi0JCQkJfHwgcHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX05BTUUpKSB7Ci0JCQlzdGF0dXMgPSB2YWxpZGF0ZUNvbnRhaW5lclBhdGhBbmRGaWxlTmFtZSgpOwotCQl9Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDb250YWluZXJQYXRoQW5kRmlsZU5hbWUoKSB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyKCk7Ci0JCWlmIChjb250YWluZXIgPT0gbnVsbCkgewotCQkJLy8gdmVyaWZpZXMgY29udGFpbmVyIGhhcyBiZWVuIHNwZWNpZmllZCwgYnV0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeSBpbiBtb3N0IGNhc2VzLgotCQkJLy8gdGhlcmUgaXMgYWxtb3N0IGFsd2F5cyBhIGRlZmF1bHQsIGFuZCB0aGUgbmV3IGZpbGUgd2l6YXJkIGRvZXMgdGhpcyB2YWxpZGF0aW9uIGFzIHdlbGwuCi0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlZBTElEQVRFX0NPTlRBSU5FUl9OT1RfU1BFQ0lGSUVEKTsKLQkJfQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShGSUxFX05BTUUpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShmaWxlTmFtZSkpIHsKLQkJCS8vIHZlcmlmaWVzIGZpbGUgbmFtZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGJ1dCBzaG91bGQgYmUgdW5uZWNlc3NhcnkgaW4gbW9zdCBjYXNlcy4KLQkJCS8vIHRoZXJlIGlzIGFsbW9zdCBhbHdheXMgYSBkZWZhdWx0LCBhbmQgdGhlIG5ldyBmaWxlIHdpemFyZCBkb2VzIHRoaXMgdmFsaWRhdGlvbiBhcyB3ZWxsLgotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfTkFNRV9OT1RfU1BFQ0lGSUVEKTsKLQkJfQotCQlpZiAoY29udGFpbmVyLmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUpKS5leGlzdHMoKSkgewotCQkJLy8gdmVyaWZpZXMgZmlsZSBkb2VzIG5vdCBleGlzdCwgYnV0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeSBpbiBtb3N0IGNhc2VzLgotCQkJLy8gdGhlIG5ldyBmaWxlIHdpemFyZCBkb2VzIHRoaXMgdmFsaWRhdGlvbiBhcyB3ZWxsLgotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfQUxSRUFEWV9FWElTVFMpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHJvdGVjdGVkIElQYXRoIGdldENvbnRhaW5lclBhdGgoKSB7Ci0JCXJldHVybiAoSVBhdGgpIHRoaXMubW9kZWwuZ2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgpOwotCX0KLQotCXByb3RlY3RlZCBJQ29udGFpbmVyIGdldENvbnRhaW5lcigpIHsKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IGdldENvbnRhaW5lclBhdGgoKTsKLQkJaWYgKGNvbnRhaW5lclBhdGggPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7IAotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybVRvb2xzLmdldENvbnRhaW5lcihjb250YWluZXJQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFByb2plY3QoZ2V0Q29udGFpbmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCXJldHVybiAoY29udGFpbmVyID09IG51bGwpID8gbnVsbCA6IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmVzdCBndWVzcyBzb3VyY2UgbG9jYXRpb24gZm9yIHRoZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0RGVmYXVsdENvbnRhaW5lcigpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShQUk9KRUNUKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjM1YzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotcHVibGljIGludGVyZmFjZSBKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogT3B0aW9uYWwsIHR5cGUge0BsaW5rIElQcm9qZWN0fSwgZ2l2ZXMgYSBjbHVlIGFzIHRvIHRoZSBkZWZhdWx0IGNvbnRhaW5lciBwYXRoCi0JICovCi0JU3RyaW5nIFBST0pFQ1QgPSAiSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUge0BsaW5rIElQYXRofSwgaWRlbnRpZmllcyB0aGUgZnVsbCBwYXRoIHRvIHRoZSBjb250YWluZXIgaW4gd2hpY2ggCi0JICogdGhlIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQKLQkgKi8KLQlTdHJpbmcgQ09OVEFJTkVSX1BBVEggPSAiSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIHtAbGluayBTdHJpbmd9LCBpZGVudGlmaWVzIHRoZSBmaWxlIG5hbWUKLQkgKi8KLQlTdHJpbmcgRklMRV9OQU1FID0gIkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Nb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MDgxZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Nb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgTW9kdWxlUmVzb3VyY2VMb2NhdG9yCi0JCWV4dGVuZHMgU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSAiTUVUQS1JTkYiIHJ1bnRpbWUgbG9jYXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlyZXR1cm4gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoTUVUQV9JTkZfUEFUSCkuZ2V0VW5kZXJseWluZ0ZvbGRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlyZXR1cm4gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKHJ1bnRpbWVQYXRoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCkgewotCQlJRmlsZSBmaWxlID0gUGxhdGZvcm1Ub29scy5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlJVmlydHVhbEZvbGRlciByb290ID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gZmluZFZpcnR1YWxGaWxlKHJvb3QsIGZpbGUpOwotCQlpZiAodkZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZGaWxlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlKCk7Ci0JCX0KLQkJLy8gY291bGRuJ3QgZmluZCBpdC4gIHRyeSB0aGUgc3VwZXItY2FzZQotCQlyZXR1cm4gc3VwZXIuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJVmlydHVhbEZpbGUgZmluZFZpcnR1YWxGaWxlKElWaXJ0dWFsRm9sZGVyIHZGb2xkZXIsIElGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCWZvciAoSVZpcnR1YWxSZXNvdXJjZSB2UmVzb3VyY2UgOiB2Rm9sZGVyLm1lbWJlcnMoKSkgewotCQkJCWlmICh2UmVzb3VyY2UuZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRklMRSkgewotCQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSAoSVZpcnR1YWxGaWxlKSB2UmVzb3VyY2U7Ci0JCQkJCWlmIChmaWxlLmVxdWFscyh2RmlsZS5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKSkpIHsKLQkJCQkJCXJldHVybiB2RmlsZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh2UmVzb3VyY2UuZ2V0VHlwZSgpID09IElWaXJ0dWFsUmVzb3VyY2UuRk9MREVSKSB7Ci0JCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IGZpbmRWaXJ0dWFsRmlsZSgoSVZpcnR1YWxGb2xkZXIpIHZSZXNvdXJjZSwgZmlsZSk7Ci0JCQkJCWlmICh2RmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gdkZpbGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1BsdWdpblJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUGx1Z2luUmVzb3VyY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2QzZmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUGx1Z2luUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucHJvamVjdC5JQnVuZGxlUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBkZS5jb3JlLnByb2plY3QuSUJ1bmRsZVByb2plY3RTZXJ2aWNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUGx1Z2luUmVzb3VyY2VMb2NhdG9yCi0JCWV4dGVuZHMgU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciB7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElDb250YWluZXIgZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJSUNvbnRhaW5lciByb290ID0gZ2V0QnVuZGxlUm9vdChwcm9qZWN0KTsKLQkJCXJldHVybiByb290LmdldEZvbGRlcihNRVRBX0lORl9QQVRIKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhjZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVBhdGggZ2V0UmVzb3VyY2VQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIHJvb3QgPSBnZXRCdW5kbGVSb290KHByb2plY3QpOwotCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcm9vdC5nZXRGdWxsUGF0aCgpLmFwcGVuZChydW50aW1lUGF0aCk7Ci0JCQlpZiAocHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlUGF0aDsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhjZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlUGF0aChwcm9qZWN0LCBydW50aW1lUGF0aCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJSUZpbGUgZmlsZSA9IFBsYXRmb3JtVG9vbHMuZ2V0RmlsZShyZXNvdXJjZVBhdGgpOwotCQl0cnkgewotCQkJSUNvbnRhaW5lciByb290ID0gZ2V0QnVuZGxlUm9vdChwcm9qZWN0KTsKLQkJCWlmIChyb290LmNvbnRhaW5zKGZpbGUpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlUGF0aC5tYWtlUmVsYXRpdmVUbyhyb290LmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0QnVuZGxlUm9vdChJUHJvamVjdCBwcm9qZWN0KSAKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCUlCdW5kbGVQcm9qZWN0U2VydmljZSBzZXJ2aWNlID0gZ2V0QnVuZGxlUHJvamVjdFNlcnZpY2UoKTsKLQkJSUJ1bmRsZVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHNlcnZpY2UuZ2V0RGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCUlQYXRoIHBhdGggPSBkZXNjcmlwdGlvbi5nZXRCdW5kbGVSb290KCk7Ci0JCXJldHVybiAocGF0aCA9PSBudWxsKSA/IHByb2plY3QgOiBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElCdW5kbGVQcm9qZWN0U2VydmljZSBnZXRCdW5kbGVQcm9qZWN0U2VydmljZSgpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5pbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldEJ1bmRsZUNvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZTxJQnVuZGxlUHJvamVjdFNlcnZpY2U+IHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQnVuZGxlUHJvamVjdFNlcnZpY2UuY2xhc3MpOwotCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlCdW5kbGVQcm9qZWN0U2VydmljZSBzZXJ2aWNlID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQkJcmV0dXJuIHNlcnZpY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlNjM2My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5pbnRlcm5hbC5GYWNldGVkUHJvamVjdEZyYW1ld29ya0phdmFQbHVnaW4ubG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTG9jYXRvckNvbmZpZyAKLQkJaW1wbGVtZW50cyBDb21wYXJhYmxlPFJlc291cmNlTG9jYXRvckNvbmZpZz4gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfRU5BQkxFTUVOVF9WQVJJQUJMRSA9ICJwcm9qZWN0IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBQcmlvcml0eSBwcmlvcml0eTsKLQlwcml2YXRlIEV4cHJlc3Npb24gZW5hYmxlbWVudENvbmRpdGlvbjsKLQkKLQkKLQlSZXNvdXJjZUxvY2F0b3JDb25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCQotCXZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCQotCXB1YmxpYyBQcmlvcml0eSBnZXRQcmlvcml0eSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpb3JpdHk7Ci0JfQotCQotCXZvaWQgc2V0UHJpb3JpdHkoUHJpb3JpdHkgcHJpb3JpdHkpIHsKLQkJdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OwotCX0KLQkKLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFbmFibGVtZW50Q29uZGl0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uOwotCX0KLQkKLQl2b2lkIHNldEVuYWJsZW1lbnRDb25kaXRpb24oRXhwcmVzc2lvbiBlbmFibGVtZW50Q29uZGl0aW9uKSB7Ci0JCXRoaXMuZW5hYmxlbWVudENvbmRpdGlvbiA9IGVuYWJsZW1lbnRDb25kaXRpb247Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKCkgewotCQlyZXR1cm4gWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQsIFJlc291cmNlTG9jYXRvck1hbmFnZXIuUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgCi0JCQkJdGhpcy5jbGFzc05hbWUsIFJlc291cmNlTG9jYXRvci5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUV2YWx1YXRpb25Db250ZXh0IGV2YWxDb250ZXh0ID0gbmV3IEV2YWx1YXRpb25Db250ZXh0KG51bGwsIHByb2plY3QpOwotCQlldmFsQ29udGV4dC5zZXRBbGxvd1BsdWdpbkFjdGl2YXRpb24odHJ1ZSk7Ci0JCWV2YWxDb250ZXh0LmFkZFZhcmlhYmxlKFBST0pFQ1RfRU5BQkxFTUVOVF9WQVJJQUJMRSwgcHJvamVjdCk7Ci0JCQotCQlpZiAodGhpcy5lbmFibGVtZW50Q29uZGl0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRXZhbHVhdGlvblJlc3VsdCBldmFsUmVzdWx0ID0gdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uLmV2YWx1YXRlKGV2YWxDb250ZXh0KTsKLQkJCQkKLQkJCQlpZiAoZXZhbFJlc3VsdCA9PSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKGUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGludCBjb21wYXJlVG8oUmVzb3VyY2VMb2NhdG9yQ29uZmlnIG90aGVyKSB7Ci0JCXJldHVybiBQcmlvcml0eS5jb21wYXJlKHRoaXMucHJpb3JpdHksIG90aGVyLnByaW9yaXR5KTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBlbnVtIFByaW9yaXR5IHsKLQkJCi0JCS8qIFRoZSBsb3dlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlMT1dFU1QoNiwgImxvd2VzdCIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgc2Vjb25kIGxvd2VzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUxPV0VSKDUsICJsb3dlciIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgdGhpcmQgbG93ZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJTE9XKDQsICJsb3ciKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlOT1JNQUwoMywgIm5vcm1hbCIpLCAvLyROT04tTkxTLTEkCi0JCQotCQkvKiBUaGUgdGhpcmQgaGlnaGVzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUhJR0goMiwgImhpZ2giKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIHNlY29uZCBoaWdoZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJSElHSEVSKDEsICJoaWdoZXIiKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlISUdIRVNUKDAsICJoaWdoZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCQotCQlwdWJsaWMgc3RhdGljIGludCBjb21wYXJlKFByaW9yaXR5IHByaW9yaXR5MSwgUHJpb3JpdHkgcHJpb3JpdHkyKSB7Ci0JCQlyZXR1cm4gcHJpb3JpdHkxLnZhbHVlLmNvbXBhcmVUbyhwcmlvcml0eTIudmFsdWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIFByaW9yaXR5IGdldChTdHJpbmcgbGl0ZXJhbCkgewotCQkJaWYgKGxpdGVyYWwgPT0gbnVsbCkgewotCQkJCXJldHVybiBOT1JNQUw7Ci0JCQl9Ci0JCQlmb3IgKFByaW9yaXR5IHByaW9yaXR5IDogdmFsdWVzKCkpIHsKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGxpdGVyYWwsIHByaW9yaXR5LmxpdGVyYWwpKSB7Ci0JCQkJCXJldHVybiBwcmlvcml0eTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgSW50ZWdlciB2YWx1ZTsKLQkJcHJpdmF0ZSBTdHJpbmcgbGl0ZXJhbDsKLQkJCi0JCQotCQlwcml2YXRlIFByaW9yaXR5KGludCB2YWx1ZSwgU3RyaW5nIGxpdGVyYWwpIHsKLQkJCXRoaXMudmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwotCQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubGl0ZXJhbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvck1hbmFnZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmYjlkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMuZmluZFJlcXVpcmVkQXR0cmlidXRlOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy5sb2c7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLmxvZ0R1cGxpY2F0ZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMubG9nSW52YWxpZFZhbHVlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3JDb25maWcuUHJpb3JpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMuWFBvaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLktleWVkU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMb2NhdG9yTWFuYWdlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gInJlc291cmNlTG9jYXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCA9IEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lEXyArIEVYVEVOU0lPTl9QT0lOVF9JRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9MT0NBVE9SX0VMRU1FTlQgPSAicmVzb3VyY2VMb2NhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfQVRUUklCVVRFID0gInByaW9yaXR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRU1FTlRfRUxFTUVOVCA9ICJlbmFibGVtZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlTG9jYXRvck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgUmVzb3VyY2VMb2NhdG9yTWFuYWdlcigpOwotCQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VMb2NhdG9yTWFuYWdlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgUmVzb3VyY2VMb2NhdG9yQ29uZmlnPiByZXNvdXJjZUxvY2F0b3JDb25maWdzOwotCQotCQotCXByaXZhdGUgUmVzb3VyY2VMb2NhdG9yTWFuYWdlcigpIHsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0b3JDb25maWdzID0gbmV3IEtleWVkU2V0PFN0cmluZywgUmVzb3VyY2VMb2NhdG9yQ29uZmlnPigpOwotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBSZXNvdXJjZUxvY2F0b3J9IG9mIGhpZ2hlc3QgcHJpb3JpdHkgdGhhdCBpcyBhY2NlcHRhYmxlCi0JICogZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICovCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlJdGVyYXRvcjxSZXNvdXJjZUxvY2F0b3I+IHN0cmVhbSA9IG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxSZXNvdXJjZUxvY2F0b3I+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFJlc291cmNlTG9jYXRvckNvbmZpZywgUmVzb3VyY2VMb2NhdG9yPigKLQkJCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxSZXNvdXJjZUxvY2F0b3JDb25maWc+KAotCQkJCQkJCQluZXcgVHJlZVNldDxSZXNvdXJjZUxvY2F0b3JDb25maWc+KHRoaXMucmVzb3VyY2VMb2NhdG9yQ29uZmlncy5nZXRJdGVtU2V0KCkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFJlc291cmNlTG9jYXRvckNvbmZpZyBvKSB7Ci0JCQkJCQkJCXJldHVybiBvLmlzRW5hYmxlZEZvcihwcm9qZWN0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgUmVzb3VyY2VMb2NhdG9yIHRyYW5zZm9ybShSZXNvdXJjZUxvY2F0b3JDb25maWcgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0UmVzb3VyY2VMb2NhdG9yKCk7Ci0JCQkJCX0KLQkJCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChSZXNvdXJjZUxvY2F0b3IgbykgewotCQkJCXJldHVybiBvICE9IG51bGw7Ci0JCQl9Ci0JCX0uaXRlcmF0b3IoKTsKLQkJcmV0dXJuIChzdHJlYW0uaGFzTmV4dCgpKSA/IHN0cmVhbS5uZXh0KCkgOiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgeHBvaW50IAotCQkJCT0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQotCQlpZiAoeHBvaW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiB4cG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgIAlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0gICAgICAgIAkJY29uZmlncy5hZGQoZWxlbWVudCk7Ci0gICAgICAgIAl9Ci0JCX0KLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBjb25maWdzKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFJFU09VUkNFX0xPQ0FUT1JfRUxFTUVOVCkpIHsKLSAgICAgICAgICAgICAgICByZWFkRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBSZXNvdXJjZUxvY2F0b3JDb25maWcgcmxDb25maWcgPSBuZXcgUmVzb3VyY2VMb2NhdG9yQ29uZmlnKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCXJsQ29uZmlnLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyByZXNvdXJjZSBsb2NhdG9yIGlkCi0JCQlybENvbmZpZy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLnJlc291cmNlTG9jYXRvckNvbmZpZ3MuY29udGFpbnNLZXkocmxDb25maWcuZ2V0SWQoKSkpIHsKLQkJCQlsb2dEdXBsaWNhdGVFeHRlbnNpb24oUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgSURfQVRUUklCVVRFLCBybENvbmZpZy5nZXRJZCgpKTsKLQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIHJlc291cmNlIGxvY2F0b3IgY2xhc3MgbmFtZQotCQkJcmxDb25maWcuc2V0Q2xhc3NOYW1lKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBDTEFTU19BVFRSSUJVVEUpKTsKLQkJCQotCQkJLy8gcHJpb3JpdHkKLQkJCVN0cmluZyBwcmlvcml0eVN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFBSSU9SSVRZX0FUVFJJQlVURSkudHJpbSgpOwotCQkJUHJpb3JpdHkgcHJpb3JpdHkgPSBQcmlvcml0eS5nZXQocHJpb3JpdHlTdHJpbmcpOwotCQkJaWYgKHByaW9yaXR5ID09IG51bGwpIHsKLQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgUFJJT1JJVFlfQVRUUklCVVRFLCBwcmlvcml0eVN0cmluZyk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJcmxDb25maWcuc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCQkJCi0JCQkvLyBlbmFibGVtZW50Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjaGlsZCA6IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSkgewotCQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZC5nZXROYW1lKCk7Ci0JCQkJaWYgKGNoaWxkTmFtZS5lcXVhbHMoRU5BQkxFTUVOVF9FTEVNRU5UKSkgewotCQkJCQlFeHByZXNzaW9uIGV4cHI7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlleHByID0gRXhwcmVzc2lvbkNvbnZlcnRlci5nZXREZWZhdWx0KCkucGVyZm9ybShjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJbG9nKGUpOwotCQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCXJsQ29uZmlnLnNldEVuYWJsZW1lbnRDb25kaXRpb24oZXhwcik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQl0aGlzLnJlc291cmNlTG9jYXRvckNvbmZpZ3MuYWRkSXRlbShybENvbmZpZy5nZXRJZCgpLCBybENvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUwZjA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIFNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IgCi0JCWltcGxlbWVudHMgUmVzb3VyY2VMb2NhdG9yIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIE1FVEFfSU5GX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLk1FVEFfSU5GKTsKLQkKLQkvKioKLQkgKiBTaW1wbHkgZW5zdXJlIHRoZSBjb250YWluZXIgaXMgZWl0aGVyOgotCSAqIC0gb24gdGhlIGphdmEgcHJvamVjdCBjbGFzc3BhdGgKLQkgKiAgIG9yCi0JICogLSBpbiB0aGUgbm9uLWphdmEgcmVzb3VyY2VzLCBidXQgbm90IGluIHRoZSBwcm9qZWN0IG91dHB1dCBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdFJlc291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqYXZhUHJvamVjdC5pc09uQ2xhc3NwYXRoKGNvbnRhaW5lcikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXRyeSB7Ci0JCQlJUGF0aCBvdXRwdXRMb2NhdGlvbiA9IGphdmFQcm9qZWN0LmdldE91dHB1dExvY2F0aW9uKCk7Ci0JCQlpZiAoY29udGFpbmVyLmVxdWFscyhwcm9qZWN0KSAmJiBvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZm9yIChPYmplY3QgcmVzb3VyY2UgOiBqYXZhUHJvamVjdC5nZXROb25KYXZhUmVzb3VyY2VzKCkpIHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIHJlc291cmNlOwotCQkJCQlpZiAoKGZvbGRlci5lcXVhbHMoY29udGFpbmVyKSB8fCBmb2xkZXIuY29udGFpbnMoY29udGFpbmVyKSkKLQkJCQkJCQkmJiAhIG91dHB1dExvY2F0aW9uLmlzUHJlZml4T2YoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkpKSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJCS8vIG9ubHkgaGFwcGVucyBpZiB0aGUgamF2YSBwcm9qZWN0IGRvZXNuJ3QgZXhpc3QuICBmYWxsIHRocm91Z2guCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gCi0JICogLSB0aGUgZmlyc3QgcGFja2FnZSBmcmFnbWVudCByb290IChzb3VyY2UgZm9sZGVyKSBNRVRBLUlORiBmb2xkZXIgaWYgaXQgZXhpc3RzLCAKLQkgKiAgICBvciAKLQkgKiAtIHRoZSBwcm9qZWN0IHJvb3RlZCBNRVRBLUlORiBmb2xkZXIgaWYgaXQgZXhpc3RzCi0JICogICAgb3IgCi0JICogLSB0aGUgbm9uLWV4aXN0ZW50IE1FVEEtSU5GIGZvbGRlciBpbiB0aGUgZmlyc3QgcGFja2FnZSBmcmFnbWVudCByb290IChzb3VyY2UgZm9sZGVyKQotCSAqLwotCXB1YmxpYyBJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCUlDb250YWluZXIgZGVmYXVsdExvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpIHsKLQkJCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJSUNvbnRhaW5lciByb290Q29udGFpbmVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCUlGb2xkZXIgbWV0YUluZkZvbGRlciA9IHJvb3RDb250YWluZXIuZ2V0Rm9sZGVyKE1FVEFfSU5GX1BBVEgpOwotCQkJCQlpZiAobWV0YUluZkZvbGRlci5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIG1ldGFJbmZGb2xkZXI7Ci0JCQkJCX0KLQkJCQkJaWYgKGRlZmF1bHRMb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBob2xkIG9uIHRvIHRoaXMgaW4gY2FzZSB0aGUgTUVUQS1JTkYgZm9sZGVyIGNhbid0IGJlIGZvdW5kCi0JCQkJCQlkZWZhdWx0TG9jYXRpb24gPSBtZXRhSW5mRm9sZGVyOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJSUZvbGRlciBtZXRhSW5mRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoTUVUQV9JTkZfUEFUSCk7Ci0JCQlpZiAobWV0YUluZkZvbGRlci5leGlzdHMoKSkgewotCQkJCXJldHVybiBtZXRhSW5mRm9sZGVyOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkvLyBvbmx5IGhhcHBlbnMgaWYgdGhlIGphdmEgcHJvamVjdCBkb2Vzbid0IGV4aXN0IG9yIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIHRoZSAKLQkJCS8vIGphdmEgcmVzb3VyY2VzLiAgZmFsbCB0aHJvdWdoLgotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJfQotCQkKLQkJcmV0dXJuIGRlZmF1bHRMb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFJlc291cmNlUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJSVBhdGggZmlyc3RSZXNvdXJjZVBhdGggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCQlJQ29udGFpbmVyIHJvb3RDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gcm9vdENvbnRhaW5lci5nZXRGdWxsUGF0aCgpLmFwcGVuZChydW50aW1lUGF0aCk7Ci0JCQkJCWlmIChmaXJzdFJlc291cmNlUGF0aCA9PSBudWxsKSB7Ci0JCQkJCQlmaXJzdFJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKLQkJCQkJfQotCQkJCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBmaXJzdFJlc291cmNlUGF0aDsKLQl9Ci0JCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdChwcm9qZWN0KTsKLQkJSUZpbGUgZmlsZSA9IFBsYXRmb3JtVG9vbHMuZ2V0RmlsZShyZXNvdXJjZVBhdGgpOwotCQl0cnkgewotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCByb290IDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJCWlmIChyb290LmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCQlJQ29udGFpbmVyIHJvb3RDb250YWluZXIgPSAoSUNvbnRhaW5lcikgcm9vdC5nZXRVbmRlcmx5aW5nUmVzb3VyY2UoKTsKLQkJCQkJaWYgKHJvb3RDb250YWluZXIuY29udGFpbnMoZmlsZSkpIHsKLQkJCQkJCXJldHVybiByZXNvdXJjZVBhdGgubWFrZVJlbGF0aXZlVG8ocm9vdENvbnRhaW5lci5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhqbWUpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZVBhdGgubWFrZVJlbGF0aXZlVG8ocHJvamVjdC5nZXRGdWxsUGF0aCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1dlYk1vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvV2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmZmZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvV2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLQotcHVibGljIGNsYXNzIFdlYk1vZHVsZVJlc291cmNlTG9jYXRvcgotCWV4dGVuZHMgTW9kdWxlUmVzb3VyY2VMb2NhdG9yewotCQotCXByb3RlY3RlZCBzdGF0aWMgSVBhdGggV0VCX0lORl9DTEFTU0VTX1BBVEggPSBuZXcgUGF0aChKMkVFQ29uc3RhbnRzLldFQl9JTkZfQ0xBU1NFUyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb2xkZXIgcmVwcmVzZW50aW5nIHRoZSAiV0VCLUlORi9jbGFzc2VzL01FVEEtSU5GIiBsb2NhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXJldHVybiBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihXRUJfSU5GX0NMQVNTRVNfUEFUSC5hcHBlbmQoTUVUQV9JTkZfUEFUSCkpLmdldFVuZGVybHlpbmdGb2xkZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIHJlc291cmNlIHBhdGggcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBydW50aW1lIGxvY2F0aW9uIGFwcGVuZGVkCi0JICogdG8gdGhlICJXRUItSU5GL2NsYXNzZXMiIGxvY2F0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJlc291cmNlUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VQYXRoKHByb2plY3QsIFdFQl9JTkZfQ0xBU1NFU19QQVRILmFwcGVuZChydW50aW1lUGF0aCkpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCUlQYXRoIHJ1bnRpbWVQYXRoID0gc3VwZXIuZ2V0UnVudGltZVBhdGgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLQkJaWYgKFdFQl9JTkZfQ0xBU1NFU19QQVRILmlzUHJlZml4T2YocnVudGltZVBhdGgpKSB7Ci0JCQlyZXR1cm4gcnVudGltZVBhdGgubWFrZVJlbGF0aXZlVG8oV0VCX0lORl9DTEFTU0VTX1BBVEgpOwotCQl9Ci0JCXJldHVybiBydW50aW1lUGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTRjZGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9DYWxsYmFja0pvYlN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIGpvYiBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IGxpc3RlbmVycwotICogd2hlbiBhIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgInN5bmNocm9uaXplIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KLSAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KLSAqIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiOwotICogc2luY2Ugb3RoZXIsIHVucmVsYXRlZCwgc3luY2hyb25pemF0aW9ucyBjYW4gYmUgdHJpZ2dlcmVkIGNvbmN1cnJlbnRseTsKLSAqIHByZXZlbnRpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBmcm9tIHF1aWVzY2luZy4KLSAqLwotcHVibGljIGNsYXNzIENhbGxiYWNrSm9iU3luY2hyb25pemVyCi0JZXh0ZW5kcyBKb2JTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENhbGxiYWNrSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoam9iTmFtZSwgY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGpvYiB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcwotCSAqIHF1aWVzY2VkLgotCSAqLwotCUBPdmVycmlkZQotCVN5bmNocm9uaXphdGlvbkpvYiBidWlsZEpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9uaXphdGlvbkpvYihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhbGxiYWNrU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXphdGlvbiBqb2IgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHtAbGluayBKb2JTeW5jaHJvbml6ZXIuU3luY2hyb25pemF0aW9uSm9ifQotCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKLQkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgotCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgotCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIG9jY3VycyBkdXJpbmcgdGhlIGpvYidzIGV4ZWN1dGlvbiwKLQkgKiBubyBvdGhlciB0aHJlYWQgd2lsbCBiZSBhYmxlIHRvCi0JICogaW5pdGlhdGUgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gdW50aWwgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBoYXZlIGJlZW4KLQkgKiBub3RpZmllZC4gTm90ZSBhbHNvLCB0aGUgc3luY2hyb25pemVyJ3MgbGlzdGVuZXJzIGNhbiwgdGhlbXNlbHZlcywKLQkgKiB0cmlnZ2VyIGFub3RoZXIgc3luY2hyb25pemF0aW9uIChieSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9KTsKLQkgKiBidXQgdGhpcyBzeW5jaHJvbml6YXRpb24gd2lsbCBub3Qgb2NjdXIgdW50aWwgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZQotCSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0JICovCi0JY2xhc3MgQ2FsbGJhY2tTeW5jaHJvbml6YXRpb25Kb2IKLQkJZXh0ZW5kcyBTeW5jaHJvbml6YXRpb25Kb2IKLQl7Ci0JCS8qKgotCQkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGpvYiBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gcnVuLgotCQkgKiBXZSBuZWVkIHRoaXMgYmVjYXVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iIEpvYn0KLQkJICogaGFzIG5vIHB1YmxpYyBBUEkgZm9yIGRpc2NvdmVyaW5nIHdoZXRoZXIgYSBqb2IgaXMgInNjaGVkdWxlZCIuCi0JCSAqLwotCQkvLyB1c2UgJ3ZvbGF0aWxlJyBiZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpc24ndCByZWFsbHkgcmVxdWlyZWQKLQkJcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNjaGVkdWxlZDsKLQotCi0JCUNhbGxiYWNrU3luY2hyb25pemF0aW9uSm9iKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJc3VwZXIoam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOwotCQkJdGhpcy5zY2hlZHVsZWQgPSBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB3ZSBhcmUgYWxsb3dpbmcgdGhlIGpvYiB0byBiZSBzY2hlZHVsZWQgKGkuZS4ge0BsaW5rICNzdGFydCgpfQotCQkgKiB3YXMgY2FsbGVkKSwgc2V0IHRoZSAic2NoZWR1bGVkIiBmbGFnLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQlpZiAodGhpcy5zaG91bGRTY2hlZHVsZSkgewotCQkJCXRoaXMuc2NoZWR1bGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgdGhlICJzY2hlZHVsZWQiIGZsYWc7IHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbjsgYW5kLAotCQkgKiBpZiB0aGUgInNjaGVkdWxlZCIgZmxhZyBpcyBzdGlsbCBjbGVhciAoaS5lLiB0aGVyZSBoYXZlIGJlZW4gbm8KLQkJICogZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9KSwgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5zY2hlZHVsZWQgPSBmYWxzZTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIucnVuKG1vbml0b3IpOwotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2Ugb3VyIGpvYiBpcyAic3RvcHBlZCI7Ci0JCQkvLyB0aGF0IHNlZW1zIG9rLi4uICB+Ymp2Ci0JCQlpZiAoICEgdGhpcy5zY2hlZHVsZWQpIHsKLQkJCQlDYWxsYmFja0pvYlN5bmNocm9uaXplci50aGlzLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXZvaWQgc3RvcCgpIHsKLQkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7Ci0JCQlzdXBlci5zdG9wKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9KRFRUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9KRFRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDUyZDI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSkRUVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYXJlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggSkRUIGNvcmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEVFRvb2xzIHsKLQotCS8qKgotCSAqIFdyYXAgY2hlY2tlZCBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhY2thZ2VGcmFnbWVudFJvb3RJc1NvdXJjZUZvbGRlcihJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXJfKHBmcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gcGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyXyhJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gcGZyLmV4aXN0cygpICYmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGNoZWNrZWQgZXhjZXB0aW9uIGFuZCBjaGVjayBmb3Igb3V0IG9mIHN5bmMgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oSVBhcmVudCBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZ25vcmUgRk5GRSAtIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgd29ya3NwYWNlIGlzIG91dCBvZiBzeW5jIHdpdGggTy9TIGZpbGUgc3lzdGVtCi0JCQlpZiAoICEgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElKYXZhRWxlbWVudFtdIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWSA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0KLQkvKioKLQkgKiBDbGltYiB0aGUgc3BlY2lmaWVkIHR5cGUncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgbG9va2luZyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGludGVyZmFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZU5hbWVkSW1wbGVtZW50c0ludGVyZmFjZU5hbWVkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKGphdmFQcm9qZWN0LCBqYXZhUHJvamVjdC5maW5kVHlwZSh0eXBlTmFtZSksIGphdmFQcm9qZWN0LmZpbmRUeXBlKGludGVyZmFjZU5hbWUpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlTmFtZWQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSB0eXBlLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0eXBlSW1wbGVtZW50c0ludGVyZmFjZShqYXZhUHJvamVjdCwgdHlwZSwgamF2YVByb2plY3QuZmluZFR5cGUoaW50ZXJmYWNlTmFtZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNJbnRlcmZhY2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSB0eXBlLCBJVHlwZSBpbnRlcmZhc2UpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAoKHR5cGUgPT0gbnVsbCkgfHwgKGludGVyZmFzZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBpbnRlcmZhc2UuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWZvciAoU3RyaW5nIHN1cGVySW50ZXJmYWNlTmFtZSA6IHJlc29sdmVTdXBlckludGVyZmFjZU5hbWVzKHR5cGUpKSB7Ci0JCQlpZiAoc3VwZXJJbnRlcmZhY2VOYW1lLmVxdWFscyhpbnRlcmZhY2VOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJLy8gcmVjdXJzZSBpbnRvIHN1cGVyIGludGVyZmFjZQotCQkJaWYgKHR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKGphdmFQcm9qZWN0LCBqYXZhUHJvamVjdC5maW5kVHlwZShzdXBlckludGVyZmFjZU5hbWUpLCBpbnRlcmZhc2UpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyByZWN1cnNlIGludG8gc3VwZXJjbGFzcwotCQlyZXR1cm4gdHlwZUltcGxlbWVudHNJbnRlcmZhY2UoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHJlc29sdmVTdXBlcmNsYXNzTmFtZSh0eXBlKSksIGludGVyZmFzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUncyBzdXBlciBpbnRlcmZhY2VzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsIGZvciB3aGF0ZXZlciByZWFzb24sIHtAbGluayBJVHlwZSNnZXRTdXBlckludGVyZmFjZU5hbWVzKCl9Ci0JICogcmV0dXJucyB1bnF1YWxpZmllZCBuYW1lcyB3aGVuIHRoZSB0eXBlIGlzIGZyb20gSmF2YSBzb3VyY2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiByZXNvbHZlU3VwZXJJbnRlcmZhY2VOYW1lcyhJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHR5cGUuaXNCaW5hcnkoKSkgewotCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4odHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHJlc29sdmVkU3VwZXJJbnRlcmZhY2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzdXBlckludGVyZmFjZU5hbWUgOiB0eXBlLmdldFN1cGVySW50ZXJmYWNlTmFtZXMoKSkgewotCQkJcmVzb2x2ZWRTdXBlckludGVyZmFjZU5hbWVzLmFkZChyZXNvbHZlVHlwZSh0eXBlLCBzdXBlckludGVyZmFjZU5hbWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRTdXBlckludGVyZmFjZU5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUncyBzdXBlcmNsYXNzLgotCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsIGZvciB3aGF0ZXZlciByZWFzb24sIHtAbGluayBJVHlwZSNnZXRTdXBlcmNsYXNzTmFtZSgpfQotCSAqIHJldHVybnMgdW5xdWFsaWZpZWQgbmFtZXMgd2hlbiB0aGUgdHlwZSBpcyBmcm9tIEphdmEgc291cmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXNvbHZlU3VwZXJjbGFzc05hbWUoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0eXBlLmlzQmluYXJ5KCkgPwotCQkJCXR5cGUuZ2V0U3VwZXJjbGFzc05hbWUoKSA6Ci0JCQkJcmVzb2x2ZVR5cGUodHlwZSwgdHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGdyYWIgdGhlIGZpcnN0IGNhbmRpZGF0ZSB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXNvbHZlVHlwZShJVHlwZSB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nW11bXSByZXNvbHZlZENsYXNzTmFtZXMgPSB0eXBlLnJlc29sdmVUeXBlKGNsYXNzTmFtZSk7Ci0JCWlmIChyZXNvbHZlZENsYXNzTmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHBrZyA9IHJlc29sdmVkQ2xhc3NOYW1lc1swXVswXTsKLQkJU3RyaW5nIGNscyA9IHJlc29sdmVkQ2xhc3NOYW1lc1swXVsxXTsKLQkJLy8gY2hlY2sgZm9yIGRlZmF1bHQgcGFja2FnZQotCQlyZXR1cm4gKHBrZy5sZW5ndGgoKSA9PSAwKSA/IGNscyA6IChwa2cgKyAnLicgKyBjbHMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldEphdmFTb3VyY2VGb2xkZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PigKLQkJCQlnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhqYXZhUHJvamVjdCksCi0JCQkJU09VUkNFX1BBQ0tBR0VfRlJBR01FTlRfUk9PVF9GSUxURVIKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9Ci0JCW5ldyBGaWx0ZXI8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgewotCQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXIocGZyKTsKLQkJCX0KLQkJfTsKLQotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290c18oamF2YVByb2plY3QpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHNfKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzICJiYXNpYyIuCi0JICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSBtYXkgaW5jbHVkZSBhcnJheSBicmFja2V0cyBidXQgbm90IGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZUlzQmFzaWMoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCi0JCWlmIChmdWxseVF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IGFycmF5RGVwdGggPSBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihmdWxseVF1YWxpZmllZE5hbWUpOwotCQlpZiAoYXJyYXlEZXB0aCA+IDEpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZAotCQl9Ci0KLQkJaWYgKGFycmF5RGVwdGggPT0gMSkgewotCQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oZnVsbHlRdWFsaWZpZWROYW1lLCAxKTsKLQkJCXJldHVybiBlbGVtZW50VHlwZUlzVmFsaWRGb3JCYXNpY0FycmF5KGVsZW1lbnRUeXBlTmFtZSk7Ci0JCX0KLQotCQkvLyBhcnJheURlcHRoID09IDAKLQkJaWYgKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYW55IHByaW1pdGl2ZSBidXQgJ3ZvaWQnCi0JCX0KLQkJaWYgKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihmdWxseVF1YWxpZmllZE5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGFueSBwcmltaXRpdmUgd3JhcHBlciBidXQgJ2phdmEubGFuZy5Wb2lkJwotCQl9Ci0JCWlmICh0eXBlSXNPdGhlclZhbGlkQmFzaWNUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlSW1wbGVtZW50c0ludGVyZmFjZU5hbWVkKGphdmFQcm9qZWN0LCB0eXBlLCBTRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlLmlzRW51bSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSA9IGphdmEuaW8uU2VyaWFsaXphYmxlLmNsYXNzLmdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBhIHZhbGlkIGVsZW1lbnQgdHlwZSBmb3IKLQkgKiBhIG9uZS1kaW1lbnNpb25hbCBhcnJheSB0aGF0IGNhbiBkZWZhdWx0IHRvIGEgYmFzaWMgbWFwcGluZzo8dWw+Ci0JICogPGxpPjxjb2RlPmJ5dGU8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmphdmEubGFuZy5CeXRlPC9jb2RlPgotCSAqIDxsaT48Y29kZT5jaGFyPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRUeXBlSXNWYWxpZEZvckJhc2ljQXJyYXkoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhWQUxJRF9CQVNJQ19BUlJBWV9FTEVNRU5UX1RZUEVfTkFNRVMsIGVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfQkFTSUNfQVJSQVlfRUxFTUVOVF9UWVBFX05BTUVTID0gewotCQlieXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJY2hhci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5CeXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcy5nZXROYW1lKCkKLQl9OwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGFtb25nIHRoZSB2YXJpb3VzICJvdGhlciIgdHlwZXMKLQkgKiB0aGF0IGNhbiBkZWZhdWx0IHRvIGEgYmFzaWMgbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzT3RoZXJWYWxpZEJhc2ljVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuY29udGFpbnMoT1RIRVJfVkFMSURfQkFTSUNfVFlQRV9OQU1FUywgdHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE9USEVSX1ZBTElEX0JBU0lDX1RZUEVfTkFNRVMgPSB7Ci0JCWphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnNxbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuVGltZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCksCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNDZiYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgR09GIENvbW1hbmQgZGVzaWduIHBhdHRlcm4gaW4gYW4KLSAqIEVjbGlwc2Ugam9iLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKb2JDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKiBUaGUgY29tbWFuZCBzaG91bGQgY2hlY2ssIGFzIGFwcHJvcHJpYXRlLCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcHJvZ3Jlc3MKLQkgKiBtb25pdG9yIGlzIHtAbGluayBJUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKSAiY2FuY2VsZWQifTsgaWYgaXQgaXMsCi0JICogdGhlIGNvbW1hbmQgc2hvdWxkIHRocm93IGFuCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbn0uCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCSAqLwotCUlTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBqb2IgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZyB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBKb2JDb21tYW5kLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEpvYkNvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIEpvYkNvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBhcmcwKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSm9iQ29tbWFuZC5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGpvYiBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZCBpbXBsZW1lbnRzIEpvYkNvbW1hbmQsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSm9iQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlwdWJsaWMgc3RhdGljIEpvYkNvbW1hbmQgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIGFyZzApIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKb2JDb21tYW5kLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYlN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWIwMjgzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLQotLyoqCi0gKiBUaGlzIHN5bmNocm9uaXplciB3aWxsIHBlcmZvcm0gc3luY2hyb25pemF0aW9ucyBpbiBhbiBFY2xpcHNlIGpvYiBvbiBhCi0gKiBzZXBhcmF0ZSB0aHJlYWQsIGFsbG93aW5nIGNhbGxzIHRvIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0KLSAqIHRvIHJldHVybiBpbW1lZGlhdGVseS4KLSAqIDxwPgotICogSWYgbmVjZXNzYXJ5LCB0aGUgY2xpZW50LXN1cHBsaWVkIGpvYiBjb21tYW5kIHNob3VsZCBoYW5kbGUgYW55Ci0gKiBleGNlcHRpb25zIGFwcHJvcHJpYXRlbHkuIEFsdGhvdWdoLCB0aGUgZGVmYXVsdCBleGNlcHRpb24taGFuZGxpbmcgcHJvdmlkZWQKLSAqIGJ5IHRoZSBFY2xpcHNlIEpvYiBGcmFtZXdvcmsgaXMgcHJvYmFibHkgYWRlcXVhdGUgaW4gbW9zdCBjYXNlczo8dWw+Ci0gKiA8bGk+QW4ge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbn0KLSAqICAgICByZXN1bHRzIGluIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXMjQ0FOQ0VMX1NUQVRVUyBDQU5DRUxfU1RBVFVTfS4KLSAqIDxsaT5Bbnkgbm9uLXtAbGluayBUaHJlYWREZWF0aH0ge0BsaW5rIFRocm93YWJsZX0KLSAqICAgICByZXN1bHRzIGluIGEge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzI0VSUk9SIEVSUk9SfQotICogICAgIHtAbGluayBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1cyBJU3RhdHVzfQotICogPC91bD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5qb2JzLldvcmtlciNydW4oKQotICovCi1wdWJsaWMgY2xhc3MgSm9iU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBTeW5jaHJvbml6ZXIKLXsKLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemF0aW9uIGlzIHBlcmZvcm1lZCBieSB0aGlzIGpvYi4gVGhlIHNhbWUgam9iIGlzIHVzZWQKLQkgKiBmb3IgZXZlcnkgc3RhcnQvc3RvcCBjeWNsZSAoc2luY2UgYSBqb2IgY2FuIGJlIHJlLXN0YXJ0ZWQpLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3luY2hyb25pemF0aW9uSm9iIGpvYjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIEpvYlN5bmNocm9uaXplcihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoam9iTmFtZSwgY29tbWFuZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmpvYiA9IHRoaXMuYnVpbGRKb2Ioam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOwotCX0KLQotCVN5bmNocm9uaXphdGlvbkpvYiBidWlsZEpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbml6YXRpb25Kb2Ioam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3cgdGhlIGpvYiB0byBiZSBzY2hlZHVsZWQsIGJ1dCBwb3N0cG9uZSB0aGUgZmlyc3Qgc3luY2hyb25pemF0aW9uCi0JICogdW50aWwgcmVxdWVzdGVkLCB2aWEge0BsaW5rICNzeW5jaHJvbml6ZSgpfS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5qb2Iuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiAiU2NoZWR1bGUiIHRoZSBqb2IuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCXRoaXMuam9iLnN5bmNocm9uaXplKCk7Ci0JfQotCi0JLyoqCi0JICogV2FpdCBmb3IgdGhlIGN1cnJlbnQgam9iIGV4ZWN1dGlvbiB0byBjb21wbGV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aGlzLmpvYi5zdG9wKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5qb2IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gam9iICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGpvYiB0aGF0IGdldHMgc2NoZWR1bGVkIGJ5IHRoZSBqb2Igc3luY2hyb25pemVyLgotCSAqIFdoZW4gdGhlIGpvYiBpcyBydW4gaXQgZXhlY3V0ZXMgdGhlIGNsaWVudC1zdXBwbGllZCBqb2IgY29tbWFuZC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgU3luY2hyb25pemF0aW9uSm9iIGV4dGVuZHMgSm9iIHsKLQkJLyoqCi0JCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgam9iIGNvbW1hbmQgdGhhdCBleGVjdXRlcyBldmVyeSB0aW1lIHRoZSBqb2IKLQkJICogcnVucy4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgSm9iQ29tbWFuZCBjb21tYW5kOwotCi0JCS8qKgotCQkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gZmFsc2UsIHRoZSBqb2IgZG9lcyBub3Qgc3RvcCBpbW1lZGlhdGVseTsKLQkJICogYnV0IGl0IHdpbGwgbm90IGJlIHNjaGVkdWxlZCB0byBydW4gYWdhaW4uCi0JCSAqLwotCQkvLyB1c2UgJ3ZvbGF0aWxlJyBiZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpc24ndCByZWFsbHkgcmVxdWlyZWQKLQkJdm9sYXRpbGUgYm9vbGVhbiBzaG91bGRTY2hlZHVsZTsKLQotCi0JCVN5bmNocm9uaXphdGlvbkpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJCXN1cGVyKGpvYk5hbWUpOwotCQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSBmYWxzZTsKLQkJCXRoaXMuc2V0UnVsZShzY2hlZHVsaW5nUnVsZSk7Ci0JCX0KLQotCQkvKioKLQkJICogSnVzdCBzZXQgdGhlICJzaG91bGQgc2NoZWR1bGUiIGZsYWcgc28gdGhlIGpvYiA8ZW0+Y2FuPC9lbT4gYmUKLQkJICogc2NoZWR1bGVkOyBidXQgZG9uJ3QgYWN0dWFsbHkgc2NoZWR1bGUgaXQuCi0JCSAqLwotCQl2b2lkIHN0YXJ0KCkgewotCQkJaWYgKHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgU3luY2hyb25pemVyIHdhcyBub3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IHRydWU7Ci0JCX0KLQotCQkvKioKLQkJICogU2ltcGx5IHJlLXNjaGVkdWxlIHRoZSBqb2IsIGFsbG93aW5nIHRoZSBjdXJyZW50IGV4ZWN1dGlvbgotCQkgKiB0byBydW4gdG8gY29tcGxldGlvbiAoaS5lLiBkbyBub3QgdHJ5IHRvIGNhbmNlbCBpdCBwcmVtYXR1cmVseSkuCi0JCSAqIFRoaXMgc2hvdWxkIG1pbmltaXplIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGpvYiBpcyByZS1leGVjdXRlZAotCQkgKiAocmVjdXJzaXZlbHkgYW5kIG90aGVyd2lzZSkuCi0JCSAqLwotCQl2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5zY2hlZHVsZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFueSB1bmNhdWdodCBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29tbWFuZCB3aWxsIGJlIHJlYXNvbmFibHkKLQkJICogaGFuZGxlZCBieSB0aGUgSm9iIEZyYW1ld29yay4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuV29ya2VyI3J1bigpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHRoaXMuY29tbWFuZC5leGVjdXRlKG1vbml0b3IpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcgYWdhaW4gYW5kIHdhaXQgZm9yIHRoZSBjdXJyZW50Ci0JCSAqIGV4ZWN1dGlvbiwgaWYgdGhlcmUgaXMgYW55LCB0byBlbmQgYmVmb3JlIHJldHVybmluZy4KLQkJICovCi0JCXZvaWQgc3RvcCgpIHsKLQkJCWlmICggISB0aGlzLnNob3VsZFNjaGVkdWxlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIFN5bmNocm9uaXplciB3YXMgbm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSBqb2IgZnJvbSBiZWluZyBzY2hlZHVsZWQgdG8gcnVuIGFnYWluCi0JCQl0aGlzLnNob3VsZFNjaGVkdWxlID0gZmFsc2U7Ci0JCQkvLyB0aGlzIHdpbGwgY2FuY2VsIHRoZSBqb2IgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQsIGJ1dCBpcyBjdXJyZW50bHkgV0FJVElORwotCQkJdGhpcy5jYW5jZWwoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gaWYgdGhlIGpvYiBpcyBjdXJyZW50bHkgUlVOTklORywgd2FpdCB1bnRpbCBpdCBpcyBkb25lIGJlZm9yZSByZXR1cm5pbmcKLQkJCQl0aGlzLmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gdGhlIHRocmVhZCB0aGF0IGNhbGxlZCAjc3RvcCgpIHdhcyBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIHRvCi0JCQkJLy8gam9pbiB0aGUgc3luY2hyb25pemF0aW9uIGpvYiAtIGlnbm9yZTsKLQkJCQkvLyAnc2hvdWxkU2NoZWR1bGUnIGlzIHN0aWxsIHNldCB0byAnZmFsc2UnLCBzbyB0aGUgam9iIGxvb3Agd2lsbCBzdGlsbCBzdG9wIC0gd2UKLQkJCQkvLyBqdXN0IHdvbid0IHdhaXQgYXJvdW5kIGZvciBpdC4uLgotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaXMgcGFydCBvZiB0aGUgbm9ybWFsIHtAbGluayBKb2J9IGJlaGF2aW9yLiBCeSBkZWZhdWx0LCBpdCBpcwotCQkgKiBub3QgdXNlZCAoaS5lLiBpdCBhbHdheXMgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqIFdlIGltcGxlbWVudCBpdCBoZXJlLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFNjaGVkdWxlKCkgewotCQkJcmV0dXJuIHRoaXMuc2hvdWxkU2NoZWR1bGU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9QbGF0Zm9ybVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1BsYXRmb3JtVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzODU1Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1BsYXRmb3JtVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIG9mIHV0aWxpdGllcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBFY2xpcHNlIHBsYXRmb3JtIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtVG9vbHMgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElDb250YWluZXJ9IHdpdGggdGhlIHdvcmtzcGFjZSByZWxhdGl2ZSAiZnVsbCIgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUNvbnRhaW5lciBnZXRDb250YWluZXIoSVBhdGggZnVsbENvbnRhaW5lclBhdGgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCS8vIGNoYW5nZWQgdG8gaGFuZGxlIG5vbi13b3Jrc3BhY2UgcHJvamVjdHMKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZnVsbENvbnRhaW5lclBhdGguc2VnbWVudCgwKS50b1N0cmluZygpOwotCQlJUGF0aCBwcm9qZWN0UmVsYXRpdmVQYXRoID0gZnVsbENvbnRhaW5lclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChwcm9qZWN0UmVsYXRpdmVQYXRoLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3QuZ2V0Rm9sZGVyKHByb2plY3RSZWxhdGl2ZVBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBJRmlsZX0gd2l0aCB0aGUgd29ya3NwYWNlIHJlbGF0aXZlICJmdWxsIiBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRGaWxlKElQYXRoIGZ1bGxGaWxlUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJcmV0dXJuIHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKHJvb3QuZ2V0TG9jYXRpb24oKS5hcHBlbmQoZnVsbEZpbGVQYXRoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGZpbGUncyBjb250ZW50IHR5cGUsCi0JICogdXNpbmcgdGhlIEVjbGlwc2UgcGxhdGZvcm0ncyBjb250ZW50IHR5cGUgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlJbnB1dFN0cmVhbSBmaWxlQ29udGVudHMgPSBudWxsOwotCQl0cnkgewotCQkJZmlsZUNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBzZWVtcyBsaWtlIHdlIGNhbiBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IG9jY3VyIGhlcmU7Ci0JCQkvLyBlLmcuIHdlIGdldCBhIEZORkUgaWYgdGhlIHdvcmtzcGFjZSBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgTy9TIGZpbGUgc3lzdGVtCi0JCQkvLyBKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0KLQkJCS8vIGxvb2sgZm9yIGNvbnRlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lIG9ubHkoPykKLQkJCXJldHVybiBmaW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCQl9Ci0KLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRUeXBlID0gZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaWxlQ29udGVudHMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZmluZENvbnRlbnRUeXBlRm9yKElucHV0U3RyZWFtIGZpbGVDb250ZW50cywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBmaW5kQ29udGVudFR5cGVGb3IoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBnZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZU1hbmFnZXIgZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSBQbGF0Zm9ybVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvU2ltcGxlU2NoZWR1bGluZ1J1bGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvU2ltcGxlU2NoZWR1bGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkOGEyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIGpvYiBzY2hlZHVsaW5nIHJ1bGUgdGhhdCBjb25mbGljdHMgb25seSB3aXRoIGl0c2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZVNjaGVkdWxpbmdSdWxlCi0JaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUKLXsKLQlwdWJsaWMgU2ltcGxlU2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdkNWRjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkFic3RyYWN0VGV4dFJhbmdlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiBUZXh0UmFuZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUZXh0UmFuZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgb2Zmc2V0OwotCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLQlwcml2YXRlIGZpbmFsIGludCBsaW5lTnVtYmVyOwotCi0JcHVibGljIFNpbXBsZVRleHRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubGluZU51bWJlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvWFBvaW50VG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvWFBvaW50VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0MmZiNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1hQb2ludFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFV0aWxpdGllcyBmb3IgZXh0ZW5zaW9uIHBvaW50IG1hbmFnZW1lbnQsIHZhbGlkYXRpb24sIGV0Yy4KLSAqLwotcHVibGljIGNsYXNzIFhQb2ludFRvb2xzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnRWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpCi0JCQl0aHJvd3MgWFBvaW50RXhjZXB0aW9uIHsKLQkJCi0JCVN0cmluZyB2YWwgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKHZhbCA9PSBudWxsKSB7Ci0JCQlsb2dNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIGF0dHJpYnV0ZU5hbWUpOwotCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB2YWw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgaW5zdGFudGlhdGUoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBjbGFzc05hbWUsIENsYXNzPFQ+IGludGVyZmF6ZSkgewotCQlDbGFzczxUPiBjbGF6eiA9IGxvYWRDbGFzcyhwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQsIGNsYXNzTmFtZSwgaW50ZXJmYXplKTsKLQkJcmV0dXJuIChjbGF6eiA9PSBudWxsKSA/IG51bGwgOiBpbnN0YW50aWF0ZShwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQsIGNsYXp6KTsKLSAgICB9Ci0JCi0JLyoqCi0JICogSW5zdGFudGlhdGUgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIGluc3RhbnRpYXRlKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBDbGFzczxUPiBjbGF6eikgewotCQl0cnkgewotCQkJcmV0dXJuIGNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJbG9nRmFpbGVkSW5zdGFudGlhdGlvbihleCwgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50LCBjbGF6ei5nZXROYW1lKCkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioJCi0JICogTG9hZCB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBjYXN0IGl0IHRvIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIDxUPiBDbGFzczxUPiBsb2FkQ2xhc3MoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBjbGFzc05hbWUsIENsYXNzPFQ+IGludGVyZmF6ZSkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQotCQlDbGFzczw/PiBjbGF6ejsKLQkJdHJ5IHsKLQkJCWNsYXp6ID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ0ZhaWxlZENsYXNzTG9hZChleCwgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50LCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmIChpbnRlcmZhemUuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQ2xhc3M8VD4gY2xhenpUID0gKENsYXNzPFQ+KSBjbGF6ejsKLQkJCXJldHVybiBjbGF6elQ7Ci0JCX0KLQkJCi0JCWxvZ0ZhaWxlZEludGVyZmFjZUFzc2lnbm1lbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50LCBjbGFzc05hbWUsIGludGVyZmF6ZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWxvZyhKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfRFVQTElDQVRFLCBleHRlbnNpb25Qb2ludCwgbm9kZU5hbWUsIHZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZyhKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEUsCi0JCQkJYXR0cmlidXRlTmFtZSwKLQkJCQljb25maWdFbGVtZW50LmdldE5hbWUoKSwKLQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nSW52YWxpZFZhbHVlKAotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBub2RlTmFtZSwgU3RyaW5nIGludmFsaWRWYWx1ZSkgewotCQkKLQkJbG9nKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9JTlZBTElEX1ZBTFVFLAotCQkJCWludmFsaWRWYWx1ZSwKLQkJCQlub2RlTmFtZSwKLQkJCQljb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpLAotCQkJCWNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0ZhaWxlZENsYXNzTG9hZChFeGNlcHRpb24gZXgsIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWxvZyhleCwgSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FELAotCQkJCWNsYXNzTmFtZSwKLQkJCQlleHRlbnNpb25Qb2ludCwKLQkJCQlwbHVnaW5JZCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nRmFpbGVkSW50ZXJmYWNlQXNzaWdubWVudCgKLQkJCVN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQkKLQkJbG9nKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9GQUlMRURfSU5URVJGQUNFX0FTU0lHTk1FTlQsCi0JCQkJY2xhc3NOYW1lLAotCQkJCWV4dGVuc2lvblBvaW50LAotCQkJCXBsdWdpbklkLAotCQkJCWludGVyZmFjZU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0ZhaWxlZEluc3RhbnRpYXRpb24oRXhjZXB0aW9uIGV4LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlsb2coZXgsIEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTiwKLQkJCQljbGFzc05hbWUsCi0JCQkJZXh0ZW5zaW9uUG9pbnQsCi0JCQkJcGx1Z2luSWQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFN0cmluZy4uLiBiaW5kaW5ncykgewotCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhOTFMuYmluZChtc2csIGJpbmRpbmdzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4LCBTdHJpbmcgbXNnLCBTdHJpbmcuLi4gYmluZGluZ3MpIHsKLQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coTkxTLmJpbmQobXNnLCBiaW5kaW5ncyksIGV4KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgZXgpIHsKLQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFhQb2ludEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0FTVE5vZGVUZXh0UmFuZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0FTVE5vZGVUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0NGY5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1ROb2RlVGV4dFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuQWJzdHJhY3RUZXh0UmFuZ2U7Ci0KLS8qKgotICogQWRhcHQgYW4gQVNUTm9kZSB0byB0aGUgVGV4dFJhbmdlIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIEFTVE5vZGVUZXh0UmFuZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZSB7Ci0JcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIGFzdE5vZGU7Ci0KLQlwdWJsaWMgQVNUTm9kZVRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hc3ROb2RlID0gYXN0Tm9kZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMuYXN0Tm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmFzdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gKChDb21waWxhdGlvblVuaXQpIHRoaXMuYXN0Tm9kZS5nZXRSb290KCkpLmdldExpbmVOdW1iZXIodGhpcy5nZXRPZmZzZXQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiYjJkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQW5ub3RhdGlvbkJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZU1ldGhvZFNpZ25hdHVyZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggSkRUIEFTVHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RUb29scyB7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBBU1Qgd2l0aG91dCBtZXRob2QgYm9kaWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiB3aXRoIGl0cyBiaW5kaW5ncyByZXNvbHZlZCAoYW5kIHRoZSByZXN1bHRhbnQgcGVyZm9ybWFuY2UgaGl0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKGNvbXBpbGF0aW9uVW5pdCk7Ci0JCXBhcnNlci5zZXRJZ25vcmVNZXRob2RCb2RpZXModHJ1ZSk7ICAvLyB3ZSBkb24ndCBuZWVkIG1ldGhvZCBib2RpZXMKLQkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkodHJ1ZSk7ICAvLyBzZWUgYnVncyAxOTYyMDAsIDIyMjczNQotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSkRUIERPTSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5RVUFMSUZJRURfTkFNRToKLQkJCWNhc2UgQVNUTm9kZS5TSU1QTEVfTkFNRToKLQkJCQlyZXR1cm4gcmVzb2x2ZUVudW0oKE5hbWUpIGV4cHJlc3Npb24pOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVFbnVtKE5hbWUgZW51bUV4cHJlc3Npb24pIHsKLQkJSUJpbmRpbmcgYmluZGluZyA9IGVudW1FeHByZXNzaW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gVE9ETyBmaWd1cmUgb3V0IHdoeSB0aGlzIGlzIG51bGwgc29tZXRpbWVzCi0JCX0KLQkJaWYgKGJpbmRpbmcuZ2V0S2luZCgpICE9IElCaW5kaW5nLlZBUklBQkxFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVmFyaWFibGVCaW5kaW5nIHZhcmlhYmxlQmluZGluZyA9IChJVmFyaWFibGVCaW5kaW5nKSBiaW5kaW5nOwotCQlyZXR1cm4gdmFyaWFibGVCaW5kaW5nLmdldFR5cGUoKS5nZXRRdWFsaWZpZWROYW1lKCkgKyAnLicgKyB2YXJpYWJsZUJpbmRpbmcuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBub2RlJ3MgYW5ub3RhdGlvbgotCSAqIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVBbm5vdGF0aW9uKEFubm90YXRpb24gbm9kZSkgewotCQlJQW5ub3RhdGlvbkJpbmRpbmcgYW5ub3RhdGlvbkJpbmRpbmcgPSBub2RlLnJlc29sdmVBbm5vdGF0aW9uQmluZGluZygpOwotCQlpZiAoYW5ub3RhdGlvbkJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVR5cGVCaW5kaW5nIGFubm90YXRpb25UeXBlQmluZGluZyA9IGFubm90YXRpb25CaW5kaW5nLmdldEFubm90YXRpb25UeXBlKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvblR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb25UeXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0eXBlJ3MgZnVsbHktCi0JICogcXVhbGlmaWVkIG5hbWUuIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlJVHlwZUJpbmRpbmcgcmVzb2x2ZWRUeXBlQmluZGluZyA9IHJlc29sdmVUeXBlQmluZGluZyhleHByZXNzaW9uKTsKLQkJcmV0dXJuIChyZXNvbHZlZFR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IHJlc29sdmVkVHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZwotCSAqIHR5cGUgYmluZGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlQmluZGluZyByZXNvbHZlVHlwZUJpbmRpbmcoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKLQkJCXJldHVybiAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFNpZ25hdHVyZSBidWlsZE1ldGhvZFNpZ25hdHVyZShNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgKLQkJCQltZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksCi0JCQkJYnVpbGRQYXJhbWV0ZXJUeXBlcyhtZXRob2REZWNsYXJhdGlvbikKLQkJCSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZVtdIGJ1aWxkUGFyYW1ldGVyVHlwZXMoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24pIHsKLQkJTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyhtZXRob2REZWNsYXJhdGlvbik7Ci0JCWludCBsZW4gPSBwYXJhbWV0ZXJzLnNpemUoKTsKLQkJSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBKYXZhVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZSA9IHBhcmFtZXRlcnMuZ2V0KGkpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCQkJcGFyYW1ldGVyVHlwZXNbaV0gPSBuZXcgU2ltcGxlSmF2YVR5cGUodHlwZS5nZXRRdWFsaWZpZWROYW1lKCksIHR5cGUuZ2V0RGltZW5zaW9ucygpKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIExpc3Q8U2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVycyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbWV0aG9kRGVjbGFyYXRpb24ucGFyYW1ldGVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCBhbmQgdGhlIHR5cGUgYmluZGluZwotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgZXhpc3RzIGluIHRoZSB0eXBlCi0JICogbGl0ZXJhbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzIGFuZCBpbnRlcmZhY2VzKS4KLQkgKiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihFeHByZXNzaW9uIGV4cHJlc3Npb24sIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgewotCQlyZXR1cm4gZmluZFR5cGVJbkhpZXJhcmNoeShleHByZXNzaW9uLCBzZWFyY2hUeXBlTmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwsIHJldHVybiB0aGUgdHlwZSBiaW5kaW5nCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBpZiBpdCBleGlzdHMgaW4gdGhlIHR5cGUKLQkgKiBsaXRlcmFsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMgYW5kIGludGVyZmFjZXMpLgotCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUeXBlQmluZGluZyBmaW5kVHlwZUluSGllcmFyY2h5KEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHNlYXJjaFR5cGVOYW1lKSB7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHJlc29sdmVUeXBlQmluZGluZyhleHByZXNzaW9uKTsKLQkJcmV0dXJuICh0eXBlQmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBmaW5kVHlwZUluSGllcmFyY2h5KHR5cGVCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSB0eXBlIGJpbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBleGlzdHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHR5cGUgYmluZGluZydzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzCi0JICogYW5kIGludGVyZmFjZXMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNTdWJUeXBlT2YoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGZpbmRUeXBlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBiaW5kaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgaWYgaXQKLQkgKiBleGlzdHMgaW4gdGhlIHNwZWNpZmllZCB0eXBlIGJpbmRpbmcncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcwotCSAqIGFuZCBpbnRlcmZhY2VzKS4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5IaWVyYXJjaHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGZpbmRUeXBlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCBuZXcgSGFzaFNldDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElUeXBlQmluZGluZyBmaW5kVHlwZUluSGllcmFyY2h5KElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaFR5cGVOYW1lLCBIYXNoU2V0PFN0cmluZz4gdmlzaXRlZCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCWlmICh2aXNpdGVkLmNvbnRhaW5zKHR5cGVOYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHR5cGVOYW1lLmVxdWFscyhzZWFyY2hUeXBlTmFtZSkpIHsKLQkJCXJldHVybiB0eXBlQmluZGluZzsKLQkJfQotCQl2aXNpdGVkLmFkZCh0eXBlTmFtZSk7Ci0JCQotCQlJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA9IGZpbmRUeXBlSW5JbnRlcmZhY2VzKHR5cGVCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSwgdmlzaXRlZCk7Ci0JCWlmIChpbnRlcmZhY2VCaW5kaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBpbnRlcmZhY2VCaW5kaW5nOwotCQl9Ci0JCQotCQlyZXR1cm4gZmluZFR5cGVJblN1cGVyY2xhc3Nlcyh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIHZpc2l0ZWQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElUeXBlQmluZGluZyBmaW5kVHlwZUluSW50ZXJmYWNlcyhJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSwgSGFzaFNldDxTdHJpbmc+IHZpc2l0ZWQpIHsKLQkJSVR5cGVCaW5kaW5nW10gaW50ZXJmYWNlQmluZGluZ3MgPSB0eXBlQmluZGluZy5nZXRJbnRlcmZhY2VzKCk7Ci0JCWZvciAoSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgOiBpbnRlcmZhY2VCaW5kaW5ncykgeyAgLy8gcmVjdXJzZSB1cCBpbnRlcmZhY2VzCi0JCQlJVHlwZUJpbmRpbmcgcmVzdWx0ID0gZmluZFR5cGVJbkhpZXJhcmNoeShpbnRlcmZhY2VCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSwgdmlzaXRlZCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5TdXBlcmNsYXNzZXMoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUsIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkKSB7Ci0JCUlUeXBlQmluZGluZyBzdXBlckJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCWlmIChzdXBlckJpbmRpbmcgIT0gbnVsbCkgeyAgLy8gcmVjdXJzZSB1cCBzdXBlcmNsYXNzZXMKLQkJCUlUeXBlQmluZGluZyByZXN1bHQgPSBmaW5kVHlwZUluSGllcmFyY2h5KHN1cGVyQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIHZpc2l0ZWQpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gaXMgYSB0eXBlIGxpdGVyYWwgYW5kIHRoZSB0eXBlIGJpbmRpbmcKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG5hbWUgZXhpc3RzIGluIHRoZSB0eXBlCi0JICogbGl0ZXJhbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzIGFuZCBpbnRlcmZhY2VzKS4KLQkgKiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHNlYXJjaEludGVyZmFjZU5hbWUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcmVzb2x2ZVR5cGVCaW5kaW5nKGV4cHJlc3Npb24pOwotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmaW5kSW50ZXJmYWNlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaEludGVyZmFjZU5hbWUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSB0eXBlIGJpbmRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVyZmFjZSBuYW1lIGV4aXN0cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgdHlwZSBiaW5kaW5nJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMKLQkgKiBhbmQgaW50ZXJmYWNlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJbXBsZW1lbnRzSW50ZXJmYWNlKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaEludGVyZmFjZU5hbWUpIHsKLQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoSW50ZXJmYWNlTmFtZSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRJbnRlcmZhY2VJbkhpZXJhcmNoeShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hJbnRlcmZhY2VOYW1lKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA9IGZpbmRUeXBlSW5JbnRlcmZhY2VzKHR5cGVCaW5kaW5nLCBzZWFyY2hJbnRlcmZhY2VOYW1lLCB2aXNpdGVkKTsKLQkJaWYgKGludGVyZmFjZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGludGVyZmFjZUJpbmRpbmc7Ci0JCX0KLQkJCi0JCXJldHVybiBmaW5kVHlwZUluU3VwZXJjbGFzc2VzKHR5cGVCaW5kaW5nLCBzZWFyY2hJbnRlcmZhY2VOYW1lLCB2aXNpdGVkKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMzMzIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudHMgQW5ub3RhdGlvbkFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50OwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50OwotCQl0aGlzLmRhYSA9IGRhYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TWFya2VyQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGROZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdOb3JtYWxBbm5vdGF0aW9uKCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFhLmdldEFzdE5vZGUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGFhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0KEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQuZWRpdChlZGl0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkTmV3TWFya2VyQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgYnVpbGROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IE5ld1NpbmdsZU1lbWJlckFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcih0aGlzLmRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkUmVtb3ZlQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JCU5ld01hcmtlckFubm90YXRpb25FZGl0b3IoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRhYSA9IGRhYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFhLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvciBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciB7Ci0JCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQkJTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGFhID0gZGFhOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJdGhpcy5kYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JCVJlbW92ZUFubm90YXRpb25FZGl0b3IoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRhYSA9IGRhYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFhLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMWM0ZWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uQW5kSW1wb3J0KGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbkFuZEltcG9ydChkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCkpOwotCQl0aGlzLmFkZEFubm90YXRpb25BbmRJbXBvcnQoZGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCBzdGF0ZW1lbnQsIHRoZW4gc2hvcnRlbiB0aGUgYW5ub3RhdGlvbidzCi0JICogbmFtZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uQW5kSW1wb3J0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGRlY2xhcmF0aW9uLmdldEFzdCgpLm5ld05hbWUodGhpcy5nZXRTb3VyY2VDb2RlQW5ub3RhdGlvbk5hbWUoZGVjbGFyYXRpb24pKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgbmFtZSBhcyBpdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTsKLQkgKiBpLmUuIGlmIHdlIGNhbiBhZGQgaXQgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBpbXBvcnRzLCByZXR1cm4gdGhlIHNob3J0Ci0JICogbmFtZTsgaWYgd2UgY2FuJ3QgKGJlY2F1c2Ugb2YgYSBjb2xsaXNpb24pLCByZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCSAqIE5COiBhbiBpbXBvcnQgbWF5IGJlIGFkZGVkIGFzIGEgc2lkZS1lZmZlY3QgOi0oCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VDb2RlQW5ub3RhdGlvbk5hbWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uYWRkSW1wb3J0KHRoaXMuYW5ub3RhdGlvbk5hbWUpID8gdGhpcy5nZXRTaG9ydEFubm90YXRpb25OYW1lKCkgOiB0aGlzLmFubm90YXRpb25OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwKLQkgKiByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyAncHVibGljJyBiZWNhdXNlIHdlIHVzZSBpdCBpbiBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JICogdG8gZ2V0IHRoZSBhbm5vdGF0aW9uIG5hbWUgZnJvbSBhIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25OYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lTWF0Y2hlcyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMubmFtZU1hdGNoZXMoZGVjbGFyYXRpb24sIGFubm90YXRpb24sIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVNYXRjaGVzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmFubm90YXRpb25Jc05hbWVkKGFubm90YXRpb24sIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oQVNUIGFzdCkgewotCQlyZXR1cm4gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGFzdCwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewotCQlNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFzdC5uZXdOYW1lKG5hbWUpKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QgYXN0KSB7Ci0JCXJldHVybiB0aGlzLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oYXN0LCB0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QpIHsKLQkJcmV0dXJuIHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvcnRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0TmFtZSh0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI0OWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBHYXRoZXIgdG9nZXRoZXIgdGhlIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvci4KLSAqIFQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gYW4gZXhwcmVzc2lvbi4KLSAqIAotICogV2UncmUgc3RpbGwgZmlndXJpbmcgb3V0IEphdmEgR2VuZXJpY3MgaGVyZS4uLi4gVGhlIG1ldGhvZHMgaW4gdGhpcyBhYnN0cmFjdAotICogY2xhc3Mgd29yayBmaW5lIHdpdGggYW55IHN1YmNsYXNzIG9mIEV4cHJlc3Npb24gRTsgYnV0IGEgQ2xhc3NDYXN0RXhjZXB0aW9uCi0gKiB3aWxsIG9jY3VyIGFzIHNvb24gYXMgd2UgY2FsbCBhbnkgbWV0aG9kIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MKLSAqIChlLmcuIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIpIHRoYXQgZXhwZWN0cyBhIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YKLSAqIEV4cHJlc3Npb24gKGUuZy4gU3RyaW5nTGl0ZXJhbCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLXsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9iamVjdCAtPiBleHByZXNzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIChvYmplY3QgPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKGFzdCkgOiB0aGlzLmNvbnZlcnRPYmplY3Qob2JqZWN0LCBhc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgYSBudWxsIG9iamVjdC4gQnkgZGVmYXVsdCwgYSBudWxsIG9iamVjdCB3aWxsCi0JICogYmUgY29udmVydGVkIGludG8gYSBudWxsIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE51bGwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVCBhc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjY29udmVydChPYmplY3QsIEFTVCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRXhwcmVzc2lvbiBjb252ZXJ0T2JqZWN0KFQgb2JqZWN0LCBBU1QgYXN0KTsKLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIC0+IG9iamVjdCAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24gPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKCkgOiB0aGlzLmNvbnZlcnRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IGZvciBhIG51bGwgZXhwcmVzc2lvbi4gQnkgZGVmYXVsdCwgYSBudWxsIGV4cHJlc3Npb24gd2lsbAotCSAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgbnVsbCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIFQgY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNjb252ZXJ0KEV4cHJlc3Npb24pCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RKRFRUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEpEVFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJiZDIwMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEpEVFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBhYnN0cmFjdCB0eXBlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKRFRUeXBlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIEFic3RyYWN0VHlwZQotewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXModHlwZURlY2xhcmF0aW9uLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJdGhpcyhudWxsLCB0eXBlRGVjbGFyYXRpb24sIDEsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKRFRUeXBlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgewotCQlyZXR1cm4gKFR5cGUpIHN1cGVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE1lbWJlci9UeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJcmV0dXJuICh0ZCA9PSBudWxsKSA/IG51bGwgOiB0ZC5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCS8qKgotCSAqIGZpbmQgdGhlIHR5cGUncyBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgQVNUCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCX0KLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGRlY2xhcmluZ1R5cGUuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQkvLyB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCB3aGVuIHRoZSBzb3VyY2UgaXMgY29tcGxldGVseSBob3NlZAotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBmaXJzdCB0b3AtbGV2ZWwgdHlwZSBpbiB0aGUgc3BlY2lmaWVkIEFTVCB3aXRoIGEgbWF0Y2hpbmcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZXMoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucy50b0FycmF5KG5ldyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvblt0eXBlRGVjbGFyYXRpb25zLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCB0eXBlIGRlY2xhcmF0aW9uIHdpdGggbWF0Y2hpbmcgbmFtZSBhbmQgb2NjdXJyZW5jZSB3aXRoaW4gdGhlIGRlY2xhcmluZyB0eXBlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGZyb20gdGhlIHNwZWNpZmllZAotCSAqIHNldCBvZiB0eXBlIGRlY2xhcmF0aW9ucyAobWF0Y2ggbmFtZSBhbmQgb2NjdXJyZW5jZSkuCi0JICogT25seSByZXR1cm4gdHlwZSBvciBlbnVtIGRlY2xhcmF0aW9ucwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWludCBvY2N1cnJlbmNlID0gdGhpcy5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uIDogdHlwZURlY2xhcmF0aW9ucykgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gb2NjdXJyZW5jZSkgewotCQkJCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IHRoaXMuZ2V0QVNUTm9kZVR5cGUoKSkgPyB0eXBlRGVjbGFyYXRpb24gOiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlOwotCQkvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY29udGV4dCBtb2RlbCBoYXMgbm90IHlldAotCQkvLyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBidXQgaXMgc3RpbGwKLQkJLy8gYXNraW5nIGZvciBhbiBBU1ROb2RlIChlLmcuIGR1cmluZyBhIHNlbGVjdGlvbiBldmVudCkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRBU1ROb2RlVHlwZSgpOwotCi0JLyoqCi0JICogd2Ugb25seSBpbnN0YW50aWF0ZSBhIHNpbmdsZSB0b3AtbGV2ZWwsIG5vbi1hbm5vdGF0aW9uCi0JICogdHlwZSBwZXIgY29tcGlsYXRpb24gdW5pdCAoaS5lLiBhIGNsYXNzLCBlbnVtLCBvciBpbnRlcmZhY2UpCi0JICovCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVudW1EZWNsYXJhdGlvbltdIGdldEVudW1zKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJkID0gYm9keURlY2xhcmF0aW9ucyhkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pOwotCQlpbnQgdHlwZUNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvcjxCb2R5RGVjbGFyYXRpb24+IGl0ID0gYmQubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXQubmV4dCgpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJdHlwZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJRW51bURlY2xhcmF0aW9uW10gbWVtYmVyRW51bXMgPSBuZXcgRW51bURlY2xhcmF0aW9uW3R5cGVDb3VudF07Ci0JCWludCBuZXh0ID0gMDsKLQkJZm9yIChJdGVyYXRvcjxCb2R5RGVjbGFyYXRpb24+IGl0ID0gYmQubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlCb2R5RGVjbGFyYXRpb24gZGVjbCA9IGl0Lm5leHQoKTsKLQkJCWlmIChkZWNsLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJbWVtYmVyRW51bXNbbmV4dCsrXSA9IChFbnVtRGVjbGFyYXRpb24pIGRlY2w7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1lbWJlckVudW1zOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTJmNzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFB1bGwgdG9nZXRoZXIgc29tZSBvZiB0aGUgYmVoYXZpb3IgY29tbW9uIHRvCi0gKiB7QGxpbmsgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcn0KLSAqIGFuZCB7QGxpbmsgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJ9Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lOwotCi0JLy8gcmVkdWNlIE5MUyBjaGVja3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBvdXRlckFubm90YXRpb25BZGFwdGVyOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFeHByZXNzaW9uIHZhbHVlID0gdGhpcy5lbGVtZW50VmFsdWUob3V0ZXIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQW5ub3RhdGlvbiBpbm5lciA9IHRoaXMuZ2V0QW5ub3RhdGlvbih2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZXR1cm4gdGhlIGFubm90YXRpb24gb25seSBpZiBpdCBoYXMgYSBtYXRjaGluZyBuYW1lKD8pCi0JCXJldHVybiB0aGlzLm5hbWVNYXRjaGVzKGRlY2xhcmF0aW9uLCBpbm5lcikgPyBpbm5lciA6IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IHRoaXMuZWxlbWVudFZhbHVlKG91dGVyKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBoYWNrIHRvIGFsbG93IHNob3J0LWNpcmN1aXQgd2hlbiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKLQkJaWYgKHRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgb3V0ZXIsIHZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFubm90YXRpb24gaW5uZXIgPSB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIG9ubHkgaWYgaXQgaGFzIGEgbWF0Y2hpbmcgbmFtZSg/KQotCQlpZiAodGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgaW5uZXIpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIG91dGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIG91dGVyIGFubm90YXRpb24ncyBub2RlCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE5vcm1hbEFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFubm90YXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBleHByZXNzaW9uLAotCSAqIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiwKLQkgKiB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGFkYXB0ZXIncyBlbGVtZW50LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgb3V0ZXIgYW5ub3RhdGlvbiB0byB0aGUKLQkgKiBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBtb2RpZnlBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlCi0JICogc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbW9kaWZ5TWVtYmVyVmFsdWVQYWlyKE1lbWJlclZhbHVlUGFpciBwYWlyLCBBbm5vdGF0aW9uIGlubmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBnZXRPdXRlckFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnROYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhbiBhbm5vdGF0aW9uLCBjYXN0IGl0IHRvIGFuIGFubm90YXRpb247Ci0JICogb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoKLQkJCWNhc2UgQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT046Ci0JCQljYXNlIEFTVE5vZGUuTUFSS0VSX0FOTk9UQVRJT046Ci0JCQkJcmV0dXJuIChBbm5vdGF0aW9uKSBleHByZXNzaW9uOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgPGVtPmZpcnN0PC9lbT4gYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sIGNvbnZlcnRpbmcgdGhlIGFubm90YXRpb24gYXMgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCWlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCAoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIpOwotCQl9IGVsc2UgaWYgKG91dGVyLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBvdXRlcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIDxlbT5maXJzdDwvZW0+IGFubm90YXRpb24gZWxlbWVudCB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudAotCSAqIG5hbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uIENvbnZlcnQgdGhlIGFubm90YXRpb24gdG8KLQkgKiBhIG1hcmtlciBhbm5vdGF0aW9uIG9yIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkgKiA8cHJlPgotCSAqICYjNjQ7T3V0ZXIobmFtZT0iRnJlZCIsIGZvbz0mIzY0O0lubmVyKSA9PiAmIzY0O091dGVyKG5hbWU9IkZyZWQiKQotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIpIHsKLQkJdGhpcy5yZW1vdmVFbGVtZW50KG91dGVyKTsKLQkJdGhpcy5ub3JtYWxpemVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRoZSBlbGVtZW50IHdpdGgKLQkgKiB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gc3RyZWFtID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGEgbWFya2VyIGFubm90YXRpb24gb3IKLQkgKiBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm9ybWFsaXplQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBOb3JtYWxBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhvdXRlcik7Ci0JCXN3aXRjaCAodmFsdWVzLnNpemUoKSkgewotCQkJY2FzZSAwOgotCQkJCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgYWxsIGdvbmUsIGNvbnZlcnQgdGhlIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHZhbHVlcy5nZXQoMCk7Ci0JCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhWQUxVRSkpIHsKLQkJCQkJLy8gaWYgdGhlIGxhc3QgcmVtYWluaW5nIGVsZW1lbnQgaXMgJ3ZhbHVlJywgY29udmVydCB0aGUgYW5ub3RhdGlvbiB0byBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbgotCQkJCQlFeHByZXNzaW9uIHZ2ID0gcGFpci5nZXRWYWx1ZSgpOwotCQkJCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIHRvIGEgbWFya2VyIGFubm90YXRpb24KLQkgKiBpZiB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBvdXRlcikgewotCQkvLyBOT1AKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGVsZW1lbnRWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRWYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRWYWx1ZSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24pOwotCQlyZXR1cm4gKHBhaXIgPT0gbnVsbCkgPyBudWxsIDogcGFpci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYW5ub3RhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGVsZW1lbnRWYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIG1lbWJlciB2YWx1ZSBwYWlyIGZvciB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKGFubm90YXRpb24pKSB7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgb3V0ZXIgYW5ub3RhdGlvbiBhbmQgYWRkIHRoZSBzcGVjaWZpZWQKLQkgKiBpbm5lciBhbm5vdGF0aW9uIHRvIGl0OgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKiBvcgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGROZXdPdXRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpOwotCQl9IGVsc2UgewotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7Ci0JCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIHRvIGJlIGFkZGVkIHRvIGEgbmV3IG91dGVyIGFubm90YXRpb24KLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKEFubm90YXRpb24gaW5uZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCUFTVCBhc3QgPSB2YWx1ZS5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuYW1lKSk7Ci0JCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gcGFpcjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lCi0JICogYW5kIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcih0aGlzLmVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbWFya2VyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQl0aGlzLmJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm1vZGlmeUFubm90YXRpb25WYWx1ZShvdXRlciwgaW5uZXIpOwotCQl9IGVsc2UgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uTm9uVmFsdWUoZGVjbGFyYXRpb24sIG91dGVyLCBpbm5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24sCi0JICogY29udmVydGluZyBpdCB0byBhIG5vcm1hbCBhbm5vdGF0aW9uOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcih2YWx1ZT0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uTm9uVmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlFeHByZXNzaW9uIHZ2ID0gb3V0ZXIuZ2V0VmFsdWUoKTsKLQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5ld091dGVyID0gdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3T3V0ZXIpOwotCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKFZBTFVFLCB2dikpOwotCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbm9ybWFsIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIiwgZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICogb3IKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKCJsb3JlbSBpcHN1bSIpKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihvdXRlcik7Ci0JCWlmIChwYWlyID09IG51bGwpIHsKLQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhvdXRlcik7Ci0JCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGlubmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm1vZGlmeU1lbWJlclZhbHVlUGFpcihwYWlyLCBpbm5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxOWE1Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0gLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50OwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGRhZWEpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudDsKLQkJdGhpcy5kYWVhID0gZGFlYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYWVhLmdldFZhbHVlKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0VmFsdWUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRTZXRWYWx1ZUVkaXRvcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRFeHByZXNzaW9uKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0QXN0Tm9kZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYWVhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0KEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQuZWRpdChlZGl0b3IpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZFNldFZhbHVlRWRpdG9yKFQgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUVkaXRvcjxUPih2YWx1ZSwgdGhpcy5kYWVhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTZXRWYWx1ZUVkaXRvcjxUPiBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhOwotCQlwcml2YXRlIGZpbmFsIFQgdmFsdWU7Ci0KLQkJU2V0VmFsdWVFZGl0b3IoVCB2YWx1ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZGFlYSA9IGRhZWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhZWEuc2V0VmFsdWUodGhpcy52YWx1ZSwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwODVlZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb3Igc2luZ2xlIGV4cHJlc3Npb24gdG8vZnJvbSBhbiBhcnJheSBvZgotICogc3RyaW5ncyAoZS5nLiB7InRleHQwIiwgInRleHQxIn0pLgotICogRSBpcyB0aGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbnMgdG8gYmUgZm91bmQgZWl0aGVyIHN0YW5kLWFsb25lIG9yCi0gKiBhcyBlbGVtZW50cyBpbiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBhcnJheUNvbnZlcnRlcjsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhcnJheSBpbml0aWFsaXplciBpZiBpdCBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlcikgewotCQl0aGlzKGVsZW1lbnRDb252ZXJ0ZXIsIHRydWUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyLCBib29sZWFuIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50Q29udmVydGVyID0gZWxlbWVudENvbnZlcnRlcjsKLQkJdGhpcy5hcnJheUNvbnZlcnRlciA9IG5ldyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoZWxlbWVudENvbnZlcnRlciwgcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogaWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIHN0cmluZyBpbiB0aGUgYXJyYXkgcmV0dXJuIHRoZSBzaW5nbGUgZXhwcmVzc2lvbiwKLQkgKiB3aXRob3V0IGJyYWNlcywgaW5zdGVhZCBvZiBhbiBhcnJheSBpbml0aWFsaXplcgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFeHByZXNzaW9uIGNvbnZlcnRPYmplY3QoU3RyaW5nW10gc3RyaW5ncywgQVNUIGFzdCkgewotCQlyZXR1cm4gKHN0cmluZ3MubGVuZ3RoID09IDEpID8KLQkJCQl0aGlzLmVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChzdHJpbmdzWzBdLCBhc3QpCi0JCQk6Ci0JCQkJdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0T2JqZWN0KHN0cmluZ3MsIGFzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0TnVsbCgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGZvciBhIHNpbmdsZSBleHByZXNzaW9uIHdpdGggbm8gc3Vycm91bmRpbmcgYnJhY2VzLCBpbXBseWluZyBhCi0JICogc2luZ2xlLWVudHJ5IGFycmF5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSA/Ci0JCQkJdGhpcy5hcnJheUNvbnZlcnRlci5jb252ZXJ0QXJyYXlJbml0aWFsaXplcigoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbikKLQkJCToKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KGV4cHJlc3Npb24pfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gY29udmVydGVyIGZvciBhbiBhbm5vdGF0aW9uIGVsZW1lbnQgb2YgdHlwZSBTdHJpbmdbXS4KLQkgKiAgICAgQEZvbyhiYXI9eyJ0ZXh0MCIsICJ0ZXh0MSJ9KQotCSAqIG9yCi0JICogICAgIEBGb28oYmFyPSJ0ZXh0MCIpCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyIGZvclN0cmluZ3MoKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGFuIGV4cHJlc3Npb24gY29udmVydGVyIGZvciBhbiBhbm5vdGF0aW9uIGVsZW1lbnQgb2YgdHlwZSA8ZW51bT5bXS4KLQkgKiAgICAgQEZvbyhiYXI9e0JBWiwgQkFUfSkKLQkgKiBvcgotCSAqICAgICBARm9vKGJhcj1CQVopCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyIGZvck5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgQ2xhc3NbXS4KLQkgKiAgICAgQEZvbyhiYXI9e0Jhei5jbGFzcywgQmF0LmNsYXNzfSkKLQkgKiBvcgotCSAqICAgICBARm9vKGJhcj1CYXouY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyIGZvclR5cGVzKCkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzYTcxOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgYm9vbGVhbiBsaXRlcmFsIHRvL2Zyb20gYSBCb29sZWFuCi0gKiAoZS5nLiBCb29sZWFuLlRSVUUpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxCb29sZWFuPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8Qm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbkxpdGVyYWwgY29udmVydE9iamVjdChCb29sZWFuIGJvb2xlYW5PYmplY3QsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGFzdC5uZXdCb29sZWFuTGl0ZXJhbChib29sZWFuT2JqZWN0LmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5yZXNvbHZlQ29uc3RhbnRFeHByZXNzaW9uVmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pID8gKChCb29sZWFuKSB2YWx1ZSkgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmI0NzA1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2hhcmFjdGVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgY2hhcmFjdGVyIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGNoYXJhY3RlcgotICogKGUuZy4gIkEiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFyYWN0ZXJMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlDaGFyYWN0ZXJMaXRlcmFsIGNoYXJhY3RlckxpdGVyYWwgPSBhc3QubmV3Q2hhcmFjdGVyTGl0ZXJhbCgpOwotCQljaGFyYWN0ZXJMaXRlcmFsLnNldENoYXJWYWx1ZShzdHJpbmcuY2hhckF0KDApKTsKLQkJcmV0dXJuIGNoYXJhY3RlckxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5yZXNvbHZlQ29uc3RhbnRFeHByZXNzaW9uVmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIENoYXJhY3RlcikgPyAoKENoYXJhY3RlcikgdmFsdWUpLnRvU3RyaW5nKCkgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFmYzhlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gdGhhdCBlaXRoZXIgb2NjdXJzIHN0YW5kLWFsb25lLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogPC9wcmU+Ci0gKiAgICAgCi0gKiBvciBpcyBlbWJlZGRlZCBpbiBhbiBlbGVtZW50IGFycmF5IHdpdGhpbiBhbm90aGVyIGFubm90YXRpb24sIGUuZy4KLSAqIDxwcmU+Ci0gKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIiksICYjNjQ7SW5uZXIoInR3byIpfSkKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqICAgICAKLSAqICAgICAgICAgYW5ub3RhdGlvbk5hbWUgPSAiSW5uZXIiCi0gKiAgICAgICAgIGNvbnRhaW5lckFubm90YXRpb25OYW1lID0gIk91dGVyIgotICogICAgICAgICBlbGVtZW50TmFtZSA9ICJmb28iCi0gKiAgICAgICAgIGluZGV4ID0gMC0yCi0gKiA8L3ByZT4KLSAqIAotICogVGhpcyBpcyBhIHVzZWZ1bCBwYXR0ZXJuIGJlY2F1c2UgYSBkZWNsYXJhdGlvbiBjYW5ub3QgaGF2ZSBtb3JlCi0gKiB0aGFuIG9uZSBhbm5vdGF0aW9uIG9mIHRoZSBzYW1lIHR5cGUsIGFuZCBhbGxvd2luZyB0aGUgc3RhbmQtYWxvbmUKLSAqIGNvbmZpZ3VyYXRpb24gcmVkdWNlcyBjbHV0dGVyLgotICogPGJyPgotICogTkI6IFRoaXMgY29uZmlndXJhdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciAidG9wLWxldmVsIiBhbm5vdGF0aW9ucywgYXMKLSAqIG9wcG9zZWQgdG8gIm5lc3RlZCIgYW5ub3RhdGlvbnMuIFRoaXMgaXMgYmVjYXVzZSBhbm5vdGF0aW9uIGVsZW1lbnRzCi0gKiBjYW4gb25seSBiZSBkZWNsYXJlZCB3aXRoIGEgdHlwZSBvZiBhIHNpbmdsZSBhbm5vdGF0aW9uIGFuZCBhbm5vdGF0aW9ucwotICogY2Fubm90IGJlIHBhcnQgb2YgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbnMgY2Fubm90ICpib3RoKiBiZSBzdXBwb3J0ZWQ6Ci0gKiA8cHJlPgotICogICAgICYjNjQ7Rm9vKGJhcj0mIzY0O091dGVyKC4uLikpCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAKLSAqICAgICAmIzY0O0ZvbyhiYXI9JiM2NDtJbm5lciguLi4pKSAgLy8gbm90IGFsbG93ZWQKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIDwvcHJlPgotICogCi0gKiBOQjogQmVoYXZpb3IgaXMgdW5kZWZpbmVkIHdoZW4gYm90aCB0aGUgc3RhbmQtYWxvbmUgYW5kIHRoZSBuZXN0ZWQKLSAqIGNvbmZpZ3VyYXRpb25zIGFubm90YXRlIHRoZSBzYW1lIGRlY2xhcmF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgIC8vIHVuZGVmaW5lZCBiZWhhdmlvcgotICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpLCAmIzY0O0lubmVyKCJ0d28iKX0pCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGNsYXNzIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi17Ci0KLQkvKioKLQkgKiB0aGlzIGFkYXB0ZXIgaXMgdXNlZCB3aGVuIHRoZSBhbm5vdGF0aW9uIGlzICJzdGFuZC1hbG9uZSI6Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0JICogPC9wcmU+Ci0JICogYW5kIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbmRleCBpcyAwIG9yIDEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyOwotCi0JLyoqCi0JICogdGhpcyBhZGFwdGVyIGlzIHVzZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyAibmVzdGVkIjoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKX0pCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBuZXN0ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIHRoaXMgYWRhcHRlciBpcyBmb3IgdGhlICJuZXN0ZWQiIGFubm90YXRpb24gYXQgdGhlIHplcm8gaW5kZXg7Ci0JICogYW5kIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSBpbmRleCBpcyAxCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB6ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLQkvLyByZWR1Y2UgTkxTIGNoZWNrcwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0JICogICAgICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBpbnQgaW5kZXgpIHsKLQkJdGhpcyhhbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUsIFZBTFVFLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUsIFN0cmluZyBlbGVtZW50TmFtZSwgaW50IGluZGV4KSB7Ci0JCXRoaXMobmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGlvbk5hbWUpLCBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihjb250YWluZXJBbm5vdGF0aW9uTmFtZSksIGVsZW1lbnROYW1lLCBpbmRleCwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIKLQkgKi8KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCAKLQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJaW50IGluZGV4LCAKLQkJCVN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uTmFtZQotCSkgewotCQl0aGlzKHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFLCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgCi0JCQlTdHJpbmcgZWxlbWVudE5hbWUsIAotCQkJaW50IGluZGV4LCAKLQkJCVN0cmluZyBuZXN0ZWRBbm5vdGF0aW9uTmFtZQotCSkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciA9IHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlcjsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uTmFtZSk7Ci0JCXRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGNvbnRhaW5lckFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgMCwgbmVzdGVkQW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5nZXRJbmRleCgpID09IDApIHsKLQkJCS8vIGNoZWNrIGZvciB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCQkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc3RhbmRBbG9uZUFubm90YXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TmVzdGVkQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogPHByZT4KLQkgKiBbbm9uZV0gPT4gJiM2NDtJbm5lcgotCSAqICAgICBvcgotCSAqICYjNjQ7SW5uZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtJbm5lcgotCSAqICAgICBvcgotCSAqICYjNjQ7SW5uZXIodGV4dD0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O0lubmVyCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIsICYjNjQ7SW5uZXJ9KSA9PiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lciwgJiM2NDtJbm5lciwgJiM2NDtJbm5lcn0pCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcikgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIsICYjNjQ7SW5uZXJ9KQotCSAqICAgICBvcgotCSAqICYjNjQ7SW5uZXIgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIsICYjNjQ7SW5uZXJ9KQotCSAqICAgICBldGMuCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5uZXdBbm5vdGF0aW9uKE1BUktFUl9BTk5PVEFUSU9OX0ZBQ1RPUlksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSB0aGlzLm5ld0Fubm90YXRpb24oU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OX0ZBQ1RPUlksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIChOb3JtYWxBbm5vdGF0aW9uKSB0aGlzLm5ld0Fubm90YXRpb24oTk9STUFMX0FOTk9UQVRJT05fRkFDVE9SWSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5nZXRJbmRleCgpID09IDApIHsKLQkJCS8vIGNoZWNrIGZvciB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCQkJaWYgKHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkJdGhpcy5yZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmICh0aGlzLm5lc3RlZEVsZW1lbnRDYW5CZUNvbnZlcnRlZFRvU3RhbmRBbG9uZShkZWNsYXJhdGlvbikpIHsKLQkJCXRoaXMuY29udmVydExhc3RFbGVtZW50QW5ub3RhdGlvblRvU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbiBhZGFwdGVyCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEluZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuZ2V0SW5kZXgoKTsKLQkJaWYgKG5ld0luZGV4ID09IG9sZEluZGV4KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlBbm5vdGF0aW9uIHN0YW5kQWxvbmVBbm5vdGF0aW9uID0gdGhpcy5nZXRTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKG5ld0luZGV4LCBkZWNsYXJhdGlvbik7Ci0JCQlpZiAodGhpcy5uZXN0ZWRFbGVtZW50Q2FuQmVDb252ZXJ0ZWRUb1N0YW5kQWxvbmUoZGVjbGFyYXRpb24pKSB7Ci0JCQkJdGhpcy5jb252ZXJ0TGFzdEVsZW1lbnRBbm5vdGF0aW9uVG9TdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKG9sZEluZGV4ID09IDApICYmIChuZXdJbmRleCA9PSAxKSkgewotCQkJCS8vIHRoaXMgaXMgb25lIG9mIHR3byBzaXR1YXRpb25zIHdoZXJlIHdlIHRyYW5zaXRpb24gZnJvbSBzdGFuZC1hbG9uZSB0byBjb250YWluZXIKLQkJCQl0aGlzLm1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihzdGFuZEFsb25lQW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQkJCXRoaXMubW92ZU5lc3RlZEFubm90YXRpb24obmV3SW5kZXgsIGRlY2xhcmF0aW9uKTsKLQkJCX0gZWxzZSBpZiAobmV3SW5kZXggPT0gMCkgewotCQkJCS8vIHdlIGFyZSBtb3ZpbmcgYSAnbnVsbCcgZW50cnkgb24gdG9wIG9mIHRoZSBzdGFuZC1hbG9uZSwgc28gcmVtb3ZlIGl0Ci0JCQkJdGhpcy5yZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9sZCBpbmRleCA9ICIgKyBvbGRJbmRleCArICI7IG5ldyBpbmRleCA9ICIgKyBuZXdJbmRleCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogYnVpbGQgdGhlIGFwcHJvcHJpYXRlIG5ldyBhbm5vdGF0aW9uLAotCSAqIHdoaWNoIG1heSByZXF1aXJlIG1vdmluZyB0aGUgMHRoIGFubm90YXRpb24gZnJvbSAic3RhbmQtYWxvbmUiIHRvICJuZXN0ZWQiCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oQW5ub3RhdGlvbkZhY3RvcnkgYW5ub3RhdGlvbkZhY3RvcnksIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZ2V0SW5kZXgoKSA9PSAgMCkgewotCQkJcmV0dXJuIHRoaXMubmV3WmVyb0Fubm90YXRpb24oYW5ub3RhdGlvbkZhY3RvcnksIGRlY2xhcmF0aW9uKTsKLQkJfQotCQlpZiAodGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbklzUHJlc2VudChkZWNsYXJhdGlvbikpIHsKLQkJCS8vIG1hbmlwdWxhdGUgdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIC0gaWdub3JlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uKD8pCi0JCQkvLyBAT3V0ZXIoZm9vPUBJbm5lcigiemVybyIpKSA9PiBAT3V0ZXIoZm9vPXtASW5uZXIoInplcm8iKSwgQElubmVyfSkKLQkJCS8vICAgICBvcgotCQkJLy8gQE91dGVyKGZvbz17QElubmVyKCJ6ZXJvIiksIEBJbm5lcigib25lIil9KSA9PiBAT3V0ZXIoZm9vPXtASW5uZXIoInplcm8iKSwgQElubmVyfSkKLQkJCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQkJfQotCi0JCS8vIHRoaXMgaXMgb25lIG9mIHR3byBzaXR1YXRpb25zIHdoZXJlIHdlIHRyYW5zaXRpb24gZnJvbSBzdGFuZC1hbG9uZSB0byBjb250YWluZXIKLQkJdGhpcy5tb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkvLyBvbmNlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIGlzIG1vdmVkIHRvIGluZGV4PTAsIGJ1aWxkIHRoZSBuZXcgYW5ub3RhdGlvbiBhdCBpbmRleD0xCi0JCXJldHVybiBhbm5vdGF0aW9uRmFjdG9yeS5uZXdBbm5vdGF0aW9uKHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgaW5kZXggaXMgMCAtIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBuZXcgYW5ub3RhdGlvbiwKLQkgKiB3aGljaCBtYXkgYmUgZWl0aGVyICJzdGFuZC1hbG9uZSIgb3IgIm5lc3RlZCIKLQkgKi8KLQlwcml2YXRlIEFubm90YXRpb24gbmV3WmVyb0Fubm90YXRpb24oQW5ub3RhdGlvbkZhY3RvcnkgYW5ub3RhdGlvbkZhY3RvcnksIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyByZXBsYWNlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIC0gaWdub3JlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbig/KQotCQkJLy8gQElubmVyKHRleHQ9ImxvcmVtIGlwc3VtIikgPT4gQElubmVyCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWlmICh0aGlzLmNvbnRhaW5lckFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBtYW5pcHVsYXRlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbgotCQkJLy8gQE91dGVyKGZvbz1ASW5uZXIodGV4dD0ibG9yZW0gaXBzdW0iKSkgPT4gQE91dGVyKGZvbz1ASW5uZXIpCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJLy8gbmVpdGhlciBhbm5vdGF0aW9uIGlzIHByZXNlbnQgLSBhZGQgYSBuZXcgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbgotCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIG1vdmUgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gdG8gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IGluZGV4PTAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24gaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5tb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oc3RhbmRBbG9uZUFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBtb3ZlIHRoZSBzcGVjaWZpZWQsIG5vbi1udWxsLCBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIHRvCi0JICogdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IGluZGV4PTAKLQkgKi8KLQlwcml2YXRlIHZvaWQgbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKEFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfSBlbHNlIGlmIChzdGFuZEFsb25lQW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJRXhwcmVzc2lvbiB2diA9ICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgc3RhbmRBbG9uZUFubm90YXRpb24pLmdldFZhbHVlKCk7Ci0JCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQl0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCX0gZWxzZSBpZiAoc3RhbmRBbG9uZUFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCU5vcm1hbEFubm90YXRpb24gbmV3TkEgPSB0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhuZXdOQSk7Ci0JCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoKE5vcm1hbEFubm90YXRpb24pIHN0YW5kQWxvbmVBbm5vdGF0aW9uKSkgewotCQkJCXZhbHVlcy5hZGQoKE1lbWJlclZhbHVlUGFpcikgQVNUTm9kZS5jb3B5U3VidHJlZShwYWlyLmdldEFTVCgpLCBwYWlyKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIHN0YW5kQWxvbmVBbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSAibmVzdGVkIiBhbm5vdGF0aW9uIGNvbnRhaW5lciBoYXMgYmVlbiByZWR1Y2VkIHRvCi0JICogYSBzaW5nbGUgZWxlbWVudCAoYW5kIHRoZSBhcnJheSBpbml0aWFsaXplciBpcyBjb252ZXJ0ZWQgdG8ganVzdAotCSAqIHRoZSBzaW5nbGUgcmVtYWluaW5nIGVsZW1lbnQpIGFuZCBjYW4gYmUgZnVydGhlciBjb252ZXJ0ZWQgdG8gdGhlCi0JICogInN0YW5kLWFsb25lIiBhbm5vdGF0aW9uOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpfSkgPT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcigiemVybyIpKSA9PgotCSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbmVzdGVkRWxlbWVudENhbkJlQ29udmVydGVkVG9TdGFuZEFsb25lKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uID0gdGhpcy5nZXRDb250YWluZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCWlmICh0aGlzLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKFZBTFVFKSkgewotCQkJCXJldHVybiAoKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBjb250YWluZXJBbm5vdGF0aW9uKS5nZXRWYWx1ZSgpLmdldE5vZGVUeXBlKCkgIT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikKLQkJCQkJCSYmICh0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJTm9ybWFsQW5ub3RhdGlvbiBuYSA9IChOb3JtYWxBbm5vdGF0aW9uKSBjb250YWluZXJBbm5vdGF0aW9uOwotCQkJaWYgKG5hLnZhbHVlcygpLnNpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlcmUgYXJlIG5vIGVsZW1lbnRzIHByZXNlbnQKLQkJCX0KLQkJCWlmIChuYS52YWx1ZXMoKS5zaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cyBwcmVzZW50IC0gbGVhdmUgdGhlbSBhbGwgYWxvbmUKLQkJCX0KLQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gKE1lbWJlclZhbHVlUGFpcikgbmEudmFsdWVzKCkuZ2V0KDApOwotCQkJaWYgKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIChwYWlyLmdldFZhbHVlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKQotCQkJCQkJJiYgKHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGwpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgY29udGFpbmVyQW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBtb3ZlIHRoZSBhbm5vdGF0aW9uIGluIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhdCBpbmRleD0wCi0JICogdG8gdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udmVydExhc3RFbGVtZW50QW5ub3RhdGlvblRvU3RhbmRBbG9uZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlBbm5vdGF0aW9uIGxhc3QgPSB0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKGxhc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIGxhc3QgbmVzdGVkIGFubm90YXRpb24gaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAobGFzdC5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5uZXdTdGFuZEFsb25lTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSBpZiAobGFzdC5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJRXhwcmVzc2lvbiB2diA9ICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgbGFzdCkuZ2V0VmFsdWUoKTsKLQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCXRoaXMubmV3U3RhbmRBbG9uZVNpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pLnNldFZhbHVlKHZ2KTsKLQkJfSBlbHNlIGlmIChsYXN0LmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5ld05BID0gdGhpcy5uZXdTdGFuZEFsb25lTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3TkEpOwotCQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKChOb3JtYWxBbm5vdGF0aW9uKSBsYXN0KSkgewotCQkJCXZhbHVlcy5hZGQoKE1lbWJlclZhbHVlUGFpcikgQVNUTm9kZS5jb3B5U3VidHJlZShwYWlyLmdldEFTVCgpLCBwYWlyKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGxhc3QpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVDb250YWluZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc3RhbmRBbG9uZUFubm90YXRpb25Jc1ByZXNlbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRTdGFuZEFsb25lQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBNYXJrZXJBbm5vdGF0aW9uIG5ld1N0YW5kQWxvbmVNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTdGFuZEFsb25lU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIE5vcm1hbEFubm90YXRpb24gbmV3U3RhbmRBbG9uZU5vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldE5lc3RlZEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbW92ZU5lc3RlZEFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubW92ZUFubm90YXRpb24obmV3SW5kZXgsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5lckFubm90YXRpb25Jc1ByZXNlbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXRDb250YWluZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0T3V0ZXJBbm5vdGF0aW9uQWRhcHRlcigpLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb250YWluZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRPdXRlckFubm90YXRpb25BZGFwdGVyKCkucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHplcm9OZXN0ZWRBbm5vdGF0aW9uSXNQcmVzZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WmVyb05lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldFplcm9OZXN0ZWRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzKE5vcm1hbEFubm90YXRpb24gbmEpIHsKLQkJcmV0dXJuIG5hLnZhbHVlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uIGZhY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzIHRvICJyZS11c2UiIHRoZSBuYXN0eSBjb2RlIGluCi0JICogI25ld0Fubm90YXRpb24oQW5ub3RhdGlvbkZhY3RvcnksIE1vZGlmaWVkRGVjbGFyYXRpb24pCi0JICovCi0JcHJpdmF0ZSBpbnRlcmZhY2UgQW5ub3RhdGlvbkZhY3RvcnkgewotCQlBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRmFjdG9yeSBNQVJLRVJfQU5OT1RBVElPTl9GQUNUT1JZID0gbmV3IEFubm90YXRpb25GYWN0b3J5KCkgewotCQlwdWJsaWMgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIGFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1hcmtlckFubm90YXRpb25GYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25GYWN0b3J5IFNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTl9GQUNUT1JZID0gbmV3IEFubm90YXRpb25GYWN0b3J5KCkgewotCQlwdWJsaWMgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIGFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlNpbmdsZU1lbWJlckFubm90YXRpb25GYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25GYWN0b3J5IE5PUk1BTF9BTk5PVEFUSU9OX0ZBQ1RPUlkgPSBuZXcgQW5ub3RhdGlvbkZhY3RvcnkoKSB7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24oRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhZGFwdGVyLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTm9ybWFsQW5ub3RhdGlvbkZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVhMmZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgdGhhdCBkZWFscyB3aXRoIEFTVAotICogZXhwcmVzc2lvbnMsIGNvbnZlcnRpbmcgdGhlbSB0by9mcm9tIHZhcmlvdXMgb3RoZXIgb2JqZWN0cy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLXsKLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBhZGFwdGVyIHRoYXQgcmV0dXJucyBhbmQgdGFrZXMgQVNUIGV4cHJlc3Npb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4gYWRhcHRlcjsKLQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBBU1QgZXhwcmVzc2lvbnMgdG8gb3RoZXIgb2JqZWN0cwotCSAqIChlLmcuIFN0cmluZ3MpLgotCSAqLwotCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4oYW5ub3RhdGlvbkFkYXB0ZXIpLCBjb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQl0aGlzKG5ldyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RXhwcmVzc2lvbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lKSwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+IGFkYXB0ZXIsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gY29udmVydGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHRoaXMuYWRhcHRlci5nZXRWYWx1ZShkZWNsYXJhdGlvbik7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KGV4cHJlc3Npb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCQl0cnkgewotCQkJZXhwcmVzc2lvbiA9IHRoaXMuY29udmVydGVyLmNvbnZlcnQodmFsdWUsIGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZiB0aGVyZSBpcyBhIHByb2JsZW0gY29udmVydGluZyB0aGUgJ3ZhbHVlJyB0byBhbiBFeHByZXNzaW9uIHdlIGdldCB0aGlzIGV4Y2VwdGlvbgotCQkJcmV0dXJuOyAgLy8gZG9uJ3Qgc2V0IHRoZSB2YWx1ZSBpZiBpdCBpcyAiaWxsZWdhbCIKLQkJfQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3Rvcnkgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgc3RyaW5nIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yU3RyaW5ncyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIG51bWJlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBmb3JOdW1iZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oYW5ub3RhdGlvbkFkYXB0ZXIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgbnVtYmVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGZvck51bWJlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPjsKLQkgKiB0aGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGJvb2xlYW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZm9yQm9vbGVhbnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGZvckJvb2xlYW5zKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT47Ci0JICogdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBjaGFyYWN0ZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JDaGFyYWN0ZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIGNoYXJhY3RlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvckNoYXJhY3RlcnMoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjY0YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGNsZWFuIHVwIHNvbWUgb2YgdGhlIG5hc3R5IEVjbGlwc2UgYW5ub3RhdGlvbgotICogZm9ybWF0dGluZyAob3IgbGFjayB0aGVyZW9mKTsgZS5nLiBhcnJheXMgb2YgYW5ub3RhdGlvbnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRPRE8KLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRleHRFZGl0W10gZWRpdHMgPSBlZGl0VHJlZS5nZXRDaGlsZHJlbigpOwotCQlpbnQgbGVuID0gZWRpdHMubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU11bHRpVGV4dEVkaXQgZXh0cmFFZGl0cyA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCVRleHRFZGl0IGVkaXQxID0gZWRpdHNbaV07Ci0JCQlpZiAoICEgKGVkaXQxIGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkpIHsKLQkJCQljb250aW51ZTsgIC8vIGlmIHRoZSBlZGl0IGlzIG5vdCBhbiBpbnNlcnQsIHNraXAgdG8gdGhlIG5leHQgZWRpdAotCQkJfQotCQkJSW5zZXJ0RWRpdCBpbnNlcnQxID0gKEluc2VydEVkaXQpIGVkaXQxOwotCQkJaW50IGogPSBpICsgMTsKLQkJCWlmIChqIDwgbGVuKSB7Ci0JCQkJVGV4dEVkaXQgZWRpdDIgPSBlZGl0c1tqXTsKLQkJCQlpZiAoZWRpdDIgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQkJCUluc2VydEVkaXQgaW5zZXJ0MiA9IChJbnNlcnRFZGl0KSBlZGl0MjsKLQkJCQkJU3RyaW5nIHRleHQxID0gaW5zZXJ0MS5nZXRUZXh0KCk7Ci0JCQkJCVN0cmluZyB0ZXh0MiA9IGluc2VydDIuZ2V0VGV4dCgpOwotCQkJCQlpbnQgb2Zmc2V0MSA9IGluc2VydDEuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBvZmZzZXQyID0gaW5zZXJ0Mi5nZXRPZmZzZXQoKTsKLQkJCQkJaWYgKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHRleHQxKSAmJiB0ZXh0Mi5lcXVhbHMoIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBhbiBhbm5vdGF0aW9uIHdhcyBpbnNlcnRlZCBiZWZvcmUgc29tZXRoaW5nIG9uIHRoZSBzYW1lIGxpbmU7Ci0JCQkJCQkvLyByZXBsYWNlIHRoZSB0cmFpbGluZyBzcGFjZSB3aXRoIGEgbmV3bGluZSBhbmQgYXBwcm9wcmlhdGUgaW5kZW50Ci0JCQkJCQlleHRyYUVkaXRzLmFkZENoaWxkKG5ldyBSZXBsYWNlRWRpdChvZmZzZXQyLCAxLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQyKSkpOwotCQkJCQkJaSsrOyAgLy8ganVtcCB0aGUgaW5kZXggcGFzdCAnZWRpdDInCi0JCQkJCQljb250aW51ZTsgIC8vIGdvIHRvIHRoZSBuZXh0IGVkaXQKLQkJCQkJfQotCQkJCQlpbnQgY29tbWExTGVuZ3RoID0gdGhpcy5jb21tYUxlbmd0aCh0ZXh0MSk7Ci0JCQkJCWlmICgoY29tbWExTGVuZ3RoICE9IDApICYmIHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHRleHQyKSkgewotCQkJCQkJLy8gYW4gYW5ub3RhdGlvbiB3YXMgaW5zZXJ0ZWQgaW4gYW4gYXJyYXkgaW5pdGlhbGl6ZXIgb24gdGhlCi0JCQkJCQkvLyBzYW1lIGxpbmUgYXMgdGhlIHByZXZpb3VzIGFycmF5IGVsZW1lbnQ7Ci0JCQkJCQkvLyByZXBsYWNlIHRoZSBwcmVjZWRpbmcgc3BhY2Ugd2l0aCBhIG5ld2xpbmUgYW5kIGFwcHJvcHJpYXRlIGluZGVudAotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQob2Zmc2V0MSArIGNvbW1hMUxlbmd0aCwgdGV4dDEubGVuZ3RoKCkgLSBjb21tYTFMZW5ndGgsIHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldDEpKSk7Ci0JCQkJCQlpKys7ICAvLyBqdW1wIHRoZSBpbmRleCBwYXN0ICdlZGl0MicKLQkJCQkJCWNvbnRpbnVlOyAgLy8gZ28gdG8gdGhlIG5leHQgZWRpdAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhpcy5mb3JtYXRBcnJheUluaXRpYWxpemVyKGRvYywgaW5zZXJ0MSwgZXh0cmFFZGl0cyk7Ci0JCX0KLQkJZXh0cmFFZGl0cy5hcHBseShkb2MsIFRleHRFZGl0Lk5PTkUpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBpbnNlcnQgZWRpdCBpcyBpbnNlcnRpbmcgYW4gYW5ub3RhdGlvbiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFubm90YXRpb25zIGFzCi0JICogaXRzIHZhbHVlIHRoZW4gZm9ybWF0IHRoZW0gbmljZWx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRBcnJheUluaXRpYWxpemVyKElEb2N1bWVudCBkb2MsIEluc2VydEVkaXQgaW5zZXJ0RWRpdCwgTXVsdGlUZXh0RWRpdCBleHRyYUVkaXRzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgcyA9IGluc2VydEVkaXQuZ2V0VGV4dCgpOwotCQlpZiAoICEgdGhpcy5zdHJpbmdJc0Fubm90YXRpb24ocykpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJaW50IHBvcyA9IDE7ICAvLyBza2lwICdAJwotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChwb3MpOwotCQkJcG9zKys7ICAvLyBidW1wIHRvIGp1c3QgcGFzdCBmaXJzdCAnKCcKLQkJCWlmIChjID09ICcoJykgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChwb3MgPT0gbGVuKSB7Ci0JCQlyZXR1cm47ICAvLyByZWFjaGVkIGVuZCBvZiBzdHJpbmcKLQkJfQotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChwb3MpOwotCQkJcG9zKys7ICAvLyBidW1wIHRvIGp1c3QgcGFzdCBmaXJzdCAneycKLQkJCWlmIChjID09ICd7JykgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGMgIT0gJyAnKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChwb3MgPT0gbGVuKSB7Ci0JCQlyZXR1cm47ICAvLyByZWFjaGVkIGVuZCBvZiBzdHJpbmcKLQkJfQotCQkvLyBub3cgbG9vayBmb3IgJ0AnIG5vdCBpbnNpZGUgcGFyZW50aGVzZXMgYW5kIHB1dCBpbiAKLQkJLy8gbGluZSBkZWxpbWV0ZXIgYW5kIGluZGVudCBzdHJpbmcgYmVmb3JlIGVhY2gKLQkJaW50IG9mZnNldCA9IGluc2VydEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCVN0cmluZyBpbmRlbnQgPSBudWxsOwotCQlpbnQgcGFyZW5EZXB0aCA9IDA7Ci0JCXdoaWxlIChwb3MgPCBsZW4pIHsKLQkJCXN3aXRjaCAocy5jaGFyQXQocG9zKSkgewotCQkJCWNhc2UgJygnIDoKLQkJCQkJcGFyZW5EZXB0aCsrOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcpJyA6Ci0JCQkJCXBhcmVuRGVwdGgtLTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnQCcgOgotCQkJCQlpZiAocGFyZW5EZXB0aCA9PSAwKSB7Ci0JCQkJCQlpZiAoaW5kZW50ID09IG51bGwpIHsKLQkJCQkJCQlpbmRlbnQgPSB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQsICJcdCIpOyAgLy8gVE9ETyB1c2UgdGFiIHByZWZlcmVuY2U/IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCBpbmRlbnQpKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICd9JyA6Ci0JCQkJCWlmIChwYXJlbkRlcHRoID09IDApIHsKLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQob2Zmc2V0ICsgcG9zLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQpKSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwb3MrKzsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaW5lIGRlbGltZXRlciBhbmQgaW5kZW50aW5nIGNoYXJhY3RlcnMgCi0JICogbWF0Y2hpbmcgdGhlIGluZGVudCBsZXZlbCBvZiB0aGUgbGluZSBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0Ci0JICogKGkuZS4gdGhlIG5ldyBsaW5lJ3MgaW5kZW50IG1hdGNoZXMgdGhlIGN1cnJlbnQgbGluZSkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDUihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENSKElEb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIFN0cmluZyBzdWZmaXgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpKTsgIC8vIHVzZSBzYW1lIENSIGFzIGN1cnJlbnQgbGluZQotCi0JCWludCBvID0gZG9jLmdldExpbmVPZmZzZXQobGluZSk7ICAvLyBtYXRjaCB0aGUgd2hpdGVzcGFjZSBvZiB0aGUgY3VycmVudCBsaW5lCi0JCWNoYXIgYyA9IGRvYy5nZXRDaGFyKG8rKyk7Ci0JCXdoaWxlICgoYyA9PSAnICcpIHx8IChjID09ICdcdCcpKSB7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQljID0gZG9jLmdldENoYXIobysrKTsKLQkJfQotCQlzYi5hcHBlbmQoc3VmZml4KTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3RyaW5nSXNBbm5vdGF0aW9uKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPiAxKSAmJiBzdHJpbmcuY2hhckF0KDApID09ICdAJzsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHNpbmdsZSBjb21tYSwgcG9zc2libHkgc3Vycm91bmRlZCBieQotCSAqIHNwYWNlcywgcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN1YnN0cmluZyBjb250YWluaW5nIHRoZQotCSAqIGluaXRpYWwgc3BhY2VzIGFuZCB0aGUgY29tbWEuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHN0cmluZykgewotCQlib29sZWFuIGNvbW1hID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWludCByZXN1bHQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzd2l0Y2ggKHN0cmluZy5jaGFyQXQoaSkpIHsKLQkJCQljYXNlICcgJyA6Ci0JCQkJCWlmICggISBjb21tYSkgewotCQkJCQkJcmVzdWx0Kys7ICAvLyBzcGFjZSBwcmVjZWRpbmcgY29tbWEKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlICcsJyA6Ci0JCQkJCWlmIChjb21tYSkgewotCQkJCQkJcmV0dXJuIDA7ICAvLyBzZWNvbmQgY29tbWEhCi0JCQkJCX0KLQkJCQkJY29tbWEgPSB0cnVlOwotCQkJCQlyZXN1bHQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIDA7ICAvLyBub24tY29tbWEsIG5vbi1zcGFjZSBjaGFyCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZjE0YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotCi0vKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIgewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2UzNDY3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFkYXB0IGFuIGFubm90YXRlZCBlbGVtZW50IGFuZCBhbiBpbmRleGVkIGRlY2xhcmF0aW9uIGFubm90YXRpb24gYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIKLQlpbXBsZW1lbnRzIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcgotewotCXByaXZhdGUgZmluYWwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXRoaXMuaWRhYSA9IGlkYWE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pZGFhLmdldEluZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTW92ZUFubm90YXRpb25FZGl0b3IobmV3SW5kZXgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZE1vdmVBbm5vdGF0aW9uRWRpdG9yKGludCBuZXdJbmRleCkgewotCQlyZXR1cm4gbmV3IE1vdmVBbm5vdGF0aW9uRWRpdG9yKHRoaXMuaWRhYSwgbmV3SW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1vdmVBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWE7Ci0JCXByaXZhdGUgaW50IGluZGV4OwotCi0JCU1vdmVBbm5vdGF0aW9uRWRpdG9yKEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEsIGludCBpbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWRhYSA9IGlkYWE7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmlkYWEubW92ZUFubm90YXRpb24odGhpcy5pbmRleCwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNhNzRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5Ci0gKiBhZGQgYW4gaW1wb3J0IGZvciB0aGUgZW51bXMgd2hlbiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIocmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBidWlsZEV4cHJlc3Npb25Db252ZXJ0ZXIoYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGlnbm9yZSB0aGUgYWRhcHRlcidzIGdldFZhbHVlKCkgLSB3ZSB3YW50IHRoZSBleHByZXNzaW9uCi0JCXJldHVybiB0aGlzLnJlc29sdmUodGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nW10gdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKHRoaXMuY29udmVydFRvU291cmNlQ29kZU5hbWVzKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBlbnVtcywgd2hpY2ggY2FuIGJlCi0JICogICAgIG51bGwKLQkgKiBvcgotCSAqICAgICB7Rk9PLCBCQVIsIEJBWn0KLQkgKiBvcgotCSAqICAgICBGT08KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZShFeHByZXNzaW9uIGV4cHJlc3Npb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQkJfSBlbHNlIGlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFycmF5KChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvbHZlU2luZ2xlRWxlbWVudChleHByZXNzaW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZUFycmF5KEFycmF5SW5pdGlhbGl6ZXIgYWksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFpKTsKLQkJaW50IGxlbiA9IGV4cHJlc3Npb25zLnNpemUoKTsKLQkJU3RyaW5nW10gZW51bXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJZW51bXNbaV0gPSB0aGlzLnJlc29sdmVFbnVtKGV4cHJlc3Npb25zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIGVudW1zOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSByZXNvbHZlU2luZ2xlRWxlbWVudChFeHByZXNzaW9uIGVudW1FeHByZXNzaW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHt0aGlzLnJlc29sdmVFbnVtKGVudW1FeHByZXNzaW9uKX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRW51bShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVFbnVtKGV4cHJlc3Npb24pOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bXMgdG8gbmFtZXMgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW4gc291cmNlIGNvZGUKLQkgKiBOQjogaW1wb3J0cyBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydFRvU291cmNlQ29kZU5hbWVzKFN0cmluZ1tdIGVudW1zLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChlbnVtcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGVuID0gZW51bXMubGVuZ3RoOwotCQlTdHJpbmdbXSBzb3VyY2VDb2RlTmFtZXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXNvdXJjZUNvZGVOYW1lc1tpXSA9IHRoaXMuY29udmVydFRvU291cmNlQ29kZU5hbWUoZW51bXNbaV0sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQlyZXR1cm4gc291cmNlQ29kZU5hbWVzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWUoU3RyaW5nIGVudW1fLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuY29udmVydFRvU291cmNlQ29kZU5hbWUoZW51bV8sIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2JlMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogV3JhcCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaW1wbHkKLSAqIGFkZCBhbiBpbXBvcnQgZm9yIHRoZSBlbnVtIHdoZW4gbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyCi0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIG5hbWUgc3RyaW5ncyAoZW51bXMpLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUpOwotCX0KLQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMobmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSkpOwotCX0KLQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZSh0aGlzLmFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoY29udmVydFRvU291cmNlQ29kZU5hbWUodmFsdWUsIGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIHJlc29sdmUgdGhlIGVudW0KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRW51bShleHByZXNzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IHRoZSBmdWxseS1xdWFsaWZpZWQgZW51bSBjb25zdGFudCB0byBhIHN0YXRpYyBpbXBvcnQgYW5kIHRoZSBjb25zdGFudCdzIHNob3J0IG5hbWUsIGUuZy4KLQkgKiAgICAgc3RhdGljIGltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVI7Ci0JICogICAgIHJldHVybiAiRUFHRVIiCi0JICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIGNvbnZlcnQgdG8gYSBub3JtYWwgaW1wb3J0IGFuZCB0aGUgY29uc3RhbnQncyBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KLQkgKiAgICAgaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkZldGNoVHlwZTsKLQkgKiAgICAgcmV0dXJuICJGZXRjaFR5cGUuRUFHRVIiCi0JICogaWYgdGhhdCBkb2Vzbid0IHdvcmssIHNpbXBseSByZXR1cm4gdGhlIGNvbnN0YW50J3MgZnVsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4KLQkgKiAgICAgcmV0dXJuICJqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUuRUFHRVIiCi0JICogTkI6IGFuIGltcG9ydCBtYXkgYmUgYWRkZWQgYXMgYSBzaWRlLWVmZmVjdCA6LSgKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9Tb3VyY2VDb2RlTmFtZShTdHJpbmcgZW51bUNvbnN0YW50TmFtZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKGVudW1Db25zdGFudE5hbWUgPT0gbnVsbCkgPyBudWxsIDogY29udmVydFRvU291cmNlQ29kZU5hbWVfKGVudW1Db25zdGFudE5hbWUsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBlbnVtIGNvbnN0YW50IG5hbWUgaXMgbm9uLW51bGw7Ci0JICogY29udmVydCBpdCB0byBpdHMgc2hvcnQgdmVyc2lvbiBpZiB3ZSBjYW4gYWRkIGEgc3RhdGljIGltcG9ydCBldGMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWVfKFN0cmluZyBlbnVtQ29uc3RhbnROYW1lLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChkZWNsYXJhdGlvbi5hZGRTdGF0aWNJbXBvcnQoZW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCXJldHVybiBjb252ZXJ0VG9TaG9ydE5hbWUoZW51bUNvbnN0YW50TmFtZSk7Ci0JCX0KLQkJaWYgKGRlY2xhcmF0aW9uLmFkZEltcG9ydChjb252ZXJ0VG9UeXBlTmFtZShlbnVtQ29uc3RhbnROYW1lKSkpIHsKLQkJCXJldHVybiBjb252ZXJ0VG9QYXJ0aWFsbHlRdWFsaWZpZWROYW1lKGVudW1Db25zdGFudE5hbWUpOwotCQl9Ci0JCXJldHVybiBlbnVtQ29uc3RhbnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1Nob3J0TmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUGFydGlhbGx5UXVhbGlmaWVkTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcobmFtZS5sYXN0SW5kZXhPZignLicsIG5hbWUubGFzdEluZGV4T2YoJy4nKSAtIDEpICsgMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0V4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2IwMzcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0V4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIE1vc3Qgb2J2aW91cyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlLgotICogQXNzdW1lIHRoZSBlbGVtZW50J3MgdmFsdWUgaXMgYW4gRXhwcmVzc2lvbi4KLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFIGV4dGVuZHMgRXhwcmVzc2lvbj4KLQlpbXBsZW1lbnRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEU+Ci17Ci0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGVsZW1lbnQncyBhbm5vdGF0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSByZWxldmFudCBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzLmFubm90YXRpb25BZGFwdGVyID0gYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEUgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyByZXR1cm4gdGhlIGV4cHJlc3Npb24gdW5tb2RpZmllZAotCQlyZXR1cm4gdGhpcy5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuc2V0VmFsdWUodmFsdWUsIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbih0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRXhwcmVzc2lvbiBleHAgPSB0aGlzLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gKGV4cCAhPSBudWxsKSA/IGV4cCA6IHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4cHJlc3Npb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25Ob0Fubm90YXRpb24oKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcmtlckFubm90YXRpb24oKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25Ob3JtYWxBbm5vdGF0aW9uKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk5vQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBleHByZXNzaW9uTWFya2VyQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvblNpbmdsZU1lbWJlckFubm90YXRpb24oU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmRvd25jYXN0KHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBkb3duY2FzdChFeHByZXNzaW9uIGUpIHsKLQkJcmV0dXJuIChFKSBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk5vcm1hbEFubm90YXRpb24oTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCXJldHVybiB0aGlzLmRvd25jYXN0KChwYWlyID09IG51bGwpID8gbnVsbCA6IHBhaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVOb0Fubm90YXRpb24odmFsdWUsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTWFya2VyQW5ub3RhdGlvbih2YWx1ZSwgKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbih2YWx1ZSwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbih2YWx1ZSwgKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZCBub24tbnVsbCwgbm9uLWVtcHR5IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVOb0Fubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQkvLyBARm9vKCJ4eHgiKQotCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBARm9vKGJhcj0ieHh4IikKLQkJCXRoaXMuYWRkVmFsdWUodmFsdWUsIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmFsdWUoRXhwcmVzc2lvbiB2YWx1ZSwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYWRkVmFsdWUodmFsdWUsIGFubm90YXRpb24sIHRoaXMuZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25FbGVtZW50TmFtZSkgewotCQlBU1QgYXN0ID0gYW5ub3RhdGlvbi5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShhbm5vdGF0aW9uRWxlbWVudE5hbWUpKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKTsKLQkJdmFsdWVzLmFkZChwYWlyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVNYXJrZXJBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gQEZvbyA9PiBARm9vKCJ4eHgiKQotCQkvLyAgICAgb3IKLQkJLy8gQEZvbyA9PiBARm9vKGJhcj0ieHh4IikKLQkJdGhpcy5zZXRWYWx1ZU5vQW5ub3RhdGlvbih2YWx1ZSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlU2luZ2xlTWVtYmVyQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSkgewotCQkJLy8gQEZvbygieXl5IikgPT4gQEZvbygieHh4IikKLQkJCWFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy8gQEZvbygieXl5IikgPT4gQEZvbyh2YWx1ZT0ieXl5IiwgYmFyPSJ4eHgiKQotCQkJRXhwcmVzc2lvbiB2diA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl0aGlzLmFkZFZhbHVlKHZ2LCBub3JtYWxBbm5vdGF0aW9uLCBWQUxVRSk7Ci0JCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCBub3JtYWxBbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9ybWFsQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbik7Ci0JCWlmIChwYWlyID09IG51bGwpIHsKLQkJCXRoaXMuYWRkVmFsdWUodmFsdWUsIGFubm90YXRpb24pOwotCQl9IGVsc2UgewotCQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudChBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50Tm9Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudE5vcm1hbEFubm90YXRpb24oKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb0Fubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBnb25lICg/KQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnRNYXJrZXJBbm5vdGF0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCS8vIEBGb28oInh4eCIpID0+IEBGb28KLQkJCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGUgW25vbi0ndmFsdWUnXSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnROb3JtYWxBbm5vdGF0aW9uKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbik7Ci0JCWlmICgodmFsdWVzLnNpemUoKSA9PSAxKSAmJiB2YWx1ZXMuZ2V0KDApLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCS8vIEBGb28oYmFyPSJ4eHgiKSA9PiBARm9vCi0JCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50KGFubm90YXRpb24pOwotCQkJaWYgKHZhbHVlcy5zaXplKCkgPT0gMSkgewotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdmFsdWVzLmdldCgwKTsKLQkJCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKFZBTFVFKSkgewotCQkJCQkvLyBARm9vKGJhcj0ieHh4IiwgdmFsdWU9Inl5eSIpID0+IEBGb28oInl5eSIpCi0JCQkJCUV4cHJlc3Npb24gdnYgPSBwYWlyLmdldFZhbHVlKCk7Ci0JCQkJCXZ2ID0gKEV4cHJlc3Npb24pIEFTVE5vZGUuY29weVN1YnRyZWUodnYuZ2V0QVNUKCksIHZ2KTsKLQkJCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQEZvbyhiYXI9Inh4eCIsIGJhej0ieXl5IikgPT4gQEZvbyhiYXo9Inl5eSIpCi0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvLyBARm9vKGJhcj0ieHh4IiwgYmF6PSJ5eXkiLCBqb289Inh4eCIpID0+IEBGb28oYmF6PSJ5eXkiLCBqb289Inh4eCIpCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZm9yIChJdGVyYXRvcjxNZW1iZXJWYWx1ZVBhaXI+IHN0cmVhbSA9IHRoaXMudmFsdWVzKGFubm90YXRpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmVsZW1lbnROYW1lKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKSkgewotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0aGlzLmVsZW1lbnROYW1lKSkgewotCQkJCXJldHVybiBwYWlyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzKE5vcm1hbEFubm90YXRpb24gbmEpIHsKLQkJcmV0dXJuIG5hLnZhbHVlcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0dlbmVyaWNWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTYwYWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvR2VuZXJpY1Zpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5QWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUNyZWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2VydFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXNzaWdubWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQmxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJyZWFrU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DYXN0RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2F0Y2hDbGF1c2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25kaXRpb25hbEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbnN0cnVjdG9ySW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29udGludWVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkRvU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbXB0eVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW5oYW5jZWRGb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1Db25zdGFudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Gb3JTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklmU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5maXhFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Jbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5zdGFuY2VvZkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkphdmFkb2M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkxhYmVsZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkxpbmVDb21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZEludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kUmVmUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVsbExpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bWJlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFyYW1ldGVyaXplZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmVudGhlc2l6ZWRFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Qb3N0Zml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJlZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUXVhbGlmaWVkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUmV0dXJuU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW1wbGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJGaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJNZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Td2l0Y2hDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Td2l0Y2hTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN5bmNocm9uaXplZFN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGFnRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGV4dEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRoaXNFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaHJvd1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHJ5U3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLldoaWxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaWxkY2FyZFR5cGU7Ci0KLS8qKgotICogY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5kb20uR2VuZXJpY1Zpc2l0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNWaXNpdG9yIGV4dGVuZHMgQVNUVmlzaXRvciB7Ci0KLQlwdWJsaWMgR2VuZXJpY1Zpc2l0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNWaXNpdG9yKGJvb2xlYW4gdmlzaXRKYXZhZG9jVGFncykgewotCQlzdXBlcih2aXNpdEphdmFkb2NUYWdzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGhvb2tzIGZvciBzdWJjbGFzc2VzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIHZpc2l0XyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQVNUTm9kZSBub2RlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZFZpc2l0XyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQVNUTm9kZSBub2RlKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFzc2lnbm1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9jayBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQnJlYWtTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2hhcmFjdGVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENvbnRpbnVlU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRG9TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJZlN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5zdGFuY2VvZkV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEphdmFkb2Mgbm9kZSkgewotCQlyZXR1cm4gKHN1cGVyLnZpc2l0KG5vZGUpKSA/IHZpc2l0Xyhub2RlKSA6IGZhbHNlOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChMYWJlbGVkU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVsbExpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyZW50aGVzaXplZEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmltaXRpdmVUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFNpbXBsZU5hbWUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyQ29uc3RydWN0b3JJbnZvY2F0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN3aXRjaENhc2Ugbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaGlzRXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQW5ub3RhdGlvblR5cGVNZW1iZXJEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJsb2NrQ29tbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEVuaGFuY2VkRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChMaW5lQ29tbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1hcmtlckFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJSZWYgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWYgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNb2RpZmllciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE5vcm1hbEFubm90YXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZFR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGFnRWxlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRleHRFbGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVHlwZVBhcmFtZXRlciBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXJyYXlBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5Q3JlYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5VHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzZXJ0U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9jayBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQm9vbGVhbkxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDYXN0RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2F0Y2hDbGF1c2Ugbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENsYXNzSW5zdGFuY2VDcmVhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29tcGlsYXRpb25Vbml0IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29udGludWVTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KERvU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbXB0eVN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRXhwcmVzc2lvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRmllbGRBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSWZTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEltcG9ydERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbmZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbml0aWFsaXplciBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSmF2YWRvYyBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdW1iZXJMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYWNrYWdlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQb3N0Zml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJlZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUHJpbWl0aXZlVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkTmFtZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUmV0dXJuU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTaW1wbGVUeXBlIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdHJpbmdMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJGaWVsZEFjY2VzcyBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTd2l0Y2hTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN5bmNocm9uaXplZFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGhpc0V4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRocm93U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUcnlTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoV2hpbGVTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJsb2NrQ29tbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW5oYW5jZWRGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVudW1Db25zdGFudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExpbmVDb21tZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZW1iZXJSZWYgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1lbWJlclZhbHVlUGFpciBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RSZWZQYXJhbWV0ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1vZGlmaWVyIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJhbWV0ZXJpemVkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUXVhbGlmaWVkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGFnRWxlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVGV4dEVsZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVQYXJhbWV0ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdpbGRjYXJkVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUQW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzcxYzc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEFubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5Mb2NhdGlvbktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgbWVtYmVyIHdpdGggc2ltcGxpZmllZCBhbm5vdGF0aW9uIGhhbmRsaW5nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSkRUQW5ub3RhdGVkRWxlbWVudAotCWltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudAotewotCi0JLyoqIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIG5hbWUgKGR1aCkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIGNvbXBpbGF0aW9uIHVuaXQgKGZpbGUpIGNvbnRhaW5pbmcgdGhlIGFubm90YXRlZCBlbGVtZW50OwotCSAqIHVzZWQgZm9yIGJ1aWxkaW5nIGFuIEFTVCB3aGVuIHdlIG1vZGlmeSB0aGUgYW5ub3RhdGVkIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0OwotCi0JLyoqCi0JICogdGhpcyBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIGEgd2F5IHRvIG1vZGlmeSB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqIChmaWxlKSB3aGVuIGl0IGlzIG9wZW4gaW4gYW4gZWRpdG9yIGFuZCBzaG91bGQgYmUgbW9kaWZpZWQgb24gdGhlIFVJCi0JICogdGhyZWFkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKiogdGhpcyB3aWxsIGZvcm1hdCB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyBhbm5vdGF0aW9ucyBhIGJpdCAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSkRUQW5ub3RhdGVkRWxlbWVudCgKLQkJCVN0cmluZyBuYW1lLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhuYW1lLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEFubm90YXRlZEVsZW1lbnQoCi0JCQlTdHJpbmcgbmFtZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb21waWxhdGlvblVuaXQgPSBjb21waWxhdGlvblVuaXQ7Ci0JCXRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IgPSBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQkJdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlciA9IGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0ZWRFbGVtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQlwdWJsaWMgTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVkaXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogRWRpdCB0aGUgbWVtYmVyIHdpdGggdGhlIHNwZWNpZmllZCBlZGl0b3IuCi0JICogVGhlIGVkaXRvciB3aWxsIGJlIGludm9rZWQgb25jZSB0aGUgbWVtYmVyJ3MgY29tcGlsYXRpb24gdW5pdAotCSAqIGlzIGluIGFuIGVkaXRhYmxlIHN0YXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIGVkaXQoRWRpdG9yIGVkaXRvcikgewotCQl0cnkgewotCQkJdGhpcy5lZGl0XyhlZGl0b3IpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5COiBCZSBjYXJlZnVsIGNoYW5naW5nIHRoaXMgbWV0aG9kLgotCSAqIFRoaW5ncyB0byBsb29rIG91dCBmb3I6Ci0JICogICAgIC0gd2hlbiBlZGl0aW5nIHZpYSB0aGUgSmF2YUVkaXRvciB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhIHdvcmtpbmcgY29weQotCSAqICAgICAtIHdoZW4gZWRpdGluZyB3aXRob3V0IGFuIGVkaXRvciBvciB2aWEgYSBzaW1wbGUgdGV4dCBlZGl0b3IsIGEgIndvcmtpbmcgY29weSIgbXVzdCBiZSBjcmVhdGVkLgotCSAqICAgICAgICAoYXQgbGVhc3QgYXMgZmFyIGFzIEkgY2FuIHRlbGwgIH5rZm0pCi0JICogICAgIC0gc2hhcmVkRG9jdW1lbnQgaXMgb25seSBldmVyIGZhbHNlIGluIHRlc3RzIChoZWFkbGVzcyBtb2RlKS4gIEluIHRoZSBVSSwgZXZlbiBpZiB0aGUgZmlsZQotCSAqICAgICAgICBpcyBub3Qgb3BlbiBpbiBhbiBlZGl0b3IsIHNoYXJlZERvY3VtZW50IGlzIHN0aWxsIHRydWUgKGJ1ZmZlciBpcyBub3QgbnVsbCkKLQkgKiAgICAgLSBpZiBhIHdvcmtpbmcgY29weSBpcyBjcmVhdGVkLCB0aGVuIHdlIG11c3QgZGlzY2FyZCBpdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVkaXRfKEVkaXRvciBlZGl0b3IpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBjcmVhdGVXb3JraW5nQ29weSA9ICEgdGhpcy5jb21waWxhdGlvblVuaXQuaXNXb3JraW5nQ29weSgpOwotCQlpZiAoY3JlYXRlV29ya2luZ0NvcHkpIHsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmJlY29tZVdvcmtpbmdDb3B5KG51bGwpOwotCQl9Ci0KLQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmdldFRleHRGaWxlQnVmZmVyKHRoaXMuY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKSwgTG9jYXRpb25LaW5kLk5PUk1BTElaRSk7Ci0JCWJvb2xlYW4gc2hhcmVkRG9jdW1lbnQgPSAoYnVmZmVyICE9IG51bGwpOyAgLy8gZG9jdW1lbnRzIGFyZSB0eXBpY2FsbHkgc2hhcmVkIHdoZW4gdGhleSBhcmUgYWxyZWFkeSBvcGVuIGluIGFuIGVkaXRvcgotCQlJRG9jdW1lbnQgZG9jID0gc2hhcmVkRG9jdW1lbnQgPwotCQkJCWJ1ZmZlci5nZXREb2N1bWVudCgpIDoKLQkJCQluZXcgRG9jdW1lbnQodGhpcy5jb21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuZ2V0Q29udGVudHMoKSk7Ci0KLQkJdHJ5IHsKLQkJCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoKTsKLQkJCWFzdFJvb3QucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotCQotCQkJZWRpdG9yLmVkaXQodGhpcy5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQkKLQkJCVRleHRFZGl0IGVkaXRzID0gYXN0Um9vdC5yZXdyaXRlKGRvYywgdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0SmF2YVByb2plY3QoKS5nZXRPcHRpb25zKHRydWUpKTsKLQkJCWlmIChzaGFyZWREb2N1bWVudCkgewotCQkJCXRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShuZXcgTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kKGVkaXRzLCBkb2MpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5hcHBseUVkaXRzKGVkaXRzLCBkb2MpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGNyZWF0ZVdvcmtpbmdDb3B5KSB7Ci0JCQkJLy9kaXNjYXJkV29ya2luZ0NvcHkgbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBiZWNvbWVXb3JraW5nQ29weSBpcyBjYWxsZWQuCi0JCQkJdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0QnVmZmVyKCkuc2V0Q29udGVudHMoZG9jLmdldCgpKTsKLQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jb21taXRXb3JraW5nQ29weSh0cnVlLCBudWxsKTsgIC8vIHRydWU9ImZvcmNlIgotCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwbHkgdGhlIHNwZWNpZmllZCBlZGl0cyB0byB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LAotCSAqIHJlZm9ybWF0dGluZyB0aGUgZG9jdW1lbnQgaWYgbmVjZXNzYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwbHlFZGl0cyhUZXh0RWRpdCBlZGl0cywgSURvY3VtZW50IGRvYykgdGhyb3dzIE1hbGZvcm1lZFRyZWVFeGNlcHRpb24sIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJZWRpdHMuYXBwbHkoZG9jLCBUZXh0RWRpdC5VUERBVEVfUkVHSU9OUyk7Ci0JCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuZm9ybWF0KGRvYywgZWRpdHMpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gQVNUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMuY29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kaWZ5IHNoYXJlZCBkb2N1bWVudCBjb21tYW5kIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIHNpbXBsZSBjb21tYW5kIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgbWVtYmVyIHRvIGFwcGx5IHRoZSBlZGl0cwotCSAqIGluIHRoZSBzYW1lIHdheSBhcyBpZiB0aGUgZG9jdW1lbnQgd2VyZSBub3Qgc2hhcmVkCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwcml2YXRlIGZpbmFsIFRleHRFZGl0IGVkaXRzOwotCQlwcml2YXRlIGZpbmFsIElEb2N1bWVudCBkb2M7Ci0KLQkJcHJvdGVjdGVkIE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChUZXh0RWRpdCBlZGl0cywgSURvY3VtZW50IGRvYykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZWRpdHMgPSBlZGl0czsKLQkJCXRoaXMuZG9jID0gZG9jOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJSkRUQW5ub3RhdGVkRWxlbWVudC50aGlzLmFwcGx5RWRpdHModGhpcy5lZGl0cywgdGhpcy5kb2MpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEVudW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkOWJjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBlbnVtLgotICovCi1wdWJsaWMgY2xhc3MgSkRURW51bQotCWV4dGVuZHMgQWJzdHJhY3RKRFRUeXBlCi0JaW1wbGVtZW50cyBFbnVtCi17Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBwcmltYXJ5IHR5cGUsIGFuIGVudW0KLQkgKi8KLQlwdWJsaWMgSkRURW51bSgKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKGVudW1EZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZSwgYW4gZW51bQotCSAqLwotCXB1YmxpYyBKRFRFbnVtKAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIobnVsbCwgZW51bURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCBlbnVtcwotCSAqLwotCXB1YmxpYyBKRFRFbnVtKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBlbnVtRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIGVudW1zCi0JICovCi0JcHVibGljIEpEVEVudW0oCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIGVudW1EZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCi0JICovCi0JcHVibGljIEpEVEVudW0oVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudW1EZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHN1cGVyLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbltdIGdldEVudW1Db25zdGFudHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyA9IGVudW1Db25zdGFudHMoZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQkJcmV0dXJuIGVudW1Db25zdGFudHMudG9BcnJheShuZXcgRW51bUNvbnN0YW50RGVjbGFyYXRpb25bZW51bUNvbnN0YW50cy5zaXplKCldKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnVtQ29uc3RhbnRzKEVudW1EZWNsYXJhdGlvbiBlZCkgewotCQlyZXR1cm4gZWQuZW51bUNvbnN0YW50cygpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKGdldEVudW1zKGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gKEVudW1EZWNsYXJhdGlvbikgc3VwZXIuZ2V0VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbnMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgZ2V0QVNUTm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JlZGQ5NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIGVudW0gY29uc3RhbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRFRFbnVtQ29uc3RhbnQKLQlleHRlbmRzIEpEVE1lbWJlcgotCWltcGxlbWVudHMgRW51bUNvbnN0YW50Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSkRURW51bUNvbnN0YW50KAotCQkJRW51bSBkZWNsYXJpbmdFbnVtLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nRW51bSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgSkRURW51bUNvbnN0YW50KAotCQkJRW51bSBkZWNsYXJpbmdFbnVtLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nRW51bSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0ZXN0aW5nCi0JICovCi0JcHVibGljIEpEVEVudW1Db25zdGFudChFbnVtIGRlY2xhcmluZ0VudW0sIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJdGhpcyhkZWNsYXJpbmdFbnVtLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW51bSBnZXREZWNsYXJpbmdUeXBlKCkgewotCQlyZXR1cm4gKEVudW0pIHN1cGVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEFubm90YXRlZEVsZW1lbnQvRW51bUNvbnN0YW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJVmFyaWFibGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLnJlc29sdmVWYXJpYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBBU1ROb2RlVGV4dFJhbmdlKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldE5hbWUoKSk7Ci0JfQotCi0JLy9BcyBmYXIgYXMgSSBjYW4gdGVsbCwgZW51bSBjb25zdGFudHMgYXJlIGFsd2F5cyAicGVyc2lzdGFibGUiLCAKLQkvL3RoZXJlIGFyZSBubyBtb2RpZmllcnMgeW91IGNhbiBhZGQgdG8gYW4gZW51bSBjb25zdGFudAotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBnZXRTZWxlY3RlZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWludCBvY2N1cnJlbmNlID0gdGhpcy5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24gOiB0aGlzLmdldERlY2xhcmluZ1R5cGVFbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMoYXN0Um9vdCkpIHsKLQkJCWlmIChlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gb2NjdXJyZW5jZSkgewotCQkJCQlyZXR1cm4gZW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHJldHVybiBudWxsIGlmIHRoZSBmaWVsZCBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlOwotCQkvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY29udGV4dCBtb2RlbCBoYXMgbm90IHlldAotCQkvLyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBidXQgaXMgc3RpbGwKLQkJLy8gYXNraW5nIGZvciBhbiBBU1ROb2RlIChlLmcuIGR1cmluZyBhIHNlbGVjdGlvbiBldmVudCkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1Db25zdGFudERlY2xhcmF0aW9uW10gZ2V0RGVjbGFyaW5nVHlwZUVudW1Db25zdGFudERlY2xhcmF0aW9ucyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlMaXN0PEVudW1Db25zdGFudERlY2xhcmF0aW9uPiBlbnVtQ29uc3RhbnRzID0gZW51bUNvbnN0YW50cyh0aGlzLmdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCXJldHVybiBlbnVtQ29uc3RhbnRzLnRvQXJyYXkobmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uW2VudW1Db25zdGFudHMuc2l6ZSgpXSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyhFbnVtRGVjbGFyYXRpb24gZWQpIHsKLQkJcmV0dXJuIGVkLmVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bURlY2xhcmF0aW9uIGdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEZpZWxkQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2NlMWVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEZpZWxkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVZhcmlhYmxlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIGZpZWxkLgotICogQXR0cmlidXRlIGJhc2VkIG9uIGEgSmF2YSBmaWVsZCwgZS5nLgotICogICAgIHByaXZhdGUgaW50IGZvbzsKLSAqLwotcHVibGljIGNsYXNzIEpEVEZpZWxkQXR0cmlidXRlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIEZpZWxkQXR0cmlidXRlCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXB1YmxpYyBKRFRGaWVsZEF0dHJpYnV0ZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ1R5cGUsIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGVzdGluZwotCSAqLwotCXB1YmxpYyBKRFRGaWVsZEF0dHJpYnV0ZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZS9GaWVsZEF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgewotCQlyZXR1cm4gKFR5cGUpIHN1cGVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEZyYWdtZW50KGFzdFJvb3QpLnJlc29sdmVCaW5kaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEZpZWxkRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFNlbGVjdGVkRGVjbGFyYXRpb24oYXN0Um9vdCwgRklFTERfREVDTEFSQVRJT05fU0VMRUNUT1IpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEFTVE5vZGVUZXh0UmFuZ2UodGhpcy5nZXRGcmFnbWVudChhc3RSb290KS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldFR5cGUoKS5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmllbGQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSVZhcmlhYmxlQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLmZpZWxkSXNQZXJzaXN0YWJsZShuZXcgSlBUVG9vbHNBZGFwdGVyKGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gYXNzdW1lIHRoZSBkZWNsYXJpbmcgdHlwZSBpcyBub3QgYW4gZW51bSBvciBhbm5vdGF0aW9uCi0JCS8vIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9ucwotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZ2V0RnJhZ21lbnQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihhc3RSb290LCBWQVJJQUJMRV9ERUNMQVJBVElPTl9GUkFHTUVOVF9TRUxFQ1RPUik7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIGVpdGhlciBhIEZpZWxkRGVjbGFyYXRpb24gb3IgYSBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQsCi0JICogZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3I7Ci0JICogCi0JICogaGFuZGxlIG11bHRpcGxlIGZpZWxkcyBkZWNsYXJlZCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQ6Ci0JICogICAgIHByaXZhdGUgaW50IGZvbywgYmFyOwotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIEFTVE5vZGU+IFQgZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCwgU2VsZWN0b3I8VD4gc2VsZWN0b3IpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJaW50IG9jY3VycmVuY2UgPSB0aGlzLmdldE9jY3VycmVuY2UoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24gOiB0aGlzLmdldERlY2xhcmluZ1R5cGVGaWVsZERlY2xhcmF0aW9ucyhhc3RSb290KSkgewotCQkJZm9yIChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgZnJhZ21lbnQgOiBmcmFnbWVudHMoZmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlpZiAoZnJhZ21lbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQljb3VudCsrOwotCQkJCQlpZiAoY291bnQgPT0gb2NjdXJyZW5jZSkgewotCQkJCQkJcmV0dXJuIHNlbGVjdG9yLnNlbGVjdChmaWVsZERlY2xhcmF0aW9uLCBmcmFnbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gcmV0dXJuIG51bGwgaWYgdGhlIGZpZWxkIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGU7Ci0JCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBub3QgeWV0Ci0JCS8vIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJ1dCBpcyBzdGlsbAotCQkvLyBhc2tpbmcgZm9yIGFuIEFTVE5vZGUgKGUuZy4gZHVyaW5nIGEgc2VsZWN0aW9uIGV2ZW50KQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmllbGREZWNsYXJhdGlvbltdIGdldERlY2xhcmluZ1R5cGVGaWVsZERlY2xhcmF0aW9ucyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0RmllbGRzKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyhGaWVsZERlY2xhcmF0aW9uIGZkKSB7Ci0JCXJldHVybiBmZC5mcmFnbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VsZWN0b3IgKioqKioqKioqKgotCi0JLy8gSSdtIG5vdCBxdWl0ZSBzdXJlIHRoaXMgaW50ZXJmYWNlIGlzIHdvcnRoIHRoZSByZXN1bHRpbmcgb2JmdXNjYXRpb24sCi0JLy8gYnV0LCB0aGVuLCBJIGtlcHQgY2hhbmdpbmcgYm90aCBtZXRob2RzLCBzby4uLiAgfmJqdgotCXByb3RlY3RlZCBpbnRlcmZhY2UgU2VsZWN0b3I8VCBleHRlbmRzIEFTVE5vZGU+IHsKLQkJVCBzZWxlY3QoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPiBGSUVMRF9ERUNMQVJBVElPTl9TRUxFQ1RPUiA9Ci0JCW5ldyBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPigpIHsKLQkJCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJcmV0dXJuICJmaWVsZCBkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkZJRUxEX0RFQ0xBUkFUSU9OX1NFTEVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SID0KLQkJbmV3IFNlbGVjdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudD4oKSB7Ci0JCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlRfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQotCS8vICoqKioqKioqKiogSlBUVG9vbHMgYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElGaWVsZAotCSAqIG9yIGFuIElWYXJpYWJsZUJpbmRpbmcgZXRjLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyIGltcGxlbWVudHMgSlBUVG9vbHMuRmllbGRBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJVmFyaWFibGVCaW5kaW5nIGZpZWxkQmluZGluZzsKLQotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElWYXJpYWJsZUJpbmRpbmcgZmllbGRCaW5kaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGZpZWxkQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGRCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjM4ZjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIG1lbWJlciB3aXRoIHNpbXBsaWZpZWQgYW5ub3RhdGlvbiBoYW5kbGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVE1lbWJlciBleHRlbmRzIEpEVEFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIE1lbWJlcgotewotCi0JLyoqIHRoaXMgd2lsbCBiZSBudWxsIGZvciB0aGUgcHJpbWFyeSB0eXBlICovCi0JcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZTsKLQotCS8qKgotCSAqIG1lbWJlcnMgY2FuIG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIG5vbi1jb21waWxpbmcgc291cmNlOwotCSAqIGNvdW50IHN0YXJ0cyBhdCAxOyB0aGUgcHJpbWFyeSB0eXBlIHdpbGwgaGF2ZSBvY2N1cnJlbmNlIDEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBvY2N1cnJlbmNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpEVE1lbWJlcigKLQkJCUFic3RyYWN0VHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZW1iZXIoCi0JCQlBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlID0gZGVjbGFyaW5nVHlwZTsKLQkJdGhpcy5vY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQl9Ci0KLQkvL2NvdmFyaWFudCBvdmVycmlkZQotCXB1YmxpYyBhYnN0cmFjdCBCb2R5RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCQotCS8vICoqKioqKioqKiogTWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXIpIHsKLQkJcmV0dXJuIG1lbWJlck5hbWUuZXF1YWxzKHRoaXMuZ2V0TmFtZSgpKSAmJiAob2NjdXIgPT0gdGhpcy5vY2N1cnJlbmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBnZXRPY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5vY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBmb3IgYSB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGMwMWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBtZXRob2QuCi0gKiBBdHRyaWJ1dGUgYmFzZWQgb24gYSBKYXZhIHByb3BlcnR5LCBlLmcuCi0gKiAgICAgcHJpdmF0ZSBpbnQgZ2V0Rm9vKCkgewotICogICAgICAgICByZXR1cm4gZm9vOwotICogICAgIH0KLSAqICAgICBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHsKLSAqICAgICAgICAgdGhpcy5mb28gPSBmb287Ci0gKiAgICAgfQotICovCi1wdWJsaWMgY2xhc3MgSkRUTWV0aG9kQXR0cmlidXRlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIE1ldGhvZEF0dHJpYnV0ZQotewotCS8qKiB3ZSBuZWVkIHRoZSBwYXJhbWV0ZXIgdHlwZXMgdG8gYnVpbGQgdGhlIG1ldGhvZCBzaWduYXR1cmUgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGRlY2xhcmluZ1R5cGUsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQlwcml2YXRlIEpEVE1ldGhvZEF0dHJpYnV0ZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLmdldE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gbWV0aG9kU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUTWV0aG9kQXR0cmlidXRlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZShuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZS9NZXRob2RBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoYXN0Um9vdCkpIHsKLQkJCWlmICh0aGlzLm1hdGNoZXMobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gdGhpcy5nZXRPY2N1cnJlbmNlKCkpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGU7Ci0JCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBub3QgeWV0Ci0JCS8vIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJ1dCBpcyBzdGlsbAotCQkvLyBhc2tpbmcgZm9yIGFuIEFTVE5vZGUgKGUuZy4gZHVyaW5nIGEgc2VsZWN0aW9uIGV2ZW50KQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXMoc2lnbmF0dXJlKSAmJiAob2NjdXJyZW5jZSA9PSB0aGlzLmdldE9jY3VycmVuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlKSB7Ci0JCXJldHVybiBzaWduYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSkKLQkJCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKEFTVFRvb2xzLmJ1aWxkTWV0aG9kU2lnbmF0dXJlKG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgI21hdGNoZXMoTWV0aG9kU2lnbmF0dXJlLCBpbnQpLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgQVNUTm9kZVRleHRSYW5nZSh0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiAiZm9vIiBmb3IgYSBtZXRob2QgbmFtZWQgImdldEZvbyIsICJpc0ZvbyIsICJzZXRGb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRHZXR0ZXJTZXR0ZXJNZXRob2ROYW1lVG9Qcm9wZXJ0eU5hbWUodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCQlyZXR1cm4gKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihuZXcgSlBUVG9vbHNBZGFwdGVyKGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gYXNzdW1lIHRoZSBkZWNsYXJpbmcgdHlwZSBpcyBub3QgYW4gZW51bSBvciBhbm5vdGF0aW9uCi0JCS8vIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9ucwotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2REZWNsYXJhdGlvbltdIGdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpLmdldE1ldGhvZHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSlBUVG9vbHMgYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElNZXRob2QKLQkgKiBvciBhbiBJTWV0aG9kQmluZGluZyBldGMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIKLQkJaW1wbGVtZW50cyBKUFRUb29scy5TaW1wbGVNZXRob2RBZGFwdGVyCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZzsKLQotCQlwcm90ZWN0ZWQgU2ltcGxlSlBUVG9vbHNBZGFwdGVyKElNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLm1ldGhvZEJpbmRpbmcgPSBtZXRob2RCaW5kaW5nOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2RCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlRXJhc3VyZU5hbWUoKSB7Ci0JCQlJVHlwZUJpbmRpbmcgcmV0dXJuVHlwZSA9IHRoaXMubWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7Ci0JCQlyZXR1cm4gKHJldHVyblR5cGUgPT0gbnVsbCkgPyBudWxsIDogcmV0dXJuVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRFcmFzdXJlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuaXNDb25zdHJ1Y3RvcigpOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEpQVFRvb2xzQWRhcHRlcgotCQlleHRlbmRzIFNpbXBsZUpQVFRvb2xzQWRhcHRlcgotCQlpbXBsZW1lbnRzIEpQVFRvb2xzLk1ldGhvZEFkYXB0ZXIKLQl7Ci0JCXByb3RlY3RlZCBKUFRUb29sc0FkYXB0ZXIoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQkJc3VwZXIobWV0aG9kQmluZGluZyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2RCaW5kaW5nLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UGFyYW1ldGVyc0xlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgSlBUVG9vbHMuU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKElNZXRob2RCaW5kaW5nIHNpYmxpbmcgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJCWlmICgoc2libGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKQotCQkJCQkJJiYgc2libGluZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU2ltcGxlSlBUVG9vbHNBZGFwdGVyKHNpYmxpbmcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIgZ2V0U2libGluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkgewotCQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5tZXRob2RCaW5kaW5nLmdldERlY2xhcmluZ0NsYXNzKCk7Ci0JCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZm9yIChJTWV0aG9kQmluZGluZyBzaWJsaW5nIDogdHlwZUJpbmRpbmcuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKLQkJCQlJVHlwZUJpbmRpbmdbXSBzaWJsaW5nUGFybVR5cGVzID0gc2libGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJCWlmICgoc2libGluZ1Bhcm1UeXBlcy5sZW5ndGggPT0gMSkKLQkJCQkJCSYmIHNpYmxpbmcuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKQotCQkJCQkJJiYgc2libGluZ1Bhcm1UeXBlc1swXS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRFcmFzdXJlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpKSB7Ci0JCQkJCXJldHVybiBuZXcgU2ltcGxlSlBUVG9vbHNBZGFwdGVyKHNpYmxpbmcpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2N2U0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRNb2RpZmllZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JbXBvcnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1Ykl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGFueSBvZiB0aGUgQVNUIG5vZGVzIHRoYXQgaGF2ZSBtb2RpZmllcnMgKHNwZWNpZmljYWxseSwgYW5ub3RhdGlvbnMpOwotICogaS5lLiBCb2R5RGVjbGFyYXRpb24sIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uLAotICogYW5kIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRFRNb2RpZmllZERlY2xhcmF0aW9uCi0JaW1wbGVtZW50cyBNb2RpZmllZERlY2xhcmF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyIGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKEFkYXB0ZXIgYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBCb2R5RGVjbGFyYXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKFBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBQYWNrYWdlRGVjbGFyYXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7CQkJCi0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uQWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCXB1YmxpYyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbGFyYXRpb24pIHsKLQkJdGhpcyhuZXcgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIoZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbk5hbWVkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPEFubm90YXRpb24+IHN0cmVhbSA9IHRoaXMuYW5ub3RhdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzTmFtZWQoYW5ub3RhdGlvbiwgYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSB0aGlzLmdldE1vZGlmaWVycygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7Ci0JCQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzTmFtZWQoKEFubm90YXRpb24pIG1vZGlmaWVyLCBhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBvbGRBbm5vdGF0aW9uTmFtZSwgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKSB7Ci0JCUxpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHRoaXMuZ2V0TW9kaWZpZXJzKCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSBtb2RpZmllcnMubGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7Ci0JCQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzTmFtZWQoKEFubm90YXRpb24pIG1vZGlmaWVyLCBvbGRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJc3RyZWFtLnNldChuZXdBbm5vdGF0aW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLmFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgZGVjbGFyYXRpb24uCi0JICogQnkgY29udmVudGlvbiBhbm5vdGF0aW9ucyBwcmVjZWRlIHRoZSAic3RhbmRhcmQiIChKTFMyKSBtb2RpZmllcnM7Ci0JICogdGhvdWdoLCB0ZWNobmljYWxseSwgdGhleSBjYW4gYmUgaW50ZXJzcGVyc2VkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCUxpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyA9IHRoaXMuZ2V0TW9kaWZpZXJzKCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBzdHJlYW0gPSBtb2RpZmllcnMubGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaXNNb2RpZmllcigpKSB7Ci0JCQkJc3RyZWFtLnByZXZpb3VzKCk7ICAvLyBwdXQgdGhlIGFubm90YXRpb24gKmJlZm9yZSogdGhlIGZpcnN0ICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyCi0JCQkJc3RyZWFtLmFkZChhbm5vdGF0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJbW9kaWZpZXJzLmFkZChhbm5vdGF0aW9uKTsgIC8vIGp1c3QgdGFjayBpdCBvbiB0byB0aGUgZW5kCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJhdGlvbidzIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYXRvcldyYXBwZXI8SUV4dGVuZGVkTW9kaWZpZXIsIEFubm90YXRpb24+KHRoaXMuYW5ub3RhdGlvbnNfKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxJRXh0ZW5kZWRNb2RpZmllcj4gYW5ub3RhdGlvbnNfKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPih0aGlzLmdldE1vZGlmaWVycygpLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElFeHRlbmRlZE1vZGlmaWVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0Fubm90YXRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGltcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGRJbXBvcnQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lLmluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyB0aGUgY2xhc3MgaXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSAtIG5vIG5lZWQgZm9yIGltcG9ydAotCQl9Ci0JCXJldHVybiB0aGlzLmFkZEltcG9ydChjbGFzc05hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRTdGF0aWNJbXBvcnQoU3RyaW5nIGVudW1Db25zdGFudE5hbWUpIHsKLQkJaW50IGluZGV4MSA9IGVudW1Db25zdGFudE5hbWUuaW5kZXhPZignLicpOwotCQlpZiAoaW5kZXgxID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGVudW1Db25zdGFudE5hbWUpOyAgLy8gc2hvdWxkbid0IGhhcHBlbj8KLQkJfQotCQlpbnQgaW5kZXgyID0gZW51bUNvbnN0YW50TmFtZS5pbmRleE9mKCcuJywgaW5kZXgxICsgMSk7Ci0JCWlmIChpbmRleDIgPT0gLTEpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gdGhlIGVudW0gaXMgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSAtIG5vIG5lZWQgZm9yIGltcG9ydAotCQl9Ci0JCXJldHVybiB0aGlzLmFkZEltcG9ydChlbnVtQ29uc3RhbnROYW1lLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljSW1wb3J0KSB7Ci0JCUJvb2xlYW4gaW5jbHVkZSA9IHRoaXMuaW1wb3J0c0luY2x1ZGUoaW1wb3J0TmFtZSwgc3RhdGljSW1wb3J0KTsKLQkJaWYgKGluY2x1ZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGluY2x1ZGUuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQlJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA9IHRoaXMuZ2V0QXN0KCkubmV3SW1wb3J0RGVjbGFyYXRpb24oKTsKLQkJaW1wb3J0RGVjbGFyYXRpb24uc2V0TmFtZSh0aGlzLmdldEFzdCgpLm5ld05hbWUoaW1wb3J0TmFtZSkpOwotCQlpbXBvcnREZWNsYXJhdGlvbi5zZXRTdGF0aWMoc3RhdGljSW1wb3J0KTsKLQkJdGhpcy5nZXRJbXBvcnRzKCkuYWRkKGltcG9ydERlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSnVzdCBhIGJpdCBoYWNreToKLQkgKiAgICAgUmV0dXJuIEJvb2xlYW4uVFJVRSBpZiB0aGUgaW1wb3J0IGlzIGFscmVhZHkgcHJlc2VudC4KLQkgKiAgICAgUmV0dXJuIEJvb2xlYW4uRkFMU0UgaWYgYSBjb2xsaWRpbmcgaW1wb3J0IGlzIGFscmVhZHkgcHJlc2VudC4KLQkgKiAgICAgUmV0dXJuIG51bGwgaWYgYSBuZXcgaW1wb3J0IG1heSBiZSBhZGRlZC4KLQkgKiBUaGlzIGhhY2tlcnkgYWxsb3dzIHVzIHRvIGxvb3AgdGhyb3VnaCB0aGUgaW1wb3J0cyBvbmx5IG9uY2UKLQkgKiAoYW5kIGNvbXBvc2Ugb3VyIG1ldGhvZHMpLgotCSAqIFByZS1jb25kaXRpb246ICdpbXBvcnROYW1lJyBpcyBub3QgaW4gdGhlICJkZWZhdWx0IiBwYWNrYWdlIChpLmUuIGl0ICppcyogcXVhbGlmaWVkKQotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGltcG9ydHNJbmNsdWRlKFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY0ltcG9ydCkgewotCQlpbnQgcGVyaW9kID0gaW1wb3J0TmFtZS5sYXN0SW5kZXhPZignLicpOyAgLy8gc2hvdWxkIG5vdCBiZSAtMQotCQlTdHJpbmcgaW1wb3J0TmFtZVF1YWxpZmllciA9IGltcG9ydE5hbWUuc3Vic3RyaW5nKDAsIHBlcmlvZCk7Ci0JCVN0cmluZyBzaG9ydEltcG9ydE5hbWUgPSBpbXBvcnROYW1lLnN1YnN0cmluZyhwZXJpb2QgKyAxKTsKLQkJcmV0dXJuIHRoaXMuaW1wb3J0c0luY2x1ZGUoaW1wb3J0TmFtZSwgaW1wb3J0TmFtZVF1YWxpZmllciwgc2hvcnRJbXBvcnROYW1lLCBzdGF0aWNJbXBvcnQpOwotCX0KLQotCS8qKgotCSAqIHByZS1jYWxjdWxhdGUgdGhlIHF1YWxpZmllciBhbmQgc2hvcnQgbmFtZQotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGltcG9ydHNJbmNsdWRlKFN0cmluZyBpbXBvcnROYW1lLCBTdHJpbmcgaW1wb3J0TmFtZVF1YWxpZmllciwgU3RyaW5nIHNob3J0SW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNJbXBvcnQpIHsKLQkJZm9yIChJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiA6IHRoaXMuZ2V0SW1wb3J0cygpKSB7Ci0JCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKSA9PSBzdGF0aWNJbXBvcnQpIHsKLQkJCQlCb29sZWFuIG1hdGNoID0gdGhpcy5pbXBvcnRNYXRjaGVzKGltcG9ydERlY2xhcmF0aW9uLCBpbXBvcnROYW1lLCBpbXBvcnROYW1lUXVhbGlmaWVyLCBzaG9ydEltcG9ydE5hbWUpOwotCQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBtYXRjaDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmVseSBvbiB0aGUgSkRUIG1vZGVsIGhlcmUsIHNpbmNlIHdlIGFyZSBsb29raW5nCi0JICogYXQgb2JqZWN0cyB0aGF0IHNob3VsZCBub3QgYmUgY2hhbmdpbmcgdW5kZXJuZWF0aCB1cy4uLgotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGltcG9ydE1hdGNoZXMoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24sIFN0cmluZyBpbXBvcnROYW1lLCBTdHJpbmcgaW1wb3J0TmFtZVF1YWxpZmllciwgU3RyaW5nIHNob3J0SW1wb3J0TmFtZSkgewotCQkvLyBleGFtcGxlczoKLQkJLy8gJ2ltcG9ydE5hbWUnIGlzICJqYXZhLnV0aWwuRGF0ZSIKLQkJLy8gICAgIG9yCi0JCS8vICdpbXBvcnROYW1lJyBpcyAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJU3RyaW5nIGlkbiA9IGltcG9ydERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKGltcG9ydE5hbWUuZXF1YWxzKGlkbikpIHsKLQkJCS8vIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsgPT4gIkRhdGUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS51dGlsLkRhdGUiCi0JCQkvLyBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7ID0+ICJUWVBFIiB3aWxsIHJlc29sdmUgdG8gImphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEUiCi0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0KLQkJU3RyaW5nIHNob3J0SUROID0gaWRuLnN1YnN0cmluZyhpZG4ubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQlpZiAoc2hvcnRJbXBvcnROYW1lLmVxdWFscyhzaG9ydElETikpIHsKLQkJCS8vIGltcG9ydCBqYXZhLnNxbC5EYXRlOyA9PiBhbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiAiRGF0ZSIKLQkJCS8vIGltcG9ydCBzdGF0aWMgb3JnLmZvby5CYXIuVFlQRTsgPT4gYW1iaWd1b3VzIHJlc29sdXRpb24gb2YgIlRZUEUiCi0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCi0JCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc09uRGVtYW5kKCkpIHsKLQkJCWlmIChpbXBvcnROYW1lUXVhbGlmaWVyLmVxdWFscyhpZG4pKSB7Ci0JCQkJLy8gaW1wb3J0IGphdmEudXRpbC4qOyA9PiAiRGF0ZSIgd2lsbCByZXNvbHZlIHRvICJqYXZhLnV0aWwuRGF0ZSIKLQkJCQkvLyBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLio7ID0+ICJUWVBFIiB3aWxsIHJlc29sdmUgdG8gImphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEUiCi0JCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCX0KLQkJCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc1N0YXRpYygpKSB7Ci0JCQkJaWYgKHRoaXMuZW51bVJlc29sdmVzKGlkbiwgc2hvcnRJbXBvcnROYW1lKSkgewotCQkJCQkvLyBpbXBvcnQgc3RhdGljIG9yZy5mb28uQmFyLio7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJUWVBFIgotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLnR5cGVSZXNvbHZlcyhpZG4gKyAnLicgKyBzaG9ydEltcG9ydE5hbWUpKSB7Ci0JCQkJCS8vIGltcG9ydCBqYXZhLnNxbC4qOyA9PiBhbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiAiRGF0ZSIKLQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vIG1hdGNoZXMgLSBPSyB0byBhZGQgZXhwbGljaXQgaW1wb3J0Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGVudW1SZXNvbHZlcyhTdHJpbmcgZW51bVR5cGVOYW1lLCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZW51bVJlc29sdmVzXyhlbnVtVHlwZU5hbWUsIGVudW1Db25zdGFudE5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGVudW1SZXNvbHZlc18oU3RyaW5nIGVudW1UeXBlTmFtZSwgU3RyaW5nIGVudW1Db25zdGFudE5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJVHlwZSBqZHRUeXBlID0gdGhpcy5maW5kVHlwZV8oZW51bVR5cGVOYW1lKTsKLQkJaWYgKGpkdFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBqZHRUeXBlLmlzRW51bSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChJRmllbGQgamR0RmllbGQgOiBqZHRUeXBlLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoamR0RmllbGQuaXNFbnVtQ29uc3RhbnQoKSAmJiBqZHRGaWVsZC5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhlbnVtQ29uc3RhbnROYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlUmVzb2x2ZXMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZmluZFR5cGUobmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmZpbmRUeXBlXyhuYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGVfKFN0cmluZyBuYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0SmF2YUVsZW1lbnQoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBnZXRJbXBvcnRzKCkgewotCQlyZXR1cm4gdGhpcy5pbXBvcnRzKHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxJbXBvcnREZWNsYXJhdGlvbj4gaW1wb3J0cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYXN0Um9vdC5pbXBvcnRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb24gbmFtZSByZXNvbHV0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFubm90YXRpb25Jc05hbWVkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UXVhbGlmaWVkTmFtZShhbm5vdGF0aW9uKS5lcXVhbHMobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2ltcGx5IHJldHVybiB0aGUgYW5ub3RhdGlvbidzIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gYW5ub3RhdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlpZiAocmVzb2x2ZWROYW1lICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOwotCQkJfQotCQl9Ci0JCS8vIGhhY2soPyk6IGNoZWNrIGZvciBhIG1hdGNoaW5nIGltcG9ydCBiZWNhdXNlIHdoZW4gbW92aW5nIGEgc3RhbmQtYWxvbmUKLQkJLy8gYW5ub3RhdGlvbiB0byBpdHMgY29udGFpbmVyIGluIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQkJLy8gdGhlIGNvbnRhaW5lcidzIGltcG9ydCBpcyBhZGRlZCBidXQgdGhlbiBpdCB3b24ndCAicmVzb2x2ZSIgdXBvbgotCQkvLyBzdWJzZXF1ZW50IGxvb2t1cHMgKGJlY2F1c2UgdGhlIHBhcnNlciBoYXNuJ3QgaGFkIHRpbWUgdG8gcnVuPykuLi4gOi0oCi0JCXJldHVybiB0aGlzLmNvbnZlcnRUb0Z1bGxDbGFzc05hbWUoYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBuZWNlc3NhcnksIHVzZSB0aGUgZGVjbGFyYXRpb24ncyBpbXBvcnRzIHRvIGNhbGN1bGF0ZSBhIGd1ZXNzIGFzIHRvCi0JICogdGhlIHNwZWNpZmllZCBuYW1lJ3MgZnVsbHktcXVhbGlmaWVkIGZvcm0uCi0JICogU2ltcGx5IHJldHVybiB0aGUgdW5xdWFsaWZpZWQgbmFtZSBpZiB3ZSBjYW4ndCAicmVzb2x2ZSIgaXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9GdWxsQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGNoZWNrIGZvciBmdWxseS1xdWFsaWZpZWQgbmFtZQotCQlyZXR1cm4gKG5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgPyBuYW1lIDogdGhpcy5yZXNvbHZlQWdhaW5zdEltcG9ydHMobmFtZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElmIG5lY2Vzc2FyeSwgdXNlIHRoZSBkZWNsYXJhdGlvbidzIGltcG9ydHMgdG8gY2FsY3VsYXRlIGEgZ3Vlc3MgYXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUncyBmdWxseS1xdWFsaWZpZWQgZm9ybS4KLQkgKiBTaW1wbHkgcmV0dXJuIHRoZSB1bnF1YWxpZmllZCBuYW1lIGlmIHdlIGNhbid0ICJyZXNvbHZlIiBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb0Z1bGxFbnVtQ29uc3RhbnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWludCBpbmRleDEgPSBuYW1lLmluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4MSA9PSAtMSkgewotCQkJLy8gc2hvcnQgbmFtZSwgZS5nLiAiVFlQRSIKLQkJCS8vIHRydWUgPSBsb29rIGZvciBzdGF0aWMgaW1wb3J0IG9mIGVudW0gY29uc3RhbnQKLQkJCXJldHVybiB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0cyhuYW1lLCB0cnVlKTsKLQkJfQotCi0JCWludCBpbmRleDIgPSBuYW1lLmluZGV4T2YoJy4nLCBpbmRleDEgKyAxKTsKLQkJaWYgKGluZGV4MiA9PSAtMSkgewotCQkJLy8gcGFydGlhbGx5LXF1YWxpZmllZCBuYW1lLCBlLmcuICJFbGVtZW50VHlwZS5UWVBFIgotCQkJLy8gZmFsc2UgPSBsb29rIHJlZ3VsYXIgaW1wb3J0IG9mIGVudW0gY2xhc3MsIG5vdCBzdGF0aWMgaW1wb3J0IG9mIGVudW0gY29uc3RhbnQKLQkJCXJldHVybiB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0cyhuYW1lLCBmYWxzZSk7Ci0JCX0KLQotCQkvLyBmdWxseS1xdWFsaWZpZWQgbmFtZSwgZS5nLiAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQXR0ZW1wdCB0byByZXNvbHZlIHRoZSBzcGVjaWZpZWQgInNob3J0IiBuYW1lIGFnYWluc3QgdGhlIGRlY2xhcmF0aW9uJ3MKLQkgKiBpbXBvcnRzLiBSZXR1cm4gdGhlIG5hbWUgdW5jaGFuZ2VkIGlmIHdlIGNhbid0IHJlc29sdmUgaXQgKHBlcmhhcHMgaXQgaXMKLQkgKiBpbiB0aGUgImRlZmF1bHQiIHBhY2thZ2UpLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUFnYWluc3RJbXBvcnRzKFN0cmluZyBzaG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljXykgewotCQlmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogdGhpcy5nZXRJbXBvcnRzKCkpIHsKLQkJCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc1N0YXRpYygpID09IHN0YXRpY18pIHsKLQkJCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gdGhpcy5yZXNvbHZlQWdhaW5zdEltcG9ydChpbXBvcnREZWNsYXJhdGlvbiwgc2hvcnROYW1lKTsKLQkJCQlpZiAocmVzb2x2ZWROYW1lICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJlc29sdmVkTmFtZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNob3J0TmFtZTsgIC8vICJkZWZhdWx0IiBwYWNrYWdlIG9yIHVua25vd24KLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIHNwZWNpZmllZCAic2hvcnQiIG5hbWUgYWdhaW5zdCB0aGUgc3BlY2lmaWVkCi0JICogaW1wb3J0LiBSZXR1cm4gdGhlIHJlc29sdmVkIG5hbWUgaWYgdGhlIGltcG9ydCByZXNvbHZlcyBpdDsgb3RoZXJ3aXNlCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlQWdhaW5zdEltcG9ydChJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiwgU3RyaW5nIHNob3J0TmFtZSkgewotCQlTdHJpbmcgaWRuID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNPbkRlbWFuZCgpKSB7Ci0JCQlTdHJpbmcgY2FuZGlkYXRlID0gaWRuICsgJy4nICsgc2hvcnROYW1lOwotCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsKLQkJCQlpZiAodGhpcy5lbnVtUmVzb2x2ZXMoaWRuLCBzaG9ydE5hbWUpKSB7Ci0JCQkJCXJldHVybiBjYW5kaWRhdGU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy50eXBlUmVzb2x2ZXMoY2FuZGlkYXRlKSkgewotCQkJCQlyZXR1cm4gY2FuZGlkYXRlOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIG1hdGNoCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGV4cGxpY2l0IGltcG9ydCAtIHNlZSB3aGV0aGVyIGl0cyBlbmQgbWF0Y2hlcyAnc2hvcnROYW1lJwotCQlpbnQgcGVyaW9kID0gaWRuLmxlbmd0aCgpIC0gc2hvcnROYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKHBlcmlvZCA8IDEpIHsKLQkJCS8vIHNvbWV0aGluZyBtdXN0IHByZWNlZGUgcGVyaW9kCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGlkbi5jaGFyQXQocGVyaW9kKSA9PSAnLicpICYmIGlkbi5lbmRzV2l0aChzaG9ydE5hbWUpKSB7Ci0JCQlyZXR1cm4gaWRuOyAgLy8gcHJvYmFibGUgZXhhY3QgbWF0Y2gKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJhdGlvbidzIGxpc3Qgb2YgbW9kaWZpZXJzLgotCSAqIEVsZW1lbnQgdHlwZTogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRNb2RpZmllcnMoKTsKLQl9Ci0KLQlwdWJsaWMgQVNUIGdldEFzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRBU1QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpIHRoaXMuZ2V0RGVjbGFyYXRpb24oKS5nZXRSb290KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hZGFwdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWNsYXJhdGlvbiBhZGFwdGVyIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIERlZmluZSBjb21tb24gcHJvdG9jb2wgYW1vbmcgdGhlIHZhcmlvdXMgImRlY2xhcmF0aW9ucyIuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyIHsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVkICJkZWNsYXJhdGlvbiIuCi0JCSAqLwotCQlBU1ROb2RlIGdldERlY2xhcmF0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIidzIGxpc3Qgb2YgbW9kaWZpZXJzLgotCQkgKiBFbGVtZW50IHR5cGU6IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcgotCQkgKi8KLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBCb2R5RGVjbGFyYXRpb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBCb2R5RGVjbGFyYXRpb25BZGFwdGVyKEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJfQotCQlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGFja2FnZURlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIFBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKLQkJcHVibGljIFBhY2thZ2VEZWNsYXJhdGlvbkFkYXB0ZXIoUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5hbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQkKLQkvKnB1YmxpYyBzdGF0aWMgY2xhc3MgQVNUTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBU1ROb2RlIGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgQVNUTm9kZUFkYXB0ZXIoQVNUTm9kZSBkZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJfQotCQlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQkJaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgQm9keURlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuICgoQm9keURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikubW9kaWZpZXJzKCk7CQkJCQotCQkJfSBlbHNlIGlmIChkZWNsYXJhdGlvbiBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvbikgewotCQkJCXJldHVybiAoKFBhY2thZ2VEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24pLmFubm90YXRpb25zKCk7CQkJCQotCQkJfQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0qLwotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uQWRhcHRlcihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyKFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbjsKLQkJcHVibGljIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZGFwdGVyKFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQgZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUUGFja2FnZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmRiZDJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAgKiBEaXN0cmlidXRlZCB1bmRlciBsaWNlbnNlIGJ5IFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAgKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICoKLSAgKiBDb250cmlidXRvcjoKLSAgKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVBhY2thZ2VCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIEBhdXRob3IgRG1pdHJ5IEdlcmFza292Ci0gKgotICovCi0KLXB1YmxpYyBjbGFzcyBKRFRQYWNrYWdlIGV4dGVuZHMgSkRUQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRzIEFubm90YXRlZFBhY2thZ2UgewotCQotCQotCXByb3RlY3RlZCBKRFRQYWNrYWdlKFBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJpbmdQYWNrYWdlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoZGVjbGFyaW5nUGFja2FnZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIAotCQkJCWNvbXBpbGF0aW9uVW5pdCwKLQkJCQltb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JcHVibGljIEpEVFBhY2thZ2UoCi0JCQlQYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyaW5nUGFja2FnZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nUGFja2FnZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksCi0JCQkJY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJUGFja2FnZURlY2xhcmF0aW9uIHBkID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCXJldHVybiAocGQgPT0gbnVsbCkgPyBudWxsIDogcGQucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYXN0Um9vdC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgQVNUTm9kZVRleHRSYW5nZSh0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZWY4OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRFRUeXBlCi0JZXh0ZW5kcyBBYnN0cmFjdEpEVFR5cGUKLQlpbXBsZW1lbnRzIFR5cGUKLXsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKHR5cGVEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXRoaXMobnVsbCwgdHlwZURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL1R5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogZmluZCB0aGUgdHlwZSdzIGJvZHkgZGVjbGFyYXRpb24gaW4gdGhlIHNwZWNpZmllZCBBU1QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgc3VwZXIuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUobmV3IEpQVFRvb2xzQWRhcHRlcihiaW5kaW5nKSk7Ci0JfQotCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25bXSBnZXRFbnVtcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RW51bXModGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRGaWVsZHMoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb25bXSBnZXRNZXRob2RzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRNZXRob2RzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiB0aGUgZmlyc3QgdG9wLWxldmVsIHR5cGUgaW4gdGhlIHNwZWNpZmllZCBBU1Qgd2l0aCBhIG1hdGNoaW5nIG5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFRvcExldmVsVHlwZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBuZXN0ZWQgdHlwZSB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBhbmQgb2NjdXJyZW5jZQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbi5nZXRUeXBlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXQgb2YgdHlwZSBkZWNsYXJhdGlvbnMgKG1hdGNoIG5hbWUgYW5kIG9jY3VycmVuY2UpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBU1ROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSlBUIHRvb2xzIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBKUFRUb29sc0FkYXB0ZXIgaW1wbGVtZW50cyBKUFRUb29scy5UeXBlQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOwotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQkJc3VwZXIoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzQW5vbnltb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBcnJheSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbnVtKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNFbnVtKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNMb2NhbCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc01lbWJlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MzBjOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgSlBBLXJlbGF0ZWQgcXVlcmllcyBjb25jZXJuaW5nIEpEVCBvYmplY3RzLgotICovCi0vL1RPRE8gdGhpcyBuZWVkcyB0byBtb3ZlIGJlY2F1c2UgaXQgaXMgb25seSB1c2VkIGZvciBKUEEKLXB1YmxpYyBjbGFzcyBKUFRUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSAicGVyc2lzdGVkIiwgaS5lLiBtYXJrZWQgYXMKLQkgKiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MsIEVtYmVkZGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzUGVyc2lzdGFibGUoVHlwZUFkYXB0ZXIgdHlwZUFkYXB0ZXIpIHsKLQkJaWYgKHR5cGVBZGFwdGVyLmlzSW50ZXJmYWNlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNFbnVtKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNMb2NhbCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzQW5vbnltb3VzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNQcmltaXRpdmUoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlKD8pCi0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzQXJyYXkoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlKD8pCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSB0eXBlIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJVHlwZUJpbmRpbmcgYW5kIElUeXBlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVHlwZUFkYXB0ZXIgewotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JCWJvb2xlYW4gaXNBbm5vdGF0aW9uKCk7Ci0JCWJvb2xlYW4gaXNBbm9ueW1vdXMoKTsKLQkJYm9vbGVhbiBpc0FycmF5KCk7Ci0JCWJvb2xlYW4gaXNFbnVtKCk7Ci0JCWJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKLQkJYm9vbGVhbiBpc0xvY2FsKCk7Ci0JCWJvb2xlYW4gaXNNZW1iZXIoKTsKLQkJYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWVsZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpZWxkIG1heSBiZSAicGVyc2lzdGVkIi4KLQkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsICJBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IAotCSAqIGFubm90YXRlZCB3aXRoIHRoZSBUcmFuc2llbnQgYW5ub3RhdGlvbiBhcmUgcGVyc2lzdGVudC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpZWxkSXNQZXJzaXN0YWJsZShGaWVsZEFkYXB0ZXIgZmllbGRBZGFwdGVyKSB7Ci0JCWludCBtb2RpZmllcnMgPSBmaWVsZEFkYXB0ZXIuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKE1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIG5lZWRlZCB0byBjYWxjdWxhdGUgd2hldGhlciBhIGZpZWxkIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJVmFyaWFibGVCaW5kaW5nIGFuZCBJRmllbGQuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBGaWVsZEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBmaWVsZCdzIG1vZGlmaWVycy4gV2UgdXNlIHRoZXNlIHRvIGNoZWNrIHdoZXRoZXIgdGhlCi0JCSAqIGZpZWxkIGlzIHN0YXRpYyBvciB0cmFuc2llbnQuCi0JCSAqLwotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBpcyBhICJnZXR0ZXIiIG1ldGhvZCB0aGF0Ci0JICogcmVwcmVzZW50cyBhIHByb3BlcnR5IHRoYXQgbWF5IGJlICJwZXJzaXN0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyKSB7Ci0JCWlmIChtZXRob2RIYXNJbnZhbGlkTW9kaWZpZXJzKG1ldGhvZEFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEFkYXB0ZXIuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOwotCQlpZiAocmV0dXJuVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQotCQl9Ci0JCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEhhc1BhcmFtZXRlcnMobWV0aG9kQWRhcHRlcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbWV0aG9kQWRhcHRlci5nZXROYW1lKCk7Ci0JCWludCBiZWdpbkluZGV4ID0gMDsKLQkJYm9vbGVhbiBib29sZWFuR2V0dGVyID0gZmFsc2U7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpbkluZGV4ID0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDM7Ci0JCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSA9IG5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOwotCQkvLyBpZiB0aGUgdHlwZSBoYXMgYm90aCBtZXRob2RzOgotCQkvLyAgICAgYm9vbGVhbiBpc1Byb3BlcnR5KCkKLQkJLy8gICAgIGJvb2xlYW4gZ2V0UHJvcGVydHkoKQotCQkvLyB0aGVuICNpc1Byb3BlcnR5KCkgdGFrZXMgcHJlY2VkZW5jZSBhbmQgd2UgaWdub3JlICNnZXRQcm9wZXJ0eSgpOwotCQkvLyBidXQgb25seSBoYXZpbmcgI2dldFByb3BlcnR5KCkgaXMgT0sgdG9vCi0JCS8vIChzZWUgdGhlIEphdmFCZWFucyBzcGVjIDEuMDEpCi0JCWlmIChib29sZWFuR2V0dGVyICYmIG1ldGhvZEhhc1ZhbGlkU2libGluZ0lzTWV0aG9kKG1ldGhvZEFkYXB0ZXIsIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHNpbmNlIHRoZSB0eXBlIGFsc28gZGVmaW5lcyAjaXNQcm9wZXJ0eSgpLCBpZ25vcmUgI2dldFByb3BlcnR5KCkKLQkJfQotCQlyZXR1cm4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nU2V0TWV0aG9kKG1ldGhvZEFkYXB0ZXIsIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgcmV0dXJuVHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QncyBtb2RpZmllcnMgcHJldmVudCBpdAotCSAqIGZyb20gYmVpbmcgYSBnZXR0ZXIgb3Igc2V0dGVyIGZvciBhICJwZXJzaXN0ZW50IiBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMoU2ltcGxlTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyKSB7Ci0JCWludCBtb2RpZmllcnMgPSBtZXRob2RBZGFwdGVyLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzUGFyYW1ldGVycyhNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIpIHsKLQkJcmV0dXJuIG1ldGhvZEFkYXB0ZXIuZ2V0UGFyYW1ldGVyc0xlbmd0aCgpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJpcyIgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIG1ldGhvZCBpcyBhICJib29sZWFuIGdldHRlciIgKGUuZy4gJ3B1YmxpYyBib29sZWFuIGdldFByb3BlcnR5KCknKTsKLQkgKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gcmV0dXJuaW5nIHRydWUgd2hlbiB0aGUgbWV0aG9kIGl0c2VsZiBpcyBhbgotCSAqICJpcyIgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nSXNNZXRob2QoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyLCBTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKSB7Ci0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgaXNNZXRob2RBZGFwdGVyID0gbWV0aG9kQWRhcHRlci5nZXRTaWJsaW5nKCJpcyIgKyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtZXRob2RJc1ZhbGlkU2libGluZyhpc01ldGhvZEFkYXB0ZXIsICJib29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIGhhcyBhIHNpYmxpbmcgInNldCIgbWV0aG9kCi0JICogYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNWYWxpZFNpYmxpbmdTZXRNZXRob2QoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyLCBTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKSB7Ci0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgc2V0TWV0aG9kQWRhcHRlciA9IG1ldGhvZEFkYXB0ZXIuZ2V0U2libGluZygic2V0IiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoc2V0TWV0aG9kQWRhcHRlciwgInZvaWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgdmFsaWQgc2libGluZyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCByZXR1cm4gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZElzVmFsaWRTaWJsaW5nKFNpbXBsZU1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlciwgU3RyaW5nIHJldHVyblR5cGVOYW1lKSB7Ci0JCWlmIChtZXRob2RBZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhtZXRob2RBZGFwdGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RBZGFwdGVyLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBydE5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOwotCQlpZiAocnROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKLQkJfQotCQlyZXR1cm4gcnROYW1lLmVxdWFscyhyZXR1cm5UeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSBtZXRob2QgaXMgInBlcnNpc3RhYmxlIi4KLQkgKiBBZGFwdGVkIHRvIElNZXRob2RCaW5kaW5nIGFuZCBJTWV0aG9kLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgU2ltcGxlTWV0aG9kQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIG1vZGlmaWVycy4KLQkJICogV2UgdXNlIHRoZXNlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBzdGF0aWMsIGZpbmFsLCBldGMuCi0JCSAqLwotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgZXJhc3VyZS4KLQkJICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgZm9yCi0JCSAqICAgLSBib29sZWFuIGdldHRlcnMKLQkJICogICAtIHZvaWQgcmV0dXJuIHR5cGVzCi0JCSAqICAgLSBtYXRjaGluZyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0JCSAqLwotCQlTdHJpbmcgZ2V0UmV0dXJuVHlwZUVyYXN1cmVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3Rvci4KLQkJICovCi0JCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOwotCX0KLQotCS8qKgotCSAqIFF1ZXJpZXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIGEgbWV0aG9kIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJTWV0aG9kQmluZGluZyBhbmQgSU1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVNZXRob2RBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgbmFtZS4KLQkJICogV2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCi0JCSAqICAgLSB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSAiZ2V0dGVyIgotCQkgKiAgIC0gdGhlIHByb3BlcnR5IG5hbWUgaW1wbGllZCBieSB0aGUgZ2V0dGVyJ3MgbmFtZQotCQkgKi8KLQkJU3RyaW5nIGdldE5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW10ZXJzIGRlY2xhcmVkIGJ5IHRoZSBtZXRob2QuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSAiZ2V0dGVyIi4KLQkJICovCi0JCWludCBnZXRQYXJhbWV0ZXJzTGVuZ3RoKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgInNpYmxpbmciIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBubyBwYXJhbWV0ZXJzLgotCQkgKiBXZSB1c2UgdGhpcyB0byBmaW5kIGFuICJpcyIgYm9vbGVhbiBnZXR0ZXIgdGhhdCB3b3VsZCB0YWtlIHByZWNlZGVuY2UKLQkJICogb3ZlciBhICJnZXQiIGJvb2xlYW4gZ2V0dGVyLgotCQkgKi8KLQkJU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBtZXRob2QncyAic2libGluZyIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHNpbmdsZSBwYXJhbWV0ZXIuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGZpbmQgYSBtYXRjaGluZyAic2V0dGVyIiBmb3IgYSBwb3NzaWJsZSAiZ2V0dGVyIi4KLQkJICovCi0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgZ2V0U2libGluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEpQVFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzliYzQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIG5hbWUgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG5hbWUvaWRlbnRpZmllcgotICogKGUuZy4gImNvbS54eHguRm9vLlZBTFVFMSIgb3IgInZhbHVlIikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlyZXR1cm4gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOgotCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOgotCQkJCXJldHVybiAoKE5hbWUpIGV4cHJlc3Npb24pLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ViOTU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gdGhhdCBpcyBlbWJlZGRlZCBhcyBhbiBlbGVtZW50IHdpdGhpbgotICogYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgICAgIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBBbm5vdGF0aW9uQWRhcHRlcjwmIzY0O091dGVyPgotICogICAgICAgICBlbGVtZW50TmFtZSA9ICJmb28iCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgb3V0ZXIgYW5ub3RhdGlvbiB3aGVuIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihvdXRlckFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogdGhlIGFubm90YXRpb24gaXMgdGhlIGV4cHJlc3Npb24gaXRzZWxmLCBzbyB0aGUgYW5ub3RhdGlvbiBjYW5ub3QgYmUKLQkgKiAicmVtb3ZlZCIgZnJvbSBpdHNlbGYgLSByZXR1cm4gJ2ZhbHNlJwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHByZT4KLQkgKiAmIzY0O091dGVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQkvLyByZXBsYWNlKD8pIHRoZSBjdXJyZW50IGVsZW1lbnQgdmFsdWUKLQkJb3V0ZXIuc2V0VmFsdWUoaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFNpbXBseSBzZXQgdGhlIHBhaXIncyB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIHBhaXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJcGFpci5zZXRWYWx1ZShpbm5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZDc0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHRoYXQgaXMgZW1iZWRkZWQgaW4gYW4gZWxlbWVudCBhcnJheSB3aXRoaW4KLSAqIGFub3RoZXIgYW5ub3RhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKSwgJiM2NDtJbm5lcigidHdvIil9KQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogICAgICAgICBvdXRlckFubm90YXRpb25BZGFwdGVyID0gQW5ub3RhdGlvbkFkYXB0ZXI8JiM2NDtPdXRlcj4KLSAqICAgICAgICAgZWxlbWVudE5hbWUgPSAiZm9vIgotICogICAgICAgICBpbmRleCA9IDAtMgotICogICAgICAgICBhbm5vdGF0aW9uTmFtZSA9ICJJbm5lciIKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQlwcml2YXRlIGludCBpbmRleDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgaW50IGluZGV4LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgYW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbigoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpOwotCQl9Ci0JCXJldHVybiAodGhpcy5pbmRleCA9PSAwKSA/IHRoaXMuYW5ub3RhdGlvblZhbHVlKHZhbHVlKSA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gKHRoaXMuaW5kZXggPT0gMCkgPyBpbm5lciA6IChFeHByZXNzaW9uKSB0aGlzLmJ1aWxkTmV3SW5uZXJBcnJheUluaXRpYWxpemVyKGlubmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlciwgKEFycmF5SW5pdGlhbGl6ZXIpIHZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIG91ciBpbmRleCBpcyBncmVhdGVyIHRoYW4gemVybywgYnV0IHdlIGRvbid0IGhhdmUgYW4gYXJyYXksCi0JCS8vIHRoZW4gdGhlIGFubm90YXRpb24gbXVzdCBhbHJlYWR5IGJlIGdvbmUKLQkJcmV0dXJuICh0aGlzLmluZGV4ICE9IDApOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSksICYjNjQ7SW5uZXIoMil9KQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcigmIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pCi0JICogPC9wcmU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJdGhpcy5tb2RpZnlFeHByZXNzaW9uKG91dGVyLCBTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih0ZXh0PSJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIodGV4dD0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcigwKSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKDApLCAmIzY0O0lubmVyKDEpLCAmIzY0O0lubmVyKDIpfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7Tm90SW5uZXIpID0+ICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoMCkpCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KQotCSAqIDwvcHJlPgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeU1lbWJlclZhbHVlUGFpcihNZW1iZXJWYWx1ZVBhaXIgcGFpciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQl0aGlzLm1vZGlmeUV4cHJlc3Npb24ocGFpciwgTUVNQkVSX1ZBTFVFX1BBSVJfRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuaW5kZXg7Ci0JCWlmIChuZXdJbmRleCA9PSBvbGRJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQW5ub3RhdGlvbiBvcmlnaW5hbCA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmluZGV4ID0gbmV3SW5kZXg7Ci0JCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOyAgLy8gY2xlYXIgb3V0IHRoZSBuZXcgbG9jYXRpb24gKD8pCi0JCX0gZWxzZSB7Ci0JCQlBbm5vdGF0aW9uIGNvcHkgPSAoQW5ub3RhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZShvcmlnaW5hbC5nZXRBU1QoKSwgb3JpZ2luYWwpOwotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBjb3B5KTsgIC8vIGluc3RhbGwgdGhlIGNvcHkgaW4gdGhlIG5ldyBsb2NhdGlvbgotCQkJdGhpcy5pbmRleCA9IG9sZEluZGV4OwotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsgIC8vIGdvIGJhY2sgYW5kIGNsZWFyIG91dCB0aGUgb3JpZ2luYWwgbG9jYXRpb24gKEFGVEVSIHRoZSBtb3ZlKQotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGFubm90YXRpb24oQXJyYXlJbml0aWFsaXplciB2YWx1ZSkgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyh2YWx1ZSk7Ci0JCXJldHVybiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpID8gbnVsbCA6IHRoaXMuYW5ub3RhdGlvblZhbHVlKGV4cHJlc3Npb25zLmdldCh0aGlzLmluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgYXJyYXkgaW5pdGlhbGl6ZXIgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sCi0JICogcGFkZGluZyBpdCB3aXRoICdudWxsJyBsaXRlcmFscyBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwcml2YXRlIEFycmF5SW5pdGlhbGl6ZXIgYnVpbGROZXdJbm5lckFycmF5SW5pdGlhbGl6ZXIoQW5ub3RhdGlvbiBpbm5lcikgewotCQlBcnJheUluaXRpYWxpemVyIGFpID0gaW5uZXIuZ2V0QVNUKCkubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgdGhpcy5leHByZXNzaW9ucyhhaSkpOwotCQlyZXR1cm4gYWk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLAotCSAqIHBhZGRpbmcgaXQgd2l0aCAnbnVsbCcgbGl0ZXJhbHMgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZElubmVyVG9FeHByZXNzaW9ucyhBbm5vdGF0aW9uIGlubmVyLCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7Ci0JCWlmIChleHByZXNzaW9ucy5zaXplKCkgPiB0aGlzLmluZGV4KSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHByZXNzaW9ucyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBpbmRleCAoc2l6ZTogIiArIGV4cHJlc3Npb25zLnNpemUoKSArICIgIGluZGV4OiAiICsgdGhpcy5pbmRleCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJd2hpbGUgKGV4cHJlc3Npb25zLnNpemUoKSA8IHRoaXMuaW5kZXgpIHsKLQkJCWV4cHJlc3Npb25zLmFkZChpbm5lci5nZXRBU1QoKS5uZXdOdWxsTGl0ZXJhbCgpKTsKLQkJfQotCQlleHByZXNzaW9ucy5hZGQoaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEFycmF5SW5pdGlhbGl6ZXIgdmFsdWUpIHsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnModmFsdWUpOwotCQlpZiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCXJldHVybjsgIC8vIGF2b2lkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oPykKLQkJfQotCQlBbm5vdGF0aW9uIGlubmVyID0gdGhpcy5hbm5vdGF0aW9uVmFsdWUoZXhwcmVzc2lvbnMuZ2V0KHRoaXMuaW5kZXgpKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoICEgdGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgaW5uZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuaW5kZXggPT0gKGV4cHJlc3Npb25zLnNpemUoKSAtIDEpKSB7Ci0JCQlleHByZXNzaW9ucy5yZW1vdmUodGhpcy5pbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlleHByZXNzaW9ucy5zZXQodGhpcy5pbmRleCwgdmFsdWUuZ2V0QVNUKCkubmV3TnVsbExpdGVyYWwoKSk7Ci0JCX0KLQkJdGhpcy50cmltRXhwcmVzc2lvbnMoZGVjbGFyYXRpb24sIG91dGVyLCBleHByZXNzaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgYWxsIHRoZSBudWxsIGxpdGVyYWxzIG9mZiB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBleHByZXNzaW9ucwotCSAqIGFuZCBub3JtYWxpemUgdGhlIHNwZWNpZmllZCBvdXRlciBhbm5vdGF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmltRXhwcmVzc2lvbnMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucykgewotCQkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCWZvciAoaW50IGkgPSBleHByZXNzaW9ucy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJaWYgKGV4cHJlc3Npb25zLmdldChpKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTlVMTF9MSVRFUkFMKSB7Ci0JCQkJZXhwcmVzc2lvbnMucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsgIC8vIHN0b3Agd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgbGl0ZXJhbCBlbmNvdW50ZXJlZAotCQkJfQotCQl9Ci0JCXN3aXRjaCAoZXhwcmVzc2lvbnMuc2l6ZSgpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCBvdXRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJdGhpcy5jb252ZXJ0QXJyYXlUb0xhc3RSZW1haW5pbmdFeHByZXNzaW9uKG91dGVyLCBleHByZXNzaW9ucy5nZXQoMCkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBlbGVtZW50IGluIGFuIGFycmF5IGluaXRpYWxpemVyLCBjb252ZXJ0IHRoZQotCSAqIGV4cHJlc3Npb24gdG8gYmUganVzdCB0aGUgc2luZ2xlIGVsZW1lbnQ7IGUuZy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0Zvbyh4eHg9eyJhYmMifSkgPT4gJiM2NDtGb28oeHh4PSJhYmMiKQotCSAqIG9yCi0JICogICAgICYjNjQ7Rm9vKHsiYWJjIn0pID0+ICYjNjQ7Rm9vKCJhYmMiKQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0QXJyYXlUb0xhc3RSZW1haW5pbmdFeHByZXNzaW9uKEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gbGFzdFZhbHVlKSB7Ci0JCWxhc3RWYWx1ZSA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKGxhc3RWYWx1ZS5nZXRBU1QoKSwgbGFzdFZhbHVlKTsKLQkJaWYgKG91dGVyLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLm1lbWJlclZhbHVlUGFpcigoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIpLnNldFZhbHVlKGxhc3RWYWx1ZSk7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgb3V0ZXIpLnNldFZhbHVlKGxhc3RWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFuaXB1bGF0ZSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gYXBwcm9wcmlhdGVseS4KLQkgKiBJZiBpdCBpcyBhbiBhcnJheSBpbml0aWFsaXplciwgYWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byBpdC4KLQkgKiBJZiBpdCBpcyBub3QsIHJlcGxhY2UgdGhlIGV4cHJlc3Npb24gb3IgY29udmVydCBpdCBpbnRvIGFuIGFycmF5Ci0JICogaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uUHJvdmlkZXIgZXhwUHJvdmlkZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IGV4cFByb3ZpZGVyLmdldEV4cHJlc3Npb24obm9kZSk7Ci0JCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCS8vIGlnbm9yZSB0aGUgb3RoZXIgZW50cmllcyBpbiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIoPykgLSB0aGV5IG1heSBub3QgYmUgbWF0Y2hpbmcgQW5ub3RhdGlvbnMuLi4KLQkJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKChBcnJheUluaXRpYWxpemVyKSB2YWx1ZSk7Ci0JCQlpZiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgZXhwcmVzc2lvbnMpOwotCQkJfSBlbHNlIHsKLQkJCQlleHByZXNzaW9ucy5zZXQodGhpcy5pbmRleCwgaW5uZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuaW5kZXggPT0gMCkgewotCQkJCS8vIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZQotCQkJCWV4cFByb3ZpZGVyLnNldEV4cHJlc3Npb24obm9kZSwgaW5uZXIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb252ZXJ0IHRvIGFuIGFycmF5Ci0JCQkJQXJyYXlJbml0aWFsaXplciBhaSA9IGlubmVyLmdldEFTVCgpLm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7Ci0JCQkJZXhwcmVzc2lvbnMuYWRkKChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZhbHVlLmdldEFTVCgpLCB2YWx1ZSkpOwotCQkJCXRoaXMuYWRkSW5uZXJUb0V4cHJlc3Npb25zKGlubmVyLCBleHByZXNzaW9ucyk7Ci0JCQkJZXhwUHJvdmlkZXIuc2V0RXhwcmVzc2lvbihub2RlLCBhaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFpKSB7Ci0JCXJldHVybiBhaS5leHByZXNzaW9ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIHByb3ZpZGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzIHRvICJyZS11c2UiIHRoZSBjb2RlIGluCi0JICogI21vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSwgRXhwcmVzc2lvblByb3ZpZGVyLCBBbm5vdGF0aW9uKQotCSAqLwotCXByaXZhdGUgaW50ZXJmYWNlIEV4cHJlc3Npb25Qcm92aWRlciB7Ci0JCUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpOwotCQl2b2lkIHNldEV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Qcm92aWRlciBNRU1CRVJfVkFMVUVfUEFJUl9FWFBSRVNTSU9OX1BST1ZJREVSID0gbmV3IEV4cHJlc3Npb25Qcm92aWRlcigpIHsKLQkJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpIHsKLQkJCXJldHVybiAoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1lbWJlclZhbHVlUGFpckV4cHJlc3Npb25Qcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uUHJvdmlkZXIgU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OX0VYUFJFU1NJT05fUFJPVklERVIgPSBuZXcgRXhwcmVzc2lvblByb3ZpZGVyKCkgewotCQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSkgewotCQkJcmV0dXJuICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG5vZGUpLnNldFZhbHVlKGV4cHJlc3Npb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcmVzc2lvblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0ZTkzNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIG5vIGZvcm1hdHRpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWZlMmQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCZWhhdmlvcmxlc3MgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIElOU1RBTkNFID0gbmV3IE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNlNjE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogQmVoYXZpb3JsZXNzIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBJTlNUQU5DRQotCQkJPSBuZXcgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxTPiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFQgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDVhNzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogTm8gY29udmVyc2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFeHByZXNzaW9uQ29udmVydGVyCi0JaW1wbGVtZW50cyBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+IElOU1RBTkNFID0gbmV3IE51bGxFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24sIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1ZDJkNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBudW1iZXIgbGl0ZXJhbCB0by9mcm9tIGFuIEludGVnZXIKLSAqIChlLmcuIDUpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE51bWJlckxpdGVyYWwgY29udmVydE9iamVjdChJbnRlZ2VyIGludGVnZXIsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKGludGVnZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEludGVnZXIgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSA/ICgoSW50ZWdlcikgdmFsdWUpIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE3NTAxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSB0eXBlIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHByaW1pdGl2ZSB0eXBlCi0gKiAoZS5nLiAiaW50IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUudG9Db2RlKHN0cmluZykpOwotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QUklNSVRJVkVfVFlQRSkgewotCQkJCXJldHVybiAoKFByaW1pdGl2ZVR5cGUpIHR5cGUpLmdldFByaW1pdGl2ZVR5cGVDb2RlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWU1NzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgYW5kIHNob3J0LWNpcmN1aXQgdGhlCi0gKiAjc2V0VmFsdWUgbWV0aG9kIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCS8qKiB0aGUgd3JhcHBlZCBhZGFwdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQl0aGlzKG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+KGFubm90YXRlZEVsZW1lbnQsIGRhZWEpKTsKLQl9Ci0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgdGhlIGFkYXB0ZXIncyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpZiBpdAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoVCBvbGRWYWx1ZSwgVCBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsgIC8vIG51bGwgPT4gbnVsbAotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0gZWxzZSB7ICAvLyBudWxsID0+IG9iamVjdAotCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgeyAgLy8gb2JqZWN0ID0+IG51bGwKLQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQl9IGVsc2UgeyAgLy8gb2JqZWN0ID0+IG9iamVjdAotCQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogYm90aCB2YWx1ZXMgYXJlIG5vbi1udWxsIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoVCBvbGRWYWx1ZSwgVCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc2YmMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaG9ydC1jaXJjdWl0IHRoZQotICogI3NldFZhbHVlIG1ldGhvZCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLiBPdmVycmlkZXMgI3ZhbHVlc0FyZUVxdWFsKCkKLSAqIHRvIGNoZWNrIGVxdWFsaXR5IG9uIGFycmF5cwotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlleHRlbmRzIFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+IGRhZWEpIHsKLQkJc3VwZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChUW10gb2xkVmFsdWUsIFRbXSBuZXdWYWx1ZSkgewotCQlyZXR1cm4gQXJyYXlzLmVxdWFscyhuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVkYzE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHdpdGggYSBzcGVjaWZpYyBuYW1lLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7Rm9vCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqIAotICogTkI6Ci0gKiBJZiB0aGUgZGVjbGFyYXRpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNhbWUKLSAqIG5hbWUsIHRoZSBhZGFwdGVyIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgZmlyc3QgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKLSAqIG5hbWUuIChBbHNvIG5vdGUgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBub3QgYWxsb3cgYSBkZWNsYXJhdGlvbiB0byBiZQotICogbW9kaWZpZWQgYnkgbXVsdGlwbGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBpLmUuIG9mIHRoZSBzYW1lIHR5cGU7Ci0gKiBzbyBpZiB0aGVyZSAqYXJlKiBtdWx0aXBsZSBhbm5vdGF0aW9ucyBvZiB0aGUgc2FtZSB0eXBlLCB0aGVyZSBhcmUgYmlnZ2VyCi0gKiBwcm9ibGVtcyB0byB3b3JyeSBhYm91dCB0aGFuIHdoaWNoIGFubm90YXRpb24gdGhlIGFkYXB0ZXIgbWFuaXB1bGF0ZXMuKQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQodGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJZGVjbGFyYXRpb24ucmVtb3ZlQW5ub3RhdGlvbk5hbWVkKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZGVjbGFyYXRpb24ucmVwbGFjZUFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25OYW1lKCksIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGRlY2xhcmF0aW9uCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmRjNWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHR5cGUgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2ltcGxlIHR5cGUKLSAqIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IGFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpOwotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfVFlQRSkgewotCQkJCXJldHVybiAoKFNpbXBsZVR5cGUpIHR5cGUpLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZTdlNjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IGluaXRpYWxpemVyIHRvL2Zyb20gYW4gYXJyYXkgb2Ygc3RyaW5ncyAoZS5nLiB7InRleHQwIiwgInRleHQxIn0pLgotICogCi0gKiBEbyBOT1QgdXNlIHRoaXMgY2xhc3MgZm9yIGNvbnZlcnRpbmcgYXJyYXkgaW5pdGlhbGl6ZXJzIGluIGFubm90YXRpb24gZWxlbWVudHMuCi0gKiBKYXZhNSBoYXMgYSBiaXQgb2Ygc3ludGFjdGljIHN1Z2FyIHRoYXQgYWxsb3dzIGEgc2luZ2xlLWVsZW1lbnQgYXJyYXkKLSAqIGluaXRpYWxpemVyIHRvIG5vdCBoYXZlIGN1cmx5IGJyYWNlcy4gVGhpcyBjb252ZXJ0ZXIgd2lsbCByZXR1cm4gbnVsbCBpZiBpdCBlbmNvdW50ZXJzCi0gKiBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGFycmF5IGluaXRpYWxpemVyLgotICogCi0gKiBJbnZhbGlkIGVudHJpZXMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyIHdpbGwgcmVzdWx0IGluIG51bGwgZWxlbWVudHMgaW4gdGhlCi0gKiByZXN1bHRpbmcgc3RyaW5nIGFycmF5LiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIG1hbmlwdWxhdGUgZWxlbWVudHMgYXQKLSAqIHRoZSBhcHByb3ByaWF0ZSBpbmRleC4KLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPgotewotCXByaXZhdGUgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaWYgaXQgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlcikgewotCQl0aGlzKGVsZW1lbnRDb252ZXJ0ZXIsIHRydWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRDb252ZXJ0ZXIgPSBlbGVtZW50Q29udmVydGVyOwotCQl0aGlzLnJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkgPSByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5OwotCX0KLQotCS8qCi0JICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQotCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQXJyYXlJbml0aWFsaXplciBjb252ZXJ0T2JqZWN0KFN0cmluZ1tdIHN0cmluZ3MsIEFTVCBhc3QpIHsKLQkJaWYgKChzdHJpbmdzLmxlbmd0aCA9PSAwKSAmJiB0aGlzLnJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFzdC5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlleHByZXNzaW9ucy5hZGQodGhpcy5lbGVtZW50Q29udmVydGVyLmNvbnZlcnQoc3RyaW5nLCBhc3QpKTsKLQkJfQotCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JfQotCi0JLyoKLQkgKiB0aGlzIG1ldGhvZCBpcyAncHVibGljJyBzbyBpdCBjYW4gYmUgY2FsbGVkIGJ5Ci0JICogQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmdbXSBjb252ZXJ0TnVsbCgpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpID8KLQkJCQl0aGlzLmNvbnZlcnRBcnJheUluaXRpYWxpemVyKChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uKSA6Ci0JCQkJU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCX0KLQotCS8qCi0JICogdGhpcyBtZXRob2QgaXMgJ3B1YmxpYycgc28gaXQgY2FuIGJlIGNhbGxlZCBieQotCSAqIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gY29udmVydEFycmF5SW5pdGlhbGl6ZXIoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpOwotCQlpbnQgbGVuID0gZXhwcmVzc2lvbnMuc2l6ZSgpOwotCQlTdHJpbmdbXSBzdHJpbmdzID0gbmV3IFN0cmluZ1tsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCXN0cmluZ3NbaV0gPSB0aGlzLmVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChleHByZXNzaW9ucy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU4OGI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgc3RyaW5nIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyAoZS5nLiAidGV4dCIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoc3RyaW5nKTsKLQkJcmV0dXJuIHN0cmluZ0xpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJT2JqZWN0IHZhbHVlID0gZXhwcmVzc2lvbi5yZXNvbHZlQ29uc3RhbnRFeHByZXNzaW9uVmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgPyAoU3RyaW5nKSB2YWx1ZSA6IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkMWI3NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGEgdHlwZSBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSAKLSAqIHNpbXBsZSB0eXBlIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0Iikgb3IgcHJpbWl0aXZlIHR5cGUgKGUuZy4gImludCIpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCWlmIChQcmltaXRpdmVUeXBlLnRvQ29kZShzdHJpbmcpICE9IG51bGwpIHsKLQkJCXJldHVybiAoVHlwZUxpdGVyYWwpIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChzdHJpbmcsIGFzdCk7Ci0JCX0KLQkJcmV0dXJuIChUeXBlTGl0ZXJhbCkgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0KHN0cmluZywgYXN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlTdHJpbmcgbmFtZSA9IFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChleHByZXNzaW9uKTsKLQkJcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUgOiBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoZXhwcmVzc2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjgyNWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXB1YmxpYyBCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgQk9PTEVBTl9GRUFUVVJFIHwgQk9PTEVBTl9MT1dFUkNBU0UpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgQk9PTEVBTl9GRUFUVVJFIHwgQk9PTEVBTl9MT1dFUkNBU0UgfCBzdHlsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0cmluZywgRU9iamVjdCBvd25lcikgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHN0cmluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHZhbHVlKS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOTQ3MDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBUaGlzIHRyYW5zbGF0b3IgaXMgdG8gYmUgdXNlZCBmb3IgZW1wdHkgeG1sIHRhZ3MgdGhhdCBjb3JyZXNwb25kCi0gKiB0byBhIGJvb2xlYW4gYXR0cmlidXRlIGluIHRoZSBlbWYgbW9kZWwuICAKLSAqIGNhc2NhZGUtcGVyc2lzdCBpcyBhbiBleGFtcGxlIGZyb20gdGhlIG9ybS54c2Q6Ci0gKiAKLSAqIAk8cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cz4KLSAqIAkJPGNhc2NhZGUtcGVyc2lzdC8+ICAgICAgICAKLSAqIAk8L3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICA9PT4gIGNhc2NhZGVQZXJzaXN0ID09IHRydWUKLSAqIAotICogdnMuCi0gKiAKLSAqIAk8cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cz4gIAotICogCTwvcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cz4gID09PiAgY2FzY2FkZVBlcnNpc3QgPT0gZmFsc2UKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXB1YmxpYyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQl0aGlzKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIE5PX1NUWUxFKTsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlLCBzdHlsZSB8IEVNUFRZX1RBRyB8IEJPT0xFQU5fRkVBVFVSRSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0TU9GVmFsdWUoRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJLy8gSSBhbSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kLiAgVGhpcyBpcyBzbyB0aGUgdGFnIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIAotCQkvLyB0aGUgdmFsdWUgaXMgZmFsc2UuCi0JCS8vIEknbSBub3Qgc3VyZSBpZiB0aGlzIGlzIGEgYnVnIGluIHRoZSBlY29yZSBvciBtYXliZSBpbiB0aGUgdHJhbnNsYXRvcnMsIAotCQkvLyBidXQgSSByZWFsbHkgZG9uJ3QgdGhpbmsgdGhhdCB3ZSBzaG91bGQgaGF2ZSB0byBkZXBlbmQgb24gdGhlIGJvb2xlYW4KLQkJLy8gYmVpbmcgInVuc2V0IiB0byByZW1vdmUgdGhlIHRhZy4KLQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSBzdXBlci5nZXRNT0ZWYWx1ZShtb2ZPYmplY3QpOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gdmFsdWUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3NGI0YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yCi0JZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHVibGljIEVudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUpOwotCX0KLQkKLQlwdWJsaWMgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTw/PiBnZXRFbnVtZXJhdGVkT2JqZWN0VmFsdWVzKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjb252ZXJ0U3RyaW5nVG9WYWx1ZShTdHJpbmcgc3RyaW5nLCBFT2JqZWN0IG93bmVyKSB7Ci0JCWZvciAoT2JqZWN0IGVhY2ggOiBnZXRFbnVtZXJhdGVkT2JqZWN0VmFsdWVzKCkpIHsKLQkJCWlmIChlYWNoLnRvU3RyaW5nKCkuZXF1YWxzKHN0cmluZykpIHsKLQkJCQlyZXR1cm4gZWFjaDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1N0cmluZyhPYmplY3QgdmFsdWUsIEVPYmplY3Qgb3duZXIpIHsKLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVSb290VHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVSb290VHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGMyMGQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlUm9vdFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5Sb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIFJvb3QgdHJhbnNsYXRvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBjaGlsZCB0cmFuc2xhdG9ycyBhbmQgbm8gc3BlY2lhbAotICogYmVoYXZpb3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVSb290VHJhbnNsYXRvcgotCWV4dGVuZHMgUm9vdFRyYW5zbGF0b3IKLXsKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGNoaWxkcmVuOwotCi0JcHVibGljIFNpbXBsZVJvb3RUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFQ2xhc3MgZUNsYXNzLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlQ2xhc3MpOwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogV2lkZW4gbWV0aG9kIGFjY2VzcyB0byAncHVibGljJy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNsYXRvcltdIGdldENoaWxkcmVuXygpIHsKLQkJcmV0dXJuICh0aGlzLmNoaWxkcmVuID09IG51bGwpID8gRU1QVFlfVFJBTlNMQVRPUl9BUlJBWSA6IHRoaXMuY2hpbGRyZW47Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNsYXRvcltdIEVNUFRZX1RSQU5TTEFUT1JfQVJSQVkgPSBuZXcgVHJhbnNsYXRvclswXTsKLQotCS8qKgotCSAqIFNldCB0aGUgdHJhbnNsYXRvcidzIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbihUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0b3IgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvciBhZGRDaGlsZChUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMuYWRkKHRoaXMuZ2V0Q2hpbGRyZW5fKCksIHRyYW5zbGF0b3IpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9ycyB0byB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVJvb3RUcmFuc2xhdG9yIGFkZENoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5nZXRDaGlsZHJlbl8oKSwgdHJhbnNsYXRvcnMpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvciByZW1vdmVDaGlsZChUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMucmVtb3ZlKHRoaXMuY2hpbGRyZW4sIHRyYW5zbGF0b3IpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9ycyBmcm9tIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGRyZW4oVHJhbnNsYXRvcltdIHRyYW5zbGF0b3JzKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZUFsbCh0aGlzLmNoaWxkcmVuLCAoT2JqZWN0W10pIHRyYW5zbGF0b3JzKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVRyYW5zbGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRiMDI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclBhdGg7Ci0KLS8qKgotICogVHJhbnNsYXRvciB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBjaGlsZCB0cmFuc2xhdG9ycyBhbmQgbm8gc3BlY2lhbAotICogYmVoYXZpb3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUcmFuc2xhdG9yCi0JZXh0ZW5kcyBUcmFuc2xhdG9yCi17Ci0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRUNsYXNzIGVDbGFzcykgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVDbGFzcyk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIGVDbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIEVDbGFzcyBlQ2xhc3MsIFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgZUNsYXNzKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoIHRyYW5zbGF0b3JQYXRoKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCB0cmFuc2xhdG9yUGF0aCk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgVHJhbnNsYXRvclBhdGhbXSB0cmFuc2xhdG9yUGF0aHMpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIHRyYW5zbGF0b3JQYXRocyk7Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCBzdHlsZSk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBhRmVhdHVyZSwgaW50IHN0eWxlLCBFQ2xhc3MgZUNsYXNzLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJdGhpcyhkb21QYXRoQW5kTmFtZXMsIGFGZWF0dXJlLCBzdHlsZSk7Ci0JCXNldEVNRkNsYXNzKGVDbGFzcyk7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUsIFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoaWxkcmVuICoqKioqKioqKioKLQotCS8qKgotCSAqIFdpZGVuIG1ldGhvZCBhY2Nlc3MgdG8gJ3B1YmxpYycuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbl8oKSB7Ci0JCXJldHVybiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSA/IEVNUFRZX1RSQU5TTEFUT1JfQVJSQVkgOiB0aGlzLmNoaWxkcmVuOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyYW5zbGF0b3IncyBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIHRvIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvciBhZGRDaGlsZChUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMuYWRkKHRoaXMuZ2V0Q2hpbGRyZW5fKCksIHRyYW5zbGF0b3IpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9ycyB0byB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgYWRkQ2hpbGRyZW4oVHJhbnNsYXRvcltdIHRyYW5zbGF0b3JzKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZEFsbCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9ycyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0b3IgZnJvbSB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZSh0aGlzLmNoaWxkcmVuLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgZnJvbSB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGRyZW4oVHJhbnNsYXRvcltdIHRyYW5zbGF0b3JzKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZUFsbCh0aGlzLmNoaWxkcmVuLCAoT2JqZWN0W10pIHRyYW5zbGF0b3JzKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJwcm92L0pwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2xpYnByb3YvSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTUyNDQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2xpYnByb3YvSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlJRmFjZXRlZFByb2plY3RCYXNlIGdldEZhY2V0ZWRQcm9qZWN0KCk7Ci0JCi0JSUxpYnJhcnlQcm92aWRlciBnZXRMaWJyYXJ5UHJvdmlkZXIoKTsKLQkKLQlJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJ2YWwvTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxNWM0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJ2YWwvTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGV4dGVuZGVyLXN1cHBsaWVkIGxpYnJhcnkgdmFsaWRhdG9ycy4gIAotICogRWFjaCBsaWJyYXJ5IHZhbGlkYXRvciBtdXN0IGhhdmUgYSB6ZXJvLWFyZyBjb25zdHJ1Y3Rvci4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpYnJhcnlWYWxpZGF0b3IgewotCQotCUlTdGF0dXMgdmFsaWRhdGUoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxNjA4Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTG9jYXRvciB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGNvbnRhaW5lciBpcyBhbiBhY2NlcHRhYmxlIChub24tamF2YSkgcmVzb3VyY2UgCi0JICogbG9jYXRpb24gZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICovCi0JYm9vbGVhbiBhY2NlcHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgY29udGFpbmVyKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgbG9jYXRpb24gaW4gd2hpY2ggdG8gY3JlYXRlIG5ldyAobm9uLWphdmEpIHJlc291cmNlcwotCSAqLwotCUlDb250YWluZXIgZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24oSVByb2plY3QgcHJvamVjdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgYWJzb2x1dGUgcmVzb3VyY2UgcGF0aCBiZXN0IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiAKLQkgKiBydW50aW1lIHBhdGggZm9yIHRoZSBnaXZlbiBwcm9qZWN0Ci0JICovCi0JSVBhdGggZ2V0UmVzb3VyY2VQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJ1bnRpbWUgcGF0aCBiZXN0IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB3b3Jrc3BhY2UgcmVsYXRpdmUgYWJzb2x1dGUKLQkgKiByZXNvdXJjZSBwYXRoIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCUlQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzEzMTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9BYnN0cmFjdFRleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRleHQgcmFuZ2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXh0UmFuZ2UKLQlpbXBsZW1lbnRzIFRleHRSYW5nZQotewotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoaW50IGluZGV4KSB7Ci0JCXJldHVybiAodGhpcy5nZXRPZmZzZXQoKSA8PSBpbmRleCkgJiYgKGluZGV4IDwgdGhpcy5lbmQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdG91Y2hlcyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuaW5jbHVkZXMoaW5kZXgpIHx8IChpbmRleCA9PSB0aGlzLmVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIG9mZnNldCBpcyAiZXhjbHVzaXZlIiwgaS5lLiB0aGUgZWxlbWVudCBhdCB0aGUgZW5kIG9mZnNldAotCSAqIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZ2UuCi0JICovCi0JcHJvdGVjdGVkIGludCBlbmQoKSB7Ci0JCXJldHVybiB0aGlzLmdldE9mZnNldCgpICsgdGhpcy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgVGV4dFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRleHRSYW5nZSByID0gKFRleHRSYW5nZSkgbzsKLQkJcmV0dXJuIChyLmdldE9mZnNldCgpID09IHRoaXMuZ2V0T2Zmc2V0KCkpCi0JCQkJJiYgKHIuZ2V0TGVuZ3RoKCkgPT0gdGhpcy5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T2Zmc2V0KCkgXiB0aGlzLmdldExlbmd0aCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzdGFydCA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0T2Zmc2V0KCkpOwotCQlTdHJpbmcgZW5kID0gU3RyaW5nLnZhbHVlT2YodGhpcy5lbmQoKSk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHN0YXJ0ICsgIiwgIiArIGVuZCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQm9keVNvdXJjZVdyaXRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9Cb2R5U291cmNlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJlZWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9Cb2R5U291cmNlV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJbmRlbnRpbmdQcmludFdyaXRlcn0gd2l0aCBzb21lIG1ldGhvZHMgdGhhdCBmYWNpbGl0YXRlCi0gKiBidWlsZGluZyBjbGFzcyBzb3VyY2UgY29kZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQm9keVNvdXJjZVdyaXRlcgotCWV4dGVuZHMgSW5kZW50aW5nUHJpbnRXcml0ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOwotCS8vIGtleSA9IHNob3J0IGNsYXNzIG5hbWU7IHZhbHVlID0gaW1wb3J0IHBhY2thZ2UKLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGltcG9ydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEltcG9ydFBhY2thZ2U+KCk7Ci0KLQlwdWJsaWMgQm9keVNvdXJjZVdyaXRlcihTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1dyaXRlcigyMDAwKSk7Ci0JCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLm91dC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKChTdHJpbmdXcml0ZXIpIHRoaXMub3V0KS5nZXRCdWZmZXIoKS5sZW5ndGgoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFZpc2liaWxpdHkoU3RyaW5nIHZpc2liaWxpdHlNb2RpZmllcikgewotCQlpZiAodmlzaWJpbGl0eU1vZGlmaWVyLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMucHJpbnQodmlzaWJpbGl0eU1vZGlmaWVyKTsKLQkJCXRoaXMucHJpbnQoJyAnKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhpcy5wcmludCgnQCcpOwotCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXRoaXMucHJpbnQodGhpcy5idWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50RmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIHZpc2liaWxpdHkpIHsKLQkJdGhpcy5wcmludFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0JCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJdGhpcy5wcmludCgnICcpOwotCQl0aGlzLnByaW50KGZpZWxkTmFtZSk7Ci0JCXRoaXMucHJpbnQoJzsnKTsKLQkJdGhpcy5wcmludGxuKCk7Ci0JCXRoaXMucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50UGFyYW1ldGVyaXplZEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyBwYXJhbWV0ZXJUeXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXRoaXMucHJpbnQoJzwnKTsKLQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihwYXJhbWV0ZXJUeXBlRGVjbGFyYXRpb24pOwotCQl0aGlzLnByaW50KCc+Jyk7Ci0JCXRoaXMucHJpbnQoJyAnKTsKLQkJdGhpcy5wcmludChmaWVsZE5hbWUpOwotCQl0aGlzLnByaW50KCc7Jyk7Ci0JCXRoaXMucHJpbnRsbigpOwotCQl0aGlzLnByaW50bG4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgPGVtPlN0cmluZyBMaXRlcmFsPC9lbT4gYW5kIHByaW50IGl0LAotCSAqIGFkZGluZyB0aGUgc3Vycm91bmRpbmcgZG91YmxlLXF1b3RlcyBhbmQgZXNjYXBpbmcgY2hhcmFjdGVycwotCSAqIGFzIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHN0cmluZywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGltcG9ydHMgKioqKioqKioqKgotCi0JLy8gKioqKiogd3JpdGluZwotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgImltcG9ydGVkIiBuYW1lLgotCSAqIFRoZSBjbGFzcyBkZWNsYXJhdGlvbiBtdXN0IGJlIG9mIHRoZSBmb3JtOgotCSAqICAgICAiaW50IgotCSAqICAgICAiaW50W10iIChub3QgIltJIikKLQkgKiAgICAgImphdmEubGFuZy5PYmplY3QiCi0JICogICAgICJqYXZhLmxhbmcuT2JqZWN0W10iIChub3QgIltMamF2YS5sYW5nLk9iamVjdDsiKQotCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeSIgKG5vdCAiamF2YS51dGlsLk1hcCRFbnRyeSIpCi0JICogICAgICJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIgKG5vdCAiW1tMamF2YS51dGlsLk1hcCRFbnRyeTsiKQotCSAqICAgICAKLQkgKiBUbyByZWFsbHkgZG8gdGhpcyByaWdodCwgd2Ugd291bGQgbmVlZCB0byBnYXRoZXIgYWxsIHRoZSB0eXBlcyBmcm9tCi0JICogdGhlICJ1bmFtZWQiIChkZWZhdWx0KSBwYWNrYWdlIHRoYXQgd2VyZSByZWZlcmVuY2VkIGluIHRoZQotCSAqIGNvbXBpbGF0aW9uIHVuaXQgYmVmb3JlaGFuZC4gKkFueSogY29sbGlzaW9ucyB3aXRoIG9uZSBvZiB0aGVzZQotCSAqIHR5cGVzIHdvdWxkIGhhdmUgdG8gYmUgZnVsbHkgcXVhbGlmaWVkICh3aGV0aGVyIGl0IHdhcyBmcm9tCi0JICogJ2phdmEubGFuZycgb3IgdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0KS4KLQkgKiBJbiBvdGhlciB3b3JkcywgaWYgd2UgaGF2ZSBhbnkgdHlwZXMgZnJvbSB0aGUgInVubmFtZWQiIHBhY2thZ2UsCi0JICogcmVzdWx0cyBhcmUgdW5wcmVkaWN0YWJsZS4uLi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkSW1wb3J0ZWRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy50eXBlRGVjbGFyYXRpb25Jc01lbWJlckNsYXNzKHR5cGVEZWNsYXJhdGlvbikpIHsKLQkJCS8vIG5vIG5lZWQgZm9yIGFuIGltcG9ydCwganVzdCByZXR1cm4gdGhlIHBhcnRpYWxseS1xdWFsaWZpZWQgbmFtZQotCQkJcmV0dXJuIHRoaXMuYnVpbGRNZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQl9Ci0JCWludCBsYXN0ID0gdHlwZURlY2xhcmF0aW9uLmxhc3RJbmRleE9mKCcuJyk7Ci0JCVN0cmluZyBjdXJyZW50UGFja2FnZU5hbWUgPSAobGFzdCA9PSAtMSkgPyAiIiA6IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCVN0cmluZyBzaG9ydFR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcobGFzdCArIDEpOwotCQlTdHJpbmcgc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJd2hpbGUgKHNob3J0RWxlbWVudFR5cGVOYW1lLmVuZHNXaXRoKCJbXSIpKSB7Ci0JCQlzaG9ydEVsZW1lbnRUeXBlTmFtZSA9IHNob3J0RWxlbWVudFR5cGVOYW1lLnN1YnN0cmluZygwLCBzaG9ydEVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSAtIDIpOwotCQl9Ci0JCUltcG9ydFBhY2thZ2UgcHJldiA9IHRoaXMuaW1wb3J0cy5nZXQoc2hvcnRFbGVtZW50VHlwZU5hbWUpOwotCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBmaXJzdCBjbGFzcyB3aXRoIHRoaXMgc2hvcnQgZWxlbWVudCB0eXBlIG5hbWUKLQkJCXRoaXMuaW1wb3J0cy5wdXQoc2hvcnRFbGVtZW50VHlwZU5hbWUsIG5ldyBJbXBvcnRQYWNrYWdlKGN1cnJlbnRQYWNrYWdlTmFtZSkpOwotCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQl9Ci0JCWlmIChwcmV2LnBhY2thZ2VOYW1lLmVxdWFscyhjdXJyZW50UGFja2FnZU5hbWUpKSB7Ci0JCQkvLyB0aGlzIGVsZW1lbnQgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGltcG9ydGVkCi0JCQlyZXR1cm4gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCX0KLQkJaWYgKGN1cnJlbnRQYWNrYWdlTmFtZS5lcXVhbHModGhpcy5wYWNrYWdlTmFtZSkgJiYKLQkJCQlwcmV2LnBhY2thZ2VOYW1lLmVxdWFscygiamF2YS5sYW5nIikpIHsKLQkJCS8vIHdlIGZvcmNlIHRoZSAnamF2YS5sYW5nJyBjbGFzcyB0byBiZSBleHBsaWNpdGx5IGltcG9ydGVkCi0JCQlwcmV2LmNvbGxpc2lvbiA9IHRydWU7Ci0JCX0KLQkJLy8gYW5vdGhlciBjbGFzcyB3aXRoIHRoZSBzYW1lIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lIGhhcyBiZWVuCi0JCS8vIHByZXZpb3VzbHkgaW1wb3J0ZWQsIHNvIHRoaXMgb25lIG11c3QgYmUgdXNlZCBmdWxseS1xdWFsaWZpZWQKLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBlLmcuICJmb28uYmFyLkVtcGxveWVlLlBLIiB3aWxsIHJldHVybiB0cnVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAodHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpID4gdGhpcy5jbGFzc05hbWUubGVuZ3RoKCkpCi0JCQkJJiYgdHlwZURlY2xhcmF0aW9uLnN0YXJ0c1dpdGgodGhpcy5jbGFzc05hbWUpCi0JCQkJJiYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQodGhpcy5jbGFzc05hbWUubGVuZ3RoKCkpID09ICcuJyk7Ci0JfQotCi0JLyoqCi0JICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gIkVtcGxveWVlLlBLIgotCSAqIHRoaXMgcHJldmVudHMgY29sbGlzaW9ucyB3aXRoIG90aGVyIGltcG9ydGVkIGNsYXNzZXMgKGUuZy4gImpvby5qYXIuUEsiKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRNZW1iZXJDbGFzc1R5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCWludCBpbmRleCA9IHRoaXMucGFja2FnZU5hbWUubGVuZ3RoKCk7Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlpbmRleCsrOyAgLy8gYnVtcCBwYXN0IHRoZSAnLicKLQkJfQotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCi0JLy8gKioqKiogcmVhZGluZwotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEltcG9ydHMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNvcnRlZFJlcXVpcmVkSW1wb3J0cygpOwotCX0KLQotCS8qKgotCSAqIHRyYW5zZm9ybSBvdXIgbWFwIGVudHJpZXMgdG8gY2xhc3MgbmFtZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRSZXF1aXJlZEltcG9ydHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPih0aGlzLmdldFNvcnRlZFJlcXVpcmVkSW1wb3J0RW50cmllcygpLCB0aGlzLmJ1aWxkSW1wb3J0RW50cmllc1RyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPiBidWlsZEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIElNUE9SVF9FTlRSSUVTX1RSQU5TRk9STUVSOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIFN0cmluZz4gSU1QT1JUX0VOVFJJRVNfVFJBTlNGT1JNRVIgPSBuZXcgSW1wb3J0RW50cmllc1RyYW5zZm9ybWVyKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+LCBTdHJpbmc+Ci0JewotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShFbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGltcG9ydEVudHJ5KSB7Ci0JCQlTdHJpbmcgcGtnID0gaW1wb3J0RW50cnkuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZTsKLQkJCVN0cmluZyB0eXBlID0gaW1wb3J0RW50cnkuZ2V0S2V5KCk7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocGtnLmxlbmd0aCgpICsgMSArIHR5cGUubGVuZ3RoKCkpOwotCQkJc2IuYXBwZW5kKHBrZyk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZCh0eXBlKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc29ydCBieSBwYWNrYWdlIGZpcnN0LCB0aGVuIGNsYXNzICgqbm90KiBieSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IGdldFNvcnRlZFJlcXVpcmVkSW1wb3J0RW50cmllcygpIHsKLQkJVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4gc29ydGVkRW50cmllcyA9IG5ldyBUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+Pih0aGlzLmJ1aWxkSW1wb3J0RW50cmllc0NvbXBhcmF0b3IoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoc29ydGVkRW50cmllcywgdGhpcy5nZXRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSk7Ci0JCXJldHVybiBzb3J0ZWRFbnRyaWVzOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBidWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gSU1QT1JUX0VOVFJJRVNfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IElNUE9SVF9FTlRSSUVTX0NPTVBBUkFUT1IgPSBuZXcgSW1wb3J0RW50cmllc0NvbXBhcmF0b3IoKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSW1wb3J0RW50cmllc0NvbXBhcmF0b3IKLQkJaW1wbGVtZW50cyBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4gZTEsIE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGUyKSB7Ci0JCQlDb2xsYXRvciBjb2xsYXRvciA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCQlpbnQgcGtnID0gY29sbGF0b3IuY29tcGFyZShlMS5nZXRWYWx1ZSgpLnBhY2thZ2VOYW1lLCBlMi5nZXRWYWx1ZSgpLnBhY2thZ2VOYW1lKTsKLQkJCXJldHVybiAocGtnID09IDApID8gY29sbGF0b3IuY29tcGFyZShlMS5nZXRLZXkoKSwgZTIuZ2V0S2V5KCkpIDogcGtnOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3RyaXAgb2ZmIGFueSBub24tcmVxdWlyZWQgaW1wb3J0cyAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCcpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBnZXRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+KHRoaXMuaW1wb3J0cy5lbnRyeVNldCgpLCB0aGlzLmJ1aWxkUmVxdWlyZWRJbXBvcnRFbnRyaWVzRmlsdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBGaWx0ZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IGJ1aWxkUmVxdWlyZWRJbXBvcnRFbnRyaWVzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBSZXF1aXJlZEltcG9ydEVudHJpZXNGaWx0ZXIKLQkJaW1wbGVtZW50cyBGaWx0ZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+Ci0JewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoTWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4gaW1wb3J0RW50cnkpIHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VNdXN0QmVJbXBvcnRlZChpbXBvcnRFbnRyeS5nZXRWYWx1ZSgpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIHBhY2thZ2VNdXN0QmVJbXBvcnRlZChJbXBvcnRQYWNrYWdlIGltcG9ydFBhY2thZ2UpIHsKLQkJCVN0cmluZyBwa2cgPSBpbXBvcnRQYWNrYWdlLnBhY2thZ2VOYW1lOwotCQkJaWYgKHBrZy5lcXVhbHMoIiIpKSB7Ci0JCQkJLy8gY2Fubm90IGltcG9ydCBhIHR5cGUgZnJvbSB0aGUgInVubmFtZWQiIHBhY2thZ2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAocGtnLmVxdWFscygiamF2YS5sYW5nIikpIHsKLQkJCQkvLyB3ZSBtdXN0IGltcG9ydCBmcm9tICdqYXZhLmxhbmcnIGlmIHdlIGFsc28gaGF2ZSBhIGNsYXNzIGluIHRoZSBzYW1lIHBhY2thZ2UKLQkJCQlyZXR1cm4gaW1wb3J0UGFja2FnZS5jb2xsaXNpb247Ci0JCQl9Ci0JCQlpZiAocGtnLmVxdWFscyhCb2R5U291cmNlV3JpdGVyLnRoaXMucGFja2FnZU5hbWUpKSB7Ci0JCQkJLy8gd2UgbmV2ZXIgbmVlZCB0byBpbXBvcnQgYSBjbGFzcyBmcm9tIHRoZSBzYW1lIHBhY2thZ2UKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIG5lZWQgYSAnY29sbGlzaW9uJyBmbGFnIGZvciB3aGVuIHdlIGVuY291bnRlciBhIGNsYXNzIGZyb20KLQkgKiAnamF2YS5sYW5nJyBmb2xsb3dlZCBieSBhIGNsYXNzIGZyb20gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCdzCi0JICogcGFja2FnZS4gV2Ugd2lsbCBuZWVkIHRvIGluY2x1ZGUgdGhlIGV4cGxpY2l0IGltcG9ydCBvZiB0aGUKLQkgKiAnamF2YS5sYW5nJyBjbGFzcyBhbmQgYWxsIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBvdGhlciBjbGFzcyB3aWxsCi0JICogaGF2ZSB0byBiZSBmdWxseS1xdWFsaWZpZWQuCi0JICogCi0JICogSWYgdGhlIGNsYXNzZXMgYXJlIGVuY291bnRlcmVkIGluIHRoZSBvcHBvc2l0ZSBvcmRlciAoaS5lLiB0aGUgY2xhc3MKLQkgKiBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQncyBwYWNrYWdlIGZvbGxvd2VkIGJ5IHRoZSBjbGFzcwotCSAqIGZyb20gJ2phdmEubGFuZycpLCB3ZSBkbyAqbm90KiBuZWVkIHRvIGltcG9ydCB0aGUgZmlyc3QgY2xhc3Mgd2hpbGUKLQkgKiBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gdGhlICdqYXZhLmxhbmcnIGNsYXNzIHdpbGwgYmUgZnVsbHktcXVhbGlmaWVkLgotCSAqIAotCSAqIFVuZm9ydHVuYXRlbHksIHdlIHN0aWxsIGhhdmUgYSBwcm9ibGVtOiBpZiB3ZSByZWZlcmVuY2UgYSBjbGFzcyBmcm9tCi0JICogJ2phdmEubGFuZycgYW5kIHRoZXJlIGlzIGEgY29uZmxpY3RpbmcgY2xhc3MgZnJvbSB0aGUgY3VycmVudAotCSAqIGNvbXBpbGF0aW9uIHVuaXQncyBwYWNrYWdlIChidXQgdGhhdCBjbGFzcyBpcyAqbm90KiByZXZlYWxlZCB0byB1cwotCSAqIGhlcmUpLCB0aGUgc2ltcGxlIG5hbWUgd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgbm9uLSdqYXZhLmxhbmcnIGNsYXNzLgotCSAqIFVubGVzcyB3ZSBzaW1wbHkgZm9yY2UgYW4gaW1wb3J0IG9mICphbGwqICdqYXZhLmxhbmcnIGNsYXNzZXMuLi4uIDotKAotCSAqIAotCSAqIFRoaXMgc2hvdWxkbid0IGhhcHBlbiB2ZXJ5IG9mdGVuLiA6LSkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydFBhY2thZ2UgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2xsaXNpb24gPSBmYWxzZTsKLQotCQlwcm90ZWN0ZWQgSW1wb3J0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvVGV4dFJhbmdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTljOThkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvVGV4dFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQSB0ZXh0IHJhbmdlIGRlZmluZXMgdGhlIG9mZnNldCBpbnRvLCBsZW5ndGggb2YsIGFuZCBsaW5lIG9mIGEgcGllY2UKLSAqIG9mIHRleHQuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGV4dFJhbmdlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgdGV4dC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIG9mZnNldCBvZiB0aGUgdGV4dAotCSAqLwotCWludCBnZXRPZmZzZXQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dC4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmFuZ2UgaW5jbHVkZXMgdGhlIGNoYXJhY3RlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCWJvb2xlYW4gaW5jbHVkZXMoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSB0b3VjaGVzIGFuIGluc2VydGlvbiBjdXJzb3IgYXQgdGhlCi0JICogc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCWJvb2xlYW4gdG91Y2hlcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgdGV4dC4KLQkgKi8KLQlpbnQgZ2V0TGluZU51bWJlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG9mZnNldHMgYW5kIGxlbmd0aHMgYXJlIHRoZSBzYW1lLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOwotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBjb2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlICNlcXVhbHMoKSBjb250cmFjdC4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotCi0JLyoqCi0JICogRW1wdHkgaW1wbGVtZW50YXRpb24gb2YgdGV4dCByYW5nZS4KLQkgKi8KLQlmaW5hbCBjbGFzcyBFbXB0eSBpbXBsZW1lbnRzIFRleHRSYW5nZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVGV4dFJhbmdlIElOU1RBTkNFID0gbmV3IEVtcHR5KCk7Ci0JCXB1YmxpYyBzdGF0aWMgVGV4dFJhbmdlIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQkJcmV0dXJuIElNZXNzYWdlLkxJTkVOT19VTlNFVDsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiBJTWVzc2FnZS5PRkZTRVRfVU5TRVQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzKGludCBpbmRleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIHRvdWNoZXMoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggPT0gMDsgIC8vID8/PwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvID09IHRoaXMpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICggISAobyBpbnN0YW5jZW9mIFRleHRSYW5nZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlUZXh0UmFuZ2UgciA9IChUZXh0UmFuZ2UpIG87Ci0JCQlyZXR1cm4gKHIuZ2V0T2Zmc2V0KCkgPT0gMCkKLQkJCQkJJiYgKHIuZ2V0TGVuZ3RoKCkgPT0gMCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGV4dFJhbmdlLkVtcHR5IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BYnN0cmFjdFR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fic3RyYWN0VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU3YTA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fic3RyYWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotCi0vKioKLSAqIEFic3RyYWN0VHlwZToganVzdCBzb21lIGNvdmFyaWFudCBvdmVycmlkZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBYnN0cmFjdFR5cGUgZXh0ZW5kcyBNZW1iZXIgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlUeXBlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGVkRWxlbWVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGVkRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2U5OWNmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIERhbGkgbWFuaXB1bGF0ZXMgYW5ub3RhdGlvbnMgb24gZWxlbWVudHMgKHBhY2thZ2VzLCB0eXBlcywgZmllbGRzLCBhbmQgbWV0aG9kcykuCi0gKiBUaGlzIGludGVyZmFjZSBzaW1wbGlmaWVzIHRob3NlIG1hbmlwdWxhdGlvbnMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0ZWRFbGVtZW50IHsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRlZCBlbGVtZW50J3MgYm9keSBkZWNsYXJhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqIFRoaXMgY2FuIGJlIG51bGwgaWYgdGhlIGFubm90YXRlZCBlbGVtZW50IGlzIG5vIGxvbmdlciBwcmVzZW50IGluIHRoZSBBU1QKLQkgKiBiZWNhdXNlIHRoZSBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZCBpbiBhbm90aGVyIHRocmVhZC4KLQkgKi8KLQlBU1ROb2RlIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRlZCBlbGVtZW50J3MgYmluZGluZyBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCUlCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzICJtb2RpZmllZCIgZGVjbGFyYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQlNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzICJtb2RpZmllZCIgZGVjbGFyYXRpb24gZnJvbSBhIG5ld2x5LWdlbmVyYXRlZCBBU1QuCi0JICovCi0JTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRlZCBlbGVtZW50J3MgbmFtZSB0ZXh0IHJhbmdlIGZyb20gdGhlIHNwZWNpZmllZCBBU1QuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogRWRpdCB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyBkZWNsYXJhdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGVkaXRvci4KLQkgKi8KLQl2b2lkIGVkaXQoRWRpdG9yIGVkaXRvcik7Ci0KLQotCS8vICoqKioqKioqKiogImVkaXRvciIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBjYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncwotCSAqIGNvbXBpbGF0aW9uIHVuaXQvQVNUIGlzIGluIGEgc3RhdGUgdG8gYmUgbWFuaXB1bGF0ZWQuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBFZGl0b3IgewotCi0JCS8qKgotCQkgKiBFZGl0IHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24uIEFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGRlY2xhcmF0aW9uCi0JCSAqIHdpbGwgYmUgY2FwdHVyZWQgYW5kIGFwcGxpZWQgdG8gdGhlIGFubm90YXRlZCBlbGVtZW50J3MgY29tcGlsYXRpb24gdW5pdC4KLQkJICovCi0JCXZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGVkUGFja2FnZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGVkUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGEzY2NjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZFBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgUmVkIEhhdCwgSW5jLgotICogRGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBieSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yOgotICogICAgIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklQYWNrYWdlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUGFja2FnZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgRG1pdHJ5IEdlcmFza292Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRlZFBhY2thZ2UgZXh0ZW5kcyBBbm5vdGF0ZWRFbGVtZW50IHsJCi0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JSVBhY2thZ2VCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCVBhY2thZ2VEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiMDRjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIEFkYXB0IGEgSmF2YSBhbm5vdGF0aW9uIHdpdGggYSBzaW1wbGUtdG8tdXNlIGludGVyZmFjZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25BZGFwdGVyIHsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgY29tcGlsYXRpb24gdW5pdCwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhZGFwdGVyJ3MgYW5ub3RhdGlvbi4KLQkgKiBAc2VlICNnZXRBbm5vdGF0aW9uKCkKLQkgKi8KLQlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgbWFya2VyIGFubm90YXRpb24sIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBpZiBwcmVzZW50LgotCSAqLwotCXZvaWQgbmV3TWFya2VyQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQl2b2lkIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IG5vcm1hbCBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQl2b2lkIG5ld05vcm1hbEFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgQVNUIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgYW5ub3RhdGlvbi4KLQkgKiBJZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGFubm90YXRpb24ncyBwYXJlbnQgbm9kZS4KLQkgKiBAc2VlICNnZXRBc3ROb2RlKCkKLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiM2FjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIFJldmlldyB0aGUgc3BlY2lmaWVkIGVkaXRzIGFuZCBmb3JtYXQgdGhlIHNwZWNpZmllZCBkb2N1bWVudCBhcyBuZWVkZWQuCi0JICovCi0Jdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjNmU5NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBBZGFwdCBhIEphdmEgYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggYSBzaW1wbGUtdG8tdXNlIGludGVyZmFjZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBlbGVtZW50LgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqIElmIHRoZSBjb21waWxhdGlvbiB1bml0IGlzIGF2YWlsYWJsZSwgI3ZhbHVlKENvbXBpbGF0aW9uVW5pdCkKLQkgKiBtaWdodCBiZSBtb3JlIHBlcmZvcm1hbnQuCi0JICogQHNlZSAjZ2V0VmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdCkKLQkgKi8KLQlUIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICovCi0JVCBnZXRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBlbGVtZW50LgotCSAqIFNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHRvIG51bGwgd2lsbCBjYXVzZQotCSAqIHRoZSBlbGVtZW50IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFQgdmFsdWUpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0LCByZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBAc2VlICNnZXRFeHByZXNzaW9uKCkKLQkgKi8KLQlFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBBU1Qgbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcsIHJldHVybiB0aGUgYW5ub3RhdGlvbidzIG5vZGUuCi0JICogQHNlZSAjZ2V0QXN0Tm9kZSgpCi0JICovCi0JQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMTlkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotCi0vKioKLSAqIEF0dHJpYnV0ZXMgYXJlIGVpdGhlciByZXByZXNlbnRlZCBieSBmaWVsZHMgKCdmb28nKSBvciBwcm9wZXJ0aWVzL21ldGhvZAotICogcGFpcnMgKCdnZXRGb28oKScvJ3NldEZvbygpJykuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGUgZXh0ZW5kcyBNZW1iZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBuYW1lLCBhcyBvcHBvc2VkIHRvIHRoZSBtZW1iZXIncyBuYW1lCi0JICogKGUuZy4gImdldEZvbygpIiByZXR1cm5zICJmb28iKS4KLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcgZm9yIHRoZSBhdHRyaWJ1dGUncyBkZWNsYXJlZCB0eXBlLAotCSAqIGFzIG9wcG9zZWQgdG8gaXRzIGRlY2xhcmluZyB0eXBlLgotCSAqLwotCUlUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGlzIGEgZmllbGQuCi0JICovCi0JYm9vbGVhbiBpc0ZpZWxkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5M2ExNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIFByb3ZpZGUgY2xpZW50cyB3aXRoIGEgcGx1Z2dhYmxlIHdheSB0byBtYW5pcHVsYXRlIGFuCi0gKiBhbm5vdGF0aW9uIG1vZGlmeWluZyBhICJkZWNsYXJhdGlvbiIuCi0gKiAKLSAqIFRPRE8gc3BlY2lmeSBob3cgbXVsdGlwbGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSB0byBiZSBoYW5kbGVkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IG1hcmtlciBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKiBSZXR1cm4gdGhlIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCU1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIG1vZGlmeSBpdCB3aXRoCi0JICogYSBuZXcgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKiBSZXR1cm4gdGhlIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCVNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIG1vZGlmeSBpdCB3aXRoCi0JICogYSBuZXcgbm9ybWFsIGFubm90YXRpb24sIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYW5ub3RhdGlvbiBpZiBwcmVzZW50LgotCSAqIFJldHVybiB0aGUgbmV3IGFubm90YXRpb24uCi0JICovCi0JTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIEFTVCBub2RlCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgYW5ub3RhdGlvbi4KLQkgKiBJZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gaXRzIHBhcmVudCBub2RlLgotCSAqLwotCUFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWU0ZmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogUHJvdmlkZSBjbGllbnRzIHdpdGggYSBwbHVnZ2FibGUgd2F5IHRvIG1hbmlwdWxhdGUgYW4KLSAqIGFubm90YXRpb24gZWxlbWVudCBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogVCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiB7Ci0KLQkvKioKLQkgKiBSZWR1Y2UgdGhlIG51bWJlciBvZiBOTFMgd2FybmluZ3MuCi0JICovCi0JU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLQkgKiBhbm5vdGF0aW9uIGVsZW1lbnQuIFJldHVybiBudWxsIG9yIGFuIGVtcHR5IGFycmF5Ci0JICogaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICovCi0JVCBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHNldCB0aGUgdmFsdWUgb2YgdGhlCi0JICogYW5ub3RhdGlvbiBlbGVtZW50LiBTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudAotCSAqIHRvIG51bGwgd2lsbCBjYXVzZSB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gaXRzCi0JICogYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFQgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBlbGVtZW50J3MgdmFsdWUgZXhwcmVzc2lvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIEFTVCBub2RlCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudCdzIHZhbHVlLgotCSAqIElmIHRoZSBlbGVtZW50IGlzIG1pc3NpbmcsIHJldHVybiB0aGUgYW5ub3RhdGlvbidzIG5vZGUuCi0JICovCi0JQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjkwYjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEVudW06IHNvbWUgY292YXJpYW50IG92ZXJyaWRlcyBwbHVzIGVudW1Db25zdGFudHMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW0gZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUVudW1EZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtJ3MgY29uc3RhbnRzCi0JICovCi0JRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBnZXRFbnVtQ29uc3RhbnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2OTNkNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci0KLS8qKgotICogRW51bSBjb25zdGFudHMgYXJlIHBhcnQgb2YgRW51bXMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW1Db25zdGFudCBleHRlbmRzIE1lbWJlciB7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ3ZWQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLQotLyoqCi0gKiBEZWZpbmUgdGhlIHByb3RvY29sIGZvciBjb252ZXJ0aW5nIGFuIEFTVCBleHByZXNzaW9uIGJhY2sgYW5kIGZvcnRoCi0gKiBmcm9tIGFuIGFyYml0cmFyeSB0eXBlIChlLmcuIFN0cmluZ0xpdGVyYWwgPD0+IFN0cmluZykuCi0gKiBUIGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGFuZCBmcm9tIGFuIGV4cHJlc3Npb24uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFeHByZXNzaW9uQ29udmVydGVyPFQ+IHsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYW4KLQkgKiBleHByZXNzaW9uIHRoYXQgaXMgb3duZWQgYnkgdGhlIHNwZWNpZmllZCBBU1QuCi0JICogVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IHNwZWNpZmllZCBieSB0aGUgY2xpZW50LgotCSAqLwotCUV4cHJlc3Npb24gY29udmVydChUIG9iamVjdCwgQVNUIGFzdCk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiB0byBhbiBvYmplY3Qgb2Ygc29tZQotCSAqIHByZS1kZXRlcm1pbmVkIHR5cGUuCi0JICovCi0JVCBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0ZpZWxkQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9GaWVsZEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTAxNGFjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0ZpZWxkQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci0KLS8qKgotICogRmllbGQgYXR0cmlidXRlOiBqdXN0IHNvbWUgY292YXJpYW50IG92ZXJyaWRlcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZpZWxkQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJVmFyaWFibGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUZpZWxkRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1ZTljYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi0KLS8qKgotICogQWRhcHQgYW4gaW5kZXhlZCBKYXZhIGFubm90YXRpb24gd2l0aCBhIHNpbXBsZS10by11c2UgaW50ZXJmYWNlLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGV4dGVuZHMgQW5ub3RhdGlvbkFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGFubm90YXRpb24gaXMgc2l0dWF0ZWQuCi0JICovCi0JaW50IGdldEluZGV4KCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4ZjIxZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLQotLyoqCi0gKiBBbGxvdyBjbGllbnRzIHRvIG1hbmlwdWxhdGUgYW4gYW5ub3RhdGlvbiB3aXRoaW4gYW4gYXJyYXkgb2YgYW5ub3RhdGlvbnMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGFubm90YXRpb24gaXMgc2l0dWF0ZWQuCi0JICovCi0JaW50IGdldEluZGV4KCk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZW1iZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01lbWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjlmMzk4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01lbWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIERhbGkgbWFuaXB1bGF0ZXMgYW5ub3RhdGlvbnMgb24gbWVtYmVycyAodHlwZXMsIGZpZWxkcywgYW5kIG1ldGhvZHMpLgotICogVGhpcyBpbnRlcmZhY2Ugc2ltcGxpZmllcyB0aG9zZSBtYW5pcHVsYXRpb25zLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVtYmVyIGV4dGVuZHMgQW5ub3RhdGVkRWxlbWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWVtYmVyIGlzIHBlcnNpc3RhYmxlLgotCSAqLwotCWJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWVtYmVyIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtZW1iZXIKLQkgKiBhbmQgb2NjdXJyZW5jZS4KLQkgKi8KLQlib29sZWFuIG1hdGNoZXMoU3RyaW5nIG1lbWJlck5hbWUsIGludCBvY2N1cnJlbmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZXRob2RBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjYTkzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZXRob2RBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogTWV0aG9kIGF0dHJpYnV0ZToganVzdCBzb21lIGNvdmFyaWFudCBvdmVycmlkZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RBdHRyaWJ1dGUgZXh0ZW5kcyBBdHRyaWJ1dGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlNZXRob2RCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCU1ldGhvZERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBNZW1iZXIjbWF0Y2hlcyhTdHJpbmcsIGludCkuCi0JICovCi0JYm9vbGVhbiBtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzFlNTM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci0KLS8qKgotICogRGVmaW5lIGEgd3JhcHBlciB0aGF0IHByb3ZpZGVzIGEgY29tbW9uIHByb3RvY29sIGZvciBhbGwgdGhlIHZhcmlvdXMgQVNUCi0gKiBkZWNsYXJhdGlvbnMgdGhhdCBoYXZlIG1vZGlmaWVycyAoaS5lLiB0aGVyZSBhcmUgYSBudW1iZXIgb2YgQVNUIG5vZGUKLSAqIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIG1ldGhvZCAjbW9kaWZpZXJzKCksIGJ1dCB0aGV5IGRvIG5vdCBpbXBsZW1lbnQKLSAqIGEgY29tbW9uIGludGVyZmFjZSk6Ci0gKiAgICAgQm9keURlY2xhcmF0aW9uCi0gKiAgICAgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbgotICogICAgIFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uCi0gKiAgICAgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kaWZpZWREZWNsYXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJkZWNsYXJhdGlvbiIgQVNUIG5vZGUuCi0JICovCi0JQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iIEFTVC4KLQkgKi8KLQlBU1QgZ2V0QXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICpmaXJzdCogYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHN1Y2ggYW5ub3RhdGlvbi4KLQkgKi8KLQlBbm5vdGF0aW9uIGdldEFubm90YXRpb25OYW1lZChTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSAqZmlyc3QqIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgZnJvbSB0aGUgZGVjbGFyYXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBvbGQgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGFubm90YXRpb24uCi0JICogSWYgdGhlcmUgaXMgbm8gYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2ltcGx5IGFkZCB0aGUgbmV3Ci0JICogYW5ub3RhdGlvbiB0byB0aGUgZGVjbGFyYXRpb24ncyBtb2RpZmllcnMuCi0JICovCi0Jdm9pZCByZXBsYWNlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBvbGRBbm5vdGF0aW9uTmFtZSwgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgd2FzIGFkZGVkIHRvIG9yIGFscmVhZHkgcHJlc2VudCBpbgotCSAqIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQgKGkuZS4gdGhlIHNwZWNpZmllZCBjbGFzcyBjYW4gYmUKLQkgKiBzdWJzZXF1ZW50bHkgcmVmZXJlbmNlZCB1c2luZyBhICJzaG9ydCIgbmFtZSkuCi0JICogQWxzbyByZXR1cm4gdHJ1ZSBpZiBhbiBpbXBvcnQgd2FzIHVubmVjZXNzYXJ5IChpLmUuIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLnV0aWwuKiIpLgotCSAqLwotCWJvb2xlYW4gYWRkSW1wb3J0KFN0cmluZyBjbGFzc05hbWUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgc3RhdGljIGltcG9ydCB0byB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhcHByb3ByaWF0ZSBpbXBvcnQgd2FzIGFkZGVkIHRvIG9yIGFscmVhZHkgcHJlc2VudCBpbgotCSAqIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQgKGkuZS4gdGhlIHNwZWNpZmllZCBjb25zdGFudCBjYW4gYmUKLQkgKiBzdWJzZXF1ZW50bHkgcmVmZXJlbmNlZCB1c2luZyBhICJzaG9ydCIgbmFtZSkuCi0JICogQWxzbyByZXR1cm4gdHJ1ZSBpZiBhbiBpbXBvcnQgd2FzIHVubmVjZXNzYXJ5IChpLmUuIHRoZSBzcGVjaWZpZWQgZW51bQotCSAqIGlzIHBhcnQgb2YgdGhlICJkZWZhdWx0IiBwYWNrYWdlKS4KLQkgKiBUaGlzIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nIGEgIndpbGRjYXJkIiBpbXBvcnQgKGUuZy4gImphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLioiKS4KLQkgKi8KLQlib29sZWFuIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgZW51bUNvbnN0YW50TmFtZSk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KLQkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgbmFtZSBjYW4gYmUKLQkgKiBzdWJzZXF1ZW50bHkgcmVmZXJlbmNlZCB1c2luZyBhICJzaG9ydCIgbmFtZSkuCi0JICogQWxzbyByZXR1cm4gdHJ1ZSBpZiBhbiBpbXBvcnQgd2FzIHVubmVjZXNzYXJ5IChpLmUuIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvciBlbnVtIGlzIHBhcnQgb2YgdGhlICJkZWZhdWx0IiBwYWNrYWdlKS4KLQkgKiBUaGlzIGRvZXMgbm90IHN1cHBvcnQgYWRkaW5nIGEgIndpbGRjYXJkIiBpbXBvcnQgKGUuZy4gImphdmEudXRpbC4qIikuCi0JICovCi0JYm9vbGVhbiBhZGRJbXBvcnQoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljXyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAoZnVsbHktcXVhbGlmaWVkKSBuYW1lIHdpdGhpbiB0aGUgZGVjbGFyYXRpb24ncyBjb250ZXh0OyBpLmUuIGF0dGVtcHQKLQkgKiB0byByZXNvbHZlIHRoZSBhbm5vdGF0aW9uJ3MgbmFtZSAodXNpbmcgaW1wb3J0cyBldGMuKSBhbmQgcmV0dXJuCi0JICogd2hldGhlciBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlib29sZWFuIGFubm90YXRpb25Jc05hbWVkKEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9UeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhM2E2YTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci0KLS8qKgotICogVHlwZTogbmVzdGVkVHlwZXMsIG5lc3RlZEVudW1zLCBmaWVsZHMsIGFuZCBtZXRob2RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZSBleHRlbmRzIEFic3RyYWN0VHlwZSB7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JVHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBuZXN0ZWQgdHlwZXMgKGRvZXMgbm90IGluY2x1ZGUgYW5ub3RhdGlvbnMgb3IgZW51bXMpLgotCSAqLwotCVR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSdzIG5lc3RlZCBlbnVtcy4KLQkgKi8KLQlFbnVtRGVjbGFyYXRpb25bXSBnZXRFbnVtcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBmaWVsZHMuCi0JICovCi0JRmllbGREZWNsYXJhdGlvbltdIGdldEZpZWxkcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBtZXRob2RzLgotCSAqLwotCU1ldGhvZERlY2xhcmF0aW9uW10gZ2V0TWV0aG9kcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjU3NDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnR5X2ZpbGVzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTM2MmE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc5YmQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3YzliMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jV2VkIEZlYiAwOSAxNjoyMTowOCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS42Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjYKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3NjA2Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLkpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJiY2Q2ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODY1ZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIEVjbGlwc2VMaW5rIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZmZWUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotIAotPHBsdWdpbj4KLQkKLQk8IS0tCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBMaWJyYXJ5IFByb3ZpZGVyIEZyYW1ld29yayBJbnRlZ3JhdGlvbiAqCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JLS0+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZG93bmxvYWRhYmxlTGlicmFyaWVzIj4KLQkJCi0JCTxpbXBvcnQtZGVmaW5pdGlvbnMgCi0JCQl1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9kZXYvZWNsaXBzZWxpbmsvZWNsaXBzZWxpbmstZG93bmxvYWRhYmxlLWxpYnMueG1sIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPG9yPgotCQkJCQkJPHRlc3QgCi0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQkJdmFsdWU9ImpwdC5qYXhiIiAKLQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQkJCTx0ZXN0IAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAKLQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQkJPC9vcj4JCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2ltcG9ydC1kZWZpbml0aW9ucz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxNzNiMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9lY2xpcHNlbGlua19jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX25vRWNsaXBzZUxpbmtWZXJzaW9uPVNlbGVjdGVkIGxpYnJhcmllcyBkbyBub3QgaW5jbHVkZSByZXF1aXJlZCBFY2xpcHNlTGluayBhbm5vdGF0aW9uIGNsYXNzZXMuCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zPVRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBFY2xpcHNlTGluayBpbiBzZWxlY3RlZCBsaWJyYXJpZXMuCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb249RWNsaXBzZUxpbmsgdmVyc2lvbiBkb2VzIG5vdCBtZWV0IHBsYXRmb3JtIHJlcXVpcmVtZW50cy4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2I0NTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi0JCWV4dGVuZHMgUGx1Z2luIHsKLQkKLQkvLyAqKioqKioqKioqIHB1YmxpYyBjb25zdGFudHMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgdGhlIGpwdCBjb21tb24gY29yZSBzdXBwb3J0Ci0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEXyA9IFBMVUdJTl9JRCArICcuJzsKLQkKLQkKLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luIElOU1RBTkNFOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIGpwdCBjb21tb24gZWNsaXBzZWxpbmsgY29yZSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcHVibGljIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBKcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4OWZlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9KcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9ub0VjbGlwc2VMaW5rVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9pbXByb3BlckVjbGlwc2VMaW5rVmVyc2lvbjsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2NvbW1vbl9lY2xpcHNlbGlua19jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLmNsYXNzOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTJhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtMaWJWYWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklGaWVsZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLkpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTGliVmFsVXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT05fQ0xBU1NfUEFUSCA9ICJvcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9WZXJzaW9uLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OX0ZJRUxEX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGUoSXRlcmFibGU8SUNsYXNzcGF0aEVudHJ5PiBsaWJyYXJ5RW50cmllcywgU2V0PFZlcnNpb25SYW5nZT4gdmVyc2lvblJhbmdlcykgewotCQlWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGxpYnJhcnlFbnRyaWVzKSB7Ci0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc1JlYWRlciA9IAotCQkJCQkJVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcigKLQkJCQkJCQllbnRyeS5nZXRQYXRoKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIFZFUlNJT05fQ0xBU1NfUEFUSCwgSUNsYXNzRmlsZVJlYWRlci5GSUVMRF9JTkZPUyk7Ci0JCQkJaWYgKGNsYXNzUmVhZGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJRmllbGRJbmZvIGZpZWxkIDogY2xhc3NSZWFkZXIuZ2V0RmllbGRJbmZvcygpKSB7Ci0JCQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGZpZWxkLmdldE5hbWUoKSwgVkVSU0lPTl9GSUVMRF9OQU1FLnRvQ2hhckFycmF5KCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdmVyc2lvblN0cmluZyA9IGZpZWxkLmdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKS5nZXRDb25zdGFudFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIHBvdGVudGlhbGx5IGEgYml0IGNvdWxkIGdvIHdyb25nIHdpdGggdGhhdCBsYXN0IGxpbmUsIGJ1dCBpZiBhbnkKLQkJCQkJCQkJLy8gYXNzdW1wdGlvbnMgYXJlbid0IG1ldCwgdGhlcmUncyBubyB2YWx1ZQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb24pOwotCQl9Ci0JCQotCQlmb3IgKFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgOiB2ZXJzaW9uUmFuZ2VzKSB7Ci0JCQlpZiAoISB2ZXJzaW9uUmFuZ2UuaXNJbmNsdWRlZCh2ZXJzaW9uKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb24pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGggYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGZiMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZTk2Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTJmNDIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIEphbiAyNCAwOTo0ODozOCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRmZDIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuSnB0Q29tbW9uVWlQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmpheGIudWksb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmpheGIudWksb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSxvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSxvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmpheGIudWksb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSxvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSxvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksb3JnLmVjbGlwc2UuanB0LmpheGIudWksb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aXphcmRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzkyZjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYWY5MGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl91aS5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTQ3NjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQm9vbGVhbl9UcnVlPVRydWUKLUJvb2xlYW5fRmFsc2U9RmFsc2UKLQotTm9uZVNlbGVjdGVkPTxOb25lPgotRGVmYXVsdEVtcHR5PURlZmF1bHQKLURlZmF1bHRXaXRoT25lUGFyYW09RGVmYXVsdCAoezB9KQotCi1BZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQ9QWRkLi4uCi1BZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQ9UmVtb3ZlCi1DaG9vc2VyUGFuZV9icm93c2VCdXR0b249QnJvd3NlLi4uCi1DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlPUNsYXNzIFNlbGVjdGlvbgotUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlPVBhY2thZ2UgU2VsZWN0aW9uCi1QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgcGFja2FnZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqID0gYW55IHN0cmluZywgPyA9ICBhbnkgY2hhcmFjdGVyKToKLUVudW1Db21ib1ZpZXdlcl9kZWZhdWx0PURlZmF1bHQgKCkKLUVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQ9RGVmYXVsdCAoezB9KQotTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzPUEgcXVlcnkgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL0pwdENvbW1vblVpUGx1Z2luLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL0pwdENvbW1vblVpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNDk3NzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9KcHRDb21tb25VaVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uVWlQbHVnaW4gCi0JZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIEpQVCBDb21tb24gVUkgc3VwcG9ydCAodmFsdWUge0B2YWx1ZX0pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBKcHRDb21tb25VaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBKUFQgVUkgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdENvbW1vblVpUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvZ2dpbmcgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRDb21tb25VaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL1dpZGdldEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTcxNTRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EYXRlVGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLQotLyoqCi0gKiBBIHdpZGdldCBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbiBTV1Qgd2lkZ2V0IGJhc2VkIG9uIHRoZSByaWdodAotICogc3R5bGUuIFNvbWUgc3R5bGUgc2hvd3MgdGhlIHdpZGdldHMgZGlmZmVyZW50bHksIGZvciBpbnN0YW5jZSwgdGhlIGZsYXQgc3R5bGUKLSAqIHNob3dzIHRoZSB3aWRnZXRzIHdpdGggbGVzcyBib3JkZXJzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlcgotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuCi0gKiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZwotICogYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QKLSAqIGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBXaWRnZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcmVndWxhciBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIGN1c3RvbSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKi8KLQlARGVwcmVjYXRlZAotCUNDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICovCi0JQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBEYXRlVGltZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIGlzIHRvIHRlbGwgdGhlIHR5cGUgb2Ygd2lkZ2V0Ci0JICogKDxjb2RlPlNXVC5EQVRFPC9jb2RlPiBvciA8Y29kZT5TV1QuVElNRTwvY29kZT4gb3IgPGNvZGU+U1dULkNBTEVOREFSPC9jb2RlPikKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRhdGVUaW1lPC9jb2RlPgotCSAqLwotCURhdGVUaW1lIGNyZWF0ZURhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSBjdXN0b20gPGNvZGU+Q0NvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCUBEZXByZWNhdGVkCi0JQ0NvbWJvIGNyZWF0ZUVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ibzwvY29kZT4KLQkgKi8KLQlDb21ibyBjcmVhdGVFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0aXRsZWQgcGFuZSAoZ3JvdXAgYm94KS4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIGdyb3VwIHBhbmUncyB0aXRsZQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+R3JvdXA8L2NvZGU+Ci0JICovCi0JR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgdGhhdCBpcyBzaG93biBhcyBhIGh5cGVybGluay4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5IeXBlcmxpbms8L2NvZGU+Ci0JICovCi0JSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+Ci0JICovCi0JTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGxhYmVsVGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpc3QuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSBpcyB1c3VhbGx5IHRvIHRlbGwgd2hhdCB0eXBlIG9mIHNlbGVjdGlvbgotCSAqICg8Y29kZT5TV1QuTVVMVEk8L2NvZGU+IG9yIDxjb2RlPlNXVC5TSU5HTEU8L2NvZGU+KQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TGFiZWw8L2NvZGU+Ci0JICovCi0JTGlzdCBjcmVhdGVMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxhYmVsIHRoYXQgY2FuIGJlIHdyYXBwZWQgb24gbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Gb3JtVGV4dDwvY29kZT4KLQkgKi8KLQlGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgdGV4dCBhcmVhLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPgotCSAqLwotCVRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgdGV4dCBmaWVsZCB0aGF0IGhhbmRsZXMgcGFzc3dvcmQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPgotCSAqLwotCVRleHQgY3JlYXRlUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiAodG9nZ2xlIGJldHdlZW4gc2VsZWN0ZWQgYW5kIHVuc2VsZWN0ZWQpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICovCi0JQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByYWRpbyBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzZWN0aW9uLCB3aGljaCBpcyBhIGNvbGxhcHNhYmxlIHBhbmUgd2l0aCBhIHRpdGxlIGJhci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIG9mIHRoZSB0aXRsZSBiYXIsIHdoaWNoIGNhbiBiZQotCSAqIDxjb2RlPkV4cGFuZGFibGVDb21wb3NpdGUuVFdJU1RJRTwvY29kZT4gYW5kCi0JICogPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVI8L2NvZGU+Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPgotCSAqLwotCVNlY3Rpb24gY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzcGlubmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKi8KLQlTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRhYmxlCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKi8KLQlUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGZpZWxkLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+VGV4dDwvY29kZT4KLQkgKi8KLQlUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRyaS1zdGF0ZSBjaGVjayBib3guCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4gdGhhdCBoYXMgMyBzZWxlY3Rpb24gc3RhdGVzCi0JICovCi0JQnV0dG9uIGNyZWF0ZVRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvSnB0Q29tbW9uVWlNZXNzYWdlcy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9KcHRDb21tb25VaU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTEwODAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9KcHRDb21tb25VaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBVSS4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdENvbW1vblVpTWVzc2FnZXMgewotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX1RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQm9vbGVhbl9GYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1wdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFdpdGhPbmVQYXJhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb25lU2VsZWN0ZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfY29tbW9uX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdENvbW1vblVpTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvbW1vblVpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9UcmFjaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL1RyYWNpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyNjAxNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL1RyYWNpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgdHJhY2luZyBjbGFzcyBtYW5hZ2VzIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB2YWx1ZSBpbnRvIGJvb2xlYW4gdmFsdWVzIG9yCi0gKiBpbnRlZ2VyIHZhbHVlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYWNpbmcgZGVidWcgZmxhZ3MuIFRob3NlIGZsYWdzCi0gKiBhcmUgc3BlY2lmaWVkIGluIHRoZSAub3B0aW9ucyBmaWxlLiBUaGUgc3VwcG9ydGVkIGtleXMgYXJlIGRlZmluZWQgaGVyZSBhcwotICogY29uc3RhbnRzIGZvciBxdWljayByZWZlcmVuY2UuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFRyYWNpbmcKLXsKLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUJVRyA9ICIvZGVidWciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9kYiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfREIgPSAiL2RlYnVnL3VpL2RiIjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0RFVEFJTFNfVklFVyA9ICIvZGVidWcvdWkvZGV0YWlsc1ZpZXciOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9sYXlvdXQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0xBWU9VVCA9ICIvZGVidWcvdWkvbGF5b3V0IjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvdW5pdC10ZXN0cyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JVF9URVNUUyA9ICIvdW5pdC10ZXN0cyI7Ci0KLQkvKioKLQkgKiBDYW4ndCBpbnN0YW50aWF0ZSB0aGlzIDxjb2RlPlRyYWNpbmc8L2NvZGU+IGNsYXNzLgotCSAqLwotCXByaXZhdGUgVHJhY2luZygpCi0JewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRyYWNpbmcgY2Fubm90IGJlIGluc3RhbnRpYXRlZCIpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdAotCSAqIHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBmbGFnIGlzIGFjdGl2ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGJvb2xlYW5EZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBib29sZWFuRGVidWdPcHRpb24oZmxhZywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZsYWcgaXMgYWN0aXZlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQkJcmV0dXJuIChzdHJpbmcgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBCb29sZWFuLnBhcnNlQm9vbGVhbihzdHJpbmcudHJpbSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4gVGhlIGRlZmF1bHQgdmFsdWUKLQkgKiBpcyAwLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGludERlYnVnT3B0aW9uKFN0cmluZyBmbGFnKQotCXsKLQkJcmV0dXJuIGludERlYnVnT3B0aW9uKGZsYWcsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIGRlZmF1bHQgdmFsdWUgaWYgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiBmbGFnIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGludERlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBpbnQgZGVmYXVsdFZhbHVlKQotCXsKLQkJU3RyaW5nIHN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdENvbW1vblVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCQlyZXR1cm4gKHN0cmluZyA9PSBudWxsKSA/ICBkZWZhdWx0VmFsdWUgOiBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZXMsIGFwcGVuZHMgaXQgd2l0aCB0aGlzIHBsdWctaW4gaWQuCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKQotCXsKLQkJU3lzdGVtLm91dC5wcmludCgiWyIgKyBKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQgKyAiXSAiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdCB2YWx1ZQotCSAqIGlzIGFuIGVtcHR5IHN0cmluZy4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcsIG9yIHRoZSBnaXZlbiBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdEZWJ1Z09wdGlvbihTdHJpbmcgZmxhZykKLQl7Ci0JCXJldHVybiBzdHJpbmdEZWJ1Z09wdGlvbihmbGFnLCAiIik7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGZsYWcgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIFN0cmluZyBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgc3RyaW5nID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lEICsgZmxhZyk7Ci0JCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nIDogZGVmYXVsdFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTFkZGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgdXBkYXRpbmcKLSAqIGxhYmVsIGluZm9ybWF0aW9uIGZvciBhIE1vZGVsIG9iamVjdC4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjYnVpbGRJbWFnZU1vZGVsKCkKLSAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGltYWdlIGZvciB0aGUgCi0gKiAgICAgcmVwcmVzZW50ZWQgbW9kZWwgb2JqZWN0Ci0gKiAjYnVpbGRUZXh0TW9kZWwoKQotICogICAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgdGV4dCBmb3IgdGhlIAotICogICAgIHJlcHJlc2VudGVkIG1vZGVsIG9iamVjdC4KLSAqICNidWlsZERlc2NyaXB0aW9uTW9kZWwoKQotICogCSAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgZGVzY3JpcHRpb24gZm9yIAotICogICAgIHRoZSByZXByZXNlbnRlZCBtb2RlbCBvYmplY3QKLSAqIAotICogT3RoZXIgbWV0aG9kcyBtYXkgYmUgb3ZlcnJpZGRlbiwgYnV0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGUgbG9naWMgcHJvdmlkZWQgCi0gKiBieSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRpb25Nb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGFiZWxDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcigKLQkJCU1vZGVsIG1vZGVsLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkTGFiZWxDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciB0byB1cGRhdGUgdGhlIHZpZXdlciAodGhyb3VnaCB0aGUgbGFiZWwgcHJvdmlkZXIpCi0JICogaWYgdGhlIHRleHQgb3IgaW1hZ2UgY2hhbmdlcwotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGFiZWxDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRMYWJlbFByb3ZpZGVyKCkudXBkYXRlTGFiZWwoZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBnZXRJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQkJZW5nYWdlSW1hZ2VNb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmltYWdlTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpbWFnZSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQotCS8qKiAKLQkgKiBTaG91bGQgb25seSBiZSBvdmVycmlkZGVuIHdpdGggYSBjYWxsIHRvIHN1cGVyLmVuZ2FnZUltYWdlTW9kZWwoKSBiZWZvcmUgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJdGhpcy5pbWFnZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VJbWFnZU1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJdGhpcy5pbWFnZU1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0VGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy50ZXh0TW9kZWwgPSBidWlsZFRleHRNb2RlbCgpOwotCQkJZW5nYWdlVGV4dE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGV4dE1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0ZXh0IHZhbHVlIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlVGV4dE1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVRleHRNb2RlbCgpIHsKLQkJdGhpcy50ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKiAKLQkgKiBTaG91bGQgb25seSBiZSBvdmVycmlkZGVuIHdpdGggYSBjYWxsIHRvIHN1cGVyLmRpc2VuZ2FnZVRleHRNb2RlbCgpIGFmdGVyIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVRleHRNb2RlbCgpIHsKLQkJdGhpcy50ZXh0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb25Nb2RlbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uTW9kZWwgPSBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCWVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbk1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBkZXNjcmlwdGlvbiB2YWx1ZSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5sYWJlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIGFmdGVyIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5sYWJlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpdGVtCi0JICovCi0JcHVibGljIE1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsYWJlbCBwcm92aWRlciB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGl0ZW0KLQkgKi8KLQlwdWJsaWMgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEltYWdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0TW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VUZXh0TW9kZWwoKTsKLQkJZGlzcG9zZUltYWdlTW9kZWwoKTsKLQkJZGlzcG9zZURlc2NyaXB0aW9uTW9kZWwoKTsJCi0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlVGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJZGlzZW5nYWdlVGV4dE1vZGVsKCk7Ci0JCQl0aGlzLnRleHRNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZUltYWdlTW9kZWwoKTsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VEZXNjcmlwdGlvbk1vZGVsKCkgewotCQlpZiAodGhpcy5kZXNjcmlwdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTYzMWI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn0gdGhhdCBwcm92aWRlcyB1cGRhdGluZwotICogY2hpbGRyZW4gaW5mb3JtYXRpb24gZm9yIGEgTW9kZWwgb2JqZWN0LgotICogCi0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqICNnZXRQYXJlbnQoKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gbnVsbC4gIHRoZXJlIGlzIG5vIAotICogICAgIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGlzIGFzIHRoaXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2luZyBmb3IgYSBnaXZlbgotICogICAgIG5vZGUuICBhbGwgc3VjaCBjaGFuZ2VzIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAjYnVpbGRDaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgY2hpbGRyZW4gZm9yIHRoZSByZXByZXNlbnRlZAotICogICAgIG1vZGVsIG9iamVjdC4gICNidWlsZENoaWxkcmVuTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWwpIGFuZCAKLSAqICAgICAjYnVpbGRDaGlsZHJlbk1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbCkgYXJlIHByb3ZpZGVkIGlmIHRoZSBjaGlsZHJlbiBhcmUgbW9yZQotICogICAgIGVhc2lseSByZXByZXNlbnRlZCBhcyBhIGNvbGxlY3Rpb24gb3IgYXMgYSBwcm9wZXJ0eSAoc2luZ2xlIGNoaWxkKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBhIHtAbGluayBOdWxsTGlzdFZhbHVlTW9kZWx9Ci0gKiAKLSAqIE90aGVyIG1ldGhvZHMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCB0YWtlIGNhcmUgdG8gcHJlc2VydmUgdGhlIGxvZ2ljIHByb3ZpZGVkIAotICogYnkgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8RT4KLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWw7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU1vZGVsIG1vZGVsLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnRyZWVDb250ZW50UHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSBidWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdG8gcmVmcmVzaCB0aGUgdHJlZSAodGhyb3VnaCB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyKQotCSAqIGlmIHRoZSBjaGlsZHJlbiBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChnZXRNb2RlbCgpKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KGdldE1vZGVsKCkpOwotCQkJCS8vIGluIHRoZSBjYXNlIG9mIGEgbGlzdCBjaGFuZ2VkIGV2ZW50LCB3ZSBkb24ndCBoYXZlIAotCQkJCS8vIGFjY2VzcyB0byB0aGUgcmVtb3ZlZCBvYmplY3RzLCBzbyB3ZSBjYW4ndCBkaXNwb3NlIHRoZW0uCi0JCQkJLy8ga2VlcCBhIHdhdGNoIG9uIHRoaXMgdG8gc2VlIGlmIHRoaXMgYmVjb21lcyBhIHByb2JsZW0uCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNsZWFyZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCi0JCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KLQkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBJdGVyYXRvcjxFPiBjaGlsZHJlbk1vZGVsKCkgewotCQlpZiAodGhpcy5jaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpOwotCQkJZW5nYWdlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoaWxkcmVuIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4oKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBjb2xsZWN0aW9uLgotCSAqIFRoaXMgd3JhcHMgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24gbW9kZWwgYW5kIHVzZXMgaXQgaW50ZXJuYWxseSBhcyBhIGxpc3QKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obHZtKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBzaW5nbGUgdmFsdWUgcHJvcGVydHkuCi0JICogVGhpcyB3cmFwcyB0aGUgY2hpbGRyZW4gKGNoaWxkKSBwcm9wZXJ0eSBtb2RlbCBhbmQgdXNlcyBpdCBpbnRlcm5hbGx5IGFzIGEgbGlzdAotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFPiBidWlsZENoaWxkcmVuTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGx2bSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGdldFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRyZWVDb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmNoaWxkcmVuTW9kZWwoKSk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHdpdGggcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgbG9naWMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLmhhc05leHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKE9iamVjdCBjaGlsZCA6IGdldENoaWxkcmVuKCkpIHsKLQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKGNoaWxkKTsKLQkJfQotCQlkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VDaGlsZHJlbigpIGJlZm9yZSAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VDaGlsZHJlbigpIHsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW5Nb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUNoaWxkcmVuTW9kZWwoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlQ2hpbGRyZW4oKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VDaGlsZHJlbk1vZGVsKCkgewotCQl0aGlzLmNoaWxkcmVuTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY1NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgZGVueSBzaG93aW5nIGFueSBmaWxlIHRoYXQgYXJlIG5vdCBKQVIgZmlsZXMgb3IgZm9sZGVycwotICogdGhhdCBkb24ndCBjb250YWluIGFueSBKQVIgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIgCi0JZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYXJjaGl2ZUV4dGVuc2lvbnM9IHsgImphciIsICJ6aXAiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkKLQkKLQlwdWJsaWMgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdCgKLQkJCVZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gaXNBcmNoaXZlUGF0aCgoKElGaWxlKWVsZW1lbnQpLmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQkJdHJ5IHsKLQkJCQlmb3IgKElSZXNvdXJjZSBlYWNoIDogZm9sZGVyLm1lbWJlcnMoKSkgewotCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgZm9sZGVyLCBlYWNoKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGp1c3Qgc2tpcCB0aGlzIG9uZSwgdGhlbgotCQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlUGF0aChJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBleHQ9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBhcmNoaXZlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZShhcmNoaXZlRXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGYyMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRXh0ZW5zaW9uIG9mIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uCi0gKiB0byBwcm92aWRlIHRyZWUgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciAKLQlleHRlbmRzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIodHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcih0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksIGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiAoVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHN1cGVyLml0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBuZXcgT2JqZWN0WzBdIDogcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IGZhbHNlIDogcHJvdmlkZXIuaGFzQ2hpbGRyZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDc5ZTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgYW4gaW1hZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciAKLXsKLQkKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSW1hZ0ltYWdlRGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mSW1hZ2UgPSBpbWFnZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIHRoaXMuZkltYWdlLmVxdWFscygoKEltYWdlSW1hZ2VEZXNjcmlwdG9yKSBvYmopLmZJbWFnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5mSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmZJbWFnZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MGIzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogTnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUxhYmVsUHJvdmlkZXIgaW50ZXJmYWNlLgotICogSW1wbGVtZW50ZWQgYXMgYSBzaW5nbGV0b24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGFiZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbExhYmVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbExhYmVsUHJvdmlkZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgYSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTBmZmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9OdWxsVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBOdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTGFiZWxQcm92aWRlciBpbnRlcmZhY2UuCi0gKiBJbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHVibGljIHN0YXRpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NTMwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGFuIEFic3RyYWN0TGlzdFZpZXdlcgotICogKGUuZy4gYSBMaXN0Vmlld2VyIG9yIENvbWJvVmlld2VyKSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwKLSAqIChvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsKS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotewotCS8qKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyOwotCi0JLyoqIFRoZSBsaXN0IHZpZXdlciB3ZSBrZWVwIGluIHN5bmNoIHdpdGggdGhlIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IHZpZXdlciB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaG9sZGVyIHNvIHRoZXkKLQkgKiBzdGF5IGluIHN5bmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIgYWRhcHQoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJLy8gd2UgbmVlZCBvbmx5IGNvbnN0cnVjdCB0aGUgYWRhcHRlciBhbmQgaXQgd2lsbCBob29rIHVwIHRvIHRoZSBsaXN0IHZpZXdlciBldGMuCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIobGlzdFZpZXdlciwgbGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IHZpZXdlciB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaG9sZGVyIHNvIHRoZXkKLQkgKiBzdGF5IGluIHN5bmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIgYWRhcHQoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJLy8gd2UgbmVlZCBvbmx5IGNvbnN0cnVjdCB0aGUgYWRhcHRlciBhbmQgaXQgd2lsbCBob29rIHVwIHRvIHRoZSBsaXN0IHZpZXdlciBldGMuCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIobGlzdFZpZXdlciwgY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdFZpZXdlciA9IGxpc3RWaWV3ZXI7Ci0JCXRoaXMubGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcyk7Ci0JCS8vIHRoZSBsaXN0IHZpZXdlciB3aWxsIGNhbGwgYmFjayB0byAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCXRoaXMubGlzdFZpZXdlci5zZXRJbnB1dChsaXN0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhsaXN0Vmlld2VyLCBuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgIT0gdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGlucHV0IGVsZW1lbnQ6ICIgKyBpbnB1dEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBsaXN0IHZpZXdlciwgc28gZG9uJ3QgdXBkYXRlIHRoZSBsaXN0IHZpZXdlciBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAodmlld2VyICE9IHRoaXMubGlzdFZpZXdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB2aWV3ZXI6ICIgKyB2aWV3ZXIpOwotCQl9Ci0JCWlmIChvbGRJbnB1dCAhPSB0aGlzLmxpc3RIb2xkZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgb2xkIGlucHV0OiAiICsgb2xkSW5wdXQpOwotCQl9Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKChMaXN0VmFsdWVNb2RlbCkgb2xkSW5wdXQsIChMaXN0VmFsdWVNb2RlbCkgbmV3SW5wdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBsaXN0ZW5lcnMgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGluICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoTGlzdFZhbHVlTW9kZWwgb2xkTW9kZWwsIExpc3RWYWx1ZU1vZGVsIG5ld01vZGVsKSB7Ci0JCWlmIChvbGRNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3TW9kZWw7Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcikgewotCQkvLyB0aGUgbGlzdCB2aWV3ZXIgd2lsbCBjYWxsIGJhY2sgdG8gI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWwgY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoT2JqZWN0IGl0ZW0gOiBlLmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbSwgaSsrKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKEFycmF5VG9vbHMuYXJyYXkoZS5nZXRJdGVtcygpLCBlLmdldEl0ZW1zU2l6ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKEFycmF5VG9vbHMuYXJyYXkoZS5nZXRPbGRJdGVtcygpLCBlLmdldEl0ZW1zU2l6ZSgpKSk7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogZS5nZXROZXdJdGVtcygpKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuaW5zZXJ0KGl0ZW0sIGkrKyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCWludCBsZW4gPSBlLmdldExlbmd0aCgpOwotCQlPYmplY3RbXSBpdGVtcyA9IG5ldyBPYmplY3RbbGVuXTsKLQkJaW50IG9mZnNldCA9IGUuZ2V0U291cmNlSW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaXRlbXNbaV0gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KG9mZnNldCArIGkpOwotCQl9Ci0JCXRoaXMubGlzdFZpZXdlci5yZW1vdmUoaXRlbXMpOwotCi0JCW9mZnNldCA9IGUuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5saXN0Vmlld2VyLmluc2VydChpdGVtc1tpXSwgb2Zmc2V0ICsgaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE4NzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRGlzcGxheSNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjEwODBkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZmJlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4gKFR5cGljYWxseSwgdGhlIGFkYXB0ZXIocykgYmV0d2VlbiBhIDxlbT5wcm9wZXJ0eTwvZW0+IGFuZAotICogaXRzIGNvcnJlc3BvbmRpbmcgVUkgd2lkZ2V0IGFyZSByZWFkLXdyaXRlOyBhcyBvcHBvc2VkIHRvIHRoZSBhZGFwdGVyKHMpCi0gKiBiZXR3ZWVuIGEgPGVtPmNvbGxlY3Rpb248L2VtPiAob3IgPGVtPmxpc3Q8L2VtPikgYW5kIGl0cyBVSSB3aWRnZXQsIHdoaWNoCi0gKiBpcyByZWFkLW9ubHkuKQotICovCi1wdWJsaWMgY2xhc3MgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiZjExOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZF8oU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI1NWU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRGlzcGxheSNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMWU0OTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi5MaWJyYXJ5RmFjZXRQcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkZhY2V0c1Byb3BlcnR5UGFnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlCi0JCWV4dGVuZHMgTGlicmFyeUZhY2V0UHJvcGVydHlQYWdlIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbDsKLQlwcm90ZWN0ZWQgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIHZhbGlkYXRpb25MaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucHJvamVjdE1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJUHJvamVjdD4oKTsKLQkJdGhpcy50cmlnZ2VyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuVHJpZ2dlcigpOwotCQkKLQkJYnVpbGRNb2RlbHMoKTsKLQkJCi0JCXRoaXMudmFsaWRhdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25MaXN0ZW5lcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBCdWlsZCBhbnkgYWRkaXRpb25hbCBtb2RlbHMgbmVlZGVkIGJ5IHRoaXMgcGFnZS4gIFRoZSBwcm9qZWN0IG1vZGVsIGhhcyBiZWVuIGNyZWF0ZWQgYXQgdGhpcwotCSAqIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGJ1aWxkTW9kZWxzKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnTW9kZWwpIHsKLQkJQm9vbGVhbiBmbGFnID0gZmxhZ01vZGVsLmdldFZhbHVlKCk7Ci0JCXJldHVybiAoZmxhZyAhPSBudWxsKSAmJiBmbGFnLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgY3JlYXRlTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKLQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSBuZXcgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShwcm9qZWN0LCBmdiwgbnVsbCk7Ci0JCWxpZC5hZGRMaXN0ZW5lcihidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkpOwotCQlyZXR1cm4gbGlkOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaWJyYXJ5UHJvdmlkZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSApIHsKLQkJCQkJaWYgKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUuUFJPUF9BVkFJTEFCTEVfUFJPVklERVJTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQkJCWFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHBhZ2UgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUGFnZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHRoaXMucHJvamVjdE1vZGVsLmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJCi0JCXRoaXMucHJvamVjdE1vZGVsLnNldFZhbHVlKGdldFByb2plY3QoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJY3JlYXRlV2lkZ2V0cyhjb21wb3NpdGUpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQkKLQkJZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXVwZGF0ZVZhbGlkYXRpb24oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBzcGVjaWZpYyB3aWRnZXRzLiAgTGF5b3V0IGFuZCB2YWxpZGF0aW9uIHdpbGwgYmUgdGFrZW4gY2FyZSBvZi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVXaWRnZXRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJZGlzZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaW5rIGJ1aWxkRmFjZXRzUGFnZUxpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGluayBmYWNldHNQYWdlTGluayA9IGJ1aWxkTGluayhwYXJlbnQsIHRleHQpOwotCQlmYWNldHNQYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZEZhY2V0c1BhZ2VMaW5rTGlzdGVuZXIoKSk7ICAvLyB0aGUgbGluayB3aWxsIGJlIEdDZWQKLQkJcmV0dXJuIGZhY2V0c1BhZ2VMaW5rOwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRmFjZXRzUGFnZUxpbmtMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlblByb2plY3RGYWNldHNQYWdlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJmYWNldHMgcGFnZSBsaW5rIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuUHJvamVjdEZhY2V0c1BhZ2UoKSB7Ci0JCSgoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpZ2V0Q29udGFpbmVyKCkpLm9wZW5QYWdlKEZhY2V0c1Byb3BlcnR5UGFnZS5JRCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERvbid0IGFsbG93IHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NvbXB1dGVTaXplKCl9Ci0JICogdG8gY2FjaGUgdGhlIHBhZ2UncyBzaXplLCBzaW5jZSB0aGUgc2l6ZSBvZiB0aGUgIkxpYnJhcnkiIHBhbmVsIGNhbgotCSAqIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzZWxlY3Rpb24gZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kb0NvbXB1dGVTaXplKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogd2lkZ2V0cyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGJ1aWxkQnV0dG9uKHBhcmVudCwgaG9yaXpvbnRhbFNwYW4sIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbihwYXJlbnQsIGhvcml6b250YWxTcGFuLCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gYnVpbGREcm9wRG93bihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZERyb3BEb3duKHBhcmVudCwgMSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBidWlsZERyb3BEb3duKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGluayBidWlsZExpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIHRydWU9Zm9yazsgZmFsc2U9dW5jYW5jZWxsYWJsZQotCQkJdGhpcy5idWlsZE9rUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKCkucnVuKHRydWUsIGZhbHNlLCB0aGlzLmJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSAKLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlQ29udGV4dCBidWlsZE9rUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUlXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhlIGJ1aWxkIHdlIGV4ZWN1dGUgaW4gI3BlcmZvcm1Pa18oKSBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QsCi0JCQkJCS8vIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdCBhcyBvdXIgc2NoZWR1bGluZyBydWxlIGhlcmUKLQkJCQkJd3MucnVuKAotCQkJCQkJCWJ1aWxkT2tXb3Jrc3BhY2VSdW5uYWJsZSgpLAotCQkJCQkJCXdzLmdldFJvb3QoKSwKLQkJCQkJCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwKLQkJCQkJCQltb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyogcHJpdmF0ZSAqLyBJV29ya3NwYWNlUnVubmFibGUgYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwZXJmb3JtT2tfKG1vbml0b3IpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyAqKioqKioqKioqIE9LL1JldmVydC9BcHBseSBiZWhhdmlvciAqKioqKioqKioqCi0JCi0Jdm9pZCBwZXJmb3JtT2tfKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNCdWZmZXJpbmcoKSkgewotCQkJYm9vbGVhbiByZWJ1aWxkID0gcHJvamVjdFJlYnVpbGRSZXF1aXJlZCgpOwotCQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkJaWYgKHJlYnVpbGQpIHsKLQkJCQlyZWJ1aWxkUHJvamVjdCgpOwotCQkJfQotCQkJdGhpcy5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcm9qZWN0UmVidWlsZFJlcXVpcmVkKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVidWlsZFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgb2YgdGhlIG1vZGVscyBhcmUgYnVmZmVyaW5nIGEgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0J1ZmZlcmluZygpIHsKLQkJZm9yIChCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IG1vZGVsIDogYnVpbGRCdWZmZXJlZE1vZGVscygpKSB7Ci0JCQlpZiAobW9kZWwuaXNCdWZmZXJpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBidWlsZEJ1ZmZlcmVkTW9kZWxzKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbGlkYXRpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAoICEgZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJdXBkYXRlVmFsaWRhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJZm9yIChNb2RlbCBtb2RlbCA6IGJ1aWxkVmFsaWRhdGlvbk1vZGVscygpKSB7Ci0JCQltb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbGlkYXRpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE1vZGVsW10gYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCk7Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJZm9yIChNb2RlbCBtb2RlbCA6IGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSkgewotCQkJbW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWxpZGF0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBNb2RlbFtdIGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLnJldmVyc2UoYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBFUlJPUl9TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5FUlJPUik7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdBUk5JTkdfU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuV0FSTklORyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElORk9fU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuSU5GTyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9LX1NUQVRVUyA9IEludGVnZXIudmFsdWVPZihJU3RhdHVzLk9LKTsKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBidWlsZEluZm9TdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgYnVpbGRXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGJ1aWxkRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgcGVyZm9ybVZhbGlkYXRpb24oKSB7Ci0JCUhhc2hNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxJU3RhdHVzPj4oKTsKLQkJc3RhdHVzZXMucHV0KEVSUk9SX1NUQVRVUywgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKLQkJc3RhdHVzZXMucHV0KFdBUk5JTkdfU1RBVFVTLCBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCkpOwotCQlzdGF0dXNlcy5wdXQoSU5GT19TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7Ci0JCXN0YXR1c2VzLnB1dChPS19TVEFUVVMsIENvbGxlY3Rpb25Ub29scy5saXN0KFN0YXR1cy5PS19TVEFUVVMpKTsKLQkJCi0JCXBlcmZvcm1WYWxpZGF0aW9uKHN0YXR1c2VzKTsKLQkJCi0JCWlmICggISBzdGF0dXNlcy5nZXQoRVJST1JfU1RBVFVTKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzdGF0dXNlcy5nZXQoRVJST1JfU1RBVFVTKS5nZXQoMCk7Ci0JCX0KLQkJZWxzZSBpZiAoICEgc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpLmdldCgwKTsKLQkJfQotCQllbHNlIGlmICggISBzdGF0dXNlcy5nZXQoSU5GT19TVEFUVVMpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChJTkZPX1NUQVRVUykuZ2V0KDApOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChPS19TVEFUVVMpLmdldCgwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcykgewotCQkvKiBsaWJyYXJ5IHByb3ZpZGVyICovCi0JCUlTdGF0dXMgbHBTdGF0dXMgPSBzdXBlci5wZXJmb3JtVmFsaWRhdGlvbigpOwotCQlzdGF0dXNlcy5nZXQoSW50ZWdlci52YWx1ZU9mKGxwU3RhdHVzLmdldFNldmVyaXR5KCkpKS5hZGQobHBTdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkMTFmZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtIGluIGEgY29tYm8uCi0gKiA8cD4KLSAqIDxiPmxpc3RIb2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiB0aGUgY29tYm8uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgY29tYm8uCi0gKgotICogQHBhcmFtIDxFPiBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgaW4gPGI+bGlzdEhvbGRlcjwvYj4KLSAqIEBzZWUgQ29tYm9Nb2RlbEFkYXB0ZXIKLSAqIEBzZWUgQ0NvbWJvTW9kZWxBZGFwdGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBzZWxlY3Rpb24gd2l0aCB0aGUKLQkgKiBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0Ci0JICogdG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwdXQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKioqKioqKiBVSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhlIGNvbWJvIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvSG9sZGVyIGNvbWJvSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb21ib01vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGNvbWJvU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgY29tYm8KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbWJvRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ib0hvbGRlciBjb21ib0hvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwobGlzdEhvbGRlciwgICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgaXRlbXMiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3RlZEl0ZW1Ib2xkZXIsICJUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoY29tYm9Ib2xkZXIsICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgY29tYm8gd2lkZ2V0IGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RyaW5nQ29udmVydGVyLCAgICAiVGhlIHN0cmluZyBjb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIgICAgICAgICA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyID0gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCQl0aGlzLmNvbWJvSG9sZGVyICAgICAgICA9IGNvbWJvSG9sZGVyOwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciAgICA9IHN0cmluZ0NvbnZlcnRlcjsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCi0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJdGhpcy5jb21ib01vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvTW9kaWZ5TGlzdGVuZXIoKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5jb21ib01vZGlmeUxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpOwotCi0JCXRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21ib0hvbGRlci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGJ1aWxkQ29tYm9Nb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tYm8gbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmNvbWJvU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbWJvIG1vZGlmeSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPihEb3VibGVDbGlja0xpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+KFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmNvbWJvRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvKCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9JdGVtcygpOwotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyaW5nIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0cmluZ0NvbnZlcnRlciwgIlRoZSBTdHJpbmdDb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ibygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGUgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgaXRlbSB0byBhCi0JICogc3RyaW5nIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQoRSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQnJ1dGUgZm9yY2Ugc3luY2hyb25pemF0aW9uIG9mIGNvbWJvIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb21ib0l0ZW1zKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsKLQkJCWl0ZW1zW2luZGV4XSA9IHRoaXMuY29udmVydCh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1Db3VudCgpOwotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkKHRoaXMuY29udmVydChpdGVtKSwgaW5kZXgrKyk7Ci0JCX0KLQotCQkvLyBXaGVuIHRoZSBjb21ibyBpcyBwb3B1bGF0ZWQsIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGlvbiB3YXMgYWxyZWFkeQotCQkvLyBzZXQgYnV0IG5vIGl0ZW1zIHdhcyBmb3VuZCwgcmVzeW5jIHRoZSBzZWxlY3RlZCBpdGVtCi0JCXN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwotCQlpbnQgc291cmNlID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKLQkJaW50IGxlbiA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlpbnQgbG9TdGFydCA9IE1hdGgubWluKHRhcmdldCwgc291cmNlKTsKLQkJaW50IGhpU3RhcnQgPSBNYXRoLm1heCh0YXJnZXQsIHNvdXJjZSk7Ci0JCS8vIG1ha2UgYSBjb3B5IG9mIHRoZSBhZmZlY3RlZCBpdGVtcy4uLgotCQlTdHJpbmdbXSBzdWJBcnJheSA9IEFycmF5VG9vbHMuc3ViQXJyYXkodGhpcy5jb21ib0hvbGRlci5nZXRJdGVtcygpLCBsb1N0YXJ0LCBoaVN0YXJ0ICsgbGVuIC0gbG9TdGFydCk7Ci0JCS8vIC4uLm1vdmUgdGhlbSBhcm91bmQuLi4KLQkJc3ViQXJyYXkgPSBBcnJheVRvb2xzLm1vdmUoc3ViQXJyYXksIHRhcmdldCAtIGxvU3RhcnQsIHNvdXJjZSAtIGxvU3RhcnQsIGxlbik7Ci0JCS8vIC4uLmFuZCB0aGVuIHB1dCB0aGVtIGJhY2sKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN1YkFycmF5Lmxlbmd0aDsgaW5kZXgrKykgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRJdGVtKGxvU3RhcnQgKyBpbmRleCwgc3ViQXJyYXlbaW5kZXhdKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJLy9maXhpbmcgYnVnIDI2OTEwMCBieSBzZXR0aW5nIHRoZSBwb3B1bGF0aW5nIGZsYWcgdG8gdHJ1ZQotCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7Ci0JCQkJdGhpcy5jb21ib0hvbGRlci5zZXRJdGVtKGluZGV4KyssIHRoaXMuY29udmVydChpdGVtKSk7Ci0JCQl9Ci0JCQlpZiAoc2VsZWN0aW9uSW5kZXggPT0gMCkgewotCQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0VGV4dCh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKClbMF0pOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnJlbW92ZUFsbCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW5ndGggPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlpZiAodmFsdWVzQXJlRXF1YWwodGhpcy5saXN0SG9sZGVyLmdldChpbmRleCksIGl0ZW0pKSB7Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkgfHwgdGhpcy5jb21ib0hvbGRlci5pc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRSBzZWxlY3RlZFZhbHVlID0gdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuZ2V0VGV4dCgpLmVxdWFscyhzZWxlY3RlZFZhbHVlKSkgewotCQkJLy9pZiB0aGUgc2VsZWN0aW9uIGlzIHN0aWxsIHRoZSBzYW1lLCBkb24ndCByZXNldCBpdAotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuZGVzZWxlY3RBbGwoKTsKLQkJCVN0cmluZyBzZWxlY3RlZEl0ZW0gPSB0aGlzLmNvbnZlcnQoc2VsZWN0ZWRWYWx1ZSk7Ci0JCQlpZiAoc2VsZWN0ZWRJdGVtID09IG51bGwpIHsKLQkJCQlzZWxlY3RlZEl0ZW0gPSAiIjsKLQkJCX0KLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0VGV4dChzZWxlY3RlZEl0ZW0pOwotCQkJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoc2VsZWN0ZWRWYWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ib1NlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBudWxsIGNoZWNrcy4KLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJaWYgKCh2YWx1ZTEgPT0gbnVsbCkgJiYgKHZhbHVlMiA9PSBudWxsKSkgewotCQkJcmV0dXJuIHRydWU7CS8vIGJvdGggYXJlIG51bGwKLQkJfQotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSB8fCAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vIG9uZSBpcyBudWxsIGJ1dCB0aGUgb3RoZXIgaXMgbm90Ci0JCX0KLQkJcmV0dXJuIHZhbHVlMS5lcXVhbHModmFsdWUyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbWJvIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib1NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9TZWxlY3Rpb25DaGFuZ2VkKE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCWlmICghdGhpcy5jb21ib0hvbGRlci5pc1BvcHVsYXRpbmcoKSkgewotCQkJRSBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbSgpOwotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJCXRoaXMubm90aWZ5TGlzdGVuZXJzKHNlbGVjdGVkSXRlbSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeUxpc3RlbmVycyhFIHNlbGVjdGVkSXRlbSkgewotCQlpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Quc2l6ZSgpID4gMCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gc2NFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPih0aGlzLCBzZWxlY3RlZEl0ZW0pOwotCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIHNlbGVjdGVkSXRlbSgpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvSG9sZGVyLmdldFRleHQoKTsKLQotCQkJaWYgKHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlmb3IgKGludCBpbmRleCA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJRSBpdGVtID0gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5jb252ZXJ0KGl0ZW0pOwotCQkJCWlmICh2YWx1ZXNBcmVFcXVhbCh0ZXh0LCB2YWx1ZSkpIHsKLQkJCQkJcmV0dXJuIGl0ZW07Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHByZXZlbnQgdGhpcyB0eXBlIGNhc3QgKGl0J2xsIHdvcmsgaWYgRSBpcwotCQkJLy8gU3RyaW5nIGJ1dCBpdCB3b24ndCB3b3JrIGlmIEUgaXMgc29tZXRoaW5nIGVsc2UpLCBtYXliZSB1c2UgYQotCQkJLy8gQmlkaVN0cmluZ0NvbnZlcnRlciBpbnN0ZWFkIG9mIFN0cmluZ0NvbnZlcnRlcgotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKEUpIHRleHQ7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWludCBpbmRleCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvRG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgb25seSBhIHNpbmdsZSBpdGVtIHNlbGVjdGVkIGR1cmluZyBhIGRvdWJsZS1jbGljayg/KQotCQkJRSBzZWxlY3Rpb24gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuY29tYm9Ib2xkZXIuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlEb3VibGVDbGlja0V2ZW50PEU+IGRjRXZlbnQgPSBuZXcgRG91YmxlQ2xpY2tFdmVudDxFPih0aGlzLCBzZWxlY3Rpb24pOwotCQkJZm9yIChEb3VibGVDbGlja0xpc3RlbmVyPEU+IGRvdWJsZUNsaWNrTGlzdGVuZXIgOiB0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJZG91YmxlQ2xpY2tMaXN0ZW5lci5kb3VibGVDbGljayhkY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBjb21ibyBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIpOwotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0VkaXRhYmxlKCkpIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy5jb21ib01vZGlmeUxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5jb21ib1NlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkb3VibGUgY2xpY2sgc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEb3VibGVDbGlja0xpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVDbGlja0V2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0aW9uOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tFdmVudChBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgRSBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGlvbiBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQkJcHJpdmF0ZSBmaW5hbCBFIHNlbGVjdGVkSXRlbTsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJcHJvdGVjdGVkIFNlbGVjdGlvbkNoYW5nZUV2ZW50KEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGVkSXRlbSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gc2VsZWN0ZWRJdGVtOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0ZWRJdGVtKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBJbnRlcm5hbCBtZW1iZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBob2xkZXIgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgPGNvZGU+Q29tYm88L2NvZGU+IGFuZAotCSAqIDxjb2RlPkNDb21ibzwvY29kZT4gdHJhbnNwYXJlbnRseS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBDb21ib0hvbGRlciB7Ci0JCXZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpOwotCQl2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKTsKLQkJdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcik7Ci0JCXZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2b2lkIGRlc2VsZWN0QWxsKCk7Ci0JCWludCBnZXRJdGVtQ291bnQoKTsKLQkJU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQkJaW50IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVN0cmluZyBnZXRUZXh0KCk7Ci0JCWJvb2xlYW4gaXNEaXNwb3NlZCgpOwotCQlib29sZWFuIGlzRWRpdGFibGUoKTsKLQkJYm9vbGVhbiBpc1BvcHVsYXRpbmcoKTsKLQkJdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpOwotCQl2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pOwotCQl2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKTsKLQkJdm9pZCBzZXRQb3B1bGF0aW5nKGJvb2xlYW4gcG9wdWxhdGluZyk7Ci0JCXZvaWQgc2V0VGV4dChTdHJpbmcgaXRlbSk7Ci0JCXZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCk7Ci0JCXZvaWQgcmVtb3ZlQWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29sdW1uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29sdW1uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzViZjkxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0NvbHVtbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgaXMgdXNlZCBieSB0aGUgdGFibGUgbW9kZWwgYWRhcHRlciB0byBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0Ci0gKiBpbnRvIHRoZSBtb2RlbHMgdXNlZCBmb3IgZWFjaCBvZiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdwotICogaW4gdGhlIHRhYmxlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFkYXB0ZXI8Vj4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhWIHN1YmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiBUeXBpY2FsbHkgdGhpcyBpcyBzdGF0aWMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY29sdW1ucwotCSAqLwotCWludCBjb2x1bW5Db3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICoKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gdG8gcmV0cmlldmUgaXRzIGRpc3BsYXkgdGV4dAotCSAqIEByZXR1cm4gVGhlIGRpc3BsYXkgdGV4dCBvZiB0aGUgY29sdW1uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBlZGl0YWJsZS4gVHlwaWNhbGx5IHRoaXMgaXMgdGhlCi0JICogc2FtZSBmb3IgZXZlcnkgcm93LgotCSAqCi0JICogQHBhcmFtIGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGZvciB3aGljaCB3ZSBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgY29udGVudCBjYW4gYmUgbW9kaWZpZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIGFsbG93IGVkaXRpbmcgb2YgdGhlIGNlbGwgYXQgdGhlIGdpdmVuCi0JICogY29sdW1uIGluZGV4OyA8Y29kZT5mYWxzZTwvY29kZT4gdG8ga2VlcCBpdCBub3QgZWRpdGFibGUKLQkgKi8KLS8vCWJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgY29sdW1uSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Nzk0YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW0gaW4gYSA8Y29kZT5Db21ibzwvY29kZT4uCi0gKiA8cD4KLSAqIDxiPmxpc3RIb2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiB0aGUgPGNvZGU+Q29tYm88L2NvZGU+Ljxicj4KLSAqIDxiPnNlbGVjdGVkSXRlbUhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluICdsaXN0SG9sZGVyJyB0aGF0IGFyZQotICogc2VsZWN0ZWQgaW4gdGhlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0gPEU+IFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiA8Yj5saXN0SG9sZGVyPC9iPgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbWJvTW9kZWxBZGFwdGVyPEU+IGV4dGVuZHMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiB7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgY29tYm8sIHdoaWNoIGNhbGxzICN0b1N0cmluZygpIG9uIHRoZQotCSAqIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbWJvTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvKQotCXsKLQkJcmV0dXJuIGFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgY29tYm8uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb21iby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb21ib01vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlyZXR1cm4gbmV3IENvbWJvTW9kZWxBZGFwdGVyPFQ+KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm9Nb2RlbEFkYXB0ZXIoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJQ29tYm8gY29tYm8sCi0JCQlTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKQotCXsKLQkJc3VwZXIobGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBuZXcgU1dUQ29tYm9Ib2xkZXIoY29tYm8pLAotCQkgICAgICBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbnRlcm5hbCBtZW1iZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU1dUQ29tYm9Ib2xkZXIgaW1wbGVtZW50cyBDb21ib0hvbGRlciB7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0JCXByaXZhdGUgZmluYWwgYm9vbGVhbiBlZGl0YWJsZTsKLQkJcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRJdGVtOwotCi0JCVNXVENvbWJvSG9sZGVyKENvbWJvIGNvbWJvKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21ibyAgICA9IGNvbWJvOwotCQkJdGhpcy5lZGl0YWJsZSA9IChjb21iby5nZXRTdHlsZSgpICYgU1dULlJFQURfT05MWSkgPT0gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLmNvbWJvLmFkZChpdGVtLCBpbmRleCk7Ci0KLQkJCS8vIEl0IGlzIHBvc3NpYmxlIHRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzZXQgYmVmb3JlIHRoZSBjb21ibyBpcyBiZWluZwotCQkJLy8gcG9wdWxhdGVkLCB1cGRhdGUgdGhlIHNlbGVjdGVkIGl0ZW0gaWYgaXQncyBtYXRjaGVzIHRoZSBpdGVtIGJlaW5nCi0JCQkvLyBhZGRlZAotCQkJaWYgKCh0aGlzLnNlbGVjdGVkSXRlbSAhPSBudWxsKSAmJiB0aGlzLnNlbGVjdGVkSXRlbS5lcXVhbHMoaXRlbSkpIHsKLQkJCQl0aGlzLnNldFRleHQodGhpcy5zZWxlY3RlZEl0ZW0pOwotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLmFkZERpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7Ci0JCQl0aGlzLmNvbWJvLmRlc2VsZWN0QWxsKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0VGV4dCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lZGl0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUG9wdWxhdGluZygpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldERhdGEoInBvcHVsYXRpbmciKSA9PSBCb29sZWFuLlRSVUU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZShzdGFydCwgZW5kKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlQWxsKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5yZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZU1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQkJdGhpcy5jb21iby5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEl0ZW1zKGl0ZW1zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKSB7Ci0JCQl0aGlzLmNvbWJvLnNldERhdGEoInBvcHVsYXRpbmciLCBCb29sZWFuLnZhbHVlT2YocG9wdWxhdGluZykpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgaXRlbSkgewotCi0JCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpdGVtIHNpbmNlIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGVkCi0JCQkvLyBpdGVtIGlzIGJlZm9yZSB0aGUgY29tYm8gaXMgcG9wdWxhdGVkCi0JCQlpZiAodGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSA9PSAwKSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCQkJdGhpcy5jb21iby5zZXRUZXh0KGl0ZW0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0RhdGVUaW1lTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDdmM2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgRGF0ZVRpbWUgd2lkZ2V0IGluIHN5bmNoIHdpdGgKLSAqIG1vZGVsIGludGVnZXJzIGhvdXJzLCBtaW51dGVzLCBhbmQgc2Vjb25kcy4gIEhhcyBkZWZhdWx0IGhvdXJzLAotICogbWludXRlcyBhbmQgc2Vjb25kcyBvZiAwIHdoaWNoIGNvcnJlc3BvbmRzIHRvIDEyOjAwOjAwIEFNLiBUaGlzIG1vZGVsCi0gKiBhZGFwdGVyIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGEgRGF0ZVRpbWUgd2lkZ2V0IHdpdGggdGhlIHN0eWxlIFNXVC5USU1FCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERhdGVUaW1lTW9kZWxBZGFwdGVyIHsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgaG91cnMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXI7Ci0JCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBtaW51dGVzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXI7Ci0JCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWNvbmRzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkYXRlVGltZSdzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIGhvdXJzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRhdGVUaW1lJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgbWludXRlcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRhdGVUaW1lJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgc2Vjb25kcyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRhdGVUaW1lIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGludGVnZXJzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBkYXRlVGltZTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBudW1iZXIgaG9sZGVyCi0JICogd2l0aCB0aGUgc3Bpbm5lcidzIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBkYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBkYXRlVGltZQotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgdmFsdWUKLQkgKiBjaGFuZ2VzIGZyb20gdGhlIHNwaW5uZXIgb3IgZnJvbSB0aGUgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgaW50ZWdlciBob2xkZXJzIHRvIHRoZSBzcGVjaWZpZWQgZGF0ZVRpbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBEYXRlVGltZU1vZGVsQWRhcHRlciBhZGFwdCgKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQlEYXRlVGltZSBkYXRlVGltZSkKLQl7Ci0JCXJldHVybiBuZXcgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIoaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGRhdGVUaW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBhbmQgZGF0ZVRpbWUgYXJlIHJlcXVpcmVkCi0JICovCi0JcHJvdGVjdGVkIERhdGVUaW1lTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKLQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHNlY29uZHNIb2xkZXIsCi0JCQkJCQkJCQlEYXRlVGltZSBkYXRlVGltZSkgewotCQlzdXBlcigpOwotCQlpZiAoKGhvdXJzSG9sZGVyID09IG51bGwpIAotCQkJfHwgKG1pbnV0ZXNIb2xkZXIgPT0gbnVsbCkgCi0JCQl8fCAoc2Vjb25kc0hvbGRlciA9PSBudWxsKSAKLQkJCXx8IChkYXRlVGltZSA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ob3Vyc0hvbGRlciA9IGhvdXJzSG9sZGVyOwotCQl0aGlzLm1pbnV0ZXNIb2xkZXIgPSBtaW51dGVzSG9sZGVyOwotCQl0aGlzLnNlY29uZHNIb2xkZXIgPSBzZWNvbmRzSG9sZGVyOwotCQl0aGlzLmRhdGVUaW1lID0gZGF0ZVRpbWU7Ci0KLQkJdGhpcy5ob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuaG91cnNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLm1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubWludXRlc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNlY29uZHNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5kYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZERhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5kYXRlVGltZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5kYXRlVGltZS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5kYXRlVGltZURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy51cGRhdGVEYXRlVGltZUhvdXJzKGhvdXJzSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZURhdGVUaW1lTWludXRlcyhtaW51dGVzSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZURhdGVUaW1lU2Vjb25kcyhzZWNvbmRzSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5ob3Vyc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgaG91cnMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNaW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5taW51dGVzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBtaW51dGVzIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuc2Vjb25kc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgc2Vjb25kcyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLmRhdGVUaW1lU2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7CQkJCQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGREYXRlVGltZURpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLmRhdGVUaW1lRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0ZVRpbWUgZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGVsIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBob3Vyc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLnVwZGF0ZURhdGVUaW1lSG91cnMoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWludXRlc0NoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLnVwZGF0ZURhdGVUaW1lTWludXRlcygoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWNvbmRzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlRGF0ZVRpbWVTZWNvbmRzKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogZGF0ZVRpbWUgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGRhdGVUaW1lU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQkvL3RvbyBiYWQgdGhleSBkaWRuJ3Qgc3BsaXQgdGhlIGV2ZW50IHVwCi0JCQkJaG91cnNTZWxlY3RlZCgpOwotCQkJCW1pbnV0ZXNTZWxlY3RlZCgpOwotCQkJCXNlY29uZHNTZWxlY3RlZCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBob3Vyc1NlbGVjdGVkKCkgewotCQlJbnRlZ2VyIGhvdXJzID0gbnVsbDsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuZ2V0SG91cnMoKSAhPSAwKSB7Ci0JCQlob3VycyA9IEludGVnZXIudmFsdWVPZih0aGlzLmRhdGVUaW1lLmdldEhvdXJzKCkpOwotCQl9Ci0JCXRoaXMuaG91cnNIb2xkZXIuc2V0VmFsdWUoaG91cnMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtaW51dGVzU2VsZWN0ZWQoKSB7Ci0JCUludGVnZXIgbWludXRlcyA9IG51bGw7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmdldE1pbnV0ZXMoKSAhPSAwKSB7Ci0JCQltaW51dGVzID0gSW50ZWdlci52YWx1ZU9mKHRoaXMuZGF0ZVRpbWUuZ2V0TWludXRlcygpKTsKLQkJfQotCQl0aGlzLm1pbnV0ZXNIb2xkZXIuc2V0VmFsdWUobWludXRlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNlY29uZHNTZWxlY3RlZCgpIHsKLQkJSW50ZWdlciBzZWNvbmRzID0gbnVsbDsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuZ2V0U2Vjb25kcygpICE9IDApIHsKLQkJCXNlY29uZHMgPSBJbnRlZ2VyLnZhbHVlT2YodGhpcy5kYXRlVGltZS5nZXRTZWNvbmRzKCkpOwotCQl9Ci0JCXRoaXMuc2Vjb25kc0hvbGRlci5zZXRWYWx1ZShzZWNvbmRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkYXRlVGltZURpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgZGF0ZVRpbWUgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmRhdGVUaW1lLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5kYXRlVGltZS5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmhvdXJzSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubWludXRlc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5taW51dGVzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2Vjb25kc0hvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVIb3VycyhJbnRlZ2VyIGhvdXJzKSB7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChob3VycyA9PSBudWxsKSB7Ci0JCQlob3VycyA9IEludGVnZXIudmFsdWVPZigwKTsvL1RPRE8gZGVmYXVsdEhvdXJzCi0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5kYXRlVGltZS5zZXRIb3Vycyhob3Vycy5pbnRWYWx1ZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGF0ZVRpbWVNaW51dGVzKEludGVnZXIgbWludXRlcykgewotCQlpZiAodGhpcy5kYXRlVGltZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobWludXRlcyA9PSBudWxsKSB7Ci0JCQltaW51dGVzID0gSW50ZWdlci52YWx1ZU9mKDApOy8vVE9ETyBkZWZhdWx0TWludXRlcwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZGF0ZVRpbWUuc2V0TWludXRlcyhtaW51dGVzLmludFZhbHVlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRlVGltZVNlY29uZHMoSW50ZWdlciBzZWNvbmRzKSB7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChzZWNvbmRzID09IG51bGwpIHsKLQkJCXNlY29uZHMgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ly9UT0RPIGRlZmF1bHRTZWNvbmRzCi0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5kYXRlVGltZS5zZXRTZWNvbmRzKHNlY29uZHMuaW50VmFsdWUoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaG91cnNIb2xkZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiYjYzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotCi0vKioKLSAqCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBzcGlubmVyJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3Bpbm5lciB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBzdHJpbmcuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXIgc3Bpbm5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBudW1iZXIgaG9sZGVyCi0JICogd2l0aCB0aGUgc3Bpbm5lcidzIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RpZnlMaXN0ZW5lciBzcGlubmVyTW9kaWZ5TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIHNwaW5uZXIKLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHNwaW5uZXJEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogVGhpcyBsb2NrIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgbGlzdGVuZXJzIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHZhbHVlCi0JICogY2hhbmdlcyBmcm9tIHRoZSBzcGlubmVyIG9yIGZyb20gdGhlIGhvbGRlci4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbG9ja2VkOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBzcGlubmVyLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgc3Bpbm5lci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIgYWRhcHQoCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JCQlTcGlubmVyIHNwaW5uZXIsCi0JCQlpbnQgZGVmYXVsdFZhbHVlKQotCXsKLQkJcmV0dXJuIG5ldyBTcGlubmVyTW9kZWxBZGFwdGVyKG51bWJlckhvbGRlciwgc3Bpbm5lciwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgbGlzdCBib3gsIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGlubmVyIHNwaW5uZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAoKG51bWJlckhvbGRlciA9PSBudWxsKSB8fCAoc3Bpbm5lciA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5udW1iZXJIb2xkZXIgPSBudW1iZXJIb2xkZXI7Ci0JCXRoaXMuc3Bpbm5lciA9IHNwaW5uZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZFNwaW5uZXJNb2RpZnlMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCi0JCXRoaXMuc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5zcGlubmVyRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnVwZGF0ZVNwaW5uZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRTcGlubmVyTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3Bpbm5lck1vZGlmaWVkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRTcGlubmVyRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zcGlubmVyRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3Bpbm5lciBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlU3Bpbm5lcigoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3Bpbm5lciBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc3Bpbm5lck1vZGlmaWVkKE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5udW1iZXJIb2xkZXIuc2V0VmFsdWUodGhpcy5zcGlubmVyLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzcGlubmVyRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBzcGlubmVyIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zcGlubmVyLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnNwaW5uZXJEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLnNwaW5uZXIucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLm51bWJlckhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGlubmVyKEludGVnZXIgdmFsdWUpIHsKLQkJaWYgKHRoaXMuc3Bpbm5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyB0aGUgbW9kZWwgY2FuIGJlIG51bGwsIGJ1dCB0aGUgc3Bpbm5lciBjYW5ub3QKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl9Ci0JCXRoaXMubG9ja2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuc3Bpbm5lci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bWJlckhvbGRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVGFibGVJdGVtTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxYTY3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSB0YWJsZSBpdGVtIGluIHN5bmNoIHdpdGggdGhlIHByb3BlcnRpZXMgb2YKLSAqIGEgbW9kZWwuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlSXRlbU1vZGVsQWRhcHRlciB7Ci0KLQkvKiogVGhlIHRhYmxlIGl0ZW0gd2Ugc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlSXRlbSB0YWJsZUl0ZW07Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgdGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQ2xpZW50LXN1cHBsaWVkIGFkYXB0ZXIgdGhhdCBwcm92aWRlcyB3aXRoIHRoZSB2YXJpb3VzIGNvbHVtbiBzZXR0aW5ncyBhbmQKLQkgKiBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgTFZNIGludG8gYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyPE9iamVjdD4gY29sdW1uQWRhcHRlcjsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBtb2RlbHMgdXNlZCB0byBsaXN0ZW4gdG8gZWFjaCBwcm9wZXJ0eSB0aGF0IGFyZSBkaXNwbGF5IGJ5IHRoZQotCSAqIHRhYmxlIGl0ZW0uCi0JICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIHZhbHVlSG9sZGVyczsKLQotCS8qKgotCSAqIFRoZSBsaXN0IG9mIDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+cyB1c2VkIHRvIGJlIG5vdGlmaWVkIHdoZW4KLQkgKiB0aGUgcHJvcGVydGllcyBvZiB0aGUgbW9kZWwgYmVpbmcgZGlzcGxheSBpbnRvIGEgcm93IGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyczsKLQotCS8qKgotCSAqIFRoZSBsYWJlbCB1c2VkIHRvIGZvcm1hdCB0aGUgb2JqZWN0cyBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqLwotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gdGhlIHNwZWNpZmllZCBidXR0b24uCi0JICogSWYgdGhlIGJvb2xlYW4gaXMgbnVsbCwgdGhlIGJ1dHRvbidzIHZhbHVlIHdpbGwgYmUgInVuc2VsZWN0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0KFRhYmxlSXRlbSB0YWJsZUl0ZW0sIENvbHVtbkFkYXB0ZXI8Pz4gY29sdW1uQWRhcHRlciwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXcgVGFibGVJdGVtTW9kZWxBZGFwdGVyKHRhYmxlSXRlbSwgY29sdW1uQWRhcHRlciwgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBhbmQgYnV0dG9uIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgVGFibGVJdGVtTW9kZWxBZGFwdGVyKFRhYmxlSXRlbSB0YWJsZUl0ZW0sIENvbHVtbkFkYXB0ZXI8Pz4gY29sdW1uQWRhcHRlciwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh0YWJsZUl0ZW0gPT0gbnVsbCB8fCBjb2x1bW5BZGFwdGVyID09IG51bGwgfHwgbGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRhYmxlSXRlbSA9IHRhYmxlSXRlbTsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gKENvbHVtbkFkYXB0ZXI8T2JqZWN0PikgY29sdW1uQWRhcHRlcjsKLQotCQl0aGlzLnRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy50YWJsZUl0ZW0uYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnZhbHVlSG9sZGVycyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKHRhYmxlSXRlbS5nZXREYXRhKCkpOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCXRhYmxlSXRlbUNoYW5nZWQoaW5kZXgsIHRhYmxlSXRlbS5nZXREYXRhKCksIGZhbHNlKTsKLQkJCXZhbHVlSG9sZGVyc1tpbmRleF0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzW2luZGV4XSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW2NvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKV07Ci0JCWZvciAoaW50IGluZGV4ID0gbGlzdGVuZXJzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCWxpc3RlbmVyc1tpbmRleF0gPSBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW5kZXgpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQl0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oaW5kZXgpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlci50aGlzLnRhYmxlSXRlbURpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRhYmxlSXRlbSBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVJdGVtQ2hhbmdlZChpbnQgaW5kZXgsIE9iamVjdCBzdWJqZWN0LCBib29sZWFuIHJldmFsaWRhdGUpIHsKLQotCQlpZiAoIXRoaXMudGFibGVJdGVtLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy51cGRhdGVUYWJsZUl0ZW1UZXh0KGluZGV4LCBzdWJqZWN0KTsKLQkJCXRoaXMudXBkYXRlVGFibGVJdGVtSW1hZ2UoaW5kZXgsIHN1YmplY3QpOwotCi0JCQlpZiAocmV2YWxpZGF0ZSkgewotCQkJCXRoaXMubGF5b3V0VGFibGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZUl0ZW1UZXh0KGludCBpbmRleCwgT2JqZWN0IHN1YmplY3QpIHsKLQkJU3RyaW5nIHRleHQgPSB0aGlzLmxhYmVsUHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChzdWJqZWN0LCBpbmRleCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXRleHQgPSAiIjsKLQkJfQotCQl0aGlzLnRhYmxlSXRlbS5zZXRUZXh0KGluZGV4LCB0ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFibGVJdGVtSW1hZ2UoaW50IGluZGV4LCBPYmplY3Qgc3ViamVjdCkgewotCQlJbWFnZSBpbWFnZSA9IHRoaXMubGFiZWxQcm92aWRlci5nZXRDb2x1bW5JbWFnZShzdWJqZWN0LCBpbmRleCk7Ci0JCXRoaXMudGFibGVJdGVtLnNldEltYWdlKGluZGV4LCBpbWFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dFRhYmxlKCkgewotCQkvLyBSZWZyZXNoIHRoZSB0YWJsZSBpbiBvcmRlciB0byBzaG93IHRoZSBzY3JvbGxiYXIgaWYgcmVxdWlyZWQKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMudGFibGVJdGVtLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotCQljb250YWluZXIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJY29udGFpbmVyLmxheW91dCgpOwotCX0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUl0ZW1EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGFibGVJdGVtLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSB2YWx1ZUhvbGRlcnMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJdmFsdWVIb2xkZXJzW2luZGV4XS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnNbaW5kZXhdKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotICAgcHJpdmF0ZSBjbGFzcyBUYWJsZUl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLSAgIAlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotICAgCVRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW50IGluZGV4KSB7Ci0gICAJCXN1cGVyKCk7Ci0gICAJCXRoaXMuaW5kZXggPSBpbmRleDsKLSAgIAl9Ci0KLSAgIAlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotICAgCQlpZiAoIXRhYmxlSXRlbS5pc0Rpc3Bvc2VkKCkpIHsKLSAgIAkJCVRhYmxlIHRhYmxlID0gdGFibGVJdGVtLmdldFBhcmVudCgpOwotICAgCQkJdGFibGVJdGVtQ2hhbmdlZChpbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgdGFibGUuZ2V0Q29sdW1uQ291bnQoKSA9PSAwKTsKLSAgIAkJfQotICAgCX0KLSAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQzYjRlMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtcyBpbiBhIHRhYmxlLgotICoge0BsaW5rICNsaXN0SG9sZGVyfSBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4gdGhlIHRhYmxlLgotICoge0BsaW5rICNzZWxlY3RlZEl0ZW1zSG9sZGVyfSBjb250YWlucyB0aGUgZGF0YSBvZiBhIHNpbmdsZSBjb2x1bW4gaW4KLSAqIHtAbGluayAjbGlzdEhvbGRlcn0gdGhhdCBhcmUgc2VsZWN0ZWQgaW4gdGhlIHRhYmxlLgotICovCi0vLyBUT0RPIGJqdgotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgdGFibGUncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSB0YWJsZSdzIHNlbGVjdGlvbiB3aXRoCi0JICogdGhlIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdGFibGUgd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3Rpb24gbGlzdCBob2xkZXIKLQkgKiB3aXRoIHRoZSB0YWJsZSdzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgdGFibGVTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+PiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Q7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gZG91YmxlIGNsaWNrIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PERvdWJsZUNsaWNrTGlzdGVuZXI8RT4+IGRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSB0YWJsZQotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgdGFibGVEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxhYmVsIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgYSBwcm9wZXJ0eSBhdCBhIGNvbHVtbiBpbmRleAotCSAqIHRvIGEgc3RyaW5nIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29sdW1uIGFkYXB0ZXIgaXMgcmVzcG9uc2libGUgdG8gcmV0dXJuIHRoZSBjb3VudCBvZiBjb2x1bW5zIGFuZCB0bwotCSAqIGNyZWF0ZSB0aGUgdmFsdWUgaG9sZGVycyBmb3IgYWxsIHRoZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxFPiBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPlRhYmxlSXRlbU1vZGVsQWRhcHRlcjwvY29kZT5zIHRoYXQgd2VyZSBjcmVhdGVkCi0JICogZm9yIGVhY2ggaXRlbSBvZiB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSBMaXN0PFRhYmxlSXRlbU1vZGVsQWRhcHRlcj4gdGFibGVJdGVtTW9kZWxBZGFwdGVyczsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsIGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCB0YWJsZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFRhYmxlTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlUYWJsZSB0YWJsZSwKLQkJCUNvbHVtbkFkYXB0ZXI8VD4gY29sdW1uQWRhcHRlciwKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxUPigKLQkJCWxpc3RIb2xkZXIsCi0JCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VD4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwKLQkJCXRhYmxlLAotCQkJY29sdW1uQWRhcHRlciwKLQkJCWxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGxpc3QgbW9kZWwgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHRhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIG1vZGVsIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIHRhYmxlLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVGFibGVNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUPiBzZWxlY3Rpb25Nb2RlbCwKLQkJCVRhYmxlIHRhYmxlLAotCQkJQ29sdW1uQWRhcHRlcjxUPiBjb2x1bW5BZGFwdGVyLAotCQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQotCQlUYWJsZU1vZGVsQWRhcHRlciBhZGFwdGVyID0gCi0JCQkJbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFQ+KAotCQkJCQlsaXN0SG9sZGVyLAotCQkJCQlzZWxlY3Rpb25Nb2RlbCwKLQkJCQkJdGFibGUsCi0JCQkJCWNvbHVtbkFkYXB0ZXIsCi0JCQkJCWxhYmVsUHJvdmlkZXIpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGJ1aWxkU3luY0xpc3RlbmVyKHNlbGVjdGlvbk1vZGVsKSk7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyA8VD4gU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTeW5jTGlzdGVuZXIoCi0JCQkJZmluYWwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUPiBzZWxlY3Rpb25Nb2RlbCkgewotCQkKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzZWxlY3Rpb25Nb2RlbC5zZXRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKGV2ZW50LnNlbGVjdGlvbigpKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgdGFibGUsIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBUYWJsZU1vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJVGFibGUgdGFibGUsCi0JCQlDb2x1bW5BZGFwdGVyPEU+IGNvbHVtbkFkYXB0ZXIsCi0JCQlJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0JewotCQlzdXBlcigpOwotCQlpZiAoKGxpc3RIb2xkZXIgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXNIb2xkZXIgPT0gbnVsbCkgfHwgKHRhYmxlID09IG51bGwpIHx8IChsYWJlbFByb3ZpZGVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIgPSBzZWxlY3RlZEl0ZW1zSG9sZGVyOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IGNvbHVtbkFkYXB0ZXI7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycyA9IG5ldyBBcnJheUxpc3Q8VGFibGVJdGVtTW9kZWxBZGFwdGVyPihjb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCkpOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy50YWJsZVNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0ID0gdGhpcy5idWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCk7Ci0KLQkJdGhpcy50YWJsZURpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZURpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLnRhYmxlLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnN5bmNocm9uaXplVGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZU1vZGVsQWRhcHRlciBsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZU1vZGVsQWRhcHRlciBzZWxlY3RlZCBpdGVtcyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVGFibGVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy50YWJsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy50YWJsZURvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVNb2RlbEFkYXB0ZXIgdGFibGUgc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3Q8RG91YmxlQ2xpY2tMaXN0ZW5lcjxFPj4gYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3QoRG91YmxlQ2xpY2tMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoeyJyYXd0eXBlcyIsICJ1bmNoZWNrZWQifSkKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+PiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3QoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRUYWJsZURpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnRhYmxlRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVNb2RlbEFkYXB0ZXIgdGFibGUgZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZSgpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlQ29sdW1ucygpOwotCQl0aGlzLnN5bmNocm9uaXplVGFibGVJdGVtcygpOwotCQl0aGlzLnN5bmNocm9uaXplVGFibGVTZWxlY3Rpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0YWJsZSBjb2x1bXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZUNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGNvbHVtbkNvdW50ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNvbHVtbkNvdW50OyBpbmRleCsrKSB7Ci0JCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVDb2x1bW4uc2V0TW92ZWFibGUoZmFsc2UpOwotCQkJdGFibGVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkJdGFibGVDb2x1bW4uc2V0V2lkdGgoMTAwKTsKLQotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uTmFtZShpbmRleCk7Ci0KLQkJCWlmIChjb2x1bW5OYW1lID09IG51bGwpIHsKLQkJCQljb2x1bW5OYW1lID0gIiI7Ci0JCQl9Ci0KLQkJCXRhYmxlQ29sdW1uLnNldFRleHQoY29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgdGFibGUgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlSXRlbXMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaW5kZXggPSB0aGlzLnRhYmxlLmdldEl0ZW1Db3VudCgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJdGhpcy50YWJsZS5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQlpbnQgaXRlbUNvdW50ID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgaXRlbUNvdW50OyBpbmRleCsrKSB7Ci0KLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YSh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSk7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy5idWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmFkZChhZGFwdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0KLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCi0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gbmV3IFRhYmxlSXRlbSh0aGlzLnRhYmxlLCBTV1QuTlVMTCwgaW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEoaXRlbSk7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy5idWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmFkZChpbmRleCsrLCBhZGFwdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCi0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy50YWJsZS5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCk7IC0taW5kZXggPj0gZXZlbnQuZ2V0SW5kZXgoKTsgKSB7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMucmVtb3ZlKGluZGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbGVuZ3RoICAgICAgICA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlpbnQgc291cmNlSW5kZXggICA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCB0YXJnZXRJbmRleCAgID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IGxvd1N0YXJ0SW5kZXggPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgaGlTdGFydEluZGV4ICA9IE1hdGgubWF4KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0KLQkJT2JqZWN0W10gaXRlbXMgPSBuZXcgT2JqZWN0W2hpU3RhcnRJbmRleCAtIGxvd1N0YXJ0SW5kZXggKyBsZW5ndGhdOwotCQlpbnQgaXRlbXNJbmRleCA9IGl0ZW1zLmxlbmd0aDsKLQotCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbXMgd3JhcHBpbmcgdGhlIG1vdmVkIGl0ZW1zCi0JCWZvciAoaW50IGluZGV4ID0gaGlTdGFydEluZGV4ICsgbGVuZ3RoOyAtLWluZGV4ID49IGxvd1N0YXJ0SW5kZXg7ICkgewotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgdGFibGVJdGVtTW9kZWwgPSB0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuZ2V0KGluZGV4KTsKLQkJCWl0ZW1zWy0taXRlbXNJbmRleF0gPSB0YWJsZUl0ZW1Nb2RlbC50YWJsZUl0ZW0uZ2V0RGF0YSgpOwotCi0JCQkvLyBSZW1vdmUgdGhlIFRhYmxlSXRlbSwgd2hpY2ggd2lsbCBhbHNvIGRpc3Bvc2UgVGFibGVJdGVtTW9kZWxBZGFwdGVyCi0JCQl0aGlzLnRhYmxlLnJlbW92ZShpbmRleCk7Ci0JCX0KLQotCQkvLyBNb3ZlIHRoZSBpdGVtcyBzbyB0aGV5IGNhbiByZXRyaWV2ZWQgaW4gdGhlIHJpZ2h0IG9yZGVyIHdoZW4KLQkJLy8gcmUtY3JlYXRpbmcgdGhlIFRhYmxlSXRlbXMKLQkJQXJyYXlUb29scy5tb3ZlKAotCQkJaXRlbXMsCi0JCQl0YXJnZXRJbmRleCAtIGxvd1N0YXJ0SW5kZXgsCi0JCQlzb3VyY2VJbmRleCAtIGxvd1N0YXJ0SW5kZXgsCi0JCQlsZW5ndGgKLQkJKTsKLQotCQlpdGVtc0luZGV4ID0gMDsKLQotCQkvLyBBZGQgVGFibGVJdGVtcyBmb3IgdGhlIG1vdmVkIGl0ZW1zCi0JCWZvciAoaW50IGluZGV4ID0gbG93U3RhcnRJbmRleDsgaW5kZXggPD0gaGlTdGFydEluZGV4ICsgbGVuZ3RoIC0gMTsgaW5kZXgrKykgewotCi0JCQkvLyBDcmVhdGUgdGhlIG5ldyBUYWJsZUl0ZW0KLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YShpdGVtc1tpdGVtc0luZGV4KytdKTsKLQotCQkJLy8gQWRhcHQgaXQgd2l0aCBhIG1vZGVsIGFkYXB0ZXIKLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy5idWlsZEl0ZW1Nb2RlbCh0YWJsZUl0ZW0pOwotCQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLnNldChpbmRleCwgYWRhcHRlcik7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgVGFibGVJdGVtTW9kZWxBZGFwdGVyIGJ1aWxkSXRlbU1vZGVsKFRhYmxlSXRlbSB0YWJsZUl0ZW0pIHsKLQkJcmV0dXJuIFRhYmxlSXRlbU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCXRhYmxlSXRlbSwKLQkJCXRoaXMuY29sdW1uQWRhcHRlciwKLQkJCXRoaXMubGFiZWxQcm92aWRlcgotCQkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHJvd0luZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7Ci0JCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGhpcy50YWJsZS5nZXRJdGVtKHJvd0luZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW0pOwotCi0JCQlUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHRlciA9IHRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5nZXQocm93SW5kZXgpOwotCi0JCQlpbnQgY29sdW1uQ291bnQgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKTsKLQkJCWJvb2xlYW4gcmV2YWxpZGF0ZSA9IChjb2x1bW5Db3VudCA9PSAxKTsKLQotCQkJZm9yIChpbnQgY29sdW1uSW5kZXggPSBjb2x1bW5Db3VudDsgLS1jb2x1bW5JbmRleCA+PSAwOyApIHsKLQkJCQlhZGFwdGVyLnRhYmxlSXRlbUNoYW5nZWQoY29sdW1uSW5kZXgsIHRhYmxlSXRlbS5nZXREYXRhKCksIHJldmFsaWRhdGUpOwotCQkJfQotCi0JCQlyb3dJbmRleCsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLnJlbW92ZUFsbCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSB0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZUl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RlZCBpdGVtcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAodGhpcy5saXN0SG9sZGVyLmdldChpKSA9PSBpdGVtKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGVTZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W3RoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBzZWxlY3RlZEl0ZW1Ib2xkZXIgOiB0aGlzLnNlbGVjdGVkSXRlbXNIb2xkZXIpIHsKLQkJCWluZGljZXNbaSsrXSA9IHRoaXMuaW5kZXhPZihzZWxlY3RlZEl0ZW1Ib2xkZXIpOwotCQl9Ci0JCXRoaXMudGFibGUuZGVzZWxlY3RBbGwoKTsKLQkJdGhpcy50YWJsZS5zZWxlY3QoaW5kaWNlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLnNlbGVjdCh0aGlzLmdldEluZGljZXMoZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUuZGVzZWxlY3QodGhpcy5nZXRJbmRpY2VzKGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSkpOwotCX0KLQotCXByb3RlY3RlZCBpbnRbXSBnZXRJbmRpY2VzKGludCBpdGVtc1NpemUsIEl0ZXJhYmxlPEU+IGl0ZW1zKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2l0ZW1zU2l6ZV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGl0ZW0gOiBpdGVtcykgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBpbmRpY2VzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGVkSXRlbXNDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLmRlc2VsZWN0QWxsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0NoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBib3ggZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlU2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKLQkJCVNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IHNjRXZlbnQgPSBuZXcgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4odGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1zKCkpOwotCQkJZm9yIChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA6IHRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuc2VsZWN0aW9uQ2hhbmdlZChzY0V2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IHNlbGVjdGVkSXRlbXMoKSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PEU+IHNlbGVjdGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCWZvciAoaW50IHNlbGVjdGlvbkluZGV4IDogdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCXNlbGVjdGVkSXRlbXMuYWRkKHRoaXMubGlzdEhvbGRlci5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZURvdWJsZUNsaWNrZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKLQkJCS8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQgZHVyaW5nIGEgZG91YmxlLWNsaWNrKD8pCi0JCQlFIHNlbGVjdGlvbiA9IHRoaXMubGlzdEhvbGRlci5nZXQodGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCURvdWJsZUNsaWNrRXZlbnQ8RT4gZGNFdmVudCA9IG5ldyBEb3VibGVDbGlja0V2ZW50PEU+KHRoaXMsIHNlbGVjdGlvbik7Ci0JCQlmb3IgKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZG91YmxlQ2xpY2tMaXN0ZW5lciA6IHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlkb3VibGVDbGlja0xpc3RlbmVyLmRvdWJsZUNsaWNrKGRjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVEaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSB0YWJsZSBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGFibGUucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLnRhYmxlLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkb3VibGUgY2xpY2sgc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGREb3VibGVDbGlja0xpc3RlbmVyKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEb3VibGVDbGlja0xpc3RlbmVyPEU+IGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudDxFPiBldmVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVDbGlja0V2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0aW9uOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgRG91YmxlQ2xpY2tFdmVudChUYWJsZU1vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoVGFibGVNb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgc2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248RT4gc2VsZWN0aW9uOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlRXZlbnQoVGFibGVNb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBDb2xsZWN0aW9uPEU+IHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBUYWJsZU1vZGVsQWRhcHRlcjxFPiBnZXRTb3VyY2UoKSB7Ci0JCQlyZXR1cm4gKFRhYmxlTW9kZWxBZGFwdGVyPEU+KSBzdXBlci5nZXRTb3VyY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxFPiBzZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMxNmI1Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuVHJpU3RhdGVDaGVja0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRyaS1zdGF0ZSBjaGVjayBib3ggaW4gc3luY2ggd2l0aAotICogYSBtb2RlbCBCb29sZWFuIHdoZXJlIHRoZSB2YWx1ZSBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIgewotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqIFRoZSBjaGVjayBib3gvdG9nZ2xlIGJ1dHRvbiB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGJ1dHRvbjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIG1vZGVsIGJvb2xlYW4gd2l0aAotCSAqIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gdG8gdGhlIHNwZWNpZmllZCBidXR0b24uCi0JICogSWYgdGhlIGJvb2xlYW4gaXMgbnVsbCwgdGhlIGJ1dHRvbidzIHZhbHVlIHdpbGwgYmUgInBhcnRpYWxseSBjaGVja2VkIgotCSAqIChpLmUuIHRoZSBidXR0b24gd2lsbCBiZSBjaGVja2VkIGJ1dCBncmF5ZWQgb3V0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIgYWRhcHQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwgVHJpU3RhdGVDaGVja0JveCBidXR0b24pIHsKLQkJcmV0dXJuIG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIsIGJ1dHRvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBhbmQgYnV0dG9uIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBUcmlTdGF0ZUNoZWNrQm94IGJ1dHRvbikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoYm9vbGVhbkhvbGRlciwgIlRoZSBib29sZWFuIGhvbGRlciBjYW5ub3QgYmUgbnVsbCIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGJ1dHRvbiwgIlRoZSBjaGVjayBib3ggY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBib29sZWFuSG9sZGVyOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbih0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpLXN0YXRlIGJvb2xlYW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci50aGlzLmJ1dHRvblNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaS1zdGF0ZSBidXR0b24gc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIudGhpcy5idXR0b25EaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmktc3RhdGUgYnV0dG9uIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uLgotCSAqIElmIHRoZSBuZXcgbW9kZWwgdmFsdWUgaXMgbnVsbCwgdXNlIHRoZSBhZGFwdGVyJ3MgZGVmYXVsdCB2YWx1ZQotCSAqICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24oKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEJ1dHRvblNlbGVjdGlvbihCb29sZWFuIHNlbGVjdGlvbikgewotCQlpZiAodGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBoYXMgYmVlbiAic2VsZWN0ZWQiIC0gc3luY2hyb25pemUgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGJ1dHRvbiBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Ib2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZDFlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSB0byBzZXQgYSBwcmVmZXJyZWQgd2lkdGggb24gdGhlIHJlZ2lzdGVyZWQgd2lkZ2V0cwotICogKGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPiBvciA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGJhc2VkIG9uIHRoZQotICogd2lkZXN0IHdpZGdldC4KLSAqIDxwPgotICogSW1wb3J0YW50OiBUaGUgbGF5b3V0IGRhdGEgaGFzIHRvIGJlIGEgPGNvZGU+R3JpZERhdGE8L2NvZGU+LiBJZiBub25lIGlzIHNldCwKLSAqIHRoZW4gYSBuZXcgPGNvZGU+R3JpZERhdGE8L2NvZGU+IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4KLSAqIDxwPgotICogSGVyZSBhbiBleGFtcGxlIG9mIHRoZSByZXN1bHQgaWYgdGhpcyBhbGlnbmVyIGlzIHVzZWQgdG8gYWxpZ24gY29udHJvbHMKLSAqIHdpdGhpbiBlaXRoZXIgb25lIG9yIHR3byBncm91cCBib3hlcywgdGhlIGNvbnRyb2xzIGFkZGVkIGFyZSB0aGUgbGFiZWxzIGluCi0gKiB0aGlzIGNhc2UuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gYWxpZ24gY29udHJvbHMgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlCi0gKiBtYWluIGNvbXBvbmVudCwgYSBzcGFjZXIgY2FuIGJlIHVzZWQgZm9yIGV4dHJhIHNwYWNlLgotICogPHA+Ci0gKiBIZXJlJ3MgYW4gZXhhbXBsZToKLSAqIDxwcmU+Ci0gKiAtIEdyb3VwIEJveCAxIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IFByZWFsbG9jYXRpb24gU2l6ZTogfCAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IERlc2NyaXB0b3I6ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogLSBHcm91cCBCb3ggMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBNYXBwaW5nIFR5cGU6ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFZ8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogfCBDaGVjayBpbiBTY3JpcHQ6ICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lcgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGEgdmFsaWRhdGlvbiBzbyBpdCBjYW4gYmUgZG9uZSBhZnRlciBhbiBvcGVyYXRpb24KLQkgKiBjb21wbGV0ZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGF1dG9WYWxpZGF0ZTsKLQotCS8qKgotCSAqIFRoZSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gc3VwcG9ydCBib3VuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxMaXN0ZW5lcj4gY2hhbmdlU3VwcG9ydDsKLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBhZGRlZCB0byBlYWNoIG9mIHRoZSBjb250cm9scyB0aGF0IGxpc3RlbnMgb25seSB0byBhIHRleHQKLQkgKiBjaGFuZ2UuCi0JICovCi0JcHJpdmF0ZSBMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkgKiBUaGlzIGhhcHBlbnMgaW4gYW4gaGllcmFyY2h5IG9mIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPnMuIFRoZSBsb2NrCi0JICogaGFzIHRvIGJlIHBsYWNlZCBoZXJlIGFuZCBub3QgaW4gdGhlIHtAbGluayBDb250cm9sQWxpZ25lcldyYXBwZXJ9LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbGN1bGF0ZWQsIHRoZW4KLQkgKiB0aGlzIHZhbHVlIGlzIDAuCi0JICovCi0JcHJpdmF0ZSBpbnQgbWF4aW11bVdpZHRoOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFdyYXBwZXJ9cyBlbmNhcHN1bGF0aW5nIGVpdGhlciA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKiBvciB7QGxpbmsgQ29udHJvbEFsaWduZXJ9cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248V3JhcHBlcj4gd3JhcHBlcnM7Ci0KLQkvKioKLQkgKiBBIG51bGwtPGNvZGU+UG9pbnQ8L2NvZGU+IG9iamVjdCB1c2VkIHRvIGNsZWFyIHRoZSBwcmVmZXJyZWQgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQb2ludCBERUZBVUxUX1NJWkUgPSBuZXcgUG9pbnQoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBldmVudHMgdG8gbGlzdGVuIGluIG9yZGVyIHRvIHByb3Blcmx5IGFkanVzdCB0aGUgc2l6ZSBvZiBhbGwKLQkgKiB0aGUgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBFVkVOVF9UWVBFUyA9IHsKLQkJU1dULkRpc3Bvc2UsCi0JCVNXVC5IaWRlLAotCQlTV1QuUmVzaXplLAotCQlTV1QuU2hvdwotCX07Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9scyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sPC9jb2RlPnMKLQkgKi8KLQlwdWJsaWMgQ29udHJvbEFsaWduZXIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJdGhpcygpOwotCQlhZGRBbGxDb250cm9scyhjb250cm9scyk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbC4gSXRzIHdpZHRoIHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwKLQkgKiB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBjb250cm9scyBpbiBvcmRlciB0byBnZXQgdGhlIGdyZWF0ZXIgd2l0ZGggYW5kIHVzZQotCSAqIGl0IGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSA8Y29kZT5Db250cm9sPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChDb250cm9sIGNvbnRyb2wpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2wsICJDYW4ndCBhZGQgbnVsbCB0byB0aGlzIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIGNvbnRyb2wuIEl0cyB3aWR0aCB3aWxsIGJlIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsCi0JICogdGhlIG90aGVyIHJlZ2lzdGVyZWQgY29udHJvbHMgaW4gb3JkZXIgdG8gZ2V0IHRoZSBncmVhdGVyIHdpdGRoIGFuZCB1c2UKLQkgKiBpdCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSBhZGRlZAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIENhbid0IGFkZCB0aGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+Ci0JICogdG8gaXRzZWxmCi0JICovCi0JcHVibGljIHZvaWQgYWRkKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIkNhbid0IGFkZCBudWxsIHRvIHRoaXMgQ29udHJvbEFsaWduZXIiKTsKLQkJQXNzZXJ0LmlzTGVnYWwoY29udHJvbEFsaWduZXIgIT0gdGhpcywgIkNhbid0IGFkZCB0aGUgQ29udHJvbEFsaWduZXIgdG8gaXRzZWxmIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gYnVpbGRXcmFwcGVyKGNvbnRyb2xBbGlnbmVyKTsKLQkJd3JhcHBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdyYXBwZXJzLmFkZCh3cmFwcGVyKTsKLQotCQlpZiAoIWNvbnRyb2xBbGlnbmVyLndyYXBwZXJzLmlzRW1wdHkoKSkgewotCQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBpdGVtcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW50byB0aGlzCi0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBUaGUgcHJlZmVycmVkIHdpZHRoIG9mIGVhY2ggaXRlbSB3aWxsIGJlCi0JICogdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwgdGhlIG90aGVyIGl0ZW1zIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgKiB3aWRlc3QgY29udHJvbCBhbmQgdXNlIGl0cyB3aWR0aCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gYWxpZ25lcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xBbGlnbmVycyhDb2xsZWN0aW9uPENvbnRyb2xBbGlnbmVyPiBhbGlnbmVycykgewotCi0JCS8vIERlYWN0aXZhdGUgdGhlIGF1dG8gdmFsaWRhdGlvbiB3aGlsZSBhZGRpbmcgYWxsIHRoZSBDb250cm9scyBhbmQvb3IKLQkJLy8gQ29udHJvbEFsaWduZXJzIGluIG9yZGVyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKLQkJYm9vbGVhbiBvbGRBdXRvVmFsaWRhdGUgPSBhdXRvVmFsaWRhdGU7Ci0JCWF1dG9WYWxpZGF0ZSA9IGZhbHNlOwotCi0JCWZvciAoQ29udHJvbEFsaWduZXIgYWxpZ25lciA6IGFsaWduZXJzKSB7Ci0JCQlhZGQoYWxpZ25lcik7Ci0JCX0KLQotCQlhdXRvVmFsaWRhdGUgPSBvbGRBdXRvVmFsaWRhdGU7Ci0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotICAgLyoqCi0JICogQWRkcyB0aGUgaXRlbXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjb2xsZWN0aW9uIGludG8gdGhpcwotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4gVGhlIHByZWZlcnJlZCB3aWR0aCBvZiBlYWNoIGl0ZW0gd2lsbCBiZQotCSAqIHVzZWQgYWxvbmcgd2l0aCB0aGUgd2lkdGggb2YgYWxsIHRoZSBvdGhlciBpdGVtcyBpbiBvcmRlciB0byBnZXQgdGhlCi0JICogd2lkZXN0IGNvbnRyb2wgYW5kIHVzZSBpdHMgd2lkdGggYXMgdGhlIHdpZHRoIGZvciBhbGwgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbENvbnRyb2xzKENvbGxlY3Rpb248PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0KLQkJLy8gRGVhY3RpdmF0ZSB0aGUgYXV0byB2YWxpZGF0aW9uIHdoaWxlIGFkZGluZyBhbGwgdGhlIENvbnRyb2xzIGFuZC9vcgotCQkvLyBDb250cm9sQWxpZ25lcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQlib29sZWFuIG9sZEF1dG9WYWxpZGF0ZSA9IGF1dG9WYWxpZGF0ZTsKLQkJYXV0b1ZhbGlkYXRlID0gZmFsc2U7Ci0KLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9scykgewotCQkJYWRkKGNvbnRyb2wpOwotCQl9Ci0KLQkJYXV0b1ZhbGlkYXRlID0gb2xkQXV0b1ZhbGlkYXRlOwotCQlyZXZhbGlkYXRlKGZhbHNlKTsKLQl9Ci0KLSAgIC8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb0xpc3RlbmVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJaWYgKGNoYW5nZVN1cHBvcnQgPT0gbnVsbCkgewotCQkgICAgY2hhbmdlU3VwcG9ydCA9IG5ldyBBcnJheUxpc3Q8TGlzdGVuZXI+KCk7Ci0JCX0KLQotCQljaGFuZ2VTdXBwb3J0LmFkZChsaXN0ZW5lcik7Ci0gICB9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbiBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSB3cmFwcGVkCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQlyZXR1cm4gbmV3IENvbnRyb2xXcmFwcGVyKGNvbnRyb2wpOwotCX0KLQotICAgLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZ2l2ZW4gc291cmNlLgotCSAqCi0JICogQHBhcmFtIENvbnRyb2xBbGlnbmVyIFRoZSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gdG8gYmUgd3JhcHBlZAotCSAqIEByZXR1cm4gQSBuZXcge0BsaW5rIENvbnRyb2xBbGlnbmVyV3JhcHBlcn0KLQkgKi8KLQlwcml2YXRlIFdyYXBwZXIgYnVpbGRXcmFwcGVyKENvbnRyb2xBbGlnbmVyIENvbnRyb2xBbGlnbmVyKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbEFsaWduZXJXcmFwcGVyKENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxjdWxhdGVzIHRoZSB3aWR0aCB0YWtlbiBieSB0aGUgd2lkZ2V0cyBhbmQgcmV0dXJucyB0aGUgbWF4aW11bSB3aWR0aC4KLQkgKgotCSAqIEBwYXJhbSByZWNhbGN1bGF0ZVNpemUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JICogb2YgYWxsIHRoZSB3cmFwcGVycyBjb250YWluZWQgd2l0aGluIHRoZW0gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhY2hlZAotCSAqIHNpemU7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGNhY2hlZCBzaXplCi0JICovCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlV2lkdGgoYm9vbGVhbiByZWNhbGN1bGF0ZVNpemUpIHsKLQotCQlpbnQgd2lkdGggPSAwOwotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IHNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gVGhlIHNpemUgaGFzIG5vdCBiZWVuIGNhbGN1bGF0ZWQgeWV0Ci0JCQlpZiAocmVjYWxjdWxhdGVTaXplIHx8IChzaXplLnggPT0gMCkpIHsKLQkJCQlzaXplID0gd3JhcHBlci5jYWxjdWxhdGVTaXplKCk7Ci0JCQl9Ci0KLQkJCS8vIE9ubHkga2VlcCB0aGUgZ3JlYXRlc3Qgd2lkdGgKLQkJCXdpZHRoID0gTWF0aC5tYXgoc2l6ZS54LCB3aWR0aCk7Ci0JCX0KLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0cyBhIGJvdW5kIHByb3BlcnR5IGNoYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgb2xkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSAoYXMgYW4gaW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBjb250cm9sUmVzaXplZChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCi0JCWlmICgoY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpKSB7Ci0JCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJCWV2ZW50LndpZGdldCA9IFNXVFV0aWwuZ2V0U2hlbGwoKTsKLQkJCWV2ZW50LmRhdGEgICA9IHRoaXM7Ci0KLQkJCWZvciAoTGlzdGVuZXIgbGlzdGVuZXIgOiBjaGFuZ2VTdXBwb3J0KSB7Ci0JCQkJbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgdGhpcyA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4sIHRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkIG9mCi0JICogZGlzcG9zaW5nIGEgcGFuZS4gV2hlbiBhIHBhbmUgaXMgZGlzcG9zZWQsIHRoaXMgYWxpZ25lciBkb2Vzbid0IG5lZWQgdG8KLQkgKiByZXZhbGlkYXRlIGl0cyBzaXplIHVwb24gZGlzcG9zZSBvZiBpdHMgd2lkZ2V0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCi0JCWZvciAoSXRlcmF0b3I8V3JhcHBlcj4gaXRlciA9IHdyYXBwZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCVdyYXBwZXIgd3JhcHBlciA9IGl0ZXIubmV4dCgpOwotCQkJd3JhcHBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlpdGVyLnJlbW92ZSgpOwotCQl9Ci0KLQkJdGhpcy53cmFwcGVycy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wuIElmIHRoZSBsZW5ndGggd2FzIG5vdAotCSAqIGNhbGN1bGF0ZWQsIHRoZW4gdGhpcyB2YWx1ZSBpcyAwLgotCSAqCi0JICogQHJldHVybiBUaGUgd2lkdGggb2YgdGhlIHdpZGVzdCBjb250cm9sIG9yIDAgaWYgdGhlIGxlbmd0aCBoYXMgbm90IGJlZW4KLQkgKiBjYWxjdWxhdGVkIHlldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKCkgewotCQlyZXR1cm4gbWF4aW11bVdpZHRoOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXRoaXMuYXV0b1ZhbGlkYXRlID0gdHJ1ZTsKLQkJdGhpcy5tYXhpbXVtV2lkdGggPSAwOwotCQl0aGlzLmxpc3RlbmVyICAgICA9IG5ldyBMaXN0ZW5lckhhbmRsZXIoKTsKLQkJdGhpcy53cmFwcGVycyAgICAgPSBuZXcgQXJyYXlMaXN0PFdyYXBwZXI+KCk7Ci0JfQotCi0JLyoqCi0JICogSW52YWxpZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gYmUgaW52YWxpZGF0ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW52YWxpZGF0ZShPYmplY3Qgc291cmNlKSB7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0KLQkJaWYgKCF3cmFwcGVyLmxvY2tlZCgpKSB7Ci0JCQlQb2ludCBzaXplID0gd3JhcHBlci5jYWNoZWRTaXplKCk7Ci0JCQlzaXplLnggPSBzaXplLnkgPSAwOwotCQkJd3JhcHBlci5zZXRTaXplKERFRkFVTFRfU0laRSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBtYXhpbXVtIGxlbmd0aCBiYXNlZCBvbiB0aGUgd2lkZXN0IGNvbnRyb2wuIFRoaXMgbWV0aG9kcwotCSAqIGRvZXMgbm90IHVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIHJlY2FsY3VsYXRlU2l6ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUKLQkgKiBvZiBhbGwgdGhlIHdyYXBwZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlbSByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FjaGVkCi0JICogc2l6ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSB0aGUgY2FjaGVkIHNpemUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVjYWxjdWxhdGVXaWR0aChib29sZWFuIHJlY2FsY3VsYXRlU2l6ZSkgewotCi0JCWludCB3aWR0aCA9IGNhbGN1bGF0ZVdpZHRoKHJlY2FsY3VsYXRlU2l6ZSk7Ci0KLQkJdHJ5IHsKLQkJCWxvY2tlZCA9IHRydWU7Ci0JCQlzZXRNYXhpbXVtV2lkdGgod2lkdGgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sLiBJdHMgcHJlZmVycmVkIHdpZHRoIHdpbGwgbm90IGJlIHVzZWQgd2hlbgotCSAqIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2lkdGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2w8L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQ29udHJvbCBjb250cm9sKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sLCAiVGhlIENvbnRyb2wgdG8gcmVtb3ZlIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKGNvbnRyb2wpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBJdHMgcHJlZmVycmVkIHdpZHRoCi0JICogd2lsbCBub3QgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBwcmVmZXJyZWQgd2l0ZGguCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSByZW1vdmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPgotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKENvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChjb250cm9sQWxpZ25lciwgIlRoZSBDb250cm9sQWxpZ25lciB0byByZW1vdmUgY2Fubm90IGJlIG51bGwiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoY29udHJvbEFsaWduZXIpOwotCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWNoYW5nZVN1cHBvcnQucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlpZiAoY2hhbmdlU3VwcG9ydC5pc0VtcHR5KCkpIHsKLQkJCWNoYW5nZVN1cHBvcnQgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA8Y29kZT5XcmFwcGVyPC9jb2RlPiB0aGF0IGlzIGVuY2Fwc3VsYXRpbmcgdGhlIGdpdmVuIG9iamVjdC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgRWl0aGVyIGEgPGNvZGU+Q29udHJvbDwvY29kZT4gb3IgYSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4KLQkgKiBAcmV0dXJuIEl0cyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgV3JhcHBlciByZXRyaWV2ZVdyYXBwZXIoT2JqZWN0IHNvdXJjZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCWlmICh3cmFwcGVyLnNvdXJjZSgpID09IHNvdXJjZSkgewotCQkJCXJldHVybiB3cmFwcGVyOwotCQkJfQotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgcmV0cmlldmUgdGhlIFdyYXBwZXIgZm9yICIgKyBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBjb3VudCBvZiBjb250cm9sIGlzIGdyZWF0ZXIgdGhhbiBvbmUgYW5kIHtAbGluayAjaXNBdXRvVmFsaWRhdGUoKX0KLQkgKiByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSBzaXplIG9mIGFsbCB0aGUgcmVnaXN0ZXJlZAotCSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+cyB3aWxsIGJlIHVkcGF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcmVjYWxjdWxhdGVTaXplIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCSAqIG9mIGFsbCB0aGUgd3JhcHBlcnMgY29udGFpbmVkIHdpdGhpbiB0aGVtIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWNoZWQKLQkgKiBzaXplOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIHRoZSBjYWNoZWQgc2l6ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKGJvb2xlYW4gcmVjYWxjdWxhdGVTaXplKSB7Ci0KLQkJaWYgKGF1dG9WYWxpZGF0ZSkgewotCQkJcmVjYWxjdWxhdGVXaWR0aChyZWNhbGN1bGF0ZVNpemUpOwotCQkJdXBkYXRlV3JhcHBlclNpemUocmVjYWxjdWxhdGVTaXplKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJhc2VzIG9uIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGdpdmVuIDxjb2RlPkV2ZW50PC9jb2RlPiwKLQkgKiByZXNpemUgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGV2ZW50IFRoZSA8Y29kZT5FdmVudDwvY29kZT4gc2VudCBieSB0aGUgVUkgdGhyZWFkIHdoZW4gdGhlIHN0YXRlCi0JICogb2YgYSB3aWRnZXQgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlKEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byByZXZhbGlkYXRlIGR1cmluZyBhIHJldmFsaWRhdGlvbiBwcm9jZXNzCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCU9iamVjdCBzb3VyY2U7Ci0KLQkJaWYgKGV2ZW50LndpZGdldCAhPSBTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQkJCXNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBzb3VyY2U7Ci0KLQkJCS8vIFdoZW4gYSBkaWFsb2cgaXMgb3BlbmVkLCB3ZSBuZWVkIHRvIGFjdHVhbGx5IGZvcmNlIGEgbGF5b3V0IG9mCi0JCQkvLyB0aGUgY29udHJvbHMsIHRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgY29udHJvbCBpcyBhY3R1YWxseQotCQkJLy8gbm90IHZpc2libGUgd2hlbiB0aGUgcHJlZmVycmVkIHdpZHRoIGlzIGNhY3VsYXRlZAotCQkJaWYgKGNvbnRyb2wgPT0gY29udHJvbC5nZXRTaGVsbCgpKSB7Ci0JCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCXNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzb3VyY2UgPSBldmVudC5kYXRhOwotCQl9Ci0KLQkJLy8gRWl0aGVyIHJlbW92ZSB0aGUgQ29udHJvbFdyYXBwZXIgaWYgdGhlIHdpZGdldCB3YXMgZGlzcG9zZWQgb3IKLQkJLy8gaW52YWxpZGF0ZSB0aGUgd2lkZ2V0IGluIG9yZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChldmVudC50eXBlID09IFNXVC5EaXNwb3NlKSB7Ci0JCQkJV3JhcHBlciB3cmFwcGVyID0gcmV0cmlldmVXcmFwcGVyKHNvdXJjZSk7Ci0JCQkJd3JhcHBlcnMucmVtb3ZlKHdyYXBwZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW52YWxpZGF0ZShzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJLy8gTm93IHJldmFsaWRhdGUgYWxsIHRoZSBDb250cm9scyBhbmQgQ29udHJvbEFsaWduZXJzCi0JCXJldmFsaWRhdGUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90IGNhbHVsY2F0ZWQsCi0JICogdGhlbiB0aGlzIHZhbHVlIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gbWF4aW11bVdpZHRoIFRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWF4aW11bVdpZHRoKGludCBtYXhpbXVtV2lkdGgpIHsKLQotCQlpbnQgb2xkTWF4aW11bVdpZHRoID0gdGhpcy5tYXhpbXVtV2lkdGg7Ci0JCXRoaXMubWF4aW11bVdpZHRoID0gbWF4aW11bVdpZHRoOwotCQljb250cm9sUmVzaXplZChvbGRNYXhpbXVtV2lkdGgsIG1heGltdW1XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvYmplY3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCJtYXhpbXVtV2lkdGg9Iik7Ci0JCXNiLmFwcGVuZChtYXhpbXVtV2lkdGgpOwotCQlzYi5hcHBlbmQoIiwgd3JhcHBlcnM9Iik7Ci0JCXNiLmFwcGVuZCh3cmFwcGVycyk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzaXplIG9mIGV2ZXJ5IDxjb2RlPldyYXBwZXI8L2NvZGU+IGJhc2VkIG9uIHRoZSBtYXhpbXVtIHdpZHRoLgotCSAqCi0JICogQHBhcmFtIGZvcmNlUmV2YWxpZGF0ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZXZhbGlkYXRlIHRoZSB3cmFwcGVyJ3Mgc2l6ZQotCSAqIGV2ZW4gdGhvdWdoIGl0cyBjdXJyZW50IHNpemUgbWlnaHQgYmUgdGhlIHNhbWUgYXMgdGhlIG1heGltdW0gd2lkdGg7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG9ubHkgcmV2YWxpZGF0ZSB0aGUgd3JhcHBlcnMgd2l0aCBhIGRpZmZlcmVudCB3aWR0aAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVXcmFwcGVyU2l6ZShib29sZWFuIGZvcmNlUmV2YWxpZGF0ZSkgewotCi0JCWZvciAoV3JhcHBlciB3cmFwcGVyIDogd3JhcHBlcnMpIHsKLQkJCVBvaW50IGNhY2hlZFNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQotCQkJLy8gTm8gbmVlZCB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHdyYXBwZXIgc2luY2UgaXQncyBhbHdheXMgdXNpbmcKLQkJCS8vIHRoZSBtYXhpbXVtIHdpZHRoCi0JCQlpZiAoZm9yY2VSZXZhbGlkYXRlIHx8IChjYWNoZWRTaXplLnggIT0gbWF4aW11bVdpZHRoKSkgewotCQkJCVBvaW50IHNpemUgPSBuZXcgUG9pbnQobWF4aW11bVdpZHRoLCBjYWNoZWRTaXplLnkpOwotCQkJCXdyYXBwZXIuc2V0U2l6ZShzaXplKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4gZW5jYXBzdWxhdGVzIGEge0BsaW5rIENvbnRyb2xBbGlnbmVyfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRyb2xBbGlnbmVyV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyB7QGxpbmsgQ29udHJvbEFsaWduZXIjbWF4aW11bVdpZHRofS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBlbmNhcHN1bGF0ZWQgYnkgdGhpcwotCQkgKiA8Y29kZT5XcmFwcGVyPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXJXcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcwotCQkgKiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gY29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZQotCQkgKiBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBDb250cm9sQWxpZ25lcldyYXBwZXIoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnRyb2xBbGlnbmVyID0gY29udHJvbEFsaWduZXI7Ci0JCQl0aGlzLmNhY2hlZFNpemUgICAgID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCwgMCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJY29udHJvbEFsaWduZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhY2hlZFNpemUoKSB7Ci0JCQljYWNoZWRTaXplLnggPSBjb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGg7Ci0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWxjdWxhdGVTaXplKCkgewotCi0JCQlQb2ludCBzaXplID0gbmV3IFBvaW50KGNvbnRyb2xBbGlnbmVyLmNhbGN1bGF0ZVdpZHRoKGZhbHNlKSwgMCk7Ci0KLQkJCWlmIChzaXplLnggIT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnggPSBzaXplLng7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYWNoZWRTaXplLnggPSAwOwotCQkJfQotCi0JCQlpZiAoc2l6ZS55ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gc2l6ZS55OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FjaGVkU2l6ZS55ID0gMDsKLQkJCX0KLQotCQkJcmV0dXJuIHNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBsb2NrZWQoKSB7Ci0JCQlyZXR1cm4gY29udHJvbEFsaWduZXIubG9ja2VkOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoc2l6ZSA9PSBERUZBVUxUX1NJWkUpIHsKLQkJCQljb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGggPSAwOwotCQkJfQotCQkJZWxzZSBpZiAoY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoICE9IHNpemUueCkgewotCQkJCWNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCA9IHNpemUueDsKLQkJCQljb250cm9sQWxpZ25lci51cGRhdGVXcmFwcGVyU2l6ZSh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBPYmplY3Qgc291cmNlKCkgewotCQkJcmV0dXJuIGNvbnRyb2xBbGlnbmVyOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiQ2FjaGVkIHNpemU9Iik7Ci0JCQlzYi5hcHBlbmQoY2FjaGVkU2l6ZSk7Ci0JCQlzYi5hcHBlbmQoIiwgQ29udHJvbEFsaWduZXI9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbEFsaWduZXIpOwotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ29udHJvbH0uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250cm9sV3JhcHBlciBpbXBsZW1lbnRzIFdyYXBwZXIgewotCQkvKioKLQkJICogVGhlIGNhY2hlZCBzaXplLCB3aGljaCBpcyBjb250cm9sJ3Mgc2l6ZS4KLQkJICovCi0JCXByaXZhdGUgUG9pbnQgY2FjaGVkU2l6ZTsKLQotCQkvKioKLQkJICogVGhlIGNvbnRyb2wgdG8gYmUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5jb250cm9sV3JhcHBlcjwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdpdmVuCi0JCSAqIGNvbnRyb2wuCi0JCSAqCi0JCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIGVuY2Fwc3VsYXRlZCBieSB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIENvbnRyb2xXcmFwcGVyKENvbnRyb2wgY29udHJvbCkgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5jb250cm9sICAgID0gY29udHJvbDsKLQkJCXRoaXMuY2FjaGVkU2l6ZSA9IG5ldyBQb2ludCgwLCAwKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWNoZWRTaXplKCkgewotCQkJcmV0dXJuIGNhY2hlZFNpemU7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgUG9pbnQgY2FsY3VsYXRlU2l6ZSgpIHsKLQotCQkJY2FjaGVkU2l6ZSA9IGNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQotCQkJLy8gVXBkYXRlIHJpZ2h0IGF3YXkgdGhlIGNvbnRyb2wncyBHcmlkRGF0YQotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0JCQlpZiAoZ3JpZERhdGEgPT0gbnVsbCkgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQlncmlkRGF0YS53aWR0aEhpbnQgID0gY2FjaGVkU2l6ZS54OwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IGNhY2hlZFNpemUueTsKLQotCQkJLy8gTWFrZSBzdXJlIHRoZSBzaXplIGlzIG5vdCAtMQotCQkJaWYgKGNhY2hlZFNpemUueCA9PSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChjYWNoZWRTaXplLnkgPT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnkgPSAwOwotCQkJfQotCi0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGxvY2tlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJCWZvciAoaW50IGV2ZW50VHlwZSA6IEVWRU5UX1RZUEVTKSB7Ci0JCQkJY29udHJvbC5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFNpemUoUG9pbnQgc2l6ZSkgewotCi0JCQlpZiAoY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFVwZGF0ZSB0aGUgR3JpZERhdGEgd2l0aCB0aGUgbmV3IHNpemUKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb250cm9sLmdldExheW91dERhdGEoKTsKLQotCQkJaWYgKGdyaWREYXRhID09IG51bGwpIHsKLQkJCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCX0KLQotCQkJZ3JpZERhdGEud2lkdGhIaW50ICA9IHNpemUueDsKLQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSBzaXplLnk7Ci0KLQkJCS8vIEZvcmNlIHRoZSBjb250cm9sIHRvIGJlIHJlc2l6ZWQsIGFuZCB0ZWxsIGl0cyBwYXJlbnQgdG8gbGF5b3V0Ci0JCQkvLyBpdHMgd2lkZ2V0cwotCQkJaWYgKHNpemUueCA+IDApIHsKLS8vCQkJCWxvY2tlZCA9IHRydWU7Ci0vLwkJCQl0cnkgIHsKLS8vLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KG5ldyBDb250cm9sW10geyBjb250cm9sIH0pOwotLy8JCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotLy8JCQkJfQotLy8JCQkJZmluYWxseSB7Ci0vLwkJCQkJbG9ja2VkID0gZmFsc2U7Ci0vLwkJCQl9Ci0JCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGNvbnRyb2wuZ2V0Qm91bmRzKCk7Ci0KLQkJCQkvLyBPbmx5IHVwZGF0ZSB0aGUgY29udHJvbCdzIHdpZHRoIGlmIGl0J3MKLQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzaXplCi0JCQkJaWYgKGJvdW5kcy53aWR0aCAhPSBzaXplLngpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotLy8JCQkJCQljb250cm9sLnNldEJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIHNpemUueCwgc2l6ZS55KTsKLQkJCQkJCWNvbnRyb2wuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkKLQkJCQkJewotCQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgQ29udHJvbCBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCi0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIkNhY2hlZCBzaXplPSIpOwotCQkJc2IuYXBwZW5kKGNhY2hlZFNpemUpOwotCQkJc2IuYXBwZW5kKCIsIENvbnRyb2w9Iik7Ci0JCQlzYi5hcHBlbmQoY29udHJvbCk7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgYWRkZWQgdG8gZWFjaCBvZiB0aGUgY29udHJvbCB0aGF0IGlzIG5vdGlmaWVkIGluIG9yZGVyIHRvCi0JICogcmV2YWxpZGF0ZSB0aGUgcHJlZmVycmVkIHNpemUuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lckhhbmRsZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQlDb250cm9sQWxpZ25lci50aGlzLnJldmFsaWRhdGUoZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBoZWxwcyB0byBlbmNhcHN1bGF0ZSBoZXRlcm9nZW5lb3VzIG9iamVjdHMgYW5kCi0JICogYXBwbHkgdGhlIHNhbWUgYmVoYXZpb3Igb24gdGhlbS4KLQkgKi8KLQlwcml2YXRlIGludGVyZmFjZSBXcmFwcGVyIHsKLQkgICAvKioKLQkJICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIHdyYXBwZWQgb2JqZWN0IGluIG9yZGVyIHRvCi0JCSAqIHJlY2VpdmUgbm90aWZpY2F0aW9uIHdoZW4gaXRzIHByb3BlcnR5IGNoYW5nZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JCSAqLwotCQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgY2FjaGVkIHNpemUgb2YgdGhlIGVuY2Fwc3VsYXRlZCBzb3VyY2UuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gPGNvZGU+UG9pbnQ8L2NvZGU+IHdoZXJlIHRoZSB4IGlzIHRoZQotCQkgKiB3aWR0aCBhbmQgdGhlIHkgaXMgdGhlIGhlaWdodCBvZiB0aGUgd2lkZ2V0Ci0JCSAqLwotCQlQb2ludCBjYWNoZWRTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIENhbGN1bGF0ZXMgdGhlIHByZWZlcnJlZCBzaXplIHRoZSB3cmFwcGVkIG9iamVjdCB3b3VsZCB0YWtlIGJ5IGl0c2VsZi4KLQkJICoKLQkJICogQHJldHVybiBUaGUgY2FsY3VsYXRlZCBzaXplCi0JCSAqLwotCQlQb2ludCBjYWxjdWxhdGVTaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiB3aGVuIHJlY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkJICogVGhpcyBoYXBwZW5zIGluIGFuIGhpZXJhcmNoeSBvZiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT5zLgotCQkgKgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByZXZlbnQgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBmcm9tCi0JCSAqIGJlaW5nIGludmFsaWRhdGVkOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JCSAqLwotCQlib29sZWFuIGxvY2tlZCgpOwotCi0JCS8qKgotCQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgPGNvZGU+TGlzdGVuZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKLQkJICovCi0JCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBzaXplIG9uIHRoZSBlbmNhcHN1bGF0ZWQgc291cmNlLgotCQkgKgotCQkgKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNpemUKLQkJICovCi0JCXZvaWQgc2V0U2l6ZShQb2ludCBzaXplKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIG9iamVjdC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgb2JqZWN0IHRoYXQgaXMgYmVlbiB3cmFwcGVkCi0JCSAqLwotCQlPYmplY3Qgc291cmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MjdmZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBpcyByZXNwb25zaWJsZSB0byBzd2l0Y2ggdGhlIGFjdGl2ZSBwYWdlIGJhc2VkIG9uIGEgdmFsdWUuIEEKLSAqIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiBpcyB1c2VkIHRvIHRyYW5zZm9ybWVkIHRoYXQgdmFsdWUgaW50byBhCi0gKiA8Y29kZT5Db250cm9sPC9jb2RlPi4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xTd2l0Y2hlcgotewotCS8qKgotCSAqIFRoZSB3aWRnZXQgdGhhdCBpcyB1c2VkIHRvIHNob3cgdGhlIGFjdGl2ZSA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXI7Ci0KLQlwcml2YXRlIExhYmVsIGVtcHR5TGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRyb2xTd2l0Y2hlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3dpdGNoSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlCi0JICogdGhlIHJpZ2h0IDxjb2RlPkNvbnRyb2w8L2NvZGU+IHdoZW4gcGFzc2VkIHRvIHRoZSBnaXZlbiB0cmFuc2Zvcm1lcgotCSAqIEBwYXJhbSBwYW5lVHJhbnNmb3JtZXIgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgaW50byBhCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKiBAcGFyYW0gcGFnZUJvb2sgVGhlIDxjb2RlPlRyYW5zZm9ybWVyPC9jb2RlPiB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUKLQkgKiBpbnRvIGEgPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgPFQ+IENvbnRyb2xTd2l0Y2hlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjxULCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHN3aXRjaEhvbGRlciwgcGFuZVRyYW5zZm9ybWVyLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjw/LCBDb250cm9sPiBwYW5lVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQl0aGlzLnBhZ2VCb29rICAgICAgICA9IHBhZ2VCb29rOwotCQl0aGlzLnBhbmVUcmFuc2Zvcm1lciA9IHBhbmVUcmFuc2Zvcm1lcjsKLQotCQl0aGlzLmVtcHR5TGFiZWwgPSB0aGlzLmJ1aWxkRW1wdHlMYWJlbCgpOwotCi0JCXN3aXRjaEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQotCQlzd2l0Y2hQYWdlcyhzd2l0Y2hIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLy9CdWlsZCBhbiBlbXB0eSBsYWJlbCB0byBkaXNwbGF5IGluIHRoZSBwYWdlIGJvb2sgd2hlbiB0aGUgcGFuZVRyYW5zZm9ybWVyIHJldHVybnMgbnVsbC4KLQkvL1NXVC5TSEFET1dfTk9ORSBtYWtlcyB0aGUgbGluZSBzZXBhcmF0b3Igbm90IHZpc2libGUKLQkvL1RoaXMgaXMgdGhlIGJlc3Qgd2UgY2FuIGNvbWUgdXAgd2l0aCBmb3IgYW4gZW1wdHkgcGFnZQotCXByaXZhdGUgTGFiZWwgYnVpbGRFbXB0eUxhYmVsKCkgewotCQlyZXR1cm4gbmV3IExhYmVsKHRoaXMucGFnZUJvb2ssIFNXVC5TRVBBUkFUT1IgfCBTV1QuU0hBRE9XX05PTkUgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJc3dpdGNoUGFnZXMoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2hlcyB0aGUgYWN0aXZlIHBhZ2UgYnkgdHJhbnNmb3JtaW5nIHRoZSBnaXZlbiB2YWx1ZSBpbnRvIGl0cwotCSAqIGNvcnJlc3BvbmRpbmcgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgc3RhdGUgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lciBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUKLQkgKiBuZXcgcGFuZQotCSAqLwotCXByaXZhdGUgdm9pZCBzd2l0Y2hQYWdlcyhPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHRoaXMucGFnZUJvb2suaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBSZXRyaWV2ZSB0aGUgQ29udHJvbCBmb3IgdGhlIG5ldyB2YWx1ZQotCQlDb250cm9sIHBhZ2UgPSB0cmFuc2Zvcm0odmFsdWUpOwotCi0JCWlmIChwYWdlID09IG51bGwpIHsKLQkJCS8vTm90ZTogV2UgY2FuJ3QgcGFzcyBpbiBudWxsIGR1ZSB0byBhIGJ1ZyBpbiBQYWdlQm9vawotCQkJcGFnZSA9IHRoaXMuZW1wdHlMYWJlbDsKLQkJfQotCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHBhZ2UpOwotCi0JCS8vIFJldmFsaWRhdGUgdGhlIHBhcmVudHMgaW4gb3JkZXIgdG8gdXBkYXRlIHRoZSBsYXlvdXQKLQkJU1dUVXRpbC5yZWZsb3codGhpcy5wYWdlQm9vayk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb250cm9sIHRyYW5zZm9ybShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICgoVHJhbnNmb3JtZXI8T2JqZWN0LCBDb250cm9sPikgdGhpcy5wYW5lVHJhbnNmb3JtZXIpLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ2ZDI5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHRoYXQgdXBkYXRlcyBhCi0gKiA8Y29kZT5CdXR0b248L2NvZGU+IHdoZW4gcmVxdWlyZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRCdXR0b24gaW1wbGVtZW50cyBMYWJlbGVkQ29udHJvbAotewotCS8qKgotCSAqIFRoZSBidXR0b24gdG8gYmUgdXBkYXRlZCB3aXRoIGEgZGlmZmVyZW50IGljb24gYW5kIHRleHQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQnV0dG9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiB0aGF0IHdpbGwgaGF2ZSBpdHMgdGV4dCBhbmQgaWNvbiB1cGRhdGVkIHdoZW4KLQkgKiByZXF1aXJlZAotCSAqIEBleGNlcHRpb24gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiA8Y29kZT5CdXR0b248L2NvZGU+IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGFiZWxlZEJ1dHRvbihCdXR0b24gYnV0dG9uKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChidXR0b24sICJUaGUgYnV0dG9uIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWlmICghdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JCQl0aGlzLmJ1dHRvbi5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQkJdGhpcy5idXR0b24uZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlZjBkYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgYSB3aWRnZXQgYW5kIHVwZGF0ZQotICogaXRzIHByb3BlcnRpZXMgKGljb24gYW5kIHRleHQpLgotICoKLSAqIEBzZWUgTGFiZWxlZEJ1dHRvbgotICogQHNlZSBMYWJlbGVkTGFiZWwKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMYWJlbGVkQ29udHJvbCB7Ci0JLyoqCi0JICogUGFzc2VzIHRoZSBpbWFnZSBzbyB0aGUgd3JhcHBlZCBjb21wb25lbnQgY2FuIHJlY2VpdmUgaXQuCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgVGhlIG5ldyA8Y29kZT5JbWFnZTwvY29kZT4KLQkgKi8KLQl2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKTsKLQotCS8qKgotCSAqIFBhc3NlcyB0aGUgdGV4dCBzbyB0aGUgd3JhcHBlZCBjb21wb25lbnQgY2FuIHJlY2VpdmUgaXQuCi0JICoKLQkgKiBAcGFyYW0gdGV4dCBUaGUgbmV3IHRleHQKLQkgKi8KLQl2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmU5ODEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogVGhpcyB1cGRhdGVyIGlzIHJlc3BvbnNpYmxlIHRvIHVwZGF0ZSB0aGUgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHdoZW4KLSAqIHRoZSB0ZXh0IGFuZCB0aGUgaWNvbiBuZWVkIHRvIGNoYW5nZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZENvbnRyb2xVcGRhdGVyIHsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVyIGFyb3VuZCBhIGNvbnRyb2wgdGhhdCBoYXMgdGV4dCBhbmQgaWNvbi4KLQkgKi8KLQlwcml2YXRlIExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQ29udHJvbFVwZGF0ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxhYmVsZWRDb250cm9sIFRoZSB3cmFwcGVyIGFyb3VuZCB0aGUgY29udHJvbCB0aGF0IG5lZWRzIHRvCi0JICogaGF2ZSBpdHMgdGV4dCB1cGRhdGVkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciB0aGlzIGNsYXNzIHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzCi0JICovCi0JcHVibGljIExhYmVsZWRDb250cm9sVXBkYXRlcihMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpCi0JewotCQl0aGlzKGxhYmVsZWRDb250cm9sLCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRDb250cm9sVXBkYXRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxlZENvbnRyb2wgVGhlIHdyYXBwZXIgYXJvdW5kIHRoZSBjb250cm9sIHRoYXQgbmVlZHMgdG8KLQkgKiBoYXZlIGl0cyBpbWFnZSBhbmQgdGV4dCB1cGRhdGVkCi0JICogQHBhcmFtIGltYWdlSG9sZGVyIFRoZSBob2xkZXIgdGhpcyBjbGFzcyB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcyBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0ZXh0IG5ldmVyIGNoYW5nZXMKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIHRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgaW1hZ2UgbmV2ZXIgY2hhbmdlcwotCSAqLwotCXB1YmxpYyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlcikKLQl7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUobGFiZWxlZENvbnRyb2wsIHRleHRIb2xkZXIsIGltYWdlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJY29uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRJY29uTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEljb25MaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMYWJlbGVkQ29udHJvbFVwZGF0ZXIudGhpcy5zZXRJbWFnZSgoSW1hZ2UpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxhYmVsZWRDb250cm9sVXBkYXRlci5pbWFnZUxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRUZXh0TGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlMYWJlbGVkQ29udHJvbFVwZGF0ZXIudGhpcy5zZXRUZXh0KChTdHJpbmcpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxhYmVsZWRDb250cm9sVXBkYXRlci50ZXh0TGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlcikKLQl7Ci0JCUFzc2VydC5pc05vdE51bGwobGFiZWxlZENvbnRyb2wsICJUaGUgTGFiZWxlZENvbnRyb2wgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmxhYmVsZWRDb250cm9sID0gbGFiZWxlZENvbnRyb2w7Ci0KLQkJaWYgKHRleHRIb2xkZXIgIT0gbnVsbCkgewotCQkJdGV4dEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVpbGRUZXh0TGlzdGVuZXIoKSk7Ci0JCQlzZXRUZXh0KHRleHRIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlpZiAoaW1hZ2VIb2xkZXIgIT0gbnVsbCkgewotCQkJaW1hZ2VIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1aWxkSWNvbkxpc3RlbmVyKCkpOwotCQkJc2V0SW1hZ2UoaW1hZ2VIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaWNvbikgewotCQlsYWJlbGVkQ29udHJvbC5zZXRJbWFnZShpY29uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCi0JCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCXRleHQgPSAiIjsKLQkJfQotCi0JCWxhYmVsZWRDb250cm9sLnNldFRleHQodGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0ZWYwNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5MYWJlbGVkQ29udHJvbDwvY29kZT4gdGhhdCB1cGRhdGVzIGFuCi0gKiA8Y29kZT5MYWJlbDwvY29kZT4gd2hlbiByZXF1aXJlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZExhYmVsIGltcGxlbWVudHMgTGFiZWxlZENvbnRyb2wKLXsKLQkvKioKLQkgKiBUaGUgbGFiZWwgdG8gYmUgdXBkYXRlZCB3aXRoIGEgZGlmZmVyZW50IGljb24gYW5kIHRleHQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMYWJlbCBsYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFiZWxlZEJ1dHRvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRoYXQgd2lsbCBoYXZlIGl0cyB0ZXh0IGFuZCBpY29uIHVwZGF0ZWQgd2hlbgotCSAqIHJlcXVpcmVkCi0JICogQGV4Y2VwdGlvbiBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIDxjb2RlPkxhYmVsPC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIExhYmVsZWRMYWJlbChMYWJlbCBsYWJlbCkgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwobGFiZWwsICJUaGUgbGFiZWwgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIGltYWdlKSB7Ci0JCWlmICghdGhpcy5sYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQkJdGhpcy5sYWJlbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCWlmICghdGhpcy5sYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJCXRoaXMubGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxNWM3Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4ga2VlcHMgdGhlICJlbmFibGVkIiBzdGF0ZSBvZiBhIGNvbGxlY3Rpb24gb2YKLSAqIGNvbnRyb2xzIGluIHN5bmNoIHdpdGggdGhlIHByb3ZpZGVkIGJvb2xlYW4gaG9sZGVyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGFuZUVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+Li4uIHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihwYW5lcyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLQkgKiBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhbmUpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBQYW5lPD8+W10gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYUNvbnRyb2xsZXJFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCSAqIG9mKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFDb250cm9sbGVyRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLml0ZXJhdG9yKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYUNvbnRyb2xsZXJFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IHdyYXAoSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQYW5lPD8+LCBDb250cm9sSG9sZGVyPihwYW5lcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oUGFuZTw/PiBwYW5lKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYW5lSG9sZGVyKHBhbmUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBob2xkcyBvbnRvIGFuIDxjb2RlPlBhbmU8L2NvZGU+IGFuZCB1cGRhdGUgaXRzIGVuYWJsZWQKLQkgKiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYW5lSG9sZGVyIGltcGxlbWVudHMgQ29udHJvbEhvbGRlciB7Ci0JCXByaXZhdGUgZmluYWwgUGFuZTw/PiBwYW5lOwotCi0JCVBhbmVIb2xkZXIoUGFuZTw/PiBwYW5lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYW5lID0gcGFuZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJCWlmICghdGhpcy5wYW5lLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl0aGlzLnBhbmUuZW5hYmxlV2lkZ2V0cyhzdGF0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgxODM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiBrZWVwcyB0aGUgInZpc2libGUiIHN0YXRlIG9mIGEKLSAqIGNvbGxlY3Rpb24gb2YgY29udHJvbHMgaW4gc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIgZXh0ZW5kcyBTdGF0ZUNvbnRyb2xsZXIKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gbm90IHZpc2libGUpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYW5lPD8+Li4uIHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihwYW5lcyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBwYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihwYW5lKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PltdIHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLml0ZXJhdG9yKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZQotCSAqIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIHdyYXAocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gd3JhcChJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBhbmU8Pz4sIENvbnRyb2xIb2xkZXI+KHBhbmVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sSG9sZGVyIHRyYW5zZm9ybShQYW5lPD8+IHBhbmUpIHsKLQkJCQlyZXR1cm4gbmV3IFBhbmVIb2xkZXIocGFuZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaG9sZGVyIGhvbGRzIG9udG8gYW4gPGNvZGU+UGFuZTwvY29kZT4gYW5kIHVwZGF0ZSBpdHMgdmlzaWJsZQotCSAqIHN0YXRlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBhbmVIb2xkZXIgaW1wbGVtZW50cyBDb250cm9sSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBQYW5lPD8+IHBhbmU7Ci0KLQkJUGFuZUhvbGRlcihQYW5lPD8+IHBhbmUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhbmUgPSBwYW5lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQkJdGhpcy5wYW5lLnNldFZpc2libGUoc3RhdGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzY1ODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1NXVFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLk51bGxQb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5Qb3N0RXhlY3V0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLldpZGdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TY3JvbGxlZEZvcm07Ci0KLS8qKgotICogQSBzdWl0ZSBvZiB1dGlsaXR5IG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgdXNlciBpbnRlcmZhY2UuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNXVFV0aWwgewotCi0JLyoqCi0JICogQ2F1c2VzIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBnaXZlbiBydW5uYWJsZSB0byBiZSBpbnZva2VkCi0JICogYnkgdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZCBhdCB0aGUgbmV4dCByZWFzb25hYmxlIG9wcG9ydHVuaXR5LiBUaGUgY2FsbGVyCi0JICogb2YgdGhpcyBtZXRob2QgY29udGludWVzIHRvIHJ1biBpbiBwYXJhbGxlbCwgYW5kIGlzIG5vdCBub3RpZmllZCB3aGVuIHRoZQotCSAqIHJ1bm5hYmxlIGhhcyBjb21wbGV0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcnVubmFibGUgQ29kZSB0byBydW4gb24gdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZAotCSAqIEBleGNlcHRpb24gb3JnLmVjbGlwc2Uuc3d0LlNXVEV4Y2VwdGlvbgotCSAqIDx1bD4KLQkgKiA8bGk+RVJST1JfREVWSUNFX0RJU1BPU0VEIC0gaWYgdGhlIHJlY2VpdmVyIGhhcyBiZWVuIGRpc3Bvc2VkPC9saT4KLQkgKiA8L3VsPgotCSAqIEBzZWUgI3N5bmNFeGVjCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQlnZXRTdGFuZGFyZERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrcyB0aGUgZ2l2ZW4gPGNvZGU+Q29tYm88L2NvZGU+IHRvIHJlbW92ZSB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZQotCSAqIHdpZGdldCByZWNlaXZlcyB0aGUgZm9jdXMgYW5kIHRvIHNob3cgdGhlIGRlZmF1bHQgd2hlbiB0aGUgd2lkZ2V0IGxvc2VzCi0JICogdGhlIGZvY3VzLgotCSAqCi0JICogQHBhcmFtIGNvbWJvIFRoZSB3aWRnZXQgaGF2aW5nIGEgZGVmYXVsdCB2YWx1ZSB0aGF0IGlzIGFsd2F5cyBhdCB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihDb21ibyBjb21ibykgewotCQlDb21ib0hhbmRsZXIgaGFuZGxlciA9IG5ldyBDb21ib0hhbmRsZXIoKTsKLQkJY29tYm8uYWRkRm9jdXNMaXN0ZW5lcihoYW5kbGVyKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoaGFuZGxlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGVDbGFzcyBUaGUgY2xhc3MgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGtleSwgaXRzIHNob3J0IGNsYXNzCi0JICogbmFtZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY29tcG9zaXRlQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoY29tcG9zaXRlQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCJfIik7Ci0JCXNiLmFwcGVuZCh2YWx1ZS50b1N0cmluZygpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ly9idWcgMjM0OTUzCi0JCS8vVE9ETyBpbiBhIGZ1dHVyZSByZWxlYXNlIHdlIHNob3VsZCBub3QgYmUgY29udmVydGluZyB0aGUga2V5IHVzaW5nIHRvTG93ZXJDYXNlKCkKLQotCQlyZXR1cm4gKFN0cmluZykgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUobmxzQ2xhc3MsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCi0JICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQotCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgotCSAqCi0JICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKLQkgKiBAcGFyYW0gY29tcG9zaXRlIFRoZSBvYmplY3QgdXNlZCB0byByZXRyaWV2ZSB0aGUgc2hvcnQgY2xhc3MgbmFtZSB0aGF0IGlzCi0JICogdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoQ2xhc3M8Pz4gbmxzQ2xhc3MsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSkgewotCi0JCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcobmxzQ2xhc3MsIGNvbXBvc2l0ZS5nZXRDbGFzcygpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+UnVubmFibGU8L2NvZGU+IHRoYXQgd2lsbCBpbnZva2UgdGhlIGdpdmVuCi0JICogPGNvZGU+UG9zdEV4ZWN1dGlvbjwvY29kZT4gaW4gb3JkZXIgdG8gaXRzIGV4ZWN1dGlvbiB0byBiZSBkb25lIGluIHRoZQotCSAqIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBkaWFsb2cgVGhlIGRpYWxvZyB0aGF0IHdhcyBqdXN0IGRpcG9zZWQKLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGUgcG9zdCBleGVjdXRpb24gb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICogQHJldHVybiBUaGUgPGNvZGU+UnVubmFibGU8L2NvZGU+IHRoYXQgd2lsbCBpbnZva2UKLQkgKiB7QGxpbmsgUG9zdEV4ZWN1dGlvbiNleGVjdXRlKERpYWxvZyl9Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPEQxIGV4dGVuZHMgRGlhbG9nLCBEMiBleHRlbmRzIEQxPgotCQlSdW5uYWJsZSBidWlsZFBvc3RFeGVjdXRpb25SdW5uYWJsZSgKLQkJCWZpbmFsIEQxIGRpYWxvZywKLQkJCWZpbmFsIFBvc3RFeGVjdXRpb248RDI+IHBvc3RFeGVjdXRpb24pIHsKLQotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNldFVzZXJJbnRlcmZhY2VBY3RpdmUoZmFsc2UpOwotCQkJCXRyeSB7Ci0JCQkJCXBvc3RFeGVjdXRpb24uZXhlY3V0ZSgoRDIpIGRpYWxvZyk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlzZXRVc2VySW50ZXJmYWNlQWN0aXZlKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgc2hlbGwuIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcwotCSAqIG5vdCB0aGUgVUkgdGhyZWFkLCB0aGVuIGFuIGludmFsaWQgdGhyZWFkIGFjY2VzcyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzaGVsbCwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFNoZWxsIGdldFNoZWxsKCkgewotCi0JCS8vIFJldHJpZXZlIHRoZSBhY3RpdmUgc2hlbGwsIHdoaWNoIGNhbiBiZSB0aGUgc2hlbGwgZnJvbSBhbnkgd2luZG93Ci0JCVNoZWxsIHNoZWxsID0gZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQotCQkvLyBObyBzaGVsbCBjb3VsZCBiZSBmb3VuZCwgcmV2ZXJ0IGJhY2sgdG8gdGhlIGFjdGl2ZSB3b3JrYmVuY2ggd2luZG93Ci0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCX0KLQotCQkvLyBNYWtlIHN1cmUgaXQncyBuZXZlciBudWxsCi0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlzaGVsbCA9IG5ldyBTaGVsbChnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpKTsKLQkJfQotCi0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZiB0aGUKLQkgKiB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNwbGF5LiBJZiBzbywgdGhpcyBkaXNwbGF5Ci0JICogaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzcGxheSBpZiBub3QgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlIHRoZSBkZWZhdWx0Ci0JICogZGlzcGxheSBpcyByZXR1cm5lZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKQotCXsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0KLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkgewotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFibGVIZWlnaHRIaW50KFRhYmxlIHRhYmxlLCBpbnQgcm93cykgewotCQlpZiAodGFibGUuZ2V0Rm9udCgpLmVxdWFscyhKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpKSkKLQkJCXRhYmxlLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJaW50IHJlc3VsdD0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogcm93cyArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpOwotCQlpZiAodGFibGUuZ2V0TGluZXNWaXNpYmxlKCkpCi0JCQlyZXN1bHQrPSB0YWJsZS5nZXRHcmlkTGluZVdpZHRoKCkgKiAocm93cyAtIDEpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotICAgLyoqCi0JICogUmV0dXJucyB0aGUgUGxhdGZvcm0gVUkgd29ya2JlbmNoLgotCSAqCi0JICogQHJldHVybiBUaGUgd29ya2JlbmNoIGZvciB0aGlzIHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWxheXMgb3V0IHRoZSBwYXJlbnRzIG9mIHRoZSA8Y29kZT5Db250cm9sPC9jb2RlPi4gVGhpcyB3YXMgdGFrZW4gZnJvbQotCSAqIHRoZSB3aWRnZXQgPGNvZGU+U2VjdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZXZhbGlkYXRlIGFzIHdlbGwgYXMgaXRzIHBhcmVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVmbG93KENvbXBvc2l0ZSBwYW5lKSB7Ci0KLQkJZm9yIChDb21wb3NpdGUgY29tcG9zaXRlID0gcGFuZTsgY29tcG9zaXRlICE9IG51bGw7ICkgewotCQkJY29tcG9zaXRlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0gfHwgY29tcG9zaXRlIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHBhbmU7IGNvbXBvc2l0ZSAhPSBudWxsOyApIHsKLQkJCWNvbXBvc2l0ZS5sYXlvdXQodHJ1ZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0pIHsKLQkJCQkoKFNjcm9sbGVkRm9ybSkgY29tcG9zaXRlKS5yZWZsb3codHJ1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKENvbXBvc2l0ZSBjb21wb3NpdGUgPSBwYW5lOyBjb21wb3NpdGUgIT0gbnVsbDsgKSB7Ci0JCQljb21wb3NpdGUuc2V0UmVkcmF3KHRydWUpOwotCQkJY29tcG9zaXRlID0gY29tcG9zaXRlLmdldFBhcmVudCgpOwotCi0JCQlpZiAoY29tcG9zaXRlIGluc3RhbmNlb2YgU2Nyb2xsZWRGb3JtIHx8IGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNoZWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIGVudGlyZSBzaGVsbCBhbmQgaXRzIHdpZGdldHMgc2hvdWxkIGJlIGVuYWJsZWQgb3IKLQkgKiBldmVyeXRoaW5nIHNob3VsZCBiZSB1bmFjY2Vzc2libGUuCi0JICoKLQkgKiBAcGFyYW0gYWN0aXZlIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgYWxsIHRoZSBVSSBhY3RpdmUgb3RoZXJ3aXNlCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGRlYWN0aXZhdGUgaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlckludGVyZmFjZUFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQlTaGVsbFtdIHNoZWxscyA9IGdldFN0YW5kYXJkRGlzcGxheSgpLmdldFNoZWxscygpOwotCi0JCWZvciAoU2hlbGwgc2hlbGwgOiBzaGVsbHMpIHsKLQkJCXNoZWxsLnNldEVuYWJsZWQoYWN0aXZlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoZSBzcGVjaWZpZWQgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nIFRoZSBkaWFsb2cgdG8gc2hvdyBvbiBzY3JlZW4KLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGlzIGludGVyZmFjZSBsZXQgdGhlIGNhbGxlciB0byBpbnZva2UgYSBwaWVjZSBvZgotCSAqIGNvZGUgb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIHN0YXRpYyA8RDEgZXh0ZW5kcyBEaWFsb2csIEQyIGV4dGVuZHMgRDE+Ci0JCXZvaWQgc2hvdyhmaW5hbCBEMSBkaWFsb2csIGZpbmFsIFBvc3RFeGVjdXRpb248RDI+IHBvc3RFeGVjdXRpb24pIHsKLQotCQl0cnkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChkaWFsb2csICAgICAgICAiVGhlIGRpYWxvZyBjYW5ub3QgYmUgbnVsbCIpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChwb3N0RXhlY3V0aW9uLCAiVGhlIFBvc3RFeGVjdXRpb24gY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCQljYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIE1ha2Ugc3VyZSB0aGUgVUkgaXMgaW50ZXJhY3RpdmUKLQkJCXNldFVzZXJJbnRlcmZhY2VBY3RpdmUodHJ1ZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0KLQkJbmV3IFRocmVhZCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFzeW5jRXhlYygKLQkJCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCXNob3dJbXAoZGlhbG9nLCBwb3N0RXhlY3V0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX0uc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBsYXVuY2hlcyB0aGUgc3BlY2lmaWVkIGRpYWxvZyBpbiB0aGUgVUkgdGhyZWFkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRvIHNob3cgb24gc2NyZWVuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNob3coRGlhbG9nIGRpYWxvZykgewotCQlzaG93KGRpYWxvZywgTnVsbFBvc3RFeGVjdXRpb24uPERpYWxvZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3luY2hyb25vdXNseSBsYXVuY2hlcyB0aGUgc3BlY2lmaWVkIGRpYWxvZyBpbiB0aGUgVUkgdGhyZWFkLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZyBUaGUgZGlhbG9nIHRvIHNob3cgb24gc2NyZWVuCi0JICogQHBhcmFtIHBvc3RFeGVjdXRpb24gVGhpcyBpbnRlcmZhY2UgbGV0IHRoZSBjYWxsZXIgdG8gaW52b2tlIGEgcGllY2Ugb2YKLQkgKiBjb2RlIG9uY2UgdGhlIGRpYWxvZyBpcyBkaXNwb3NlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxEMSBleHRlbmRzIERpYWxvZywgRDIgZXh0ZW5kcyBEMT4KLQkJdm9pZCBzaG93SW1wKEQxIGRpYWxvZywgUG9zdEV4ZWN1dGlvbjxEMj4gcG9zdEV4ZWN1dGlvbikgewotCi0JCXNldFVzZXJJbnRlcmZhY2VBY3RpdmUodHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKHBvc3RFeGVjdXRpb24gIT0gTnVsbFBvc3RFeGVjdXRpb24uPEQyPmluc3RhbmNlKCkpIHsKLQkJCWFzeW5jRXhlYyhidWlsZFBvc3RFeGVjdXRpb25SdW5uYWJsZShkaWFsb2csIHBvc3RFeGVjdXRpb24pKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhdXNlcyB0aGUgPGNvZGU+cnVuKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gcnVubmFibGUgdG8gYmUgaW52b2tlZAotCSAqIGJ5IHRoZSB1c2VyLWludGVyZmFjZSB0aHJlYWQgYXQgdGhlIG5leHQgcmVhc29uYWJsZSBvcHBvcnR1bml0eS4gVGhlCi0JICogdGhyZWFkIHdoaWNoIGNhbGxzIHRoaXMgbWV0aG9kIGlzIHN1c3BlbmRlZCB1bnRpbCB0aGUgcnVubmFibGUgY29tcGxldGVzLgotCSAqCi0JICogQHBhcmFtIHJ1bm5hYmxlIGNvZGUgdG8gcnVuIG9uIHRoZSB1c2VyLWludGVyZmFjZSB0aHJlYWQuCi0JICogQHNlZSAjYXN5bmNFeGVjCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWdldFN0YW5kYXJkRGlzcGxheSgpLnN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCdzIHRoZSBVSSBldmVudCB0aHJlYWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1aVRocmVhZCgpIHsKLQkJcmV0dXJuIGdldFN0YW5kYXJkRGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZCBieSB1c2luZyB0aGUKLQkgKiB0aHJlYWQgZnJvbSB3aGljaCB0aGUgZ2l2ZW4gdmlld2VyJ3MgZGlzcGxheSB3YXMgaW5zdGFudGlhdGVkLgotCSAqCi0JICogQHBhcmFtIHZpZXdlciBUaGUgdmlld2VyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHRocmVhZAotCSAqIGlzIHRoZSBVSSBldmVudCB0aHJlYWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdWlUaHJlYWQoVmlld2VyIHZpZXdlcikgewotCQlyZXR1cm4gdWlUaHJlYWQodmlld2VyLmdldENvbnRyb2woKSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgdGhlIFVJIGV2ZW50IHRocmVhZCBieSB1c2luZyB0aGUKLQkgKiB0aHJlYWQgZnJvbSB3aGljaCB0aGUgZ2l2ZW4gd2lkZ2V0J3MgZGlzcGxheSB3YXMgaW5zdGFudGlhdGVkLgotCSAqCi0JICogQHBhcmFtIHdpZGdldCBUaGUgd2lkZ2V0IHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHRocmVhZAotCSAqIGlzIHRoZSBVSSBldmVudCB0aHJlYWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdWlUaHJlYWQoV2lkZ2V0IHdpZGdldCkgewotCQlyZXR1cm4gd2lkZ2V0LmdldERpc3BsYXkoKS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuIHRoZSBjb21ibwotCSAqIGhhcyB0aGUgZm9jdXMgb3Igd2hlbiB0aGUgc2VsZWN0ZWQgaXRlbSBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBhbmQgdG8gc2VsZWN0Ci0JICogaXQgd2hlbiB0aGUgY29tYm8gbG9zZXMgdGhlIGZvY3VzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbWJvSGFuZGxlciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvY3VzTGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIGZvY3VzR2FpbmVkKEZvY3VzRXZlbnQgZSkgewotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwotCi0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSB7CQotCQkJCS8vIFRoZSB0ZXh0IHNlbGVjdGlvbiBoYXMgdG8gYmUgY2hhbmdlZCBvdXRzaWRlIG9mIHRoZSBjb250ZXh0IG9mIHRoaXMKLQkJCQkvLyBsaXN0ZW5lciBvdGhlcndpc2UgdGhlIGNvbWJvIHdvbid0IHVwZGF0ZSBiZWNhdXNlIGl0J3MgY3VycmVudGx5Ci0JCQkJLy8gbm90aWZ5aW5nIGl0cyBsaXN0ZW5lcnMKLQkJCQlhc3luY0V4ZWMobmV3IFNlbGVjdFRleHQoY29tYm8pKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCS8vZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0KLQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLQotCQkJaWYgKGNvbWJvLmlzRm9jdXNDb250cm9sKCkgJiYKLQkJCSAgICBjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDApIHsKLQotCQkJCS8vIFRoZSB0ZXh0IGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwotCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKLQkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgTW9kaWZ5VGV4dChjb21ibykpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBjbGFzcyBNb2RpZnlUZXh0IGltcGxlbWVudHMgUnVubmFibGUgewotCQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQotCQkJcHVibGljIE1vZGlmeVRleHQoQ29tYm8gY29tYm8pIHsKLQkJCQlzdXBlcigpOwotCQkJCXRoaXMuY29tYm8gPSBjb21ibzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0KLQkJCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXRleHQgPSB0aGlzLmNvbWJvLmdldEl0ZW0oMCk7Ci0JCQkJCXRoaXMuY29tYm8uc2V0VGV4dCh0ZXh0KTsKLQkJCQl9Ci0KLQkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBjbGFzcyBTZWxlY3RUZXh0IGltcGxlbWVudHMgUnVubmFibGUgewotCQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQotCQkJcHVibGljIFNlbGVjdFRleHQoQ29tYm8gY29tYm8pIHsKLQkJCQlzdXBlcigpOwotCQkJCXRoaXMuY29tYm8gPSBjb21ibzsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmICh0aGlzLmNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cmluZyB0ZXh0ID0gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0JCQkJdGhpcy5jb21iby5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIHRleHQubGVuZ3RoKCkpKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzEzZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1N0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiBrZWVwcyB0aGUgc3RhdGUgb2YgYSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgaW4KLSAqIHN5bmNoIHdpdGggdGhlIHByb3ZpZGVkIGJvb2xlYW4gaG9sZGVyLgotICoKLSAqIEBzZWUgQ29udHJvbEVuYWJsZXIKLSAqIEBzZWUgQ29udHJvbFZpc2liaWxpdHlFbmFibGVyCi0gKiBAc2VlIFBhbmVFbmFibGVyCi0gKiBAc2VlIFBhbmVWaXNpYmlsaXR5RW5hYmxlcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWFic3RyYWN0IGNsYXNzIFN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGNvbnRyb2xIb2xkZXJzIHdpdGggY2hhbmdlcwotCSAqIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVyczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBzdGF0ZTsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4uCi0JICovCi0JU3RhdGVDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBjb250cm9sSG9sZGVycywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcygpOwotCQlpbml0aWFsaXplKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xIb2xkZXJzLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVyIFRoZSA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPiB3aG9zZSBzdGF0ZSBpcyBrZXB0Ci0JICogaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xIb2xkZXIsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXIuLi4gY29udHJvbEhvbGRlcnMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVyIFRoZSA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPiB3aG9zZSBzdGF0ZSBpcyBrZXB0Ci0JICogaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgbmV3IENvbnRyb2xIb2xkZXJbXSB7IGNvbnRyb2xIb2xkZXIgfSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXJbXSBjb250cm9sSG9sZGVycywKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIEFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuCi0JICogaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4KLQkgKiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJaW5pdGlhbGl6ZShib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihjb250cm9sSG9sZGVycyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYm9vbGVhbiBwcmltaXRpdmUgb2YgdGhlIGdpdmVuIDxjb2RlPkJvb2xlYW48L2NvZGU+IHZhbHVlIGJ1dAotCSAqIGFsc28gY2hlY2tzIGZvciA8Y29kZT5udWxsPC9jb2RlPiwgaWYgdGhhdCBpcyB0aGUgY2FzZSwgdGhlbgotCSAqIHtAbGluayAjZGVmYXVsdFZhbHVlfSBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4gdmFsdWUgdG8gYmUgcmV0dXJuZWQgYXMgYSBwcmltaXRpdmUKLQkgKiBAcmV0dXJuIFRoZSBwcmltaXRpdmUgb2YgdGhlIGdpdmVuIHZhbHVlIG9yIHtAbGluayAjZGVmYXVsdFZhbHVlfXdoZW4gdGhlCi0JICogdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBib29sZWFuIGhvbGRlci4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlN0YXRlQ29udHJvbGxlci5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGxpc3RlbmVyIGZvciB0aGUgYm9vbGVhbiBob2xkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVTdGF0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJTdGF0ZUNvbnRyb2xsZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiA8Y29kZT5JdGVyYXRvcjwvY29kZT4gb3ZlciB0aGUgY29sbGVjdGlvbiBvZgotCSAqIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGl0ZXJhdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxDb250cm9sSG9sZGVyPih0aGlzLmNvbnRyb2xIb2xkZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gYnkgYnVpbGRpbmcgdGhlIGFwcHJvcHJpYXRlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBlbmFibGVtZW50IHN0YXRlCi0JICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkJCQkJCQkJCSAgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKLQkJCQkJCQkJCSAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGJvb2xlYW5Ib2xkZXIsICAiVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSBjYW5ub3QgYmUgbnVsbCIpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2xIb2xkZXJzLCAiVGhlIGNvbGxlY3Rpb24gb2YgQ29udHJvbEhvbGRlcnMgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmNvbnRyb2xIb2xkZXJzID0gbmV3IEFycmF5TGlzdDxDb250cm9sSG9sZGVyPihjb250cm9sSG9sZGVycyk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlICAgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciAgPSBib29sZWFuSG9sZGVyOwotCi0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIKLQkJKTsKLQotCQl0aGlzLnVwZGF0ZVN0YXRlKCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGNvbnRyb2wgaG9sZGVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0ZSgpIHsKLQkJdGhpcy51cGRhdGVTdGF0ZShib29sZWFuVmFsdWUodGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgPGNvZGU+Q29udHJvbDwvY29kZT5zLgotCSAqCi0JICogQHBhcmFtIHN0YXRlIFRoZSBuZXcgc3RhdGUgdGhlIHdpZGdldHMgbmVlZCB0byBoYXZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdGUoYm9vbGVhbiBzdGF0ZSkgewotCQlmb3IgKENvbnRyb2xIb2xkZXIgY29udHJvbEhvbGRlciA6IHRoaXMuY29udHJvbEhvbGRlcnMpIHsKLQkJCWNvbnRyb2xIb2xkZXIudXBkYXRlU3RhdGUoc3RhdGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGhvbGRlciBvZiB0aGUgYWN0dWFsIHdpZGdldC4KLQkgKi8KLQlzdGF0aWMgaW50ZXJmYWNlIENvbnRyb2xIb2xkZXIgewotCi0JCS8qKgotCQkgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgd3JhcHBlZCBjb250cm9sLgotCQkgKgotCQkgKiBAcGFyYW0gc3RhdGUgVGhlIG5ldyBzdGF0ZSB0aGUgY29udHJvbCBzaG91bGQgaGF2ZQotCQkgKi8KLQkJdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTg3OTBjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8gY29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnV0aWwuVGFibGVMYXlvdXRDb21wb3NpdGUKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5MYXlvdXREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uUGl4ZWxEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLQotLyoqCi0gKiBBIHNwZWNpYWwgY29tcG9zaXRlIHRvIGxheW91dCBjb2x1bW5zIGluc2lkZSBhIHRhYmxlLiBUaGUgY29tcG9zaXRlIGlzIG5lZWRlZCBzaW5jZSB3ZSBoYXZlCi0gKiB0byBsYXlvdXQgdGhlIGNvbHVtbnMgImJlZm9yZSIgdGhlIGFjdHVhbCB0YWJsZSBnZXRzIGxheW91dGVkLiBIZW5jZSB3ZSBjYW4ndCB1c2UgYSBub3JtYWwKLSAqIGxheW91dCBtYW5hZ2VyLgotICogPHA+Ci0gKiBYWFg6IFNob3VsZCBzd2l0Y2ggdG8gdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuVGFibGVDb2x1bW5MYXlvdXR9LgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgVGFibGVMYXlvdXRDb21wb3NpdGUgZXh0ZW5kcyBDb21wb3NpdGUgewotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBleHRyYSBwaXhlbHMgdGFrZW4gYXMgaG9yaXpvbnRhbCB0cmltIGJ5IHRoZSB0YWJsZSBjb2x1bW4uCi0JICogVG8gZW5zdXJlIHRoZXJlIGFyZSBOIHBpeGVscyBhdmFpbGFibGUgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBjb2x1bW4sCi0JICogYXNzaWduIE4rQ09MVU1OX1RSSU0gZm9yIHRoZSBjb2x1bW4gd2lkdGguCi0JICogPHA+Ci0JICogWFhYOiBTaG91bGQgZWl0aGVyIHN3aXRjaCB0byB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5UYWJsZUNvbHVtbkxheW91dH0gb3IgZ2V0IEFQSSBmcm9tIEpGYWNlIG9yIFNXVCwgc2VlOiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE4NDgzCi0JICogPC9wPgotCSAqCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBDT0xVTU5fVFJJTTsKLQlzdGF0aWMgewotCQlTdHJpbmcgcGxhdGZvcm09IFNXVC5nZXRQbGF0Zm9ybSgpOwotCQlpZiAoIndpbjMyIi5lcXVhbHMocGxhdGZvcm0pKSAvLyROT04tTkxTLTEkCi0JCQlDT0xVTU5fVFJJTT0gNDsKLQkJZWxzZSBpZiAoImNhcmJvbiIuZXF1YWxzKHBsYXRmb3JtKSkgLy8kTk9OLU5MUy0xJAotCQkJQ09MVU1OX1RSSU09IDI0OwotCQllbHNlCi0JCQlDT0xVTU5fVFJJTT0gMzsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHN0eWxlIHRoZSBTV1Qgc3R5bGUKLQkgKi8KLQlwdWJsaWMgVGFibGVMYXlvdXRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotICAgICAgICBhZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotICAgICAgICAgICAgcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgICAgICAgICBSZWN0YW5nbGUgYXJlYT0gZ2V0Q2xpZW50QXJlYSgpOwotICAgICAgICAgICAgICAgIFRhYmxlIHRhYmxlPSAoVGFibGUpZ2V0Q2hpbGRyZW4oKVswXTsKLSAgICAgICAgICAgICAgICBQb2ludCBwcmVmZXJyZWRTaXplPSBjb21wdXRlVGFibGVTaXplKHRhYmxlKTsKLSAgICAgICAgICAgICAgICBpbnQgd2lkdGg9IGFyZWEud2lkdGggLSAyICogdGFibGUuZ2V0Qm9yZGVyV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJlZmVycmVkU2l6ZS55ID4gYXJlYS5oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3VidHJhY3QgdGhlIHNjcm9sbGJhciB3aWR0aCBmcm9tIHRoZSB0b3RhbCBjb2x1bW4gd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIgd2lsbCBiZSByZXF1aXJlZAotICAgICAgICAgICAgICAgICAgICBQb2ludCB2QmFyU2l6ZSA9IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICB3aWR0aCAtPSB2QmFyU2l6ZS54OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsYXlvdXRUYWJsZSh0YWJsZSwgd2lkdGgsIGFyZWEsIHRhYmxlLmdldFNpemUoKS54IDwgYXJlYS53aWR0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBuZXcgY29sdW1uIG9mIGRhdGEgdG8gdGhpcyB0YWJsZSBsYXlvdXQuCi0JICoKLQkgKiBAcGFyYW0gZGF0YSB0aGUgY29sdW1uIGxheW91dCBkYXRhCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uRGF0YShDb2x1bW5MYXlvdXREYXRhIGRhdGEpIHsKLQkJY29sdW1ucy5hZGQoZGF0YSk7Ci0JfQotCi0JLy8tLS0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVGFibGVTaXplKFRhYmxlIHRhYmxlKSB7Ci0JCVBvaW50IHJlc3VsdD0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJCWlmIChjb2wuYWRkVHJpbSkgewotCQkJCQl3aWR0aCArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGxheW91dERhdGEgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJQ29sdW1uV2VpZ2h0RGF0YSBjb2w9IChDb2x1bW5XZWlnaHREYXRhKSBsYXlvdXREYXRhOwotCQkJCXdpZHRoICs9IGNvbC5taW5pbXVtV2lkdGg7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKHdpZHRoID4gcmVzdWx0LngpCi0JCQlyZXN1bHQueD0gd2lkdGg7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dFRhYmxlKFRhYmxlIHRhYmxlLCBpbnQgd2lkdGgsIFJlY3RhbmdsZSBhcmVhLCBib29sZWFuIGluY3JlYXNlKSB7Ci0JCS8vIFhYWDogTGF5b3V0IGlzIGJlaW5nIGNhbGxlZCB3aXRoIGFuIGludmFsaWQgdmFsdWUgdGhlIGZpcnN0IHRpbWUKLQkJLy8gaXQgaXMgYmVpbmcgY2FsbGVkIG9uIExpbnV4LiBUaGlzIG1ldGhvZCByZXNldHMgdGhlCi0JCS8vIExheW91dCB0byBudWxsIHNvIHdlIG1ha2Ugc3VyZSB3ZSBydW4gaXQgb25seSB3aGVuCi0JCS8vIHRoZSB2YWx1ZSBpcyBPSy4KLQkJaWYgKHdpZHRoIDw9IDEpCi0JCQlyZXR1cm47Ci0KLQkJVGFibGVDb2x1bW5bXSB0YWJsZUNvbHVtbnM9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJaW50IHNpemU9IE1hdGgubWluKGNvbHVtbnMuc2l6ZSgpLCB0YWJsZUNvbHVtbnMubGVuZ3RoKTsKLQkJaW50W10gd2lkdGhzPSBuZXcgaW50W3NpemVdOwotCQlpbnQgZml4ZWRXaWR0aD0gMDsKLQkJaW50IG51bWJlck9mV2VpZ2h0Q29sdW1ucz0gMDsKLQkJaW50IHRvdGFsV2VpZ2h0PSAwOwotCi0JCS8vIEZpcnN0IGNhbGMgc3BhY2Ugb2NjdXBpZWQgYnkgZml4ZWQgY29sdW1ucwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjcGQ9IChDb2x1bW5QaXhlbERhdGEpIGNvbDsKLQkJCQlpbnQgcGl4ZWxzPSBjcGQud2lkdGg7Ci0JCQkJaWYgKGNwZC5hZGRUcmltKSB7Ci0JCQkJCXBpeGVscyArPSBDT0xVTU5fVFJJTTsKLQkJCQl9Ci0JCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJZml4ZWRXaWR0aCArPSBwaXhlbHM7Ci0JCQl9IGVsc2UgaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCW51bWJlck9mV2VpZ2h0Q29sdW1ucysrOwotCQkJCS8vIGZpcnN0IHRpbWUsIHVzZSB0aGUgd2VpZ2h0IHNwZWNpZmllZCBieSB0aGUgY29sdW1uIGRhdGEsIG90aGVyd2lzZSB1c2UgdGhlIGFjdHVhbCB3aWR0aCBhcyB0aGUgd2VpZ2h0Ci0JCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQl0b3RhbFdlaWdodCArPSB3ZWlnaHQ7Ci0JCQl9IGVsc2UgewotCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJVbmtub3duIGNvbHVtbiBsYXlvdXQgZGF0YSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBEbyB3ZSBoYXZlIGNvbHVtbnMgdGhhdCBoYXZlIGEgd2VpZ2h0Ci0JCWlmIChudW1iZXJPZldlaWdodENvbHVtbnMgPiAwKSB7Ci0JCQkvLyBOb3cgZGlzdHJpYnV0ZSB0aGUgcmVzdCB0byB0aGUgY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCByZXN0PSB3aWR0aCAtIGZpeGVkV2lkdGg7Ci0JCQlpbnQgdG90YWxEaXN0cmlidXRlZD0gMDsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyArK2kpIHsKLQkJCQlDb2x1bW5MYXlvdXREYXRhIGNvbD0gKENvbHVtbkxheW91dERhdGEpIGNvbHVtbnMuZ2V0KGkpOwotCQkJCWlmIChjb2wgaW5zdGFuY2VvZiBDb2x1bW5XZWlnaHREYXRhKSB7Ci0JCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJCS8vIGNhbGN1bGF0ZSB3ZWlnaHQgYXMgYWJvdmUKLQkJCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCQlpbnQgd2VpZ2h0PSBjdy53ZWlnaHQ7Ci0JCQkJCWludCBwaXhlbHM9IHRvdGFsV2VpZ2h0ID09IDAgPyAwIDogd2VpZ2h0ICogcmVzdCAvIHRvdGFsV2VpZ2h0OwotCQkJCQlpZiAocGl4ZWxzIDwgY3cubWluaW11bVdpZHRoKQotCQkJCQkJcGl4ZWxzPSBjdy5taW5pbXVtV2lkdGg7Ci0JCQkJCXRvdGFsRGlzdHJpYnV0ZWQgKz0gcGl4ZWxzOwotCQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIERpc3RyaWJ1dGUgYW55IHJlbWFpbmluZyBwaXhlbHMgdG8gY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCBkaWZmPSByZXN0IC0gdG90YWxEaXN0cmlidXRlZDsKLQkJCWZvciAoaW50IGk9IDA7IGRpZmYgPiAwOyArK2kpIHsKLQkJCQlpZiAoaSA9PSBzaXplKQotCQkJCQlpPSAwOwotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJKyt3aWR0aHNbaV07Ci0JCQkJCS0tZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRhYmxlQ29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aHNbaV0pOwotCQl9Ci0JCWlmICghaW5jcmVhc2UpIHsKLQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCwgYXJlYS5oZWlnaHQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L0FzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4YjNhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tbWFuZFJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBDb21tYW5kRXhlY3V0b3IgY2FuIGJlIHVzZWQgYnkgYSBub24tVUkKLSAqIHRocmVhZCB0byBhc3luY2hyb25vdXNseSBtb2RpZnkgYSBKUEEgcHJvamVjdCB3aXRoIGFueSBvYmplY3RzIGFzc29jaWF0ZWQKLSAqIHdpdGggZG9jdW1lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIEFzeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kUnVubmFibGUoY29tbWFuZCk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gKGRpc3BsYXkgIT0gbnVsbCkgPyBkaXNwbGF5IDogRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L1N5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZGQyMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIENvbW1hbmRFeGVjdXRvciBjYW4gYmUgdXNlZCBieSBhIG5vbi1VSQotICogdGhyZWFkIHRvIHN5bmNocm9ub3VzbHkgbW9kaWZ5IGEgSlBBIHByb2plY3Qgd2l0aCBhbnkgb2JqZWN0cyBhc3NvY2lhdGVkCi0gKiB3aXRoIGRvY3VtZW50cyB0aGF0IGFyZSBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSBVSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IFN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmdldERpc3BsYXkoKS5zeW5jRXhlYyh0aGlzLmJ1aWxkUnVubmFibGUoY29tbWFuZCkpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kUnVubmFibGUoY29tbWFuZCk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlyZXR1cm4gKGRpc3BsYXkgIT0gbnVsbCkgPyBkaXNwbGF5IDogRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Fic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRmNDUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIEFsbCB0aGUgImxpc3Qgd2lkZ2V0cyIgYXJlIHN1YmNsYXNzZXMgb2Yge0BsaW5rIFdpZGdldH07IHNvIHdlIGNhbiBwcm92aWRlCi0gKiBhIHNtaWRnZW4gb2YgY29tbW9uIGJlaGF2aW9yIGhlcmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8VyBleHRlbmRzIFdpZGdldD4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldAotewotCWZpbmFsIFcgd2lkZ2V0OwotCi0JQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcihXIHdpZGdldCkgewotCQlzdXBlcigpOwotCQl0aGlzLndpZGdldCA9IHdpZGdldDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXQuaXNEaXNwb3NlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjcwMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotCi0vKioKLSAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgY2hlY2stYm94LCB0b2dnbGUgYnV0dG9uLCBvciByYWRpbyBidXR0b24KLSAqICJzZWxlY3Rpb24iIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwgYm9vbGVhbi4KLSAqIAotICogQHNlZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBCdXR0b24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nIHsKLQotCS8vICoqKioqIG1vZGVsCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgYm9vbGVhbi4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZSB3aXRoCi0JICogdGhlIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNldHRpbmcgZm9yIHRoZSBjaGVjay1ib3gvdG9nZ2xlIGJ1dHRvbi9yYWRpbyBidXR0b247Ci0JICogZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiB0aGUgY2hlY2stYm94Ci0JICogaXMgdW5jaGVja2VkL3RvZ2dsZSBidXR0b24gcG9wcGVkIG91dC9yYWRpbyBidXR0b24gdW5jaGVja2VkKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0JLy8gKioqKiogVUkKLQkvKiogVGhlIGNoZWNrLWJveC90b2dnbGUgYnV0dG9uL3JhZGlvIGJ1dHRvbiB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbCBib29sZWFuLiAqLwotCXByaXZhdGUgZmluYWwgQnV0dG9uIGJ1dHRvbjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIG1vZGVsIGJvb2xlYW4gd2l0aAotCSAqIHRoZSBidXR0b24ncyBzZWxlY3Rpb24gc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25TZWxlY3Rpb25MaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgYnV0dG9uCi0JICogaXMgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIG1vZGVsIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBCdXR0b24gYnV0dG9uLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcigpOwotCQlpZiAoKGJvb2xlYW5Nb2RlbCA9PSBudWxsKSB8fCAoYnV0dG9uID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJvb2xlYW5Nb2RlbCA9IGJvb2xlYW5Nb2RlbDsKLQkJdGhpcy5idXR0b24gPSBidXR0b247Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCi0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmJvb2xlYW5Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24odGhpcy5ib29sZWFuTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcudGhpcy5ib29sZWFuQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJib29sZWFuIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLnRoaXMuYnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJ1dHRvbiBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQnV0dG9uRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcudGhpcy5idXR0b25EaXNwb3NlZCgpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYnV0dG9uIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBib29sZWFuIG1vZGVsIGV2ZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uLgotCSAqIElmIHRoZSBuZXcgbW9kZWwgdmFsdWUgaXMgbnVsbCwgdXNlIHRoZSBiaW5kaW5nJ3MgZGVmYXVsdCB2YWx1ZQotCSAqICh3aGljaCBpcyB0eXBpY2FsbHkgZmFsc2UpLgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBib29sZWFuQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QnV0dG9uU2VsZWN0aW9uKEJvb2xlYW4gYikgewotCQlpZiAoICEgdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24odGhpcy5ib29sZWFuVmFsdWUoYikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZShCb29sZWFuIGIpIHsKLQkJcmV0dXJuIChiICE9IG51bGwpID8gYi5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBidXR0b24gZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBidXR0b24gaGFzIGJlZW4gInNlbGVjdGVkIiAtIHN5bmNocm9uaXplIHRoZSBtb2RlbC4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmICggISB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYm9vbGVhbk1vZGVsLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZih0aGlzLmJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkpOwotCQl9Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGJ1dHRvbkRpc3Bvc2VkKCkgewotCQkvLyB0aGUgYnV0dG9uIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5idXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuYnV0dG9uLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuYm9vbGVhbk1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuTW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhOTg4ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgYm9vbGVhbiBtb2RlbCB0byBjb250cm9sIGVpdGhlciB0aGUKLSAqIDxlbT5lbmFibGVkPC9lbT4gb3IgPGVtPnZpc2libGU8L2VtPiBwcm9wZXJ0aWVzIG9mIFNXVCBjb250cm9sczsgaS5lLiB0aGUKLSAqIGNvbnRyb2xzJyBwcm9wZXJ0aWVzIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwsCi0gKiBidXQgPGVtPm5vdDwvZW0+IHZpY2UtdmVyc2EuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBtYW5hZ2UgdGhlIGxpc3RlbmVyczsgaS5lLiB0aGUgZW5nYWdpbmcgYW5kIGRpc2VuZ2FnaW5nIG9mCi0gKiB0aGUgYm9vbGVhbiBtb2RlbCBhbmQgdGhlIGNvbnRyb2wocykuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIENvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotICogQHNlZSBDb250cm9sI3NldFZpc2libGUoYm9vbGVhbikKLSAqLwotYWJzdHJhY3QgY2xhc3MgQm9vbGVhblN0YXRlQ29udHJvbGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgY29udHJvbGxpbmcgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBjb250cm9sIHN0YXRlcyB3aXRoCi0JICogY2hhbmdlcyBpbiB0aGUgdmFsdWUgb2YgdGhlIGJvb2xlYW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJvb2xlYW5DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiBhbGwgdGhlCi0JICogY29udHJvbHMgYXJlIGRpc3Bvc2VkLiAoQ3JpdGljYWwgZm9yIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBjb250cm9sRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YXRlOyBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBkZWZhdWx0IFtkZWZhdWx0IHZhbHVlXSBpcyA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVmYXVsdFZhbHVlOwotCi0JLyoqCi0JICogVGhlIGFkYXB0ZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSAnZW5hYmxlZCcgb3IgJ3Zpc2libGUnIHByb3BlcnR5IGlzCi0JICogY29udHJvbGxlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIG1vZGVsIGFuZCB0aGUgYWRhcHRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JQm9vbGVhblN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBib29sZWFuIGRlZmF1bHRWYWx1ZSwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoYm9vbGVhbk1vZGVsID09IG51bGwpIHx8IChhZGFwdGVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJvb2xlYW5Nb2RlbCA9IGJvb2xlYW5Nb2RlbDsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0KLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb250cm9sRGlzcG9zZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5ib29sZWFuQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJib29sZWFuIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQ29udHJvbERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyB0aGUgY29udHJvbCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcgotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5jb250cm9sRGlzcG9zZWQoKENvbnRyb2wpIGV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb250cm9sIGRpc3Bvc2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJvb2xlYW4gbW9kZWwgKioqKioqKioqKgotCi0Jdm9pZCBlbmdhZ2VCb29sZWFuTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbk1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBkaXNlbmdhZ2VCb29sZWFuTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbk1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJvb2xlYW4gbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29udHJvbHMuCi0JICogSWYgdGhlIG5ldyBib29sZWFuIG1vZGVsIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB1c2UgdGhlIGNvbnRyb2xsZXIncwotCSAqIGRlZmF1bHQgdmFsdWUgKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRDb250cm9sU3RhdGUoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCi0JYm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJvb2xlYW5WYWx1ZSh0aGlzLmJvb2xlYW5Nb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgIT0gbnVsbCkgPyBiLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRyb2wgKioqKioqKioqKgotCi0Jdm9pZCBlbmdhZ2VDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbnRyb2xEaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCXZvaWQgZGlzZW5nYWdlQ29udHJvbChDb250cm9sIGNvbnRyb2wpIHsKLQkJY29udHJvbC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5jb250cm9sRGlzcG9zZUxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q29udHJvbFN0YXRlKEJvb2xlYW4gYikgewotCQl0aGlzLnNldENvbnRyb2xTdGF0ZSh0aGlzLmJvb2xlYW5WYWx1ZShiKSk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBzZXRDb250cm9sU3RhdGUoYm9vbGVhbiBiKTsKLQotCXZvaWQgc2V0Q29udHJvbFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCWlmICggISBjb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5hZGFwdGVyLnNldFN0YXRlKGNvbnRyb2wsIGIpOwotCQl9Ci0JfQotCi0Jdm9pZCBjb250cm9sRGlzcG9zZWQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Nb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCWludGVyZmFjZSBBZGFwdGVyIHsKLQkJdm9pZCBzZXRTdGF0ZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2ZiOGJkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbgotICogc3luY2hyb25pemVkIHdpdGggYSBtb2RlbC4gVGhlIHNlbGVjdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgZWl0aGVyIHRoZQotICogZHJvcC1kb3duIGxpc3QgYm94IG9yIHRoZSBtb2RlbCwgc28gY2hhbmdlcyBtdXN0IGJlIGNvb3JkaW5hdGVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIHNlbGVjdGVkIGl0ZW0gdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gY2FuIGJlIHVzZWQKLSAqIHRvIGNsZWFyIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncyBzZWxlY3Rpb24uIElmIDxjb2RlPm51bGw8L2NvZGU+IGlzIGEKLSAqIHZhbGlkIGl0ZW0gaW4gdGhlIG1vZGVsIGxpc3QsIGFuIGludmFsaWQgc2VsZWN0ZWQgaXRlbSBjYW4gYmUgdXNlZCB0byBjbGVhcgotICogdGhlIHNlbGVjdGlvbi4KLSAqIAotICogQHNlZSBMaXN0VmFsdWVNb2RlbAotICogQHNlZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBEcm9wRG93bkxpc3RCb3gKLSAqIEBzZWUgU1dUVG9vbHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+Ci0JaW1wbGVtZW50cyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcKLXsKLQkvLyAqKioqKiBtb2RlbAotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWw7Ci0KLQkvKioKLQkgKiBBIHdyaXRhYmxlIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3MKLQkgKiBzZWxlY3Rpb24gd2l0aCB0aGUgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcjsKLQotCS8vICoqKioqIFVJCi0JLyoqCi0JICogVGhlIGRyb3AtZG93biBsaXN0IGJveCB3aG9zZSBzZWxlY3Rpb24gd2Uga2VlcCBzeW5jaHJvbml6ZWQKLQkgKiB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEcm9wRG93bkxpc3RCb3ggZHJvcGRvd25MaXN0Qm94OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0ZWQgaXRlbSBob2xkZXIKLQkgKiB3aXRoIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBkcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIGFsbCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsCi0JCQlEcm9wRG93bkxpc3RCb3ggZHJvcGRvd25MaXN0Qm94Ci0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1Nb2RlbCA9PSBudWxsKSB8fCAoZHJvcGRvd25MaXN0Qm94ID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbCA9IHNlbGVjdGVkSXRlbU1vZGVsOwotCQl0aGlzLmRyb3Bkb3duTGlzdEJveCA9IGRyb3Bkb3duTGlzdEJveDsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5kcm9wZG93bkxpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW0gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGREcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmRyb3BEb3duTGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZHJvcC1kb3duIGxpc3QgYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGRyb3AtZG93biBsaXNiIGJveCdzIHNlbGVjdGVkIGl0ZW0gcHJvZ3JhbW1hdGljYWxseSBkb2VzCi0JICogbm90IHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKiA8cD4KLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgZHJvcC1kb3duIGxpc3QgYm94IGlzIG5vdCBkaXNwb3NlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuZHJvcGRvd25MaXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCUUgdmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLmdldFZhbHVlKCk7Ci0JCWludCBuZXdJbmRleCA9IHRoaXMuaW5kZXhPZih2YWx1ZSk7Ci0JCWlmICgob2xkSW5kZXggIT0gLTEpICYmIChuZXdJbmRleCAhPSAtMSkgJiYgKG5ld0luZGV4ICE9IG9sZEluZGV4KSkgewotCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guZGVzZWxlY3Qob2xkSW5kZXgpOwotCQl9Ci0JCWlmIChuZXdJbmRleCA9PSAtMSkgewotCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdJbmRleCAhPSBvbGRJbmRleCkgewotCQkJCXRoaXMuZHJvcGRvd25MaXN0Qm94LnNlbGVjdChuZXdJbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW0gKioqKioqKioqKgotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW0gcHJvZ3JhbW1hdGljYWxseSBkb2VzCi0JICogbm90IHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIGludCBpbmRleE9mKEUgaXRlbSkgewotCQlpbnQgbGVuID0gdGhpcy5saXN0TW9kZWwuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5saXN0TW9kZWwuZ2V0KGkpLCBpdGVtKSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCS8vIGlmICdudWxsJyBpcyBub3QgaW4gdGhlIGxpc3QsIHVzZSBpdCB0byBjbGVhciB0aGUgc2VsZWN0aW9uCi0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvLyBXZSBjYW4gZ2V0IGhlcmUgdmlhIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCQkvLyAxLiBUaGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBpcyBpbnZhbGlkIGFuZCBub3QgaW4gc3luYyB3aXRoIHRoZSBsaXN0Ci0JCS8vICAgIG1vZGVsLiBUaGlzIGlzIG5vdCBnb29kIGFuZCB3ZSBkb24ndCBtYWtlIHRoaXMgKHByb2dyYW1taW5nCi0JCS8vICAgIGVycm9yKSBvYnZpb3VzIChlLmcuIHZpYSBhbiBleGNlcHRpb24pLiA6LSgKLQkJLy8gMi4gSWYgYm90aCB0aGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBhbmQgdGhlIGxpc3QgbW9kZWwgYXJlIGRlcGVuZGVudAotCQkvLyAgICBvbiB0aGUgc2FtZSB1bmRlcmx5aW5nIG1vZGVsLCB0aGUgc2VsZWN0ZWQgaXRlbSBtb2RlbCBtYXkgcmVjZWl2ZQotCQkvLyAgICBpdHMgZXZlbnQgZmlyc3QsIHJlc3VsdGluZyBpbiBhIG1pc3NpbmcgaXRlbS4gVGhpcyB3aWxsIHJlc29sdmUKLQkJLy8gICAgaXRzZWxmIG9uY2UgdGhlIGxpc3QgbW9kZWwgcmVjZWl2ZXMgaXRzIGV2ZW50IGFuZCBzeW5jaHJvbml6ZXMKLQkJLy8gICAgd2l0aCB0aGUgc2FtZSB1bmRlcmx5aW5nIG1vZGVsLiBUaGlzIHNpdHVhdGlvbiBpcyBhY2NlcHRhYmxlLgotCQlyZXR1cm4gLTE7Ci0KLS8vIFRoaXMgaXMgd2hhdCB3ZSB1c2VkIHRvIGRvOgotLy8JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlbGVjdGVkIGl0ZW0gbm90IGZvdW5kOiAiICsgaXRlbSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbWJvLWJveCBldmVudHMgKioqKioqKioqKgotCi0Jdm9pZCBkcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmRyb3Bkb3duTGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBkcm9wRG93bkxpc3RCb3hEb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmRyb3Bkb3duTGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLnNldFZhbHVlKHRoaXMuZ2V0RHJvcERvd25MaXN0Qm94U2VsZWN0ZWRJdGVtKCkpOwotCX0KLQotCXByaXZhdGUgRSBnZXREcm9wRG93bkxpc3RCb3hTZWxlY3RlZEl0ZW0oKSB7Ci0JCWludCBzZWxlY3Rpb25JbmRleCA9IHRoaXMuZHJvcGRvd25MaXN0Qm94LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uSW5kZXggPT0gLTEpID8gbnVsbCA6IHRoaXMubGlzdE1vZGVsLmdldChzZWxlY3Rpb25JbmRleCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCBieSB0aGUgZHJvcC1kb3duIGxpc3QgYm94IHNlbGVjdGlvbiBiaW5kaW5nIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlCi0JICogdGhlIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKi8KLQlpbnRlcmZhY2UgRHJvcERvd25MaXN0Qm94IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbWJvLWJveCBpcyAiZGlzcG9zZWQiLgotCQkgKi8KLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY29tYm8tYm94LgotCQkgKi8KLQkJdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBsaXN0ZW5lciBmcm9tIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgY29tYm8tYm94J3Mgc2VsZWN0aW9uLgotCQkgKi8KLQkJaW50IGdldFNlbGVjdGlvbkluZGV4KCk7Ci0KLQkJLyoqCi0JCSAqIFNlbGVjdCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIHNlbGVjdChpbnQgaW5kZXgpOwotCi0JCS8qKgotCQkgKiBEZXNlbGVjdCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGluIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIGRlc2VsZWN0KGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIENsZWFyIHRoZSBjb21iby1ib3gncyBzZWxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIGRlc2VsZWN0QWxsKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1YzI4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0IGJveCdzIHNlbGVjdGlvbgotICogc3luY2hyb25pemVkIHdpdGggYSBtb2RlbC4gVGhlIHNlbGVjdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgZWl0aGVyIHRoZSBsaXN0Ci0gKiBib3ggb3IgdGhlIG1vZGVsLCBzbyBjaGFuZ2VzIG11c3QgYmUgY29vcmRpbmF0ZWQuCi0gKiAKLSAqIEBzZWUgTGlzdFZhbHVlTW9kZWwKLSAqIEBzZWUgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbAotICogQHNlZSBMaXN0Ci0gKiBAc2VlIFNXVFRvb2xzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotZmluYWwgY2xhc3MgTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZwotewotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgd3JpdGFibGUgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24gd2l0aAotCSAqIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcjsKLQotCS8vICoqKioqIFVJCi0JLyoqCi0JICogVGhlIGxpc3QgYm94IHdob3NlIHNlbGVjdGlvbiB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdCBsaXN0Qm94OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0ZWQgaXRlbXMgaG9sZGVyCi0JICogd2l0aCB0aGUgbGlzdCBib3gncyBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCi0JICovCi0JTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCwKLQkJCUxpc3QgbGlzdEJveAotCSkgewotCQlzdXBlcigpOwotCQlpZiAoKGxpc3RNb2RlbCA9PSBudWxsKSB8fCAoc2VsZWN0ZWRJdGVtc01vZGVsID09IG51bGwpIHx8IChsaXN0Qm94ID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwgPSBzZWxlY3RlZEl0ZW1zTW9kZWw7Ci0JCXRoaXMubGlzdEJveCA9IGxpc3RCb3g7Ci0KLQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0Qm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc0NsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzZWxlY3RlZCBpdGVtcyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZExpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmxpc3RCb3hEb3VibGVDbGlja2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAotCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKiAKLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgbGlzdC1ib3ggaXMgbm90IGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IHNlbGVjdGVkSXRlbXNTaXplID0gdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwuc2l6ZSgpOwotCQlpbnRbXSBzZWxlY3QgPSBuZXcgaW50W3NlbGVjdGVkSXRlbXNTaXplXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCQlzZWxlY3RbaSsrXSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKLQkJfQotCi0JCWludCBsaXN0U2l6ZSA9IHRoaXMubGlzdE1vZGVsLnNpemUoKTsKLQkJaW50W10gZGVzZWxlY3QgPSBuZXcgaW50W2xpc3RTaXplIC0gc2VsZWN0ZWRJdGVtc1NpemVdOwotCQlpID0gMDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0U2l6ZTsgaisrKSB7Ci0JCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhzZWxlY3QsIGopKSB7Ci0JCQkJZGVzZWxlY3RbaSsrXSA9IGo7Ci0JCQl9Ci0JCX0KLQotCQlpbnRbXSBvbGQgPSBBcnJheVRvb2xzLnNvcnQodGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkluZGljZXMoKSk7Ci0JCXNlbGVjdCA9IEFycmF5VG9vbHMuc29ydChzZWxlY3QpOwotCQlpZiAoICEgQXJyYXlzLmVxdWFscyhzZWxlY3QsIG9sZCkpIHsKLQkJCXRoaXMubGlzdEJveC5kZXNlbGVjdChkZXNlbGVjdCk7Ci0JCQl0aGlzLmxpc3RCb3guc2VsZWN0KHNlbGVjdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmxpc3RCb3gucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXZvaWQgc2VsZWN0ZWRJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtldmVudC5nZXRJdGVtc1NpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOwotCQl9Ci0JCXRoaXMubGlzdEJveC5zZWxlY3QoaW5kaWNlcyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXZvaWQgc2VsZWN0ZWRJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAotCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFtldmVudC5nZXRJdGVtc1NpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOwotCQl9Ci0JCXRoaXMubGlzdEJveC5kZXNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKLQkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNDbGVhcmVkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0QWxsKCk7Ci0JfQotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RNb2RlbC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmxpc3RNb2RlbC5nZXQoaSksIGl0ZW0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJLy8gc2VlIGNvbW1lbnQgaW4gRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5pbmRleE9mKEUpCi0JCXJldHVybiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBib3ggZXZlbnRzICoqKioqKioqKioKLQotCXZvaWQgbGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXZvaWQgbGlzdEJveERvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEJveFNlbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsLnNldFZhbHVlcyh0aGlzLmdldExpc3RCb3hTZWxlY3RlZEl0ZW1zKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0TGlzdEJveFNlbGVjdGVkSXRlbXMoKSB7Ci0JCUFycmF5TGlzdDxFPiBzZWxlY3RlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uQ291bnQoKSk7Ci0JCWZvciAoaW50IHNlbGVjdGlvbkluZGV4IDogdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJc2VsZWN0ZWRJdGVtcy5hZGQodGhpcy5saXN0TW9kZWwuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIHNlbGVjdGVkSXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThiOWU3Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0IHdpZGdldCdzIGNvbnRlbnRzCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgbGlzdCB3aWRnZXQgbmV2ZXIgYWx0ZXJzCi0gKiBpdHMgY29udGVudHMgZGlyZWN0bHk7IGFsbCBjaGFuZ2VzIGFyZSBkcml2ZW4gYnkgdGhlIG1vZGVsLgotICogCi0gKiBAc2VlIExpc3RWYWx1ZU1vZGVsCi0gKiBAc2VlIFN0cmluZ0NvbnZlcnRlcgotICogQHNlZSBMaXN0V2lkZ2V0Ci0gKiBAc2VlIFNlbGVjdGlvbkJpbmRpbmcKLSAqIEBzZWUgU1dUVG9vbHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nPEU+IHsKLQotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0J3MgY29udGVudHMgd2l0aAotCSAqIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgY29udmVydGVyIHRoYXQgY29udmVydHMgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QKLQkgKiB0byBzdHJpbmdzIHRoYXQgY2FuIGJlIHB1dCBpbiB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKiogVUkKLQkvKioKLQkgKiBBbiBhZGFwdGVyIG9uIHRoZSBsaXN0IHdpZGdldCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdFdpZGdldCBsaXN0V2lkZ2V0OwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBsaXN0IHdpZGdldAotCSAqIGlzIGRpc3Bvc2VkLiAoQ3JpdGljYWwgZm9yIHByZXZlbnRpbmcgbWVtb3J5IGxlYWtzLikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBsaXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyOwotCi0JLy8gKioqKiogc2VsZWN0aW9uCi0JLyoqCi0JICogV2lkZ2V0LXNwZWNpZmljIHNlbGVjdGlvbiBiaW5kaW5nLgotCSAqLwotCXByaXZhdGUgZmluYWwgU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgotCSAqLwotCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlMaXN0V2lkZ2V0IGxpc3RXaWRnZXQsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyLAotCQkJU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nCi0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChsaXN0V2lkZ2V0ID09IG51bGwpIHx8IChzdHJpbmdDb252ZXJ0ZXIgPT0gbnVsbCkgfHwgKHNlbGVjdGlvbkJpbmRpbmcgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLmxpc3RXaWRnZXQgPSBsaXN0V2lkZ2V0OwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nID0gc2VsZWN0aW9uQmluZGluZzsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5saXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0V2lkZ2V0LmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3luY2hyb25pemVMaXN0V2lkZ2V0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZExpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RXaWRnZXREaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IHdpZGdldCBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCcnV0ZSBmb3JjZSBzeW5jaHJvbml6YXRpb24gb2YgbGlzdCB3aWRnZXQgd2l0aCB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0KCkgewotCQlpZiAoICEgdGhpcy5saXN0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0XygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwuc2l6ZSgpKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmxpc3RNb2RlbCkgewotCQkJaXRlbXMuYWRkKHRoaXMuY29udmVydChpdGVtKSk7Ci0JCX0KLQkJdGhpcy5saXN0V2lkZ2V0LnNldEl0ZW1zKGl0ZW1zLnRvQXJyYXkobmV3IFN0cmluZ1tpdGVtcy5zaXplKCldKSk7Ci0KLQkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pLCBpKyspOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgdGhlIGxpc3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gc3luY2ggdGhlIHNlbGVjdGlvbgotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0V2lkZ2V0LnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc01vdmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgbGVuID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBsb1N0YXJ0ID0gTWF0aC5taW4odGFyZ2V0LCBzb3VyY2UpOwotCQlpbnQgaGlTdGFydCA9IE1hdGgubWF4KHRhcmdldCwgc291cmNlKTsKLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGFmZmVjdGVkIGl0ZW1zLi4uCi0JCVN0cmluZ1tdIHN1YkFycmF5ID0gQXJyYXlUb29scy5zdWJBcnJheSh0aGlzLmxpc3RXaWRnZXQuZ2V0SXRlbXMoKSwgbG9TdGFydCwgaGlTdGFydCArIGxlbik7Ci0JCS8vIC4uLm1vdmUgdGhlbSBhcm91bmQuLi4KLQkJc3ViQXJyYXkgPSBBcnJheVRvb2xzLm1vdmUoc3ViQXJyYXksIHRhcmdldCAtIGxvU3RhcnQsIHNvdXJjZSAtIGxvU3RhcnQsIGxlbik7Ci0JCS8vIC4uLmFuZCB0aGVuIHB1dCB0aGVtIGJhY2sKLQkJaW50IGkgPSBsb1N0YXJ0OwotCQlmb3IgKFN0cmluZyBpdGVtIDogc3ViQXJyYXkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5zZXRJdGVtKGkrKywgaXRlbSk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdEl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaW50IGkgPSBldmVudC5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLmxpc3RXaWRnZXQuc2V0SXRlbShpKyssIHRoaXMuY29udmVydChpdGVtKSk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdENsZWFyZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RXaWRnZXQucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdENoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIGEKLQkgKiBzdHJpbmcgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnQoRSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoaXRlbSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3Qgd2lkZ2V0IGV2ZW50cyAqKioqKioqKioqCi0KLQl2b2lkIGxpc3RXaWRnZXREaXNwb3NlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBsaXN0IHdpZGdldCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMubGlzdFdpZGdldC5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5saXN0V2lkZ2V0RGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0TW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyIGludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIGJ5IHRoZSBsaXN0IHdpZGdldCBtb2RlbCBiaW5kaW5nIHRvIHF1ZXJ5IGFuZCBtYW5pcHVsYXRlCi0JICogdGhlIHdpZGdldC4KLQkgKi8KLQlpbnRlcmZhY2UgTGlzdFdpZGdldCB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IHdpZGdldCBpcyAiZGlzcG9zZWQiLgotCQkgKi8KLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGRpc3Bvc2UgbGlzdGVuZXIgdG8gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZGlzcG9zZSBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0IHdpZGdldC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCVN0cmluZ1tdIGdldEl0ZW1zKCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgbGlzdCB3aWRnZXQncyBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCQkgKi8KLQkJdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCi0JCSAqLwotCQl2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCQkgKi8KLQkJdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGl0ZW1zIGZyb20gdGhlIGxpc3Qgd2lkZ2V0J3MgaXRlbXMuCi0JCSAqLwotCQl2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBsaXN0IHdpZGdldC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlQWxsKCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdpZGdldC1zcGVjaWZpYyBzZWxlY3Rpb24gYmluZGluZyB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgdGhlIGxpc3Qgd2lkZ2V0Ci0JICogbW9kZWwgYmluZGluZy4KLQkgKi8KLQlpbnRlcmZhY2UgU2VsZWN0aW9uQmluZGluZyB7Ci0KLQkJLyoqCi0JCSAqIFN5bmNocm9uaXplIHRoZSBzZWxlY3Rpb24gYmluZGluZydzIHdpZGdldCB3aXRoIHRoZSBzZWxlY3Rpb24gbW9kZWwuCi0JCSAqIDxwPgotCQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgd2lkZ2V0IGlzIG5vdCBkaXNwb3NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSB3aWRnZXQgaGFzIGJlZW4gZGlzcG9zZWQ7IGRpc3Bvc2UgdGhlIHNlbGVjdGlvbiBiaW5kaW5nLgotCQkgKi8KLQkJdm9pZCBkaXNwb3NlKCk7Ci0KLQotCQkvKioKLQkJICogVXNlZnVsIGZvciBsaXN0IGJveGVzIHRoYXQgaWdub3JlIHRoZSBzZWxlY3Rpb24uCi0JCSAqLwotCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU2VsZWN0aW9uQmluZGluZyB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlbGVjdGlvbkJpbmRpbmcgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJcHVibGljIHN0YXRpYyBTZWxlY3Rpb25CaW5kaW5nIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiU2VsZWN0aW9uQmluZGluZy5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9NdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTJhODAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9NdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgYm9vbGVhbiBtb2RlbCB0byBjb250cm9sIGVpdGhlciB0aGUKLSAqIDxlbT5lbmFibGVkPC9lbT4gb3IgPGVtPnZpc2libGU8L2VtPiBwcm9wZXJ0aWVzIG9mIGEgc2V0IG9mIFNXVCBjb250cm9sczsKLSAqIGkuZS4gdGhlIGNvbnRyb2xzJyBwcm9wZXJ0aWVzIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwsCi0gKiBidXQgPGVtPm5vdDwvZW0+IHZpY2UtdmVyc2EuCi0gKiAKLSAqIEBzZWUgUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBAc2VlIENvbnRyb2wjc2V0RW5hYmxlZChib29sZWFuKQotICogQHNlZSBDb250cm9sI3NldFZpc2libGUoYm9vbGVhbikKLSAqLwotZmluYWwgY2xhc3MgTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlcgotCWV4dGVuZHMgQm9vbGVhblN0YXRlQ29udHJvbGxlcgotewotCS8qKgotCSAqIFRoZSBzZXQgb2YgY29udHJvbHMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgY2xpZW50cyB0byBhZGQvcmVtb3ZlIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbnRyb2xzTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEhhc2hTZXQ8Q29udHJvbD4gY29udHJvbHMgPSBuZXcgSGFzaFNldDxDb250cm9sPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwsIHRoZSBjb250cm9scyBtb2RlbCwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsLAotCQkJYm9vbGVhbiBkZWZhdWx0VmFsdWUsCi0JCQlBZGFwdGVyIGFkYXB0ZXIKLQkpIHsKLQkJc3VwZXIoYm9vbGVhbk1vZGVsLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCQlpZiAoY29udHJvbHNNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbnRyb2xzTW9kZWwgPSBjb250cm9sc01vZGVsOwotCQl0aGlzLmNvbnRyb2xzTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29udHJvbHNMaXN0ZW5lcigpOwotCQl0aGlzLmFkZENvbnRyb2xzKGNvbnRyb2xzTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbnRyb2xzTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5hZGRDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRJdGVtcygpKTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5yZW1vdmVDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRJdGVtcygpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJCX0KLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNsZWFyQ29udHJvbHMoKTsKLQkJCQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuYWRkQ29udHJvbHMoKEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPikgZXZlbnQuZ2V0Q29sbGVjdGlvbigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbnRyb2xzIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250cm9scyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQl2b2lkIHNldENvbnRyb2xTdGF0ZShib29sZWFuIGIpIHsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiB0aGlzLmNvbnRyb2xzKSB7Ci0JCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCBiKTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBhZGRDb250cm9scyhJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNfKSB7Ci0JCWJvb2xlYW4gYiA9IHRoaXMuZ2V0Qm9vbGVhblZhbHVlKCk7Ci0JCWZvciAoQ29udHJvbCBjb250cm9sIDogY29udHJvbHNfKSB7Ci0JCQl0aGlzLmFkZENvbnRyb2woY29udHJvbCwgYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ29udHJvbChDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgewotCQlpZiAodGhpcy5jb250cm9scy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JCQl0aGlzLmNvbnRyb2xzTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb250cm9sc0xpc3RlbmVyKTsKLQkJfQotCQlpZiAodGhpcy5jb250cm9scy5hZGQoY29udHJvbCkpIHsKLQkJCXRoaXMuZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQkJCXRoaXMuc2V0Q29udHJvbFN0YXRlKGNvbnRyb2wsIGIpOwotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbnRyb2w6ICIgKyBjb250cm9sKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGNsZWFyQ29udHJvbHMoKSB7Ci0JCXRoaXMucmVtb3ZlQ29udHJvbHMobmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxDb250cm9sPih0aGlzLmNvbnRyb2xzKSk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHJlbW92ZUNvbnRyb2xzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc18pIHsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9sc18pIHsKLQkJCXRoaXMuZGlzZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQkJCXRoaXMucmVtb3ZlQ29udHJvbChjb250cm9sKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmNvbnRyb2xzLnJlbW92ZShjb250cm9sKTsKLQkJaWYgKHRoaXMuY29udHJvbHMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbnRyb2xzTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb250cm9sc0xpc3RlbmVyKTsKLQkJCXRoaXMuZGlzZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGNvbnRyb2xEaXNwb3NlZChDb250cm9sIGNvbnRyb2wpIHsKLQkJc3VwZXIuY29udHJvbERpc3Bvc2VkKGNvbnRyb2wpOwotCQl0aGlzLnJlbW92ZUNvbnRyb2woY29udHJvbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RDb21ib0FkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyNTI0ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLQotLyoqCi0gKiBBZGFwdCBhbiBTV1Qge0BsaW5rIENvbWJvfSB0byB0aGUgbGlzdCB3aWRnZXQgZXhwZWN0ZWQgYnkKLSAqIHtAbGluayBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nfSBhbmQgdGhlCi0gKiBkcm9wLWRvd24gbGlzdCBib3ggZXhwZWN0ZWQgYnkge0BsaW5rIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmd9LgotICovCi1maW5hbCBjbGFzcyBTV1RDb21ib0FkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8Q29tYm8+Ci0JaW1wbGVtZW50cyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLkRyb3BEb3duTGlzdEJveAotewotCVNXVENvbWJvQWRhcHRlcihDb21ibyBjb21ibykgewotCQlzdXBlcihjb21ibyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldEl0ZW1zKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQl0aGlzLndpZGdldC5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJdGhpcy53aWRnZXQuc2V0SXRlbXMoaXRlbXMpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCkgewotCQl0aGlzLndpZGdldC5hZGQoaXRlbSwgaW5kZXgpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZShzdGFydCwgZW5kKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQl0aGlzLndpZGdldC5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbWJvQm94U2VsZWN0aW9uQmluZGluZy5Db21ib0JveCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCX0KLQlwdWJsaWMgdm9pZCBzZWxlY3QoaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LnNlbGVjdChpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpbmRleCkgewotCQl0aGlzLndpZGdldC5kZXNlbGVjdChpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgewotCQl0aGlzLndpZGdldC5kZXNlbGVjdEFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3YmUxYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVExpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci0KLS8qKgotICogQWRhcHQgYW4gU1dUIHtAbGluayBMaXN0fSB0byB0aGUgbGlzdCB3aWRnZXQgZXhwZWN0ZWQgYnkKLSAqIHtAbGluayBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nfS4KLSAqLwotZmluYWwgY2xhc3MgU1dUTGlzdEFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TGlzdFdpZGdldEFkYXB0ZXI8TGlzdD4KLXsKLQlTV1RMaXN0QWRhcHRlcihMaXN0IGxpc3QpIHsKLQkJc3VwZXIobGlzdCk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5nZXRJdGVtcygpOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIGl0ZW0pIHsKLQkJdGhpcy53aWRnZXQuc2V0SXRlbShpbmRleCwgaXRlbSk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCXRoaXMud2lkZ2V0LnNldEl0ZW1zKGl0ZW1zKTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy53aWRnZXQuYWRkKGl0ZW0sIGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aGlzLndpZGdldC5yZW1vdmUoc3RhcnQsIGVuZCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlQWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5MzU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0OwotCi0vKioKLSAqIFZhcmlvdXMgU1dUIHRvb2xzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBTV1RUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIGNoZWNrLWJveC9yYWRpbyBidXR0b24vdG9nZ2xlIGJ1dHRvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgYnV0dG9uIChjaGVjay1ib3gsIHJhZGlvIGJ1dHRvbiwgb3IgdG9nZ2xlIGJ1dHRvbikKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGJvb2xlYW4gbW9kZWwuCi0JICogSWYgdGhlIGJvb2xlYW4gbW9kZWwgaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGJ1dHRvbidzICdzZWxlY3Rpb24nIHN0YXRlIHdpbGwKLQkgKiBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24pIHsKLQkJYmluZChib29sZWFuTW9kZWwsIGJ1dHRvbiwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBidXR0b24gKGNoZWNrLWJveCwgcmFkaW8gYnV0dG9uLCBvciB0b2dnbGUgYnV0dG9uKQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBtb2RlbC4KLQkgKiBJZiB0aGUgYm9vbGVhbiBtb2RlbCBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ3NlbGVjdGlvbicgc3RhdGUgd2lsbAotCSAqIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYmluZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgYm9vbGVhbiBtb2RlbCBhbmQgdGhlIGJ1dHRvbgotCQluZXcgQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhib29sZWFuTW9kZWwsIGJ1dHRvbiwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBmaWVsZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgdGV4dCBtb2RlbCB0byB0aGUgc3BlY2lmaWVkIHRleHQgZmllbGQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsLCBUZXh0IHRleHRGaWVsZCkgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHRleHQgbW9kZWwgYW5kIHRoZSB0ZXh0IGZpZWxkCi0JCW5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmcodGV4dE1vZGVsLCB0ZXh0RmllbGQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFRoZSBsaXN0IGJveCBzZWxlY3Rpb24gaXMgaWdub3JlZC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQotCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0IGxpc3RCb3gpIHsKLQkJYmluZChsaXN0TW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVGhlIGxpc3QgYm94IHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBuZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9Ci0JICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsLCBMaXN0IGxpc3RCb3gpIHsKLQkJYmluZChsaXN0TW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIExpc3QgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQljaGVja0ZvclNpbmdsZVNlbGVjdGlvblN0eWxlKGxpc3RCb3gpOwotCQliaW5kKGxpc3RNb2RlbCwgbmV3IFdyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4oc2VsZWN0ZWRJdGVtTW9kZWwpLCBsaXN0Qm94LCBzdHJpbmdDb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwsIExpc3QgbGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwsIExpc3QgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQliaW5kKAotCQkJbGlzdE1vZGVsLAotCQkJbmV3IFNXVExpc3RBZGFwdGVyKGxpc3RCb3gpLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbmV3IExpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+KGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtc01vZGVsLCBsaXN0Qm94KQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JTaW5nbGVTZWxlY3Rpb25TdHlsZShMaXN0IGxpc3RCb3gpIHsKLQkJaWYgKCAhIEJpdFRvb2xzLmZsYWdJc1NldChsaXN0Qm94LmdldFN0eWxlKCksIFNXVC5TSU5HTEUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsaXN0IGJveCBtdXN0IGJlIHNpbmdsZS1zZWxlY3Rpb246ICIgKyBsaXN0Qm94KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkcm9wLWRvd24gbGlzdCBib3ggKioqKioqKioqKgotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIENvbWJvIGRyb3BEb3duTGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBkcm9wLWRvd24gbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBkcm9wLWRvd24gbGlzdCBib3guCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIENvbWJvIGRyb3BEb3duTGlzdEJveCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQljaGVja0ZvclJlYWRPbmx5U3R5bGUoZHJvcERvd25MaXN0Qm94KTsKLQkJU1dUQ29tYm9BZGFwdGVyIGNvbWJvQWRhcHRlciA9IG5ldyBTV1RDb21ib0FkYXB0ZXIoZHJvcERvd25MaXN0Qm94KTsKLQkJYmluZCgKLQkJCWxpc3RNb2RlbCwKLQkJCWNvbWJvQWRhcHRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW5ldyBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nPEU+KGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGNvbWJvQWRhcHRlcikKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRm9yUmVhZE9ubHlTdHlsZShXaWRnZXQgY29tYm9Cb3gpIHsKLQkJaWYgKCAhIEJpdFRvb2xzLmZsYWdJc1NldChjb21ib0JveC5nZXRTdHlsZSgpLCBTV1QuUkVBRF9PTkxZKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY29tYm8tYm94IG11c3QgYmUgcmVhZC1vbmx5OiAiICsgY29tYm9Cb3gpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgIndpZGdldCIgKioqKioqKioqKgotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgdG8gdGhlIHNwZWNpZmllZCBsaXN0IHdpZGdldC4KLQkgKiBUaGUgbGlzdCB3aWRnZXQncyBzZWxlY3Rpb24gaXMgaWdub3JlZC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LgotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLkxpc3RXaWRnZXQgbGlzdFdpZGdldCwgU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQliaW5kKGxpc3RNb2RlbCwgbGlzdFdpZGdldCwgc3RyaW5nQ29udmVydGVyLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcuTnVsbC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lkZ2V0LgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHNlbGVjdGlvbiBiaW5kaW5nIHRvIGNvbnRyb2wgdGhlIGxpc3Qgd2lkZ2V0J3Mgc2VsZWN0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBsaXN0V2lkZ2V0LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyLCBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLlNlbGVjdGlvbkJpbmRpbmcgc2VsZWN0aW9uQmluZGluZykgewotCQkvLyB0aGUgbmV3IGJpbmRpbmcgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVscyBhbmQgdGhlIGxpc3QgYm94Ci0JCW5ldyBMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nPEU+KGxpc3RNb2RlbCwgbGlzdFdpZGdldCwgc3RyaW5nQ29udmVydGVyLCBzZWxlY3Rpb25CaW5kaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogJ2VuYWJsZWQnIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbFtdIGNvbnRyb2xzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlzd2l0Y2ggKGNvbnRyb2xzLmxlbmd0aCkgewotCQkJY2FzZSAwOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVtcHR5IGNvbnRyb2xzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGNvbnRyb2xzKSk7Ci0JCQljYXNlIDE6Ci0JCQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzWzBdLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbnRyb2w+KGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSA8Y29kZT5mYWxzZTxjb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCkgewotCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNNb2RlbCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBkZWZhdWx0VmFsdWUsIEVOQUJMRURfQURBUFRFUik7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2wncwotCSAqIDxlbT5lbmFibGVkPC9lbT4gc3RhdGUgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xFbmFibGVkU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbCBjb250cm9sLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sKGJvb2xlYW5Nb2RlbCwgY29udHJvbCwgZGVmYXVsdFZhbHVlLCBFTkFCTEVEX0FEQVBURVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBFTkFCTEVEX0FEQVBURVIgPQotCQkJbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXRTdGF0ZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gYikgewotCQkJCQljb250cm9sLnNldEVuYWJsZWQoYik7Ci0JCQkJfQotCQkJfTsKLSAgIAotCi0JLy8gKioqKioqKioqKiAndmlzaWJsZScgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sW10gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN3aXRjaCAoY29udHJvbHMubGVuZ3RoKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgY29udHJvbHMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoY29udHJvbHMpKTsKLQkJCWNhc2UgMToKLQkJCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNbMF0sIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsKSB7Ci0JCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPnZpc2libGU8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgVklTSUJMRV9BREFQVEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbCdzCi0JICogPGVtPnZpc2libGU8L2VtPiBzdGF0ZSB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbFZpc2libGVTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIFZJU0lCTEVfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyIFZJU0lCTEVfQURBUFRFUiA9Ci0JCQluZXcgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCQkJCWNvbnRyb2wuc2V0VmlzaWJsZShiKTsKLQkJCQl9Ci0JCQl9OwotICAgCi0KLQkvLyAqKioqKioqKioqIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlciAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyb2woUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgYWRhcHRlcikgewotCQkvLyB0aGUgbmV3IGNvbnRyb2xsZXIgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVsIGFuZCB0aGUgY29udHJvbHMKLQkJbmV3IE11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJvbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgYWRhcHRlcikgewotCQkvLyB0aGUgbmV3IGNvbnRyb2xsZXIgd2lsbCBhZGQgaXRzZWxmIGFzIGEgbGlzdGVuZXIgdG8gdGhlIHZhbHVlIG1vZGVsIGFuZCB0aGUgY29udHJvbHMKLQkJbmV3IFNpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIGFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgU1dUVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TaW1wbGVCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzOGJiMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNvbnRyb2xsZXIgZW5hYmxlcyBhIGJvb2xlYW4gbW9kZWwgdG8gY29udHJvbCBlaXRoZXIgdGhlCi0gKiA8ZW0+ZW5hYmxlZDwvZW0+IG9yIDxlbT52aXNpYmxlPC9lbT4gcHJvcGVydGllcyBvZiBhbiBTV1QgY29udHJvbDsgaS5lLiB0aGUKLSAqIGNvbnRyb2wncyBwcm9wZXJ0eSBpcyBrZXB0IGluIHN5bmNoIHdpdGggdGhlIGJvb2xlYW4gbW9kZWwsCi0gKiBidXQgPGVtPm5vdDwvZW0+IHZpY2UtdmVyc2EuCi0gKiA8cD4KLSAqIE9uY2UgdGhlIGNvbnRyb2wgaXMgZGlzcG9zZWQsIHRoaXMgY29udHJvbGxlciBpcyBrYXB1dC4KLSAqIAotICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0gKiBAc2VlIENvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotICovCi1maW5hbCBjbGFzcyBTaW1wbGVCb29sZWFuU3RhdGVDb250cm9sbGVyCi0JZXh0ZW5kcyBCb29sZWFuU3RhdGVDb250cm9sbGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb250cm9sIGNvbnRyb2w7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBtb2RlbCwgdGhlIGNvbnRyb2wsIGFuZCB0aGUgYWRhcHRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsCi0JCQlDb250cm9sIGNvbnRyb2wsCi0JCQlib29sZWFuIGRlZmF1bHRWYWx1ZSwKLQkJCUFkYXB0ZXIgYWRhcHRlcgotCSkgewotCQlzdXBlcihib29sZWFuTW9kZWwsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JCWlmIChjb250cm9sID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29udHJvbCA9IGNvbnRyb2w7Ci0JCXRoaXMuZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQ29udHJvbChjb250cm9sKTsKLQkJdGhpcy5zZXRDb250cm9sU3RhdGUoY29udHJvbCwgdGhpcy5nZXRCb29sZWFuVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRyb2xzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgc2V0Q29udHJvbFN0YXRlKGJvb2xlYW4gYikgewotCQl0aGlzLnNldENvbnRyb2xTdGF0ZSh0aGlzLmNvbnRyb2wsIGIpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY29udHJvbERpc3Bvc2VkKENvbnRyb2wgYykgewotCQlzdXBlci5jb250cm9sRGlzcG9zZWQoYyk7Ci0JCXRoaXMuZGlzZW5nYWdlQm9vbGVhbk1vZGVsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJjMGNlMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRleHQgZmllbGQKLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwgdGV4dC9zdHJpbmcuCi0gKiAKLSAqIEBzZWUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgVGV4dAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWNsYXNzIFRleHRGaWVsZE1vZGVsQmluZGluZyB7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBtb2RlbCB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSB0ZXh0IGZpZWxkLgotCSAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSB0ZXh0IGZpZWxkJ3MgY29udGVudHMgd2l0aAotCSAqIHRoZSB0ZXh0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IGZpZWxkIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIHRleHQgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUZXh0IHRleHRGaWVsZDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHRleHQgbW9kZWwKLQkgKiB3aXRoIHRoZSB0ZXh0IGZpZWxkJ3MgY29udGVudHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBNb2RpZnlMaXN0ZW5lciB0ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgdGV4dCBmaWVsZAotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIHRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEhtbS4uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXR0aW5nVGV4dEZpZWxkVGV4dCA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHRleHQgbW9kZWwgYW5kIHRleHQgZmllbGQgYXJlIHJlcXVpcmVkLgotCSAqLwotCVRleHRGaWVsZE1vZGVsQmluZGluZyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRNb2RlbCwgVGV4dCB0ZXh0RmllbGQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKCh0ZXh0TW9kZWwgPT0gbnVsbCkgfHwgKHRleHRGaWVsZCA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50ZXh0TW9kZWwgPSB0ZXh0TW9kZWw7Ci0JCXRoaXMudGV4dEZpZWxkID0gdGV4dEZpZWxkOwotCi0JCXRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy50ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXh0RmllbGREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZXRUZXh0RmllbGRUZXh0KHRleHRNb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFRleHRNb2RlbENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dE1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0ZXh0IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nLnRoaXMudGV4dEZpZWxkTW9kaWZpZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgZmllbGQgbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmcudGhpcy50ZXh0RmllbGREaXNwb3NlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHRleHRNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy50ZXh0RmllbGQuaXNEaXNwb3NlZCgpKSB7ICAvLyA/Pz8KLQkJCXRoaXMuc2V0VGV4dEZpZWxkVGV4dCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCS8vIHRoZSB0ZXh0IG1vZGVsIGNhbiBiZSBudWxsLCBidXQgdGhlIHRleHQgZmllbGQgY2Fubm90Ci0JCXRoaXMuc2V0VGV4dEZpZWxkVGV4dF8oKHRleHQgPT0gbnVsbCkgPyAiIiA6IHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0XyhTdHJpbmcgdGV4dCkgewotCQlpZiAoICEgdGV4dC5lcXVhbHModGhpcy50ZXh0RmllbGQuZ2V0VGV4dCgpKSkgeyAgLy8gPz8/Ci0JCQl0aGlzLnNldFRleHRGaWVsZFRleHRfXyh0ZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUZXh0RmllbGRUZXh0X18oU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRleHRGaWVsZC5zZXRUZXh0KHRleHQpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCA9IGZhbHNlOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRleHQgZmllbGQgZXZlbnRzICoqKioqKioqKioKLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCB0ZXh0RmllbGRNb2RpZmllZCgpIHsKLQkJaWYgKCAhIHRoaXMuc2V0dGluZ1RleHRGaWVsZFRleHQpIHsKLQkJCXRoaXMuc2V0VGV4dE1vZGVsVGV4dCh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRNb2RlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKCAhIHRleHQuZXF1YWxzKHRoaXMudGV4dE1vZGVsLmdldFZhbHVlKCkpKSB7ICAvLyA/Pz8KLQkJCXRoaXMudGV4dE1vZGVsLnNldFZhbHVlKHRleHQpOwotCQl9Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHRleHRGaWVsZERpc3Bvc2VkKCkgewotCQkvLyB0aGUgdGV4dCBmaWVsZCBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dEZpZWxkLnJlbW92ZU1vZGlmeUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkTW9kaWZ5TGlzdGVuZXIpOwotCQl0aGlzLnRleHRNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50ZXh0TW9kZWwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZUxpc3RQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlZmUyYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiB1c2VzIGEgPGNvZGU+VGFibGU8L2NvZGU+Ci0gKiBhcyBpdHMgbWFpbiB3aWRnZXQsIGEgPGNvZGU+TGlzdDwvY29kZT4gY2FuJ3QgYmUgdXNlZCBiZWNhdXNlIGl0IGRvZXNuJ3QKLSAqIHN1cHBvcnQgc2hvd2luZyBpbWFnZXMuIEhvd2V2ZXIsIHRoZSB0YWJsZSBpcyBkaXNwbGF5ZWQgbGlrZSBhIGxpc3QuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW90IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBJdGVtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEFkZC4uLiAgfCB8Ci0gKiB8IHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8IEl0ZW0gbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEVkaXQuLi4gfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFJlbW92ZSAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFkZFJlbW92ZUxpc3RQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBBZGRSZW1vdmVQYW5lPFQ+Ci17Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKLQkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQsCi0JCSAgICAgIHBhcmVudE1hbmFnZVBhbmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxPYmplY3Q+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2x1bW5BZGFwdGVyPE9iamVjdD4oKSB7Ci0JCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KSB7Ci0JCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSB2YWx1ZUhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bMV07Ci0JCQkJdmFsdWVIb2xkZXJzWzBdID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KHN1YmplY3QpOwotCQkJCXJldHVybiB2YWx1ZUhvbGRlcnM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQlyZXR1cm4gIiI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc0FkZGVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJc3VwZXIuaXRlbXNNb3ZlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc1JlbW92ZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc1JlcGxhY2VkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJc3VwZXIubGlzdENoYW5nZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXN1cGVyLmxpc3RDbGVhcmVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV2YWxpZGF0ZXMgdGhlIHRhYmxlIGxheW91dCBhZnRlciB0aGUgbGlzdCBvZiBpdGVtcyBoYXMgY2hhbmdlZC4gVGhlCi0JICogbGF5b3V0IGhhcyB0byBiZSBkb25lIGluIGEgbmV3IFVJIHRocmVhZCBiZWNhdXNlIG91ciBsaXN0ZW5lciBtaWdodCBiZQotCSAqIG5vdGlmaWVkIGJlZm9yZSB0aGUgdGFibGUgaGFzIGJlZW4gdXBkYXRlZCAodGFibGUgY29sdW1uIGFkZGVkIG9yIHJlbW92ZWQpLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlTGF5b3V0KCkgewotCQlTV1RVdGlsLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7IHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdGFibGUuZ2V0UGFyZW50KCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQkJCX0KLQkJfX0pOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlnZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGVkVmFsdWUoZS5nZXROZXdWYWx1ZSgpKTsKLQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+IGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8T2JqZWN0PiBlKSB7Ci0JCQkJQWRkUmVtb3ZlTGlzdFBhbmUudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkVGFibGVDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZFBhbmUoY29udGFpbmVyLCBidWlsZFRhYmxlQ29udGFpbmVyTGF5b3V0KCkpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSBMYXlvdXQgYnVpbGRUYWJsZUNvbnRhaW5lckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0JCQkJaW50IGNvbHVtbldpZHRoID0gdGFibGVDb2x1bW4uZ2V0V2lkdGgoKTsKLQkJCQlwYWNrQ29sdW1uKHRhYmxlKTsKLQotCQkJCS8vIENhbGN1bGF0ZSB0aGUgdGFibGUgc2l6ZSBhbmQgYWRqdXN0IGl0IHdpdGggdGhlIGhpbnRzCi0JCQkJUG9pbnQgc2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJCQlpZiAod2lkdGhIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCXNpemUueCA9IHdpZHRoSGludDsKLQkJCQl9Ci0KLQkJCQlpZiAoaGVpZ2h0SGludCAhPSBTV1QuREVGQVVMVCkgewotCQkJCQlzaXplLnkgPSBoZWlnaHRIaW50OwotCQkJCX0KLQotCQkJCS8vIFJldmVydCB0aGUgY29sdW1uJ3Mgd2lkdGggdG8gaXRzIGN1cnJlbnQgdmFsdWUKLQkJCQl0YWJsZS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKHRydWUpOwotCQkJCXRhYmxlQ29sdW1uLnNldFdpZHRoKGNvbHVtbldpZHRoKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZChmYWxzZSk7Ci0JCQkJdGFibGUuc2V0UmVkcmF3KHRydWUpOwotCi0JCQkJcmV0dXJuIHNpemU7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgYm9vbGVhbiBpc1ZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZShUYWJsZSB0YWJsZSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN0YW5nbGUgY2xpZW50QXJlYSkgewotCi0JCQkJLy8gR2V0IHRoZSBoZWlnaHQgb2YgYWxsIHRoZSByb3dzCi0JCQkJaW50IGhlaWdodCA9IHRhYmxlLmdldEl0ZW1Db3VudCgpICogdGFibGUuZ2V0SXRlbUhlaWdodCgpOwotCi0JCQkJLy8gUmVtb3ZlIHRoZSBib3JkZXIgZnJvbSB0aGUgaGVpZ2h0Ci0JCQkJaGVpZ2h0ICs9ICh0YWJsZS5nZXRCb3JkZXJXaWR0aCgpICogMik7Ci0KLQkJCQlyZXR1cm4gKGNsaWVudEFyZWEuaGVpZ2h0IDwgaGVpZ2h0KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsKLQotCQkJCWlmIChib3VuZHMud2lkdGggPiAwKSB7Ci0KLQkJCQkJVGFibGUgdGFibGUgPSAoVGFibGUpIGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOwotCQkJCQl0YWJsZS5zZXRCb3VuZHMoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQotCQkJCQl1cGRhdGVUYWJsZUNvbHVtbldpZHRoKAotCQkJCQkJdGFibGUsCi0JCQkJCQlib3VuZHMud2lkdGgsCi0JCQkJCQlpc1ZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZSh0YWJsZSwgYm91bmRzKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHBhY2tDb2x1bW4oVGFibGUgdGFibGUpIHsKLQotCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCi0JCQkJdGFibGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZCh0cnVlKTsKLQkJCQl0YWJsZUNvbHVtbi5wYWNrKCk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQoZmFsc2UpOwotCQkJCXRhYmxlLnNldFJlZHJhdyh0cnVlKTsKLQotCQkJCS8vIENhY2hlIHRoZSBjb2x1bW4gd2lkdGggc28gaXQgY2FuIGJlIHVzZWQgaW4KLQkJCQkvLyB1cGRhdGVUYWJsZUNvbHVtbldpZHRoKCkgd2hlbiBkZXRlcm1pbmUgd2hpY2ggd2lkdGggdG8gdXNlCi0JCQkJdGFibGUuc2V0RGF0YSgKLQkJCQkJImNvbHVtbi53aWR0aCIsCi0JCQkJCUludGVnZXIudmFsdWVPZih0YWJsZUNvbHVtbi5nZXRXaWR0aCgpKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZUNvbHVtbldpZHRoKFRhYmxlIHRhYmxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB2ZXJ0aWNhbFNjcm9sbGJhckJhclZpc2libGUpIHsKLQotCQkJCS8vIFJlbW92ZSB0aGUgYm9yZGVyIGZyb20gdGhlIHdpZHRoCi0JCQkJd2lkdGggLT0gKHRhYmxlLmdldEJvcmRlcldpZHRoKCkgKiAyKTsKLQotCQkJCS8vIFJlbW92ZSB0aGUgc2Nyb2xsYmFyIGZyb20gdGhlIHdpZHRoIGlmIGl0IGlzIHNob3duCi0JCQkJaWYgKHZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZSkgewotCQkJCQl3aWR0aCAtPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKS54OwotCQkJCX0KLQotCQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gdGFibGUuZ2V0Q29sdW1uKDApOwotCi0JCQkJLy8gUmV0cmlldmUgdGhlIGNhY2hlZCBjb2x1bW4gd2lkdGgsIHdoaWNoIGlzIHJlcXVpcmVkIGZvcgotCQkJCS8vIGRldGVybWluaW5nIHdoaWNoIHdpZHRoIHRvIHVzZSAodGhlIGNvbHVtbiB3aWR0aCBvciB0aGUKLQkJCQkvLyBjYWxjdWxhdGVkIHdpZHRoKQotCQkJCUludGVnZXIgY29sdW1uV2l0ZGggPSAoSW50ZWdlcikgdGFibGUuZ2V0RGF0YSgiY29sdW1uLndpZHRoIik7Ci0KLQkJCQkvLyBVc2UgdGhlIGNhbGN1bGF0ZWQgd2lkdGggaWYgdGhlIGNvbHVtbiBpcyBzbWFsbGVyLCBvdGhlcndpc2UKLQkJCQkvLyB1c2UgdGhlIGNvbHVtbiB3aWR0aCBhbmQgYSBob3Jpem9udGFsIHNjcm9sbCBiYXIgd2lsbCBzaG93IHVwCi0JCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgY29sdW1uV2l0ZGgpOwotCi0JCQkJLy8gQWRqdXN0IHRoZSBjb2x1bW4gd2lkdGgKLQkJCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCh3aWR0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVMYWJlbFByb3ZpZGVyKElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKChJTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE1haW5Db250cm9sKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXRhYmxlID0gYWRkVW5tYW5hZ2VkVGFibGUoCi0JCQlhZGRUYWJsZUNvbnRhaW5lcihjb250YWluZXIpLAotCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJLAotCQkJaGVscElkCi0JCSk7Ci0KLQotCQlUYWJsZU1vZGVsQWRhcHRlciBtb2RlbCA9IFRhYmxlTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJKExpc3RWYWx1ZU1vZGVsPE9iamVjdD4pIGxpc3RIb2xkZXIsCi0JCQlnZXRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZFRhYmxlTGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKQotCQkpOwotCi0JCW1vZGVsLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJc2VsZWN0ZWRJdGVtSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQlidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCi0JCWluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGdpdmVuIHRhYmxlLCB3aGljaCBhY3RzIGxpa2UgYSBsaXN0IGluIG91ciBjYXNlLgotCSAqCi0JICogQHBhcmFtIHRhYmxlIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQotCQl0YWJsZS5zZXREYXRhKCJjb2x1bW4ud2lkdGgiLCBuZXcgSW50ZWdlcigwKSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUoZmFsc2UpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQsIHVwZGF0ZSAoMSkgdGhlIHNlbGVjdGVkIGl0ZW0gaG9sZGVyLCAoMikgdGhlCi0JICogc2VsZWN0aW9uIG1vZGVsIGFuZCAoMykgdGhlIGJ1dHRvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbCA9IGdldFNlbGVjdGlvbk1vZGVsKCk7Ci0JCWludCBzZWxlY3Rpb25Db3VudCA9IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQotCQlpZiAoc2VsZWN0aW9uQ291bnQgPT0gMCkgewotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3Rpb25Db3VudCAhPSAxKSB7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQlzZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGlvbigpOwotCi0JCQlmb3IgKGludCBpbmRleCA6IHRoaXMudGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW5kZXgsIGluZGV4KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWludCBzZWxlY3RlZEluZGV4ID0gdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IGdldExpc3RIb2xkZXIoKS5nZXQoc2VsZWN0ZWRJbmRleCk7Ci0KLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQl9Ci0KLQkJdXBkYXRlQnV0dG9ucygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbGFiZWwgcHJvdmlkZXIgc2ltcGx5IGRlbGVnYXRlcyB0aGUgcmVuZGVyaW5nIHRvIHRoZSBwcm92aWRlZAotCSAqIDxjb2RlPklMYWJlbFByb3ZpZGVyPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCQlUYWJsZUxhYmVsUHJvdmlkZXIoSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIGxhYmVsUHJvdmlkZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNjE3NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgYSBwYW5lIHRoYXQgaGFzIGJ1dHRvbnMgZm9yIGFkZGluZywgcmVtb3ZpbmcgYW5kCi0gKiBwb3NzaWJseSBlZGl0aW5nIHRoZSBpdGVtcy4KLSAqCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMS4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZW1vdmVQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBBZGFwdGVyIGFkYXB0ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkQnV0dG9uOwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZDsKLQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbiBvcHRpb25hbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiByZW1vdmVCdXR0b247Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlcjsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXRoaXMocGFyZW50UGFuZSwKLQkJICAgICBwYXJlbnQsCi0JCSAgICAgYWRhcHRlciwKLQkJICAgICBsaXN0SG9sZGVyLAotCQkgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgaGVscElkLAotCQkgICAgIHRydWUpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwgCi0JICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlLCBwYXJlbnRNYW5hZ2VQYW5lKTsKLQotCQlpbml0aWFsaXplKAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUxheW91dCgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlciwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICBwYXJlbnQsCi0JCSAgICAgYWRhcHRlciwKLQkJICAgICBsaXN0SG9sZGVyLAotCQkgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCBBZGRSZW1vdmVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0KLQkJaW5pdGlhbGl6ZSgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCWluaXRpYWxpemVMYXlvdXQoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGJ1dHRvbnMgYWZ0ZXIgdGhlIEFkZCBidXR0b24gYW5kIGJlZm9yZSB0aGUKLQkgKiBvcHRpb25hbCBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1dHRvbnMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21CdXR0b25BZnRlckFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGJ1dHRvbnMgYWZ0ZXIgdGhlIG9wdGlvbmFsIGJ1dHRvbiBhbmQgYmVmb3JlCi0JICogdGhlIFJlbW92ZSBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGJ1dHRvbnMKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21CdXR0b25BZnRlck9wdGlvbmFsQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEl0ZW0oKSB7Ci0JCWFkYXB0ZXIuYWRkTmV3SXRlbShzZWxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBBZGQKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlhZGFwdGVyLmFkZEJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkQWRkSXRlbUFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRBZGRJdGVtQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5hZGRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc0FkZGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc01vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuaXRlbXNSZW1vdmVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc1JlcGxhY2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5saXN0Q2hhbmdlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5saXN0Q2xlYXJlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOwotCi0JCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlLmdldEl0ZW1zKCksIHNlbGVjdGVkSXRlbSkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT3B0aW9uYWxBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmVkaXRJdGVtKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IE9wdGlvbgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkT3B0aW9uYWxCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkVW5tYW5hZ2VkQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJYWRhcHRlci5vcHRpb25hbEJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkT3B0aW9uYWxBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBBZGQKLQkgKi8KLQlwcm90ZWN0ZWQgQnV0dG9uIGFkZFJlbW92ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlhZGFwdGVyLnJlbW92ZUJ1dHRvblRleHQoKSwKLQkJCWJ1aWxkUmVtb3ZlSXRlbXNBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBSZW1vdmUKLQkgKi8KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUmVtb3ZlSXRlbXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLnJlbW92ZUl0ZW1zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFJvd1NlbGVjdGlvbk1vZGVsKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RNb2RlbCkgewotCQlyZXR1cm4gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0TW9kZWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgT3B0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZWRpdEl0ZW0oKSB7Ci0JCXRoaXMuYWRhcHRlci5vcHRpb25PblNlbGVjdGlvbihnZXRTZWxlY3Rpb25Nb2RlbCgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0KLQkJaWYgKCF0aGlzLmdldE1haW5Db250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmdldE1haW5Db250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCi0JCXRoaXMudXBkYXRlQnV0dG9ucygpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBJQmFzZUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGdldExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBsaXN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQ29tcG9zaXRlIGdldE1haW5Db250cm9sKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBnZXRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JfQotCi0JcHVibGljIGZpbmFsIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBnZXRTZWxlY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbk1vZGVsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWRkL3JlbW92ZSBwYW5lLgotCSAqCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpCi0JewotCQl0aGlzLmxpc3RIb2xkZXIgICAgICAgICA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGFiZWxQcm92aWRlciAgICAgID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy5hZGFwdGVyICAgICAgICAgICAgPSAoYWRhcHRlciA9PSBudWxsKSA/IGJ1aWxkQWRhcHRlcigpIDogYWRhcHRlcjsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIgPSAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pikgc2VsZWN0ZWRJdGVtSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsICAgICA9IG5ldyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwobmV3IExpc3RNb2RlbEFkYXB0ZXIobGlzdEhvbGRlcikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoCi0JCQlMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywKLQkJCWJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgcGFuZSBjb250YWluaW5nIHRoZSBidXR0b25zIChBZGQsIG9wdGlvbmFsIChpZiByZXF1aXJlZCkKLQkgKiBhbmQgUmVtb3ZlKS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCdXR0b25QYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQljb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICA9IFNXVC5UT1A7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBBZGQgYnV0dG9uCi0JCXRoaXMuYWRkQnV0dG9uID0gYWRkQWRkQnV0dG9uKGNvbnRhaW5lcik7Ci0JCWFkZEFsaWduUmlnaHQodGhpcy5hZGRCdXR0b24pOwotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJBZGRCdXR0b24oY29udGFpbmVyLCBoZWxwSWQpOwotCi0JCS8vIE9wdGlvbmFsIGJ1dHRvbgotCQlpZiAodGhpcy5hZGFwdGVyLmhhc09wdGlvbmFsQnV0dG9uKCkpIHsKLQkJCXRoaXMub3B0aW9uYWxCdXR0b24gPSBhZGRPcHRpb25hbEJ1dHRvbihjb250YWluZXIpOwotCQkJYWRkQWxpZ25SaWdodCh0aGlzLm9wdGlvbmFsQnV0dG9uKTsKLQkJfQotCi0JCS8vIEN1c3RvbSBidXR0b24KLQkJYWRkQ3VzdG9tQnV0dG9uQWZ0ZXJPcHRpb25hbEJ1dHRvbihjb250YWluZXIsIGhlbHBJZCk7Ci0KLQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQlyZW1vdmVCdXR0b24gPSBhZGRSZW1vdmVCdXR0b24oY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodChyZW1vdmVCdXR0b24pOwotCi0JCS8vIFVwZGF0ZSB0aGUgaGVscCB0b3BpYyBJRAotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGFkZEJ1dHRvbiwgaGVscElkKTsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJlbW92ZUJ1dHRvbiwgaGVscElkKTsKLQotCQkJaWYgKG9wdGlvbmFsQnV0dG9uICE9IG51bGwpIHsKLQkJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChvcHRpb25hbEJ1dHRvbiwgaGVscElkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYWRkL3JlbW92ZSBwYW5lIGJ5IGNyZWF0aW5nIHRoZSB3aWRnZXRzLiBUaGUgc3ViY2xhc3MgaXMKLQkgKiByZXF1aXJlZCB0byBidWlsZCB0aGUgbWFpbiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChBZGFwdGVyIGFkYXB0ZXIsCi0gICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLSAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLSAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCWluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJaGVscElkKTsKLQotCQlpbml0aWFsaXplQnV0dG9uUGFuZShjb250YWluZXIsIGhlbHBJZCk7Ci0JCWVuYWJsZVdpZGdldHMoZ2V0U3ViamVjdCgpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5jb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMiwgMCwgMCwgMCwgMCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMgYWRkL3JlbW92ZSBwYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCB3YXMgbm90IHNwZWNpZmllZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVNYWluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCk7Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgUmVtb3ZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSXRlbXMoKSB7Ci0KLQkJLy8gS2VlcCB0cmFjayBvZiB0aGUgc2VsZWN0ZWQgaW5kaWNlcyBzbyB3ZSBjYW4gc2VsZWN0IGFuIGl0ZW0KLQkJLy8gYmVmb3JlIHRoZSBsb3dlc3QgaW5kZXgKLQkJaW50W10gaW5kaWNlcyA9IHNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkSW5kaWNlcygpOwotCQlBcnJheXMuc29ydChpbmRpY2VzKTsKLQotCQkvLyBOb3RpZnkgdGhlIGFkYXB0ZXIgdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBpdGVtcwotCQlhZGFwdGVyLnJlbW92ZVNlbGVjdGVkSXRlbXMoc2VsZWN0aW9uTW9kZWwpOwotCi0JCS8vIFNlbGVjdCBhIG5ldyBpdGVtCi0JCWlmIChnZXRMaXN0SG9sZGVyKCkuc2l6ZSgpID4gMCkgewotCQkJaW50IGluZGV4ID0gTWF0aC5taW4oaW5kaWNlc1swXSwgZ2V0TGlzdEhvbGRlcigpLnNpemUoKSAtIDEpOwotCQkJT2JqZWN0IGl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KGluZGV4KTsKLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShpdGVtKTsKLQkJfQotCQkvLyBUaGUgbGlzdCBpcyBlbXB0eSwgY2xlYXIgdGhlIHZhbHVlCi0JCWVsc2UgewotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyB0aGUgZ2l2ZW4gdmFsdWUsIHdoaWNoIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHNlbGVjdGVkIHZhbHVlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCB2YWx1ZSkgewotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWRkQnV0dG9uKEJ1dHRvbiBhZGRCdXR0b24pIHsKLQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlpZiAoIWNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXVwZGF0ZUFkZEJ1dHRvbihhZGRCdXR0b24pOwotCQkJdXBkYXRlUmVtb3ZlQnV0dG9uKHJlbW92ZUJ1dHRvbik7Ci0JCQl1cGRhdGVPcHRpb25hbEJ1dHRvbihvcHRpb25hbEJ1dHRvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9wdGlvbmFsQnV0dG9uKEJ1dHRvbiBvcHRpb25hbEJ1dHRvbikgewotCQlpZiAob3B0aW9uYWxCdXR0b24gIT0gbnVsbCkgewotCQkJb3B0aW9uYWxCdXR0b24uc2V0RW5hYmxlZCgKLQkJCQllbmFibGVkICYmCi0JCQkJYWRhcHRlci5lbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25Nb2RlbCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlbW92ZUJ1dHRvbihCdXR0b24gcmVtb3ZlQnV0dG9uKSB7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKAotCQkJZW5hYmxlZCAmJgotCQkJYWRhcHRlci5lbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShzZWxlY3Rpb25Nb2RlbCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5BZGFwdGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBUaGUgdGV4dCBvZiB0aGUgYWRkIGJ1dHRvbi4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGFkZEJ1dHRvblRleHQ7Ci0KLQkJLyoqCi0JCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgb3B0aW9uYWwgYnV0dG9uIHNob3VsZCBiZSBzaG93biBvciBub3QuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b247Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIGlmIHVzZWQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQ7Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSByZW1vdmUgYnV0dG9uLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+IHdpdGggZGVmYXVsdCB0ZXh0IGZvciB0aGUKLQkJICogYWRkIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQl0aGlzKEpwdENvbW1vblVpTWVzc2FnZXMuQWRkUmVtb3ZlUGFuZV9BZGRCdXR0b25UZXh0LAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKgotCQkgKiBAcGFyYW0gaGFzT3B0aW9uYWxCdXR0b24gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24KLQkJICogYW5kIHRvIHVzZSB0aGUgYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOwotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZSBpdAotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKSB7Ci0JCQl0aGlzKCk7Ci0JCQl0aGlzLnNldEhhc09wdGlvbmFsQnV0dG9uKGhhc09wdGlvbmFsQnV0dG9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKgotCQkgKiBAcGFyYW0gb3B0aW9uYWxCdXR0b25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIHdoaWNoIG1lYW5zCi0JCSAqIHRoZSBvcHRpb25hbCBidXR0b24gd2lsbCBiZSBzaG93bgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0JCQl0aGlzKHRydWUpOwotCQkJdGhpcy5zZXRPcHRpb25hbEJ1dHRvblRleHQob3B0aW9uYWxCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBhZGRCdXR0b25UZXh0IFRoZSBhZGQgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gcmVtb3ZlQnV0dG9uVGV4dCBUaGUgcmVtb3ZlIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXIoU3RyaW5nIGFkZEJ1dHRvblRleHQsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQpIHsKLQotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYWRkQnV0dG9uVGV4dCAgICA9IGFkZEJ1dHRvblRleHQ7Ci0JCQl0aGlzLnJlbW92ZUJ1dHRvblRleHQgPSByZW1vdmVCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIGFkZEJ1dHRvblRleHQgVGhlIGFkZCBidXR0b24ncyB0ZXh0Ci0JCSAqIEBwYXJhbSByZW1vdmVCdXR0b25UZXh0IFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dAotCQkgKiBAcGFyYW0gb3B0aW9uYWxCdXR0b25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBvcHRpb25hbCBidXR0b24sIHdoaWNoIG1lYW5zCi0JCSAqIHRoZSBvcHRpb25hbCBidXR0b24gd2lsbCBiZSBzaG93bgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihTdHJpbmcgYWRkQnV0dG9uVGV4dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KSB7Ci0KLQkJCXRoaXMob3B0aW9uYWxCdXR0b25UZXh0KTsKLQkJCXRoaXMuc2V0QWRkQnV0dG9uVGV4dChhZGRCdXR0b25UZXh0KTsKLQkJCXRoaXMuc2V0UmVtb3ZlQnV0dG9uVGV4dChyZW1vdmVCdXR0b25UZXh0KTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgYWRkQnV0dG9uVGV4dCgpIHsKLQkJCXJldHVybiBhZGRCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJcmV0dXJuIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlc1NpemUoKSA9PSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZW5hYmxlUmVtb3ZlT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJcmV0dXJuIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkgIT0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJcmV0dXJuIGhhc09wdGlvbmFsQnV0dG9uOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQlyZXR1cm4gb3B0aW9uYWxCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyByZW1vdmVCdXR0b25UZXh0KCkgewotCQkJcmV0dXJuIHJlbW92ZUJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlcyB0aGUgdGV4dCBvZiB0aGUgYWRkIGJ1dHRvbi4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUKLQkJICogdGhlIDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPiBpcyBpbml0aWFsaXplZC4KLQkJICoKLQkJICogQHBhcmFtIGFkZEJ1dHRvblRleHQgVGhlIGFkZCBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRBZGRCdXR0b25UZXh0KFN0cmluZyBhZGRCdXR0b25UZXh0KSB7Ci0JCQl0aGlzLmFkZEJ1dHRvblRleHQgPSBhZGRCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHN0YXRlIG9mIHRoZSBvcHRpb25hbCBidXR0b24sIG1lYW5pbmcgaWYgaXQgc2hvdWxkIGJlIHNob3duCi0JCSAqIGJldHdlZW4gdGhlIGFkZCBhbmQgcmVtb3ZlIGJ1dHRvbnMgb3Igbm90LgotCQkgKgotCQkgKiBAcGFyYW0gaGFzT3B0aW9uYWxCdXR0b24gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gc2hvdyBhbiBvcHRpb25hbCBidXR0b24KLQkJICogYW5kIHRvIHVzZSB0aGUgYmVoYXZpb3IgcmVsYXRlZCB0byB0aGUgb3B0aW9uYWwgYnV0dG9uOwotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IHVzZSBpdAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0SGFzT3B0aW9uYWxCdXR0b24oYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbikgewotCQkJdGhpcy5oYXNPcHRpb25hbEJ1dHRvbiA9IGhhc09wdGlvbmFsQnV0dG9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbi4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZAotCQkgKiBiZWZvcmUgdGhlIDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPiBpcyBpbml0aWFsaXplZC4gVGhpcyBkb2VzIG5vdAotCQkgKiBtYWtlIHRoZSBvcHRpb25hbCBidXR0b24gdmlzaWJsZS4KLQkJICoKLQkJICogQHBhcmFtIG9wdGlvbmFsQnV0dG9uVGV4dCBUaGUgb3B0aW9uYWwgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0T3B0aW9uYWxCdXR0b25UZXh0KFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQpIHsKLQkJCXRoaXMub3B0aW9uYWxCdXR0b25UZXh0ID0gb3B0aW9uYWxCdXR0b25UZXh0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoYW5nZXMgdGhlIHRleHQgb2YgdGhlIHJlbW92ZSBidXR0b24uIFRoaXMgbWV0aG9kIGhhcyB0byBiZSBjYWxsZWQKLQkJICogYmVmb3JlIHRoZSA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4gaXMgaW5pdGlhbGl6ZWQuCi0JCSAqCi0JCSAqIEBwYXJhbSByZW1vdmVCdXR0b25UZXh0IFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0UmVtb3ZlQnV0dG9uVGV4dChTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCkgewotCQkJdGhpcy5yZW1vdmVCdXR0b25UZXh0ID0gcmVtb3ZlQnV0dG9uVGV4dDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBhY3Rpb24gd2hlbiBhZGRpbmcgYSBuZXcgaXRlbQotCSAqIG9yIHJlbW92aW5nIHRoZSBzZWxlY3RlZCBpdGVtcy4gSXQgaXMgcG9zc2libGUgdG8gYWRkIGFuIG9wdGlvbmFsIGJ1dHRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBZGFwdGVyIHsKLQotCQkvKioKLQkJICogVGhlIGFkZCBidXR0b24ncyB0ZXh0LgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSB0ZXh0IHNob3duIG9uIHRoZSBhZGQgYnV0dG9uCi0JCSAqLwotCQlTdHJpbmcgYWRkQnV0dG9uVGV4dCgpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgQWRkIGJ1dHRvbi4KLQkJICovCi0JCXZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzLiBJbXBsZW1lbnRhdGlvbiBkaWN0YXRlcyB3aGV0aGVyIGJ1dHRvbgotCQkgKiBzaG91bGQgYmUgZW5hYmxlZC4KLQkJICovCi0JCWJvb2xlYW4gZW5hYmxlT3B0aW9uT25TZWxlY3Rpb25DaGFuZ2UoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlcy4gSW1wbGVtZW50YXRpb24gZGljdGF0ZXMgd2hldGhlciByZW1vdmUgYnV0dG9uCi0JCSAqIHNob3VsZCBiZSBlbmFibGVkLgotCQkgKi8KLQkJYm9vbGVhbiBlbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIG9wdGlvbmFsIGJ1dHRvbiBzaG91bGQgYmUgYWRkZWQgYmV0d2VlbiB0aGUgYWRkCi0JCSAqIGFuZCByZW1vdmUgYnV0dG9ucy4KLQkJICoKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzaG93IGFuIG9wdGlvbmFsIGJ1dHRvbiBhbmQgdG8gdXNlIHRoZQotCQkgKiBiZWhhdmlvciByZWxhdGVkIHRvIHRoZSBvcHRpb25hbCBidXR0b247IDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgdXNlCi0JCSAqIGl0Ci0JCSAqLwotCQlib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJlc291cmNlIHN0cmluZyBrZXkgZm9yIHRoZSBvcHRpb25hbCBidXR0b24uCi0JCSAqLwotCQlTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBvcHRpb25hbCBidXR0b24KLQkJICovCi0JCXZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dC4KLQkJICoKLQkJICogQHJldHVybiBUaGUgdGV4dCBzaG93biBvbiB0aGUgcmVtb3ZlIGJ1dHRvbgotCQkgKi8KLQkJU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQoKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIFJlbW92ZSBidXR0b24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVUYWJsZVBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVUYWJsZVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhN2VkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlVGFibGVQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IHVzZXMgYSA8Y29kZT5UYWJsZTwvY29kZT4KLSAqIGFzIGl0cyBtYWluIHdpZGdldC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tIHwKLSAqIHwgfCBDb2x1bW4gMSB8IENvbHVtbiAyIHwgLi4uICAgfCBDb2x1bW4gaSB8IC4uLiAgIHwgQ29sdW5tIG4gfCB8IEFkZC4uLiAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8IC0tLS0tLS0tLS0tIHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IEVkaXQuLi4gfCB8Ci0gKiB8IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IC0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCB8IFJlbW92ZSAgfCB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZGRSZW1vdmVUYWJsZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KLXsKLQkvKioKLQkgKiBGbGFnIHVzZWQgdG8gcHJldmVudCBjaXJjdWxhcgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVRhYmxlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVUYWJsZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVUYWJsZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sdW1uQWRhcHRlcjw/PiBidWlsZENvbHVtbkFkYXB0ZXIoKTsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmICh0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWlmICghbG9ja2VkKSB7Ci0JCQkJCWxvY2tlZCA9IHRydWU7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCU9iamVjdCB2YWx1ZSA9IGUuZ2V0TmV3VmFsdWUoKTsKLQkJCQkJCWdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0ZWRWYWx1ZShlLmdldE5ld1ZhbHVlKCkpOwotCQkJCQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRMaXN0SG9sZGVyKCkuaXRlcmF0b3IoKSwgdmFsdWUpOwotCQkJCQkJfQotCi0JCQkJCQl0YWJsZS5zZWxlY3QoaW5kZXgpOwotCQkJCQkJdXBkYXRlQnV0dG9ucygpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJbG9ja2VkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+IGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8T2JqZWN0PigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8T2JqZWN0PiBlKSB7Ci0JCQkJQWRkUmVtb3ZlVGFibGVQYW5lLnRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRNYWluQ29udHJvbCgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYWluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpCi0JewotCQl0YWJsZSA9IGFkZFVubWFuYWdlZFRhYmxlKGNvbnRhaW5lciwgaGVscElkKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZU1vZGVsQWRhcHRlcjxPYmplY3Q+IHRhYmxlTW9kZWwgPSBUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCShMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KSBsaXN0SG9sZGVyLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJKENvbHVtbkFkYXB0ZXI8T2JqZWN0PikgYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQkoSVRhYmxlTGFiZWxQcm92aWRlcikgbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlICgxKSB0aGUgc2VsZWN0ZWQgaXRlbSBob2xkZXIsICgyKSB0aGUKLQkgKiBzZWxlY3Rpb24gbW9kZWwgYW5kICgzKSB0aGUgYnV0dG9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQotCQlpZiAobG9ja2VkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlsb2NrZWQgPSB0cnVlOwotCi0JCXRyeSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCQkJT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsID0gZ2V0U2VsZWN0aW9uTW9kZWwoKTsKLQkJCWludCBzZWxlY3Rpb25Db3VudCA9IHRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCk7Ci0KLQkJCWlmIChzZWxlY3Rpb25Db3VudCA9PSAwKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChzZWxlY3Rpb25Db3VudCAhPSAxKSB7Ci0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0KLQkJCQlmb3IgKGludCBpbmRleCA6IHRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJCQlzZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBzZWxlY3RlZEluZGV4ID0gdGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChzZWxlY3RlZEluZGV4KTsKLQotCQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJCXNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQotCQkJdXBkYXRlQnV0dG9ucygpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjUyNTYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSBjaG9vc2VyIGlzIHNpbXBseSBhIHBhbmUgd2l0aCB0aHJlZSB3aWRnZXRzLCB0aGUgbGFiZWwgb24gdGhlIGxlZnQsIGEgbWFpbgotICogd2lkZ2V0LCB1c3VhbGx5IGEgdGV4dCBmaWVsZCwgYW5kIGEgcmlnaHQgd2lkZ2V0IHdoaWNoIGlzIHVzdWFsbHkgYSBicm93c2UKLSAqIGJ1dHRvbi4KLSAqCi0gKiBAc2VlIENsYXNzQ2hvb3NlclBhbmUKLSAqIEBzZWUgUGFja2FnZUNob29zZXJQYW5lCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBsYWJlbCAobGVmdCBjb250cm9sKS4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2wgbWFpbkNvbnRyb2w7Ci0KLQkvKioKLQkgKiBUaGUgY29udHJvbCBzaG93biBhZnRlciB0aGUgbWFpbiBjb250cm9sLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCByaWdodENvbnRyb2w7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMubWFpbkNvbnRyb2wgID0gYWRkTWFpbkNvbnRyb2woY29udGFpbmVyKTsKLQkJdGhpcy5yaWdodENvbnRyb2wgPSBhZGRSaWdodENvbnRyb2woY29udGFpbmVyKTsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJYWRkTGVmdENvbnRyb2woY29udGFpbmVyKSwKLQkJCXRoaXMubWFpbkNvbnRyb2wsCi0JCQl0aGlzLnJpZ2h0Q29udHJvbCwKLQkJCWdldEhlbHBJZCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGVmdCBjb250cm9sLiBCeSBkZWZhdWx0IGEgbGFiZWwgaXMgY3JlYXRlZCBhbmQgaXRzIHRleHQgaXMKLQkgKiByZXRyaWV2ZWQgYnkge0BsaW5rICNnZXRMYWJlbFRleHQoKX0uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBsZWZ0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRMZWZ0Q29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRMYWJlbChjb250YWluZXIsIGdldExhYmVsVGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBvZiB0aGUgbGFiZWwuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotCSAqIHtAbGluayAjYnVpbGRMZWZ0Q29udHJvbChDb21wb3NpdGUpfS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IG9mIHRoZSBsZWZ0IGNvbnRyb2wgKHdoaWNoIGlzIGEgbGFiZWwgYnkKLQkgKiBkZWZhdWx0KQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtYWluIGNvbnRyb2wgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgbWFpbiBjb250cm9sCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSByaWdodCBjb250cm9sLiBCeSBkZWZhdWx0IGEgYnJvd3NlIGJ1dHRvbiBpcyBjcmVhdGVkIGFuZCBpdHMKLQkgKiBhY3Rpb24gaXMgcGVyZm9ybWVkIGJ5IHtAbGluayAjYnVpbGRCcm93c2VBY3Rpb24oKX0gYW5kIGl0cyB0ZXh0IGlzCi0JICogcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0QnJvd3NlQnV0dG9uVGV4dCgpfS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIHJpZ2h0IGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRSaWdodENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJZ2V0QnJvd3NlQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRCcm93c2VBY3Rpb24oKQotCQkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGJyb3dzZSBidXR0b24uIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQotCSAqIHtAbGluayAjYnVpbGRSaWdodENvbnRyb2woQ29tcG9zaXRlKX0uCi0JICoKLQkgKiBAcmV0dXJuICJCcm93c2UuLi4iCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCcm93c2VCdXR0b25UZXh0KCkgewotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5DaG9vc2VyUGFuZV9icm93c2VCdXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgYWN0aW9uIHJlc3BvbnNpYmxlIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiB3aGVuIHRoZSBCcm93c2UgaXMKLQkgKiBjbGlja2VkLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5SdW5uYWJsZTwvY29kZT4gcGVyZm9ybWluZyB0aGUgYWN0dWFsIGFjdGlvbiBvZiB0aGUKLQkgKiBidXR0b24KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHAgdG9waWMgSUQgZm9yIHRoZSBjb250cm9scyBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlzIHJldHVybmVkIG90aGVyd2lzZSB0aGUgc3ViY2xhc3MgY2FuIHJldHVybiBhbiBJRAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJaWYgKCF0aGlzLm1haW5Db250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5tYWluQ29udHJvbC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJaWYgKCF0aGlzLnJpZ2h0Q29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMucmlnaHRDb250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGViM2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlckNvbWJvUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgdHlwZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzIGNvZGUKLSAqIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDbGFzc0Nob29zZXJQYW5lPFQ+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDbGFzc0Nob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0gICAgCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRDbGFzc0NvbWJvKHN1YlBhbmUpOwotCi0JCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZUNvbWJvQ29udGVudEFzc2lzdGFudCgKLQkJCWNvbWJvLAotCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBhZGRDbGFzc0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUZXh0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKQotCQkpOwotIAl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRDbGFzc0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmViMjQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5yZWZhY3RvcmluZy5jb250ZW50YXNzaXN0LkphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5OZXdDbGFzc0NyZWF0aW9uV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDbGFzc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgdHlwZSB3aGVuIGJyb3dzaW5nIGFuZCBpdCBhZGRzIGNvZGUKLSAqIGNvbXBsZXRpb24gc3VwcG9ydCB0byB0aGUgdGV4dCBmaWVsZCwgd2hpY2ggaXMgdGhlIG1haW4gY29tcG9uZW50LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBDaG9vc2VyUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBjb2RlIGNvbXBsZXRpb24gbWFuYWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcjsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDbGFzc0Nob29zZXJQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DbGFzc0Nob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDbGFzc0Nob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCi0JCS8vIFRPRE8gYnVnIDE1NjE4NSAtIHdoZW4gdGhpcyBpcyBmaXhlZCB0aGVyZSBzaG91bGQgYmUgYXBpIGZvciB0aGlzCi0JCXRoaXMuamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcihmYWxzZSwgZmFsc2UpOwotCi0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoZ2V0U3ViamVjdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2xhc3NDaG9vc2VyUGFuZS50aGlzLmNsYXNzQ2hvb3NlclN1YmplY3RDaGFuZ2VkKChUKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsYXNzQ2hvb3NlclN1YmplY3RDaGFuZ2VkKFQgbmV3U3ViamVjdCkgewotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IG51bGw7Ci0JCWlmIChuZXdTdWJqZWN0ICE9IG51bGwpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCQlpZiAocm9vdCAhPSBudWxsKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50ID0gcm9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpOwotCQkJfQotCQl9Ci0JCXRoaXMuamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yLnNldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZExlZnRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaWYoICEgdGhpcy5hbGxvd1R5cGVDcmVhdGlvbigpKSB7Ci0JCQlyZXR1cm4gc3VwZXIuYWRkTGVmdENvbnRyb2woY29udGFpbmVyKTsKLQkJfQotCQlIeXBlcmxpbmsgbGFiZWxMaW5rID0gdGhpcy5hZGRIeXBlcmxpbmsoY29udGFpbmVyLAotCQkJdGhpcy5nZXRMYWJlbFRleHQoKSwKLQkJCXRoaXMuYnVpbGRIeXBlckxpbmtBY3Rpb24oKQotCQkpOwotCQlyZXR1cm4gbGFiZWxMaW5rOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRIeXBlckxpbmtBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2xhc3NDaG9vc2VyUGFuZS50aGlzLmh5cGVyTGlua1NlbGVjdGVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaHlwZXJMaW5rU2VsZWN0ZWQoKSB7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCW9wZW5JbkVkaXRvcih0eXBlKTsJCi0JCX0KLQkJZWxzZSBpZiAoYWxsb3dUeXBlQ3JlYXRpb24oKSl7Ci0JCQljcmVhdGVUeXBlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoKSB7Ci0JCWlmIChnZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXR5cGUgPSBnZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGdldENsYXNzTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHlwZSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0KLQkJTmV3Q2xhc3NXaXphcmRQYWdlIG5ld0NsYXNzV2l6YXJkUGFnZSA9IG5ldyBOZXdDbGFzc1dpemFyZFBhZ2UoKTsKLQkJbmV3Q2xhc3NXaXphcmRQYWdlLmluaXQoc2VsZWN0aW9uKTsKLQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFN1cGVyQ2xhc3MoZ2V0U3VwZXJjbGFzc05hbWUoKSwgdHJ1ZSk7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRTdXBlckludGVyZmFjZXMoZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpLCB0cnVlKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzTmFtZSgpKSkgewotCQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFR5cGVOYW1lKENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGdldENsYXNzTmFtZSgpKSwgdHJ1ZSk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoZ2V0Q2xhc3NOYW1lKCkpOwotCQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFBhY2thZ2VGcmFnbWVudChnZXRGaXJzdEphdmFTb3VyY2VGb2xkZXIoKS5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLCB0cnVlKTsKLQkJfQotCQlOZXdDbGFzc0NyZWF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdDbGFzc0NyZWF0aW9uV2l6YXJkKG5ld0NsYXNzV2l6YXJkUGFnZSwgZmFsc2UpOwotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IGRSZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZFJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAobmV3Q2xhc3NXaXphcmRQYWdlLmdldENyZWF0ZWRUeXBlKCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpOwotCQkJc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBlbmNsb3NpbmcgdHlwZSBzZXBhcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJyQnOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNldCBhIHN1cGVyY2xhc3MgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlciBpbnRlcmZhY2UgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqIEBzZWUgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRTdXBlckludGVyZmFjZU5hbWVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkpIDogQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlciBpbnRlcmZhY2UgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyBpZiBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyB0eXBlLgotCSAqIFRoaXMgd2lsbCBkZXRlcm1pbmUgd2hldGhlciBjbGlja2luZyB0aGUgaHlwZXJsaW5rIG9wZW5zIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93VHlwZUNyZWF0aW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkluRWRpdG9yKElUeXBlIHR5cGUpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKLQkJdHJ5IHsKLQkJCUphdmFVSS5vcGVuSW5FZGl0b3IoamF2YUVsZW1lbnQsIHRydWUsIHRydWUpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIpOwotCQlUZXh0IHRleHQgPSBhZGRUZXh0KHN1YlBhbmUsIGJ1aWxkVGV4dEhvbGRlcigpKTsKLQotCQlDb250cm9sQ29udGVudEFzc2lzdEhlbHBlci5jcmVhdGVUZXh0Q29udGVudEFzc2lzdGFudCgKLQkJCXRleHQsCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHMgPSBuZXcgSUphdmFFbGVtZW50W10geyBnZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCksCi0JCQkJc2NvcGUsCi0JCQkJZ2V0VHlwZURpYWxvZ1N0eWxlKCksCi0JCQkJZmFsc2UsCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRDbGFzc05hbWUoKSkgPyAiIiA6IENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGdldENsYXNzTmFtZSgpKQotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0Q29tbW9uVWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFR5cGVEaWFsb2dTdHlsZSgpIHsKLQkJcmV0dXJuIElKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9DTEFTU0VTOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIGZyb20gaXRzIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjbGFzcyBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMgZGVmaW5lZAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0Rmlyc3RKYXZhU291cmNlRm9sZGVyKCkgewotCQlJdGVyYXRvcjxJUGFja2FnZUZyYWdtZW50Um9vdD4gaSA9IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGdldEphdmFQcm9qZWN0KCkpLml0ZXJhdG9yKCk7Ci0JCXJldHVybiBpLmhhc05leHQoKSA/IGkubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBjbGFzcyBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdFR5cGUoKSB7Ci0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZVR5cGUoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpKTsKLQkJCXNldENsYXNzTmFtZShjbGFzc05hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKClbMF07Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ29tYm9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDZlZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NvbWJvUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUGFuZSB3aXRoIGNvbWJvIGJveCBzdXBwb3J0IGZvciBhdXRvbWF0aWMgdXBkYXRpbmcgb2Y6Ci0gKiAgLSBzZWxlY3RlZCB2YWx1ZQotICogIC0gZGVmYXVsdCB2YWx1ZQotICogIC0gdmFsdWUgY2hvaWNlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbWFpbiAob25seSkgd2lkZ2V0IG9mIHRoaXMgcGFuZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm8gY29tYm9Cb3g7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIENvbWJvUGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0JCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZW5hYmxlZE1vZGVsKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5jb21ib0JveC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLmJ1aWxkTW9kaWZ5TGlzdGVuZXIoKSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcih0aGlzLmNvbWJvQm94KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGJ1aWxkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlDb21ib1BhbmUudGhpcy5jb21ib0JveE1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdHlwaWNhbCBvdmVycmlkZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcG9zc2libGUgdmFsdWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb21ibyBkdXJpbmcKLQkgKiBwb3B1bGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb21ibyBpcyB0byBhZGQgYSBkZWZhdWx0IHZhbHVlIHRvIHRoZSBjaG9pY2VzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0RlZmF1bHRWYWx1ZSgpIHsKLQkJLy8gZGVmYXVsdCByZXNwb25zZSBpcyAndHJ1ZScKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZGVmYXVsdCBpcwotCSAqIHNwZWNpZmllZC4gVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgc3ViamVjdCBpcyBub24tbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBzdWJqZWN0LgotCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN1YmplY3QgaXMgbm9uLW51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFzIHRoZSBuZXcgdmFsdWUgb24gdGhlIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy51cGRhdGVTZWxlY3RlZEl0ZW0oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm9Cb3goKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwb3B1bGF0aW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUG9wdWxhdGUgdGhlIGNvbWJvLWJveCBsaXN0IGJ5IGNsZWFyaW5nIGl0LCB0aGVuIGFkZGluZyBmaXJzdCB0aGUgZGVmYXVsdAotCSAqIHZhbHVlLCBpZiBhdmFpbGFibGUsIGFuZCB0aGVuIHRoZSBwb3NzaWJsZSBjaG9pY2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ29tYm9Cb3goKSB7Ci0JCXRoaXMuY29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0JCQotCQlpZiAodXNlc0RlZmF1bHRWYWx1ZSgpKSB7Ci0JCQl0aGlzLmNvbWJvQm94LmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKSk7Ci0JCX0KLQkJCQotCQlmb3IgKFN0cmluZyB2YWx1ZSA6IHRoaXMuZ2V0VmFsdWVzKCkpIHsKLQkJCXRoaXMuY29tYm9Cb3guYWRkKHZhbHVlKTsKLQkJfQotCQkKLQkJdGhpcy51cGRhdGVTZWxlY3RlZEl0ZW1fKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VmFsdWVFbnRyeSgpIHsKLQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCXJldHVybiAoZGVmYXVsdFZhbHVlID09IG51bGwpID8gdGhpcy5idWlsZE51bGxEZWZhdWx0VmFsdWVFbnRyeSgpIDogdGhpcy5idWlsZE5vbk51bGxEZWZhdWx0VmFsdWVFbnRyeShkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROb25OdWxsRGVmYXVsdFZhbHVlRW50cnkoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbSgpIHsKLQkJLy8gbWFrZSBzdXJlIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHVwIHRvIGRhdGUgKD8/PyB+Ymp2KQotCQlpZiAodXNlc0RlZmF1bHRWYWx1ZSgpKSB7Ci0JCQlTdHJpbmcgZGVmYXVsdFZhbHVlRW50cnkgPSB0aGlzLmJ1aWxkRGVmYXVsdFZhbHVlRW50cnkoKTsKLQkJCWlmICggISB0aGlzLmNvbWJvQm94LmdldEl0ZW0oMCkuZXF1YWxzKGRlZmF1bHRWYWx1ZUVudHJ5KSkgewotCQkJCXRoaXMuY29tYm9Cb3gucmVtb3ZlKDApOwotCQkJCXRoaXMuY29tYm9Cb3guYWRkKGRlZmF1bHRWYWx1ZUVudHJ5LCAwKTsKLQkJCX0KLQkJfQotCQkKLQkJdGhpcy51cGRhdGVTZWxlY3RlZEl0ZW1fKCk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNlbGVjdGVkIGl0ZW0gYnkgc2VsZWN0aW5nIHRoZSBjdXJyZW50IHZhbHVlLCBpZiBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgb3Igc2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlIGlmIG9uZSBpcyBhdmFpbGFibGUsCi0JICogb3RoZXJ3aXNlIHJlbW92ZSB0aGUgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNlbGVjdGVkSXRlbV8oKSB7Ci0JCVN0cmluZyB2YWx1ZSA9ICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFZhbHVlKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAodXNlc0RlZmF1bHRWYWx1ZSgpKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBkZWZhdWx0IHZhbHVlCi0JCQkJdGhpcy5jb21ib0JveC5zZWxlY3QoMCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbWJvQm94LnNldFRleHQoIiIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gc2VsZWN0IHRoZSBuZXcgdmFsdWUKLQkJCWlmICggISB2YWx1ZS5lcXVhbHModGhpcy5jb21ib0JveC5nZXRUZXh0KCkpKSB7Ci0JCQkJLy8gVGhpcyBwcmV2ZW50cyB0aGUgY3Vyc29yIGZyb20gYmVpbmcgc2V0IGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAoYnVnIDIzNDQxOCkuCi0JCQkJLy8gVGhlIHJlYXNvbiB3ZSBhcmUgaGl0dGluZyB0aGlzIG1ldGhvZCBhdCBhbGwgaXMgYmVjYXVzZSB0aGUKLQkJCQkvLyBjb250ZXh0IG1vZGVsIGlzIHVwZGF0aW5nIGZyb20gdGhlIHJlc291cmNlIG1vZGVsIGluIGEgd2F5Ci0JCQkJLy8gdGhhdCBjYXVzZXMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8gYmUgZmlyZWQgKHRoZSBhbm5vdGF0aW9uCi0JCQkJLy8gaXMgYWRkZWQgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9jY3VycwotCQkJCS8vIG9uIHRoZSB1cGRhdGUgdGhyZWFkLCBhbmQgdGhlbiB0aGUgbmFtZSBpcyBzZXQsIHRoZXNlIDIKLQkJCQkvLyB0aHJlYWRzIGNhbiBnZXQgaW4gdGhlIHdyb25nIG9yZGVyKS4KLQkJCQkvLyBUaGUgI3ZhbHVlQ2hhbmdlZCgpIG1ldGhvZCBzZXRzIHRoZSBwb3B1bGF0aW5nIGZsYWcgdG8gdHJ1ZSwKLQkJCQkvLyBidXQgaW4gdGhpcyBjYXNlIGl0IGlzIGFscmVhZHkgc2V0IGJhY2sgdG8gZmFsc2Ugd2hlbiB3ZQotCQkJCS8vIHJlY2VpdmUgbm90aWZpY2F0aW9uIGJhY2sgZnJvbSB0aGUgbW9kZWwgYmVjYXVzZSBpdCBoYXMKLQkJCQkvLyBtb3ZlZCB0byB0aGUgdXBkYXRlIHRocmVhZCBhbmQgdGhlbiBqdW1wcyBiYWNrIG9uIHRoZSBVSSB0aHJlYWQuCi0JCQkJdGhpcy5jb21ib0JveC5zZXRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXBvcHVsYXRlQ29tYm9Cb3goKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5yZXBvcHVsYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb21iby1ib3ggbGlzdGVuZXIgY2FsbGJhY2sgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9Cb3hNb2RpZmllZCgpIHsKLQkJaWYgKCAhIHRoaXMuaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXRoaXMudmFsdWVDaGFuZ2VkKHRoaXMuY29tYm9Cb3guZ2V0VGV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29tYm8tYm94IHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlIHRoZSBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICogSWYgdGhlIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCB0aGUgc3ViamVjdCBpcyBudWxsLCB3ZSBjYW4gYnVpbGQgYSBzdWJqZWN0Ci0JICogYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJVCBzdWJqZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCVN0cmluZyBvbGRWYWx1ZTsKLQkJaWYgKHN1YmplY3QgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMubnVsbFN1YmplY3RJc05vdEFsbG93ZWQoKSkgewotCQkJCXJldHVybjsgIC8vIG5vIHN1YmplY3QgdG8gc2V0IHRoZSB2YWx1ZSBvbgotCQkJfQotCQkJb2xkVmFsdWUgPSBudWxsOwotCQl9IGVsc2UgewotCQkJb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCX0KLQkJCi0JCS8vIGNvbnZlcnQgZW1wdHkgc3RyaW5nIG9yIGRlZmF1bHQgdG8gbnVsbAotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuZXdWYWx1ZSkgfHwgdGhpcy52YWx1ZUlzRGVmYXVsdChuZXdWYWx1ZSkpIHsKLQkJCW5ld1ZhbHVlID0gbnVsbDsKLQkJfQotCQkKLQkJLy8gc2V0IHRoZSBuZXcgdmFsdWUgaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9sZCB2YWx1ZQotCQlpZiAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQl0aGlzLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdGhpcy5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBjYW4gc2V0IHRoZSB2YWx1ZSB3aGVuIHRoZSBzdWJqZWN0IGlzIG51bGwKLQkgKiAoaS5lLiAjc2V0VmFsdWUoU3RyaW5nKSB3aWxsIGNvbnN0cnVjdCB0aGUgc3ViamVjdCBpZiBuZWNlc3NhcnkpLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG51bGxTdWJqZWN0SXNOb3RBbGxvd2VkKCkgewotCQlyZXR1cm4gISB0aGlzLm51bGxTdWJqZWN0SXNBbGxvd2VkKCk7Ci0JfQotCQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHZhbHVlIGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVJc0RlZmF1bHQoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICghIHVzZXNEZWZhdWx0VmFsdWUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiAodGhpcy5jb21ib0JveC5nZXRJdGVtQ291bnQoKSA+IDApCi0JCQkJJiYgdmFsdWUuZXF1YWxzKHRoaXMuY29tYm9Cb3guZ2V0SXRlbSgwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RlZmF1bHRXaWRnZXRGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGVmYXVsdFdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNGRjMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGVmYXVsdFdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gc2ltcGx5IGNyZWF0ZXMgcGxhaW4gU1dUIHdpZGdldHMuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0V2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPklXaWRnZXRGYWN0b3J5PC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFdpZGdldEZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdFdpZGdldEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVmYXVsdFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgRGVmYXVsdFdpZGdldEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBXaWRnZXRGYWN0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGJ1dHRvbiwgd2hpY2ggZGV0ZXJtaW5lcyBpdHMgdHlwZToKLQkgKiB0b2dnbGUsIHB1c2gsIGNoZWNrIGJveCwgcmFkaW8KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIHN0eWxlKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuQ0hFQ0spOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQkKLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIERhdGVUaW1lIGNyZWF0ZURhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IERhdGVUaW1lKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlRWRpdGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJZ3JvdXAuc2V0VGV4dCh0aXRsZSk7Ci0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJSHlwZXJsaW5rIGh5cGVybGluayA9IG5ldyBIeXBlcmxpbmsocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWh5cGVybGluay5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gaHlwZXJsaW5rOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChsYWJlbFRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgTGlzdChwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgICA9IDE7Ci0JCWxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiAgID0gMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luICA9IDA7Ci0JCWxheW91dC50b3BNYXJnaW4gICAgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJRm9ybVRvb2xraXQgd2lkZ2V0RmFjdG9yeSA9IG5ldyBGb3JtVG9vbGtpdChwYXJlbnQuZ2V0RGlzcGxheSgpKTsKLQkJRm9ybVRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlRm9ybVRleHQoY29udGFpbmVyLCB0cnVlKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXRleHQuc2V0VGV4dChsYWJlbFRleHQsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUFVTSCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlJBRElPKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNlY3Rpb24gY3JlYXRlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBTZWN0aW9uKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3Bpbm5lciBjcmVhdGVTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgVGFibGUocGFyZW50LCBTV1QuQk9SREVSIHwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0LCB0aGlzKTsKLQkJcmV0dXJuIGNoZWNrQm94LmdldENoZWNrQm94KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2cuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2NTA5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBkaWFsb2cgdXNpbmcgYSAic3RhdGUgb2JqZWN0IiAobW9kZWwgb2JqZWN0KQotICogZm9yIGJlaGF2aW9yLgotICogPHA+Ci0gKiBUaGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nIHNob3VsZCBiZSBleHRlbmRpbmcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KLSAqIGZvciBjcmVhdGluZyB0aGUgcmlnaHQgdHlwZSBvZiB3aWRnZXRzIGFuZCBpdCBoYXMgdGhlICJzdGF0ZSBvYmplY3QiIChzdWJqZWN0KQotICogYmVoYXZpb3IgYnVpbHQtaW4uCi0gKgotICogQHNlZSBOb2RlCi0gKiBAc2VlIERpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFRpdGxlQXJlYURpYWxvZwotewotCS8qKgotCSAqIFRoZSBtYWluIGNvbnRlbnQgcGFuZSBvZiB0aGlzIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIERpYWxvZ1BhbmU8Pz4gcGFuZTsKLQotCS8qKgotCSAqIFRoZSBob2xkZXIgb2YgdGhlICJzdGF0ZSBvYmplY3QiIHVzZWQgYnkgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqCi0JICogQ2FjaGVzIHRoZSB0aXRsZSB0ZXh0IHVudGlsIHRoZSBkaWFsb2cgaXMgY3JlYXRlZCBhbmQgdGhlIGRpYWxvZydzIHNoZWxsCi0JICogbmVlZHMgdG8gYmUgY29uZmlndXJlZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCAiIik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFRoZSBkaWFsb2cncyB0aXRsZQotCSAqLwotCXByb3RlY3RlZCBEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIG1haW4gcGFuZSBvZiB0aGlzIGRpYWxvZy4gVGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5Ci0JICogd2hlbiB0aGUgZGlhbG9nIGlzIHJlcXVlc3RlZCB0byBzaG93IG9uIHNjcmVlbiBhbmQgbm90IGR1cmluZwotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIHRvIHdoaWNoIHRoZSB3aWRnZXRzIHNob3VsZCBiZSBhZGRlZCB0bywKLQkgKiB0aGUgbGF5b3V0IGlzIGFscmVhZHkgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERpYWxvZ1BhbmU8Pz4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzdGF0ZSBvYmplY3QgKG1vZGVsIG9iamVjdCkgdGhhdCB3aWxsIGJlIHVzZWQgdG8ga2VlcCB0cmFjawotCSAqIG9mIHRoZSBpbmZvcm1hdGlvbiBlbnRlcmVkIGluIHRoaXMgZGlhbG9nLiBUaGUgc3RhdGUgb2JqZWN0IHdpbGwgYmUgc3RvcmVkCi0JICogaW4gdGhlIHN1YmplY3QgaG9sZGVyIGFuZCBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHtAbGluayAjc3ViamVjdCgpfS4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgc3RhdGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIFQgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiBjaGFuZ2VzIGFyZQotCSAqIG1hZGUgdG8gdGhlIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgc2V0IG9uIHRoZSBzdGF0ZSBvYmplY3QKLQkgKi8KLQlOb2RlLlZhbGlkYXRvciBidWlsZFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIE5vZGUuTlVMTF9WQUxJREFUT1I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0KLQkJLy8gRGlzcG9zZSB0aGUgcGFuZSBpbiBvcmRlciB0byByZW1vdmUgYW55IGxpc3RlbmVycyB0aGF0IGNvdWxkCi0JCS8vIGhhdmUgYmVlbiBpbnN0YWxsZWQgb3V0c2lkZSB0aGUgc2Nyb3BlIG9mIHRoZSBzdGF0ZSBvYmplY3QKLQkJaWYgKHBhbmUgIT0gbnVsbCkgewotCQkJcGFuZS5kaXNwb3NlKCk7Ci0JCQlwYW5lID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQoZ2V0VGl0bGUoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCWluc3RhbGxTdWJqZWN0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoaGFzVGl0bGVBcmVhKCkpIHsKLQkJCXJldHVybiBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRDb250ZW50KHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBtYWluIGNvbnRhaW5lciBvZiB0aGlzIGRpYWxvZyB3aGVuIHRoZSB0aXRsZSBhcmVhIGlzCi0JICogbm90IHJlcXVpcmVkLiBUaGUgdG9wIHBhcnQgaXMgdGhlIGRpYWxvZyBhcmVhIHBvcHVsYXRlZCBieSB0aGUgc3ViY2xhc3MKLQkgKiBhbmQgdGhlIGxvd2VyIHBhcnQgaXMgdGhlIGJ1dHRvbiBwYW5lIGhhdmluZyB0aGUgT0sgYW5kIENhbmNlbCBidXR0b25zLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlRGVmYXVsdENvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ICAgICAgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggICAgID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMoY29tcG9zaXRlKTsKLQkJZGlhbG9nQXJlYSA9IGNyZWF0ZURpYWxvZ0FyZWEoY29tcG9zaXRlKTsKLQkJYnV0dG9uQmFyICA9IGNyZWF0ZUJ1dHRvbkJhcihjb21wb3NpdGUpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBJZiB0aGUgdGl0bGUgYXJlYSBuZWVkcyB0byBiZSBzaG93biwgdGhlbiBsZWF2ZSB0aGUgc3VwZXJjbGFzcyB0bwotCQkvLyBjcmVhdGUgdGhlIG5lY2Vzc2FyeSB3aWRnZXRzCi0JCWlmIChoYXNUaXRsZUFyZWEoKSkgewotCQkJcGFyZW50ID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQl9Ci0KLQkJLy8gQ3JlYXRlIHRoZSBtYWluIGFyZWEncyBjb250YWluZXIKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIGNvbnRlbnQgcGFuZQotCQlwYW5lID0gYnVpbGRMYXlvdXQoY29udGFpbmVyKTsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBVSSBwYXJ0LCB3aGljaCByZXF1aXJlcyB0aGUgd2lkZ2V0cyBiZWluZyBjcmVhdGVkCi0JCWluaXRpYWxpemVVSSgpOwotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkZXNjcmlwdGlvbiBhcmVhICh3aGVyZSBhIHRpdGxlLCBkZXNjcmlwdGlvbiBhbmQKLQkgKiBpbWFnZSkgc2hvdWxkIGJlIHZpc2libGUgb3IgaGlkZGVuLiA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPgotCSAqIGF1dG9tYXRpY2FsbHkgc2hvdyB0aGUgZGVzY3JpcHRpb24gYXJlYSBpbiBvcmRlciB0byBzaG93IHByb2JsZW1zLgotCSAqCi0JICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gYnkgZGVmYXVsdCwgd2hpY2ggbWVhbnMgdGhlIG1ldGhvZHMgdXNlZCB0bwotCSAqIHVwZGF0ZSB0aGUgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZCBpbWFnZSBzaG91bGRuJ3QgYmUgY2FsbGVkOyA8Y29kZT50cnVlPC9jb2RlPgotCSAqIHRvIG1ha2UgdGhlIGRlc2NyaXB0aW9uIHBhbmUgdmlzaWJsZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBsYXRmb3JtJ3MgaGVscCBzeXN0ZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBIZWxwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgZGlhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgVUkgcGFydCBvZiB0aGlzIGRpYWxvZywgdGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHdpZGdldHMKLQkgKiBoYXZlIGJlZW4gY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVUkoKSB7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgc3RhdGUgb2JqZWN0LCBpZiBvbmUgaXMgbmVlZGVkIGFuZCBpbnN0YWxsIGEgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPgotCSAqIGluIG9yZGVyIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMgZG9uZSB0byB0aGF0IHN0YXRlIG9iamVjdC4gVGhlCi0JICogc3ViamVjdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHN1YmplY3QgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbnN0YWxsU3ViamVjdCgpIHsKLQotCQlUIHN1YmplY3QgPSBidWlsZFN0YXRlT2JqZWN0KCk7Ci0KLQkJaWYgKHN1YmplY3QgIT0gbnVsbCkgewotCQkJc3ViamVjdC5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7Ci0JCX0KLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZygpIHsKLQkJU1dUVXRpbC5zZXRVc2VySW50ZXJmYWNlQWN0aXZlKGZhbHNlKTsKLQkJU1dUVXRpbC5zaG93KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEFzeW5jaHJvbm91c2x5IGxhdW5jaGVzIHRoaXMgZGlhbG9nIGluIHRoZSBVSSB0aHJlYWQgYW5kIGludm9rZSB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiB0byBwZXJmb3JtIGFueSBwb3N0LXRhc2suCi0JICoKLQkgKiBAcGFyYW0gcG9zdEV4ZWN1dGlvbiBUaGlzIGludGVyZmFjZSBsZXQgdGhlIGNhbGxlciB0byBpbnZva2UgYSBwaWVjZSBvZgotCSAqIGNvZGUgb25jZSB0aGUgZGlhbG9nIGlzIGRpc3Bvc2VkCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgb3BlbkRpYWxvZyhQb3N0RXhlY3V0aW9uPD8gZXh0ZW5kcyBEaWFsb2c8VD4+IGV4ZWN1dGlvbikgewotCQlTV1RVdGlsLnNldFVzZXJJbnRlcmZhY2VBY3RpdmUoZmFsc2UpOwotCQlTV1RVdGlsLnNob3codGhpcywgZXhlY3V0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlcyBhY2Nlc3MgdG8gdGhlIGRpYWxvZydzIG1haW4gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhbmUgc2hvd2luZyB0aGUgY3VzdG9tIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTw/PiBnZXRQYW5lKCkgewotCQlyZXR1cm4gcGFuZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzdWJqZWN0IHdhcwotCSAqIHVzZWQKLQkgKi8KLQlwdWJsaWMgVCBnZXRTdWJqZWN0KCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QgaG9sZGVyIHVzZWQgdG8gYmUgcGFzc2VkIHRvIHRoZSBkaWFsb2cgcGFuZSwgd2hpY2ggaXMKLQkgKiBhbiBpbnN0YW5jZSBvZiA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0U3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkaWFsb2cncyB0aXRsZS4gVGhlIHRpdGxlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZQotCSAqIHJldHVybmVkIGJ5IGRlZmF1bHQgYnV0IGlmIGl0IHdhc24ndCBzcGVjaWZpZWQsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkCi0JICogdG8gcmV0dXJuIGl0LgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHRpdGxlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igb3IgYSBkaWZmZXJlbnQgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGxlZCBvciBub3QuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNhbmNlbGxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgaXQgd2FzIGNvbmZpcm1lZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHdhc0NhbmNlbGxlZCgpIHsKLQkJcmV0dXJuIGdldFJldHVybkNvZGUoKSA9PSBDQU5DRUw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBkaWFsb2cgd2FzIGNvbmZpcm1lZCBvciBub3QuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBkaWFsb2cgd2FzIGNvbmZpcm1lZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgaXQgd2FzIGNhbmNlbGxlZAotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHdhc0NvbmZpcm1lZCgpIHsKLQkJcmV0dXJuIGdldFJldHVybkNvZGUoKSA9PSBPSzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZ1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2NkMGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZ1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgcGFuZSB0byB1c2Ugd2hlbiB0aGUgcGFuZSBpcyBzaG93biBpbiBhbiA8Y29kZT5EaWFsb2c8L2NvZGU+LgotICoKLSAqIEBzZWUgRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2dQYW5lPFQgZXh0ZW5kcyBOb2RlPiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoRGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IGNvbnRyb2xsZXI7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtQ29tYm9WaWV3ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwNjljNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaW1wbHkgc2hvd3MgYSBjb21ibyB3aGVyZSBpdHMgZGF0YSBpcyBwb3B1bGF0aW5nIHRocm91Z2gKLSAqIHtAbGluayAjY2hvaWNlcygpfSBhbmQgYSBkZWZhdWx0IHZhbHVlIGNhbiBhbHNvIGJlIGFkZGVkLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWFic3RyYWN0IGNsYXNzIEVudW1Db21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBjb21ib1ZpZXdlcjsKLQotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXByZXNlbnQgdGhlIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfVkFMVUUgPSAibnVsbCI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlFbnVtQ29tYm9WaWV3ZXIoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlFbnVtQ29tYm9WaWV3ZXIoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBvZiBjaG9pY2VzIGFuZCBhZGQgYW4gZXh0cmEgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0JICogZGVmYXVsdCB2YWx1ZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbWJvJ3MgY2hvaWNlcyBpbmNsdWRpbmcgdGhlIGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkQ2hvaWNlcygpIHsKLQkJVltdIGNob2ljZXMgPSBnZXRDaG9pY2VzKCk7Ci0JCWlmIChzb3J0Q2hvaWNlcygpKSB7Ci0JCQlBcnJheXMuc29ydChjaG9pY2VzLCBidWlsZENvbXBhcmF0b3IoKSk7Ci0JCX0KLQotCQlPYmplY3RbXSBleHRlbmRlZENob2ljZXMgPSBuZXcgT2JqZWN0W2Nob2ljZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoY2hvaWNlcywgMCwgZXh0ZW5kZWRDaG9pY2VzLCAxLCBjaG9pY2VzLmxlbmd0aCk7Ci0JCWV4dGVuZGVkQ2hvaWNlc1swXSA9IE5VTExfVkFMVUU7Ci0KLQkJcmV0dXJuIGV4dGVuZGVkQ2hvaWNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSB0byBzb3J0IHRoZSBjaG9pY2VzIGluIGFscGhhYmV0aWNhbCBvcmRlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB3aXRoIHRoZSByaWdodCBjb21ibyB3aWRnZXRzLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBjb21ibwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIHJpZ2h0IGNvbWJvIHdpZGdldAotCSAqLwotCXByb3RlY3RlZCBDb21ib1ZpZXdlciBhZGRDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRDb21ib1ZpZXdlcihjb250YWluZXIsIGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8T2JqZWN0PiBidWlsZENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxPYmplY3Q+KCkgewotCQkJZmluYWwgTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyID0gYnVpbGRMYWJlbFByb3ZpZGVyKCk7Ci0KLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gbGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbG9jYWxpemVkIHN0cmluZyBmcm9tIHRoZSBnaXZlbiBOTFMgY2xhc3MgYnkgY3JlYXRpbmcgdGhlCi0JICoga2V5LiBUaGF0IGtleSBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY29tcG9zaXRlJ3Mgc2hvcnQgY2xhc3MgbmFtZQotCSAqIHdpdGggdGhlIHRvU3RyaW5nKCkgb2YgdGhlIGdpdmVuIHZhbHVlIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlLgotCSAqCi0JICogQHBhcmFtIG5sc0NsYXNzIFRoZSBOTFMgY2xhc3MgdXNlZCB0byByZXRyaWV2ZSB0aGUgbG9jYWxpemVkIHRleHQKLQkgKiBAcGFyYW0gY29tcG9zaXRlQ2xhc3MgVGhlIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW5nIHRoZSBrZXksIGl0cyBzaG9ydCBjbGFzcwotCSAqIG5hbWUgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB1c2VkIHRvIGFwcGVuZCBpdHMgdG9TdHJpbmcoKSB0byB0aGUgZ2VuZXJhdGVkIGtleQotCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhDbGFzczw/PiBubHNDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBjb21wb3NpdGVDbGFzcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLQotCQlyZXR1cm4gU1dUVXRpbC5idWlsZERpc3BsYXlTdHJpbmcobmxzQ2xhc3MsIGNvbXBvc2l0ZUNsYXNzLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBsb2NhbGl6ZWQgc3RyaW5nIGZyb20gdGhlIGdpdmVuIE5MUyBjbGFzcyBieSBjcmVhdGluZyB0aGUKLQkgKiBrZXkuIFRoYXQga2V5IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjb21wb3NpdGUncyBzaG9ydCBjbGFzcyBuYW1lCi0JICogd2l0aCB0aGUgdG9TdHJpbmcoKSBvZiB0aGUgZ2l2ZW4gdmFsdWUgc2VwYXJhdGVkIGJ5IGFuIHVuZGVyc2NvcmUuCi0JICoKLQkgKiBAcGFyYW0gbmxzQ2xhc3MgVGhlIE5MUyBjbGFzcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBsb2NhbGl6ZWQgdGV4dAotCSAqIEBwYXJhbSBjb21wb3NpdGUgVGhlIG9iamVjdCB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaG9ydCBjbGFzcyBuYW1lIHRoYXQgaXMKLQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHVzZWQgdG8gYXBwZW5kIGl0cyB0b1N0cmluZygpIHRvIHRoZSBnZW5lcmF0ZWQga2V5Ci0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKENsYXNzPD8+IG5sc0NsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0KLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKG5sc0NsYXNzLCBjb21wb3NpdGUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkaXNwbGF5IHN0cmluZyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IGlzIHRoZQotCSAqIHZpcnR1YWwgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgdGhlbiBpdHMgZGlzcGxheSBzdHJpbmcgd2lsbCBiZSAiRGVmYXVsdCIKLQkgKiBhcHBlbmRlZCBieSB0aGUgYWN0dWFsIGRlZmF1bHQgdmFsdWUsIGlmIGl0IGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydCBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCi0JICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBlbGVtZW50Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gTlVMTF9WQUxVRSkgewotCQkJViBkZWZhdWx0VmFsdWUgPSAoZ2V0U3ViamVjdCgpICE9IG51bGwpID8gZ2V0RGVmYXVsdFZhbHVlKCkgOiBudWxsOwotCi0JCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0Q29tbW9uVWlNZXNzYWdlcy5FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0LCBkaXNwbGF5U3RyaW5nKTsKLQkJCX0KLQkJCXJldHVybiBudWxsRGlzcGxheVN0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGRpc3BsYXlTdHJpbmcoKFYpIHZhbHVlKTsKLQl9Ci0KLQlmaW5hbCBMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbiBidWlsZFNlbGVjdGlvbigpIHsKLQkJT2JqZWN0IHZhbHVlID0gKGdldFN1YmplY3QoKSAhPSBudWxsKSA/IGdldFZhbHVlKCkgOiBudWxsOwotCi0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl2YWx1ZSA9IE5VTExfVkFMVUU7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odmFsdWUpOwotCX0KLQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCWlmICghaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJdmFsdWVDaGFuZ2VkKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBvc3NpYmxlIGNob2ljZXMgdG8gc2hvdyBpbiB0aGUgdmlld2VyLgotCSAqCi0JICogQHJldHVybiBUaGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgY29tYm9zCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFZbXSBnZXRDaG9pY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIGlmIHRoZSBzdWJqZWN0IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSB0aGF0IGlzIGRlY2xhcmVkIGFzIGJlaW5nIHRoZSBkZWZhdWx0IHdoZW4gaXQgaXMgbm90Ci0JICogZGVmaW5lZCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgZm9yIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gdHJhbnNsYXRlIGludG8gYSBodW1hbiByZWFkYWJsZSBzdHJpbmcKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgdGV4dCByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBkaXNwbGF5U3RyaW5nKFYgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHN0cmluZyBmb3IgYSBudWxsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbnVsbERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOyAvL0kgd291bGQgcmF0aGVyIGRpc3BsYXkgbm90aGluZyB0aGFuICJEZWZhdWx0KCkiCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JZmluYWwgQ29tYm9WaWV3ZXIgZ2V0Q29tYm9WaWV3ZXIoKSB7Ci0JCXJldHVybiBjb21ib1ZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHN1YmplY3QncyB2YWx1ZS4gVGhlIHN1YmplY3QgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0JyB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0VmFsdWUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuY29tYm9WaWV3ZXIgPSB0aGlzLmFkZENvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJcmVtb3ZlQWxsKCk7Ci0JCWNvbWJvVmlld2VyLmFkZChidWlsZENob2ljZXMoKSk7Ci0JCXVwZGF0ZVNlbGVjdGlvbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnBvcHVsYXRlQ29tYm8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCB0aGUgaXRlbXMgZnJvbSB0aGUgY29tYm8uCi0JICovCi0JYWJzdHJhY3Qgdm9pZCByZW1vdmVBbGwoKTsKLQotCS8qKgotCSAqIFJlcXVlc3RzIHRoZSBnaXZlbiBuZXcgdmFsdWUgYmUgc2V0IG9uIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYmUgc2V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0VmFsdWUoViB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjdXJzb3IsIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHNob3cgdGhlIGVudGlyZSBzZWxlY3RlZCBpdGVtCi0JICogd2l0aGluIHRoZSBjb21ibydzIGFyZWEuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCB1cGRhdGVDdXJzb3IoKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCkgewotCQljb21ib1ZpZXdlci5zZXRTZWxlY3Rpb24oYnVpbGRTZWxlY3Rpb24oKSk7Ci0JCXVwZGF0ZUN1cnNvcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gY2hhbmdlcywgbm90aWZ5IHRoZSBzdWJjbGFzcyB0byBzZXQgdGhlIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgaXRlbQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCB2YWx1ZUNoYW5nZWQoT2JqZWN0IHZhbHVlKSB7Ci0KLQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCAibnVsbCIgdmFsdWUgdG8gYSByZWFsIG51bGwKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCXNldFZhbHVlKChWKSB2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRGlhbG9nQ29tYm9WaWV3ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRGlhbG9nQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVkNmIxOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZGlhbG9nIHBhbmUuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnVtRGlhbG9nQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPgotCWV4dGVuZHMgRW51bUNvbWJvVmlld2VyPFQsIFY+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRGlhbG9nQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1EaWFsb2dDb21ib1ZpZXdlcihEaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bURpYWxvZ0NvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoRGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCQlpZiAoICEgY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gZ2V0Q29tYm9WaWV3ZXIoKS5nZXRDb21ibygpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgcmVtb3ZlQWxsKCkgewotCQlnZXRDb21ibygpLnJlbW92ZUFsbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdXBkYXRlQ3Vyc29yKCkgewotCQlnZXRDb21ibygpLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmVlODlmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9FbnVtRm9ybUNvbWJvVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkVudW1Db21ib1ZpZXdlcjwvY29kZT4gc2hvdWxkIGJlIHVzZWQgd2l0aGluIGEgZm9ybSBwYW5lLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bUZvcm1Db21ib1ZpZXdlcjxUIGV4dGVuZHMgTW9kZWwsIFY+Ci0JZXh0ZW5kcyBFbnVtQ29tYm9WaWV3ZXI8VCwgVj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1Gb3JtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEVudW1Gb3JtQ29tYm9WaWV3ZXIoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRm9ybUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0KLQkJQ29tYm8gY29tYm8gPSBnZXRDb21ibygpOwotCQlpZiAoICEgY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21ib1ZpZXdlcigpLmdldENvbWJvKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWdldENvbWJvKCkucmVtb3ZlQWxsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB1cGRhdGVDdXJzb3IoKSB7Ci0JCWdldENvbWJvKCkuc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCAwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyQ29tYm9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJDb21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0N2JhZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJDb21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUgd2hlbiBicm93c2luZy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTGFiZWw6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwgfCBCcm93c2UuLi4gfCB8Ci0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGaWxlQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBhZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZExpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZ2V0VGV4dEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFN0cmluZ0NvbnZlcnRlcigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBob2xkZXIgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0TGlzdCgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBsaXN0IG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0KCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0aGlzLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZygpOwotCQotCS8qKgotCSAqIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggY29tYm8gYm94IGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhZWM2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RmlsZUNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRmlsZUNob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRGaWxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPiB0aGF0IHdpbGwgZmlsdGVyIHRoZSBjb250ZW50IG9mIHRoZQotCSAqIGRpYWxvZyBhbmQgb25seSBkaXNwbGF5cyB3aGF0IGlzIHZhbGlkLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5WaWV3ZXJGaWx0ZXI8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFZpZXdlckZpbHRlciBidWlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLAotCQkJICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBwYXJlbnRFbGVtZW50LAotCQkJICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0aGlzLnRleHRIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbHVlIGhvbGRlciBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWxpZGF0b3IgdGhhdCB3aWxsIHNob3cgYSBzdGF0dXMgbWVzc2FnZSBiYXNlZCBvbiB3aGF0IGlzCi0JICogc2VsZWN0ZWQgaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCi0JCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggIT0gMSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgcHJvamVjdCBwYXRoIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBUaGUgcHJvamVjdCBwYXRoIHVzZWQgdG8gZGlzcGxheSBpdHMgY29udGVudCBpbiBhIHNlbGVjdGlvbiBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFByb2plY3RQYXRoKCk7Ci0KLQlwcm90ZWN0ZWQgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0VGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEhvbGRlcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMudGV4dEhvbGRlciA9IHRoaXMuYnVpbGRUZXh0SG9sZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGJyb3dzZSBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmlsZSBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdEZpbGUoKSB7Ci0JCVN0cmluZyBwcm9qZWN0UGF0aD0gdGhpcy5nZXRQcm9qZWN0UGF0aCgpOwotCi0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRUZXh0KHRoaXMuZ2V0RGlhbG9nVGl0bGUoKSk7Ci0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKHByb2plY3RQYXRoKTsKLQkJU3RyaW5nIGZpbGVQYXRoID0gZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGZpbGVQYXRoICE9IG51bGwpIHsKLQkJCUZpbGVDaG9vc2VyUGFuZS50aGlzLnRleHRIb2xkZXIuc2V0VmFsdWUoZmlsZVBhdGgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJDb21ib1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Y2NlOGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJDb21ib1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZm9sZGVyIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDaG9vc2VyQ29tYm9QYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBGb2xkZXJDaG9vc2VyUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlckNvbWJvUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZvbGRlckNob29zZXJDb21ib1BhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlyZXR1cm4gYWRkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmdldFRleHRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3QgaG9sZGVyIG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdExpc3QoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGREZWZhdWx0TGlzdCgpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGhpcy5nZXREZWZhdWx0U3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGNvbWJvIGJveCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTQxNDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZvbGRlckNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlyZWN0b3J5RGlhbG9nOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZm9sZGVyIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDaG9vc2VyUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ2hvb3NlclBhbmU8VD4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIFJ1bm5hYmxlIGJ1aWxkQnJvd3NlQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdEZvbGRlcigpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRoaXMudGV4dEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgdG8gYmUgc2hvd24gaW4gdGhlIHNlbGVjdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZyBzaG93biBhYm92ZSB0aGUgdGV4dCBmaWVsZCBvZiB0aGUKLQkgKiBzZWxlY3Rpb24gZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaWFsb2dNZXNzYWdlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWxlY3Rpb24gZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcmV0dXJuIEEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nVGl0bGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGggdGhhdCB0aGUgZGlhbG9nIHdpbGwgdXNlIHRvIGZpbHRlciB0aGUgZGlyZWN0b3JpZXMgaXQKLQkgKiBzaG93cyB0byB0aGUgYXJndW1lbnQsIHdoaWNoIG1heSBiZSBudWxsLiBJZiB0aGUgc3RyaW5nIGlzIG51bGwsIHRoZW4gdGhlCi0JICogb3BlcmF0aW5nIHN5c3RlbSdzIGRlZmF1bHQgZmlsdGVyIHBhdGggd2lsbCBiZSB1c2VkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGUgcGF0aCBzdHJpbmcgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiBGb3IgY29udmVuaWVuY2UsIGVpdGhlcgotCSAqICcvJyBvciAnXCcgY2FuIGJlIHVzZWQgYXMgYSBwYXRoIHNlcGFyYXRvci4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcmV0dXJuIFRoZSBmaWx0ZXIgcGF0aAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsdGVyUGF0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnRleHRIb2xkZXIgPSB0aGlzLmJ1aWxkVGV4dEhvbGRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZvbGRlciBhbmQgc2V0IGl0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb21wdEZvbGRlcigpIHsKLQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UodGhpcy5nZXREaWFsb2dNZXNzYWdlKCkpOwotCQlkaWFsb2cuc2V0VGV4dCh0aGlzLmdldERpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aCh0aGlzLmZpbHRlclBhdGgoKSk7Ci0JCVN0cmluZyBkaXJlY3RvcnkgPSBkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaXJlY3RvcnkgIT0gbnVsbCkgewotCQkJdGhpcy50ZXh0SG9sZGVyLnNldFZhbHVlKGRpcmVjdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVdpZGdldEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTEzMDJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5XaWRnZXRGYWN0b3J5PC9jb2RlPiBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHdpZGdldHMKLSAqIHVzaW5nIHRoZSA8Y29kZT5Gb3JtVG9vbGtpdDwvY29kZT4gaW4gb3JkZXIgdXNlIHRoZSBmb3JtIHN0eWxlIChmbGF0LXN0eWxlKQotICogbG9vayBhbmQgZmVlbC4KLSAqCi0gKiBAc2VlIEZvcm1Ub29sa2l0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZvcm1XaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgV2lkZ2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcgd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEZvcm1Ub29sa2l0IHdpZGdldEZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvcm1XaWRnZXRGYWN0b3J5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldwotCSAqIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoRm9ybVRvb2xraXQgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwod2lkZ2V0RmFjdG9yeSwgIlRoZSB3aWRnZXQgZmFjdG9yeSBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLndpZGdldEZhY3RvcnkgPSB3aWRnZXRGYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIFdyYXBzIHRoZSBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGludG8gYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqIGluIG9yZGVyIHRvIGhhdmUgdGhlIHdpZGdldHMnIGJvcmRlciBwYWludGVkLiBFeGNlcHQgZm9yIDxjb2RlPkNDb21ibzwvY29kZT4sCi0JICogdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgaGF2ZSB0byBiZSAyIHBpeGVsIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQKLQkgKiBtYXJnaW5zIGhhdmUgdG8gYmUgMSBwaXhlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBvZiB0aGUgc3ViLXBhbmUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCBoYXMgdGhlIG5lY2Vzc2FyeSBzcGFjZSB0byBwYWludAotCSAqIHRoZSBib3JkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUJvcmRlckNvbnRhaW5lcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBjcmVhdGVCb3JkZXJDb250YWluZXIoY29udGFpbmVyLCAyLCAxKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IG1hcmdpbkhlaWdodCwgaW50IG1hcmdpbldpZHRoKSB7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSBtYXJnaW5XaWR0aDsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJY29udGFpbmVyID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuTlVMTCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBidXR0b24sIHdoaWNoIGRldGVybWluZXMgaXRzIHR5cGU6Ci0JICogdG9nZ2xlLCBwdXNoLCBjaGVjayBib3gsIHJhZGlvCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVDQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbWJvLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIGNvbWJvLCB1c3VhbGx5IHJlYWQtb25seSwgZmxhdAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBDQ29tYm8gY3JlYXRlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlwYXJlbnQgPSBjcmVhdGVCb3JkZXJDb250YWluZXIocGFyZW50LCAxLCAxKTsKLQotCQlDQ29tYm8gY29tYm8gPSBuZXcgQ0NvbWJvKHBhcmVudCwgc3R5bGUpOwotCQl3aWRnZXRGYWN0b3J5LmFkYXB0KGNvbWJvLCB0cnVlLCBmYWxzZSk7Ci0KLQkJLy8gQnVnemlsbGEgMTQ1ODM3IC0gd29ya2Fyb3VuZCBmb3Igbm8gYm9yZGVycyBvbiBXaW5kb3dzIFhQCi0JCWlmICh3aWRnZXRGYWN0b3J5LmdldEJvcmRlclN0eWxlKCkgPT0gU1dULkJPUkRFUikgewotCQkJY29tYm8uc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJfQotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkNIRUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkgfCBTV1QuRkxBVCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBEYXRlVGltZSBjcmVhdGVEYXRlVGltZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCk7Ci0KLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSBuZXcgRGF0ZVRpbWUocGFyZW50LCBzdHlsZSB8IFNXVC5GTEFUKTsKLQkJZGF0ZVRpbWUuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5LmFkYXB0KGRhdGVUaW1lLCB0cnVlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tYm8gY3JlYXRlRWRpdGFibGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkZMQVQpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWdyb3VwLnNldFRleHQodGl0bGUpOwotCQlyZXR1cm4gZ3JvdXA7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUh5cGVybGluayhwYXJlbnQsIHRleHQsIFNXVC5GTEFUKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQsIFNXVC5XUkFQKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExpc3QgY3JlYXRlTGlzdChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3R5bGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IExpc3QoY29udGFpbmVyLCBTV1QuRkxBVCB8IHN0eWxlKTsKLQkJbGlzdC5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJVGFibGVXcmFwTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZVdyYXBMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgICA9IDE7Ci0JCWxheW91dC5ib3R0b21NYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiAgID0gMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luICA9IDA7Ci0JCWxheW91dC50b3BNYXJnaW4gICAgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJRm9ybVRleHQgdGV4dCA9IHdpZGdldEZhY3RvcnkuY3JlYXRlRm9ybVRleHQoY29udGFpbmVyLCB0cnVlKTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZVdyYXBEYXRhKFRhYmxlV3JhcERhdGEuRklMTF9HUkFCKSk7Ci0JCXRleHQuc2V0VGV4dChsYWJlbFRleHQsIGZhbHNlLCBmYWxzZSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZU11bHRpTGluZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVBhc3N3b3JkVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgU1dULlBBU1NXT1JEKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUFVTSCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5SQURJTyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTZWN0aW9uIGNyZWF0ZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHBhcmVudCwgU1dULkZMQVQpOwotCQlzcGlubmVyLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXdpZGdldEZhY3RvcnkuYWRhcHQoc3Bpbm5lciwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKHBhcmVudCwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQkJdGFibGUuc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBTV1QuTk9ORSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsIG51bGwsIFNXVC5CT1JERVIgfCBTV1QuRkxBVCB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsIHRleHQsIHRoaXMpOwotCQlyZXR1cm4gY2hlY2tCb3guZ2V0Q2hlY2tCb3goKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG5ldyB3aWRnZXRzLgotCSAqCi0JICogQHJldHVybiBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGUgd2lkZ2V0cyB3aXRoIHRoZSBmb3JtIHN0eWxlIChmbGF0LXN0eWxlKQotCSAqLwotCXB1YmxpYyBGb3JtVG9vbGtpdCBnZXRXaWRnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ludGVnZXJDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzAzZDZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9JbnRlZ2VyQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGEgU3Bpbm5lci4gIEl0IGlzIGEgY29tYm8gdGhhdCBvbmx5IGFjY2VwdHMgaW50ZWdlcnMuCi0gKiBJdCBhbHNvIGluY2x1ZGVzIGEgRGVmYXVsdCBvcHRpb24gaW4gdGhlIGNvbWJvLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW50ZWdlckNvbWJvPFQgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQotCS8qKgotCSAqIFRoZSBtYWluIChvbmx5KSB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ29tYm8gY29tYm9Cb3g7Ci0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdFZhbHVlSG9sZGVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCi0JCQkJCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyQ29tYm8oCi0JCQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50Ci0JKSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHVibGljIENvbWJvIGdldENvbWJvKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib0JveDsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIgPSBidWlsZERlZmF1bHRTdHJpbmdIb2xkZXIoKTsKLQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYWRkSW50ZWdlckNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUw7Ci0JCWdyaWREYXRhLmhvcml6b250YWxJbmRlbnQgPSBtYXJnaW47Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJdGhpcy5jb21ib0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMuY29tYm9Cb3guYWRkVmVyaWZ5TGlzdGVuZXIodGhpcy5idWlsZFZlcmlmeUxpc3RlbmVyKCkpOwotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGhpcy5jb21ib0JveCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBhZGRJbnRlZ2VyQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCQljb250YWluZXIsCi0JCQkJZ2V0TGFiZWxUZXh0KCksCi0JCQkJYnVpbGREZWZhdWx0TGlzdEhvbGRlcigpLAotCQkJCWJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCksCi0JCQkJZ2V0SGVscElkKCkKLQkJCQkpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIFZlcmlmeUxpc3RlbmVyIGJ1aWxkVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVmVyaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2ZXJpZnlUZXh0KFZlcmlmeUV2ZW50IGUpIHsKLQkJCQlJbnRlZ2VyQ29tYm8udGhpcy52ZXJpZnlDb21ib0JveChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCQkJfQotCQkJCXJldHVybiBzdXBlci50cmFuc2Zvcm0odmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVTdHJpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoSW50ZWdlciBkZWZhdWx0VmFsdWUpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZWxlY3RlZEl0ZW1TdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyLCBTdHJpbmc+KGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSW50ZWdlciB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gCi0JCQkJCQlnZXREZWZhdWx0VmFsdWVTdHJpbmcoKQotCQkJCQk6IAotCQkJCQkJdmFsdWUudG9TdHJpbmcoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciByZXZlcnNlVHJhbnNmb3JtXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpbnQgaW50TGVuZ3RoOwotCQkJCXRyeSB7Ci0JCQkJCWludExlbmd0aCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZiB0aGUgZGVmYXVsdCBpcyBzZWxlY3RlZCBmcm9tIHRoZSBjb21ibywgc2V0IGxlbmd0aCB0byBudWxsCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKGludExlbmd0aCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhYmVsVGV4dCgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SGVscElkKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCi0JLy8gKioqKioqKioqKiBjb21iby1ib3ggdmVyaWZ5IGxpc3RlbmVyIGNhbGxiYWNrICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNvbWJvQm94KFZlcmlmeUV2ZW50IGUpIHsKLQkJaWYgKGUuY2hhcmFjdGVyID09ICdcYicpIHsKLQkJCS8vaWdub3JlIGJhY2tzcGFjZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlLnRleHQuZXF1YWxzKCIiKSAvL0RlZmF1bHRWYWx1ZUhhbmRsZXIgc2V0cyB0aGUgdGV4dCB0byAiIiAvLyROT04tTkxTLTEkCi0JCQkJfHwgZS50ZXh0LmVxdWFscyh0aGlzLmRlZmF1bHRWYWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSkgeyAKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJSW50ZWdlci5wYXJzZUludChlLnRleHQpOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZDYzNTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBkaWFsb2cgdXNlZCB0byByZXF1ZXN0cyBhIG5hbWUgZnJvbSB0aGUgdXNlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5ld05hbWVEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPE5ld05hbWVTdGF0ZU9iamVjdD4KLXsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb25UaXRsZTsKLQlwcml2YXRlIFN0cmluZyBsYWJlbFRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25UaXRsZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbkltYWdlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEBwYXJhbSBuYW1lCi0JICogQHBhcmFtIG5hbWVzCi0JICovCi0JTmV3TmFtZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwKLQkgICAgICAgICAgICAgIFN0cmluZyBkaWFsb2dUaXRsZSwKLQkgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlLAotCSAgICAgICAgICAgICAgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZSwKLQkgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICBTdHJpbmcgbmFtZSwKLQkgICAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykKLQl7Ci0JCXN1cGVyKHBhcmVudFNoZWxsLCBkaWFsb2dUaXRsZSk7Ci0KLQkJdGhpcy5uYW1lICAgICAgICAgICAgID0gbmFtZTsKLQkJdGhpcy5uYW1lcyAgICAgICAgICAgID0gbmFtZXM7Ci0JCXRoaXMubGFiZWxUZXh0ICAgICAgICA9IGxhYmVsVGV4dDsKLQkJdGhpcy5kZXNjcmlwdGlvbiAgICAgID0gZGVzY3JpcHRpb247Ci0JCXRoaXMuZGVzY3JpcHRpb25JbWFnZSA9IGRlc2NyaXB0aW9uSW1hZ2U7Ci0JCXRoaXMuZGVzY3JpcHRpb25UaXRsZSA9IGRlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8TmV3TmFtZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgTmV3TmFtZURpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmV3TmFtZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgTmV3TmFtZVN0YXRlT2JqZWN0KG5hbWUsIG5hbWVzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCi0JCU5ld05hbWVEaWFsb2dQYW5lIHBhbmUgPSAoTmV3TmFtZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uSW1hZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmaWVsZCdzIGlucHV0LCB3aGljaCBpcyB0aGUgbmV3IG5hbWUgdGhlIHVzZXIgZW50ZXJlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5hbWUgdGhlIHVzZXIgZW50ZXJlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBOZXdOYW1lRGlhbG9nUGFuZSBleHRlbmRzIERpYWxvZ1BhbmU8TmV3TmFtZVN0YXRlT2JqZWN0PiB7Ci0KLQkJcHJpdmF0ZSBUZXh0IHRleHQ7Ci0KLQkJTmV3TmFtZURpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoTmV3TmFtZURpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOZXdOYW1lU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBOZXdOYW1lU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkJdGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlsYWJlbFRleHQsCi0JCQkJYnVpbGROYW1lSG9sZGVyKCkKLQkJCSk7Ci0JCX0KLQotCQl2b2lkIHNlbGVjdEFsbCgpIHsKLQkJCXRleHQuc2VsZWN0QWxsKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQyYzA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBidWlsZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSBhIGZ1bGx5IGluaXRpYWxpemVkCi0gKiA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPiBvbmNlIGFsbCB0aGUgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0LgotICoKLSAqIEBzZWUgTmV3TmFtZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBOZXdOYW1lRGlhbG9nQnVpbGRlciB7Ci0KLQkvKioKLQkgKiBUaGUgbWVzc2FnZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JLyoqCi0JICogVGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgSW1hZ2UgZGVzY3JpcHRpb25JbWFnZTsKLQotCS8qKgotCSAqIFRoZSB0aXRsZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkaWFsb2dUaXRsZTsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWxUZXh0OwotCi0JLyoqCi0JICogVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4gYmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eSBjb2xsZWN0aW9uIGlmIG5vbmUKLQkgKiBhcmUgYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCi0JLyoqCi0JICogVGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgU2hlbGwgcGFyZW50U2hlbGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVEaWFsb2dCdWlsZGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwdWJsaWMgTmV3TmFtZURpYWxvZ0J1aWxkZXIoU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShwYXJlbnRTaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlhbG9nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJlcXVlc3QgYSBuZXcgbmFtZSBmcm9tIHRoZSB1c2VyLgotCSAqCi0JICogQHJldHVybiBUaGUgaW5pdGlhbGl6ZWQgZGlhbG9nCi0JICovCi0JcHVibGljIE5ld05hbWVEaWFsb2cgYnVpbGREaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgTmV3TmFtZURpYWxvZygKLQkJCXBhcmVudFNoZWxsLAotCQkJZGlhbG9nVGl0bGUsCi0JCQlkZXNjcmlwdGlvblRpdGxlLAotCQkJZGVzY3JpcHRpb25JbWFnZSwKLQkJCWRlc2NyaXB0aW9uLAotCQkJbGFiZWxUZXh0LAotCQkJbmFtZSwKLQkJCW5hbWVzCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBidWlsZGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsIFRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoU2hlbGwgcGFyZW50U2hlbGwpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcmVudFNoZWxsLCAiVGhlIHBhcmVudCBzaGVsbCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMucGFyZW50U2hlbGwgPSBwYXJlbnRTaGVsbDsKLQkJdGhpcy5uYW1lcyAgICAgICA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhIHVuZGVyIHRoZSB0aXRsZS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbWVzc2FnZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbWFnZSB0byBiZSBzaG93biB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbkltYWdlIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uSW1hZ2UoSW1hZ2UgZGVzY3JpcHRpb25JbWFnZSkgewotCQl0aGlzLmRlc2NyaXB0aW9uSW1hZ2UgPSBkZXNjcmlwdGlvbkltYWdlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRpdGxlIHRvIGJlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhLgotCSAqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uVGl0bGUgVGhlIHRpdGxlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIGFyZWEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblRpdGxlKFN0cmluZyBkZXNjcmlwdGlvblRpdGxlKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25UaXRsZSA9IGRlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGlhbG9nJ3MgdGl0bGUuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nVGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaWFsb2dUaXRsZShTdHJpbmcgZGlhbG9nVGl0bGUpIHsKLQkJdGhpcy5kaWFsb2dUaXRsZSA9IGRpYWxvZ1RpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGV4aXN0aW5nIG5hbWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSB0ZXh0IGZpZWxkJ3MKLQkgKiBpbnB1dCBhbmQgcHJldmVudCB0aGUgdXNlciBmcm9tIHVzaW5nIGl0LgotCSAqCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4aXN0aW5nTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBuYW1lcykgewotCQl0aGlzLm5hbWVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHRleHQgdG8gbGFiZWwgdGhlIHRleHQgZmllbGQuCi0JICoKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbFRleHQoU3RyaW5nIGxhYmVsVGV4dCkgewotCQl0aGlzLmxhYmVsVGV4dCA9IGxhYmVsVGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbml0aWFsIG5hbWUgaWYgb25lIGV4aXN0cy4gSXQgaXMgdmFsaWQgdG8gbGVhdmUgdGhpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdGhlIHVzZXIgaGFzIHRvIGVudGVyIHNvbWV0aGluZy4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lU3RhdGVPYmplY3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2YmFlMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgc3RhdGUgb2JqZWN0IHVzZWQgYnkgdGhlIDxjb2RlPk5ld05hbWVEaWFsb2c8L2NvZGU+LCB3aGljaCBzdG9yZXMKLSAqIHRoZSBjdXJyZW50IG5hbWUgYW5kIHZhbGlkYXRlcyBpdCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICoKLSAqIEBzZWUgTmV3TmFtZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIE5ld05hbWVTdGF0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0Tm9kZQotewotCS8qKgotCSAqIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCi0JICogYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIG5hbWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4KLQkgKiBiZSBzcGVjaWZpZWQKLQkgKiBAcGFyYW0gbmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5Ci0JICogY29sbGVjdGlvbiBpZiBub25lIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlOZXdOYW1lU3RhdGVPYmplY3QoU3RyaW5nIG5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lcykgewotCQlzdXBlcihudWxsKTsKLQotCQl0aGlzLm5hbWUgID0gbmFtZTsKLQkJdGhpcy5uYW1lcyA9IG5hbWVzOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlcyB0aGUgbmFtZSBwcm9wZXJ0eS4KLQkgKgotCSAqIEBwYXJhbSBjdXJyZW50UHJvYmxlbXMgVGhlIGxpc3QgdG8gd2hpY2ggPGNvZGU+UHJvYmxlbTwvY29kZT5zIGNhbiBiZQotCSAqIGFkZGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE5hbWVQcm9ibGVtcyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5hbWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRDb21tb25VaU1lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSk7Ci0JCX0KLQkJZWxzZSBpZiAobmFtZXMuY29udGFpbnMobmFtZS50cmltKCkpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRDb21tb25VaU1lc3NhZ2VzLk5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cywgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykKLQl7Ci0JCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkTmFtZVByb2JsZW1zKGN1cnJlbnRQcm9ibGVtcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnJlbnQgbmFtZSBzdG9yZWQgaW4gdGhpcyBzdGF0ZSBvYmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBjbGVhciBpdC4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJdGhpcy52YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL051bGxQb3N0RXhlY3V0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTnVsbFBvc3RFeGVjdXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlNzQyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTnVsbFBvc3RFeGVjdXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLQotLyoqCi0gKiBBIDxjb2RlPm51bGw8L2NvZGU+IGluc3RhbmNlIG9mIDxjb2RlPlBvc3RFeGVjdXRpb248L2NvZGU+LgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFBvc3RFeGVjdXRpb24gaW1wbGVtZW50cyBQb3N0RXhlY3V0aW9uPERpYWxvZz4gewotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQb3N0RXhlY3V0aW9uPERpYWxvZz4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIE51bGxQb3N0RXhlY3V0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIDxjb2RlPk51bGxQb3N0RXhlY3V0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSA8VD4gVGhlIGRpYWxvZyB3aGVyZSB0aGlzIDxjb2RlPlBvc3RFeGVjdXRpb248L2NvZGU+IHdpbGwgYmUgdXNlZAotCSAqIEByZXR1cm4gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSB3aXRoIHRoZSBwcm9wZXIgdHlwZQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRGlhbG9nPiBQb3N0RXhlY3V0aW9uPFQ+IGluc3RhbmNlKCkgewotCi0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBOdWxsUG9zdEV4ZWN1dGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIChQb3N0RXhlY3V0aW9uPFQ+KSBJTlNUQU5DRTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKERpYWxvZyBkaWFsb2cpIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NzI2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBwYWNrYWdlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMKLSAqIGNvZGUgY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvZGUgY29tcGxldGlvbiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcjsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhY2thZ2VDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWNrYWdlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ST09UKQotCQkpOwotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5wYWNrYWdlQ2hvb3NlclN1YmplY3RDaGFuZ2VkKGdldFN1YmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVBhY2thZ2VDaG9vc2VyUGFuZS50aGlzLnBhY2thZ2VDaG9vc2VyU3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFja2FnZUNob29zZXJTdWJqZWN0Q2hhbmdlZChUIG5ld1N1YmplY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IG51bGw7Ci0JCWlmIChuZXdTdWJqZWN0ICE9IG51bGwpIHsKLQkJCXJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCX0KLQkJdGhpcy5qYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50Um9vdChyb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0UGFja2FnZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0KLQkJVGV4dCB0ZXh0ID0gYWRkVGV4dChzdWJQYW5lLCBidWlsZFRleHRIb2xkZXIoKSk7Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19DT05URU5UX1BST1BPU0FMKS5nZXRJbWFnZSgpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlVGV4dENvbnRlbnRBc3Npc3RhbnQoCi0JCQl0ZXh0LAotCQkJamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIHBhY2thZ2UgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBQYWNrYWdlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBjaG9vc2VQYWNrYWdlKCkgewotCi0JCVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVQYWNrYWdlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0Q29tbW9uVWlNZXNzYWdlcy5QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQlzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLlBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQotCQlpZiAocGFjayAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgcGFjayB9KTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBzZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGRlZmluZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBwYWNrYWdlIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0UGFja2FnZSgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBjaG9vc2VQYWNrYWdlKCk7Ci0KLQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCXRoaXMuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotCi0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzA4NjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuRGF0ZVRpbWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgd2hpY2ggaG9sZHMgb250byBhIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQgY29udGFpbnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotICogPHA+Ci0gKiBJdCBhbHNvIGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGJ1dHRvbnMsIGxhYmVscywgY2hlY2sKLSAqIGJveGVzLCBhbmQgcmFkaW8gYnV0dG9ucywgZXRjLgotICogPHA+Ci0gKiBJdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgbGlzdGVuIHRvIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotICogc3ViamVjdCwge0BsaW5rICNhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb24pfSBpcyBzcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMKLSAqIGFyZSBvZiBpbnRlcmVzdCBhbmQge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nKX0gaXMgdXNlZCB0byBub3RpZnkgdGhlCi0gKiBwYW5lIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotICoKLSAqIEBzZWUgRm9ybVBhbmUKLSAqIEBzZWUgRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYQotCSAqIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIGRldGVybWluZWQgYnkKLQkgKiB7QGxpbmsgI3Byb3BlcnR5TmFtZXMoKX0uCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFzcGVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIGxlZnRDb250cm9sQWxpZ25lcjsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBzdG9wIHRoZSBjaXJjdWxhciBwb3B1bGF0aW9uIG9mIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIHJpZ2h0Q29udHJvbEFsaWduZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3ViamVjdCBob2xkZXIgaW4gb3JkZXIgdG8KLQkgKiBhdXRvbWF0aWNhbGx5IHJlcG9wdWxhdGUgdGhpcyBwYW5lIHdpdGggdGhlIG5ldyBzdWJqZWN0LgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgc3ViLXBhbmVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBub3RpZmllZAotCSAqIHdoZW4gbGlzdGVuZXJzIG5lZWQgdG8gYmUgZW5nYWdlZCBvciBkaXNlbmdhZ2VkIG9yIHdoZW4gdG8gcG9wdWxhdGUgaXRzCi0JICogd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UGFuZTw/Pj4gc3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29udHJvbD4gbWFuYWdlZFdpZGdldHM7Ci0JCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+UGFuZTwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8UGFuZTw/Pj4gbWFuYWdlZFN1YlBhbmVzOwotCQotCS8qKgotCSAqIFRoaXMgZW5hYmxlZCBtb2RlbCBpcyB1c2VkIHRvIHN0b3JlIHRoZSBwYW5lJ3MgYmFzZSBlbmFibGVtZW50IHN0YXRlLgotCSAqIElmIEFQSSBpcyBjYWxsZWQgdG8gc2V0IHRoZSBwYW5lIGVuYWJsZWQsIHRoaXMgbW9kZWwgZ2V0cyB1cGRhdGVkLiAgSWYgdGhlIHBhbmUgaXMgdGhlcmVieQotCSAqIGZ1bGx5IGVuYWJsZWQgKGNvbnRyb2xsZXIgZW5hYmxlZCBtb2RlbCBpcyBhbHNvIGluIGFncmVlbWVudCkgdGhlIHBhbmUncyB3aWRnZXRzIGFyZSBzZXQKLQkgKiBlbmFibGVkLgotCSAqIEBzZWUgI2dldENvbWJpbmVkRW5hYmxlZE1vZGVsKCkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJhc2VFbmFibGVkTW9kZWwgCi0JCQk9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkKLQkvKioKLQkgKiBUaGlzIGVuYWJsZWQgbW9kZWwgaXMgdXNlZCB0byBkZWZpbmUgdGhlIHBhbmUncyBlbmFibGVtZW50IGFzIGNvbnRyb2xsZWQgYnkgb3RoZXIgd2lkZ2V0cywKLQkgKiB0ZXN0cywgZXRjLiAoZm9yIGV4YW1wbGUgYSByYWRpbyBidXR0b24pCi0JICogSWYgdGhpcyBtb2RlbCBpcyBjaGFuZ2VkLCBhbmQgdGhlIHBhbmUgaXMgdGhlcmVieSBmdWxseSBlbmFibGVkIChiYXNlIGVuYWJsZWQgbW9kZWwgaXMgYWxzbyAKLQkgKiBpbiBhZ3JlZW1lbnQpIHRoZSBwYW5lJ3Mgd2lkZ2V0cyBhcmUgc2V0IGVuYWJsZWQuCi0JICogQHNlZSAjZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKQotCSAqLwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNvbnRyb2xsZXJFbmFibGVkTW9kZWw7Ci0JCi0JLyoqCi0JICogVGhlICJhbmQiIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjYmFzZUVuYWJsZWRNb2RlbH0gYW5kIHtAbGluayAjY29udHJvbGxlckVuYWJsZWRNb2RlbH0KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjb21iaW5lZEVuYWJsZWRNb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJdGhpcyhwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0JCQotCQl0aGlzKAotCQkJcGFyZW50UGFuZSwKLQkJCXBhcmVudFBhbmUuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJcGFyZW50LAotCQkJYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQkJCi0JCXRoaXMoCi0JCQlwYXJlbnRQYW5lLAotCQkJcGFyZW50UGFuZS5nZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlwYXJlbnQsCi0JCQlhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLAotCQkJcGFyZW50TWFuYWdlUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgdHJ1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCB0cnVlLCBlbmFibGVkTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQkJCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCB0cnVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQkKLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHRydWUsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcGFyYW0gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyA8Y29kZT50cnVlPC9jb2RlPiB0byBtYWtlIHRoZSB3aWRnZXRzCi0JICogdGhpcyBwYW5lIGFsaWduZWQgd2l0aCB0aGUgd2lkZ2V0cyBvZiB0aGUgZ2l2ZW4gcGFyZW50IHBhbmU7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCBhbGlnbiB0aGVtCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIAotCQkJYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0JCQotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgcGFyZW50UGFuZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmluaXRpYWxpemUocGFyZW50UGFuZSwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgcGFyZW50TWFuYWdlUGFuZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgCi0JCQlib29sZWFuIHBhcmVudE1hbmFnZVBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0JCQotCQl0aGlzKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgcGFyZW50UGFuZS5nZXRXaWRnZXRGYWN0b3J5KCkpOwotCQl0aGlzLmluaXRpYWxpemUocGFyZW50UGFuZSwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywgcGFyZW50TWFuYWdlUGFuZSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVuYWJsZWRNb2RlbChlbmFibGVkTW9kZWwpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplKHN1YmplY3RIb2xkZXIsIHdpZGdldEZhY3RvcnkpOwotCQl0aGlzLmNvbnRhaW5lciA9IHRoaXMuYWRkQ29udGFpbmVyKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUxheW91dCh0aGlzLmNvbnRhaW5lcik7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQl0aGlzLmVuZ2FnZUxpc3RlbmVycyhnZXRTdWJqZWN0KCkpOwotCQl0aGlzLnBvcHVsYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlBc3NlcnQuaXNOb3ROdWxsKHN1YmplY3RIb2xkZXIsICJUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIgICAgICAgICA9IChQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHN1YmplY3RIb2xkZXI7Ci0JCXRoaXMud2lkZ2V0RmFjdG9yeSAgICAgICAgID0gd2lkZ2V0RmFjdG9yeTsKLQkJdGhpcy5zdWJQYW5lcyAgICAgICAgICAgICAgPSBuZXcgQXJyYXlMaXN0PFBhbmU8Pz4+KCk7Ci0JCXRoaXMubWFuYWdlZFdpZGdldHMgICAgICAgID0gbmV3IEFycmF5TGlzdDxDb250cm9sPigpOwotCQl0aGlzLm1hbmFnZWRTdWJQYW5lcyAgICAgICA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIgICAgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyICAgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlTGlzdGVuZXIgID0gdGhpcy5idWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQkJCi0JCS8vIFJlZ2lzdGVyIHRoaXMgcGFuZSB3aXRoIHRoZSBwYXJlbnQgcGFuZSwgaXQgd2lsbCBjYWxsIHRoZSBtZXRob2RzCi0JCS8vIGF1dG9tYXRpY2FsbHkgKGVuZ2FnZUxpc3RlbmVycygpLCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSwgcG9wdWxhdGUoKSwKLQkJLy8gZGlzcG9zZSgpLCBldGMpCi0JCXBhcmVudFBhbmUucmVnaXN0ZXJTdWJQYW5lKHRoaXMpOwotCQkKLQkJaWYgKHBhcmVudE1hbmFnZVBhbmUpIHsKLQkJCXBhcmVudFBhbmUubWFuYWdlU3ViUGFuZSh0aGlzKTsKLQkJfQotCQkKLQkJLy8gQWxpZ24gdGhlIGxlZnQgYW5kIHJpZ2h0IGNvbnRyb2xzIHdpdGggdGhlIGNvbnRyb2xzIGZyb20gdGhlIHBhcmVudAotCQkvLyBwYW5lCi0JCWlmIChhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0JCQlwYXJlbnRQYW5lLmFkZEFsaWduTGVmdCh0aGlzKTsKLQkJCXBhcmVudFBhbmUuYWRkQWxpZ25SaWdodCh0aGlzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVuYWJsZWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0JCXRoaXMuY29udHJvbGxlckVuYWJsZWRNb2RlbCA9IGVuYWJsZWRNb2RlbDsKLQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCA9IAotCQkJCUNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKHRoaXMuYmFzZUVuYWJsZWRNb2RlbCwgdGhpcy5jb250cm9sbGVyRW5hYmxlZE1vZGVsKTsKLQkJdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyID0gYnVpbGRDb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcik7Ci0JCWVuYWJsZVdpZGdldHNfKGdldENvbWJpbmVkRW5hYmxlbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZENvbnRyb2xsZXJFbmFibGVkTW9kZWxMaXN0ZW5lcl8oKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENvbnRyb2xsZXJFbmFibGVkTW9kZWxMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVBhbmUudGhpcy5jb250cm9sbGVyRW5hYmxlbWVudENoYW5nZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByaXZhdGUgdm9pZCBtYW5hZ2VXaWRnZXQoQ29udHJvbCBjb250cm9sKSB7Ci0JCWlmICh0aGlzLm1hbmFnZWRXaWRnZXRzLmNvbnRhaW5zKGNvbnRyb2wpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5tYW5hZ2VkV2lkZ2V0cy5hZGQoY29udHJvbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYW5hZ2VTdWJQYW5lKFBhbmU8Pz4gc3ViUGFuZSkgewotCQlpZiAodGhpcy5tYW5hZ2VkU3ViUGFuZXMuY29udGFpbnMoc3ViUGFuZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1hbmFnZWRTdWJQYW5lcy5hZGQoc3ViUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogbGVmdCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIHRvIHRoaXMgcGFuZSdzIGxlZnQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCBjYW4gYmUgYWRqdXN0ZWQgdG8gaGF2ZQotCSAqIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KFBhbmU8Pz4gY29udGFpbmVyKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChjb250YWluZXIubGVmdENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBoYXZlIHRoZWlyIHdpZHRoCi0JICogYWRqdXN0IHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LiBUaGUgbGVmdCBhbGlnbm1lbnQgaXMgdXN1YWxseQotCSAqIHVzZWQgZm9yIGxhYmVscy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIGFkZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoIGl0cwotCSAqIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgdG8gdGhpcyBwYW5lJ3MgcmlnaHQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCBjYW4gYmUgYWRqdXN0ZWQgdG8gaGF2ZQotCSAqIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25SaWdodChQYW5lPD8+IGNvbnRhaW5lcikgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBoYXZlIHRoZWlyIHdpZHRoCi0JICogYWRqdXN0IHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LiBUaGUgbGVmdCBhbGlnbm1lbnQgaXMgdXN1YWxseQotCSAqIHVzZWQgZm9yIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyBjb250cm9scyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgZm9yCi0JICogYWxpZ25tZW50KSBmcm9tIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkIGZvcgotCSAqIGFsaWdubWVudAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhbmVGb3JBbGlnbm1lbnQoUGFuZTw/PiBjb250YWluZXIpIHsKLQkJYWRkQWxpZ25MZWZ0KGNvbnRhaW5lcik7Ci0JCWFkZEFsaWduUmlnaHQoY29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFueSBwcm9wZXJ0eSBuYW1lcyB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbiBvcmRlciB0byBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGFjdHVhbCBwcm9wZXJ0eSBjaGFuZ2VzIGluIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgdG8gcmVnaXN0ZXIgd2l0aCB0aGUKLQkgKiBzdWJqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCS8vc3ViamVjdCgpIGNvdWxkIGhhdmUgY2hhbmdlZCBvciBpcyBudWxsIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mCi0JCQkJLy8ianVtcGluZyIgb24gdGhlIFVJIHRocmVhZCBoZXJlIGFuZCBhIHNlbGVjdGlvbiBjaGFuZ2Ugb2NjdXJpbmcKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBnZXRTdWJqZWN0KCkpIHsKLQkJCQkJdXBkYXRlUGFuZShlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5CdXR0b248L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucyAKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRVbm1hbmFnZWRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVW5tYW5hZ2VkQnV0dG9uKGNvbnRhaW5lciwgdGV4dCwgbnVsbCwgYnV0dG9uQWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IGFkZFVubWFuYWdlZEJ1dHRvbihjb250YWluZXIsIHRleHQsIGhlbHBJZCwgYnV0dG9uQWN0aW9uKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5CdXR0b248L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucyAKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQnV0dG9uIGFkZFVubWFuYWdlZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCB0ZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU1dUVXRpbC5hc3luY0V4ZWMoYnV0dG9uQWN0aW9uKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxheW91dCB3aWxsIGxlYXZlIHNwYWNlIGZvciBkZWNvcmF0aW9ucyBvbiB3aWRnZXRzLgotCSAqIFdoZXRoZXIgZGVjb3JhdGVkIG9yIG5vdCwgYWxsIG9mIHRoZSB3aWRnZXRzIG5lZWQgdGhlIHNhbWUgaW5kZW50Ci0gCSAqIHNvIHRoYXQgdGhleSBhbGlnbiBwcm9wZXJseS4KLQkgKi8KLQlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0RmllbGRHcmlkRGF0YSgpIHsKLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKQotCQkJCS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSCArIG1hcmdpbjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRDaGVja0JveCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5hZGRUb2dnbGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlidXR0b25UZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZCwKLQkJCVNXVC5DSEVDSyk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQ2hlY2tCb3goCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblRleHQsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSB0aGlzLmFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQsIGJvb2xlYW5Ib2xkZXIsIGhlbHBJZCwgU1dULkNIRUNLKTsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlKGVuYWJsZWRNb2RlbCwgYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPiB0aGF0IGNhbiBiZSBjb2xsYXBzZWQuIEEgc3ViLXBhbmUgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQkJCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJc2VjdGlvblRleHQsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4gdGhhdCBjYW4gYmUgY29sbGFwc2VkLiBBIHN1Yi1wYW5lIGlzCi0JICogYXV0b21hdGljYWxseSBhZGRlZCBhcyBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCQkKLQkJcmV0dXJuIGFkZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIsIHNlY3Rpb25UZXh0LCBudWxsLCB0eXBlLCBleHBhbmRlZFN0YXRlSG9sZGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIHdhcyBwcm92aWRlZAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCB0eXBlCi0JCSk7Ci0KLQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHN1YlBhbmUuZ2V0UGFyZW50KCk7Ci0KLQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoc2VjdGlvbikKLQkJKTsKLQotCQlzZWN0aW9uLnNldEV4cGFuZGVkKAotCQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5nZXRWYWx1ZSgpICE9IG51bGwgPyBleHBhbmRlZFN0YXRlSG9sZGVyLmdldFZhbHVlKCkgOiB0cnVlCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFLAotCQkJZXhwYW5kZWRTdGF0ZUhvbGRlcgotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgd2hpY2ggY2FuIGJlIHR5cGVkIGNhc3QgZGlyZWN0bHkgYXMgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJU1dULk5VTEwsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZENvbWJvKGNvbnRhaW5lcik7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGNvbWJvKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tYm8gYWRkVW5tYW5hZ2VkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21ibyhjb250YWluZXIpOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdldEZpZWxkR3JpZERhdGEoKSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENvbWJvKGNvbnRhaW5lcik7Ci0KLQkJQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIDxWPiBDb21ibyBhZGRVbm1hbmFnZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZENvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCUxpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCQkKLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZENvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZENvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250YWluZXIgb2YgdGhpcyBwYW5lLiBUaGUgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhcmUKLQkgKiBhdXRvbWF0aWNhbGx5IHNldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCB3aWxsIGhvbGRzIGFsbCB0aGUKLQkgKiB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyBwYW5lIHRocm91Z2gge0BsaW5rICNpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSl9Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkRWRpdGFibGVDb21ibygKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZEVkaXRhYmxlQ29tYm8oCi0JCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhzZWN0aW9uKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhwYW5kZWRTdGF0ZUNoYW5nZUxpc3RlbmVyXyhmaW5hbCBTZWN0aW9uIHNlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgZS5nZXROZXdWYWx1ZSgpOwotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXZhbHVlID0gQm9vbGVhbi5UUlVFOwotCQkJCX0KLQkJCQlzZWN0aW9uLnNldEV4cGFuZGVkKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4gdGhhdCB3aWxsIGludm9rZWQgdGhlIGdpdmVuCi0JICogPGNvZGU+UnVubmFibGU8L2NvZGU+IHdoZW4gc2VsZWN0ZWQuIFRoZSBnaXZlbiBhY3Rpb24gaXMgYWx3YXlzIGludm9rZWQKLQkgKiBmcm9tIHRoZSBVSSB0aHJlYWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGh5cGVybGluaydzIHRleHQKLQkgKiBAcGFyYW0gaHlwZXJMaW5rQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBsaW5rIHdhcyBzZWxlY3RlZAotCSAqIHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5IeXBlcmxpbms8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEh5cGVybGluayBhZGRIeXBlcmxpbmsoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgaHlwZXJMaW5rQWN0aW9uKSB7Ci0KLQkJSHlwZXJsaW5rIGxpbmsgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlSHlwZXJsaW5rKHBhcmVudCwgdGV4dCk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGxpbmspOwotCi0JCWxpbmsuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCi0JCQkJSHlwZXJsaW5rIGh5cGVyTGluayA9IChIeXBlcmxpbmspIGUud2lkZ2V0OwotCi0JCQkJaWYgKGh5cGVyTGluay5pc0VuYWJsZWQoKSkgewotCQkJCQlTV1RVdGlsLmFzeW5jRXhlYyhoeXBlckxpbmtBY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJcmV0dXJuIGxpbms7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExhYmVsIGFkZExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgewotCQkKLQkJTGFiZWwgbGFiZWwgPSBhZGRVbm1hbmFnZWRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JCW1hbmFnZVdpZGdldChsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGFiZWwgYWRkTGFiZWwoCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJU3RyaW5nIGxhYmVsVGV4dCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmFkZFVubWFuYWdlZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlKGVuYWJsZWRNb2RlbCwgbGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+TGFiZWw8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucyAKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIExhYmVsIGFkZFVubWFuYWdlZExhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCkgewotCi0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRMYWJlbGVkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JCQkJCQkJCQkJCQkJQ29udHJvbCBsZWZ0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCS8vIENvbnRhaW5lciBmb3IgdGhlIGxhYmVsIGFuZCBtYWluIGNvbXBvc2l0ZQotCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAzLCAwLCAwLCAwLCAwKTsKLQotCQkvLyBMZWZ0IGNvbnRyb2wKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlsZWZ0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBSZS1wYXJlbnQgdGhlIGxlZnQgY29udHJvbCB0byB0aGUgbmV3IHN1YiBwYW5lCi0JCWxlZnRDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCQl0aGlzLmFkZEFsaWduTGVmdChsZWZ0Q29udHJvbCk7Ci0KLQotCQkvLyBSZS1wYXJlbnQgdGhlIGNlbnRlciBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKLQkJY2VudGVyQ29udHJvbC5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQotCQkvLyBSZWdpc3RlciB0aGUgaGVscCBpZCBmb3IgdGhlIGNlbnRlciBjb250cm9sCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY2VudGVyQ29udHJvbCwgaGVscElkKTsKLQkJfQotCi0JCS8vIFJpZ2h0IGNvbnRyb2wKLQkJaWYgKHJpZ2h0Q29udHJvbCA9PSBudWxsKSB7Ci0JCQlDb21wb3NpdGUgc3BhY2VyID0gdGhpcy5hZGRQYW5lKGNvbnRhaW5lcik7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0KHRoaXMuYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCQlyaWdodENvbnRyb2wgPSBzcGFjZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyaWdodENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0KLQkJCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgcmlnaHQgY29udHJvbAotCQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmlnaHRDb250cm9sLCBoZWxwSWQpOwotCQkJfQotCQl9Ci0KLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCi0JCXJpZ2h0Q29udHJvbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJdGhpcy5hZGRBbGlnblJpZ2h0KHJpZ2h0Q29udHJvbCk7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGNlbnRlciBjb250cm9sCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29udHJvbAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCQkJCQkJCQkJCQkJCUNvbnRyb2wgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlclBhbmUgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBjZW50ZXJQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyUGFuZS5nZXRDb250cm9sKCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sKSB7Ci0KLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmFkZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KSwKLQkJCWNlbnRlckNvbnRyb2wsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSB0aGlzLmFkZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQljZW50ZXJDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb21ib0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uCi0JICogY2hhbmdlcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY29tYm9MaXN0ZW5lciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsZWZ0Q29udHJvbCBUaGUgd2lkZ2V0IHNob3duIHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXIgPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm9WaWV3ZXIoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBjb21ib1ZpZXdlci5nZXRDb21ibygpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQkoY29tYm8uZ2V0UGFyZW50KCkgIT0gY29udGFpbmVyKSA/IGNvbWJvLmdldFBhcmVudCgpIDogY29tYm8sCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYW4gZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoIHRoZQotCSAqIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gY29tYm9MaXN0ZW5lciBUaGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNlbGVjdGlvbgotCSAqIGNoYW5nZXMKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNvbWJvTGlzdGVuZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxWPmluc3RhbmNlKCksCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbGluZUNvdW50KTsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKLQotCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCi0JCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRQYXNzd29yZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIHdpZGdldCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHNwaW5uZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGlubmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGFkZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5hZGRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJbWluaW11bVZhbHVlLAotCQkJbWF4aW11bVZhbHVlLAotCQkJaGVscElkCi0JCSk7Ci0JCUxhYmVsIGxhYmVsID0gYWRkTGFiZWwocGFyZW50LCBsYWJlbFRleHQpOwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJbGFiZWwsCi0JCQkoc3Bpbm5lci5nZXRQYXJlbnQoKSAhPSBwYXJlbnQpID8gc3Bpbm5lci5nZXRQYXJlbnQoKSA6IHNwaW5uZXIsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgc3Bpbm5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIHNwaW5uZXIuIE1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIGhhbmRsZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQgaWYgYSBQYW5lRW5hYmxlciBpcyB1c2VkLiAgCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIG51bWJlckhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgc2hvd24gd2hlbiB0aGUgaG9sZGVyIGhhcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBtaW5pbXVtVmFsdWUgVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIG1heGltdW1WYWx1ZSBUaGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGFkZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gYWRkVW5tYW5hZ2VkU3Bpbm5lcihwYXJlbnQsIG51bWJlckhvbGRlciwgZGVmYXVsdFZhbHVlLCBtaW5pbXVtVmFsdWUsIG1heGltdW1WYWx1ZSwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoc3Bpbm5lcik7Ci0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIHNwaW5uZXIuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFNwaW5uZXIgYWRkVW5tYW5hZ2VkU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0VmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhpbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlU3Bpbm5lcihwYXJlbnQpOwotCQlzcGlubmVyLnNldE1pbmltdW0obWluaW11bVZhbHVlKTsKLQkJc3Bpbm5lci5zZXRNYXhpbXVtKG1heGltdW1WYWx1ZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gZ2V0RmllbGRHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCXNwaW5uZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdChudW1iZXJIb2xkZXIsIHNwaW5uZXIsIGRlZmF1bHRWYWx1ZSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzcGlubmVyLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuYWdlZCBEYXRlVGltZSBvZiB0eXBlIFNXVC5USU1FLiAgTWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogaGFuZGxlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldCBpZiBhIFBhbmVFbmFibGVyIGlzIHVzZWQuICAKLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaG91cnNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaG91cnMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBtaW51dGVzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1pbnV0ZXMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBzZWNvbmRzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlY29uZHMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBkYXRlVGltZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERhdGVUaW1lIGFkZERhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJCQkJCQkJCQlTdHJpbmcgaGVscElkKSB7Ci0JCQotCQlEYXRlVGltZSBkYXRlVGltZSA9IHRoaXMuYWRkVW5tYW5hZ2VkRGF0ZVRpbWUocGFyZW50LCBob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoZGF0ZVRpbWUpOwotCi0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgRGF0ZVRpbWUgYWRkRGF0ZVRpbWUoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCVN0cmluZyBoZWxwSWQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsCi0JKSB7Ci0JCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy5hZGRVbm1hbmFnZWREYXRlVGltZShwYXJlbnQsIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBkYXRlVGltZSk7Ci0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBEYXRlVGltZSBvZiB0eXBlIFNXVC5USU1FLiAgVW5tYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKLQkgKiBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZQotCSAqIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaG91cnNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaG91cnMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBtaW51dGVzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1pbnV0ZXMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBzZWNvbmRzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlY29uZHMgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBkYXRlVGltZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBEYXRlVGltZSBhZGRVbm1hbmFnZWREYXRlVGltZShDb21wb3NpdGUgcGFyZW50LAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKLQkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCQkJCQkJCQkJU3RyaW5nIGhlbHBJZCkgewotCQkKLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlRGF0ZVRpbWUocGFyZW50LCBTV1QuVElNRSk7Ci0JCQotCQlEYXRlVGltZU1vZGVsQWRhcHRlci5hZGFwdChob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgZGF0ZVRpbWUpOwotCQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRhdGVUaW1lLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgPFY+IENvbWJvIGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSBhZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21ibyBhZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRUZXh0KGNvbnRhaW5lciwgbGFiZWxUZXh0LCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGZpZWxkJ3MgbGFiZWwKLQkgKiBAcGFyYW0gcmlnaHRDb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSB0ZXh0Ci0JICogZmllbGQKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSB0ZXh0IGZpZWxkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb21wb25lbnQsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JLyoqCi0JICogCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICogQHBhcmFtIHJpZ2h0Q29tcG9uZW50IFRoZSBjb21wb25lbnQgdG8gYmUgcGxhY2VkIHRvIHRoZSByaWdodCBvZiB0aGUgdGV4dAotCSAqIGZpZWxkCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJdGV4dCwKLQkJCXJpZ2h0Q29tcG9uZW50LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgbGFiZWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbCwKLQkJCXRleHRIb2xkZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3QgYWRkTGlzdChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGlzdCgKLQkJCWNvbnRhaW5lciwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzZWxlY3Rpb25Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdW5pcXVlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5MaXN0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGFkZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzZWxlY3Rpb25Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlMaXN0IGxpc3QgPSB0aGlzLmFkZFVubWFuYWdlZExpc3QoY29udGFpbmVyLCBzZWxlY3Rpb25Ib2xkZXIsIGhlbHBJZCk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGxpc3QpOwotCi0JCXJldHVybiBsaXN0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LiAKLQkgKiBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICAKLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGFkZFVubWFuYWdlZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzZWxlY3Rpb25Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlMaXN0IGxpc3QgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTGlzdCgKLQkJCWNvbnRhaW5lciwKLQkJCVNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkKLQkJKTsKLQotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uSG9sZGVyKSk7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChsaXN0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJsZSBleHBhbmRpbmcgb24gbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZvcm1UZXh0IGFkZE11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJRm9ybVRleHQgbGFiZWwgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCQltYW5hZ2VXaWRnZXQobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0ZXh0KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lcik7Ci0JCQotCQlHcmlkRGF0YSBncmlkRGF0YSAgID0gZ2V0RmllbGRHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiBsaW5lQ291bnQ7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIGxpbmVDb3VudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgbGluZUNvdW50LCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBhbmQgc2V0IHRoZSBwcm9wZXIgbGF5b3V0IGFuZCBsYXlvdXQKLQkgKiBkYXRhLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+UGFnZUJvb2s8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBhZ2VCb29rIGFkZFBhZ2VCb29rKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBwYWdlQm9vazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRob3V0IHNwZWNpZnlpbmcgYW55IGxheW91dCBtYW5hZ2VyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IG9mIHRoZSBuZXcgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcGFyYW0gbGF5b3V0IFRoZSBsYXlvdXQgbWFuYWdlciBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIExheW91dCBsYXlvdXQpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFBhc3N3b3JkVGV4dChjb250YWluZXIpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVBhc3N3b3JkVGV4dChjb250YWluZXIpOwotCQl0ZXh0LnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQotCQl0aGlzLm1hbmFnZVdpZGdldCh0ZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZFB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHVzaCBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVB1c2hCdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJbWFuYWdlV2lkZ2V0KGJ1dHRvbik7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNXVFV0aWwuYXN5bmNFeGVjKGJ1dHRvbkFjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkUmFkaW9CdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRUb2dnbGVCdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlidXR0b25UZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZCwKLQkJCVNXVC5SQURJTwotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUgotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSkgewotCi0JCXJldHVybiB0aGlzLmFkZFNlY3Rpb24oY29udGFpbmVyLCBzZWN0aW9uVGV4dCwgbnVsbCwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbikgewotCi0JCXJldHVybiB0aGlzLmFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogd2FzIHByb3ZpZGVyCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2Ygc2VjdGlvbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gZXhwYW5kZWRTdGF0ZUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHRoYXQgd2lsbCBkaWN0YXRlCi0JICogd2hlbiB0byBleHBhbmQgb3IgY29sbGFwc2UgdGhlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKLQotCQlTZWN0aW9uIHNlY3Rpb24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlU2VjdGlvbihjb250YWluZXIsIHR5cGUgfCAoKGRlc2NyaXB0aW9uICE9IG51bGwpID8gU2VjdGlvbi5ERVNDUklQVElPTiA6IFNXVC5OVUxMKSk7Ci0JCXNlY3Rpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNlY3Rpb24uc2V0VGV4dChzZWN0aW9uVGV4dCk7Ci0JCXNlY3Rpb24ubWFyZ2luV2lkdGggID0gMDsKLQkJc2VjdGlvbi5tYXJnaW5IZWlnaHQgPSAwOwotCQkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSB0aGlzLmFkZFN1YlBhbmUoc2VjdGlvbik7Ci0JCXNlY3Rpb24uc2V0Q2xpZW50KHN1YlBhbmUpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcihmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHNlbGVjdGlvbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlMaXN0IGxpc3QgPSAoTGlzdCkgZS53aWRnZXQ7Ci0JCQkJU3RyaW5nW10gc2VsZWN0ZWRJdGVtcyA9IGxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKChzZWxlY3RlZEl0ZW1zID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zLmxlbmd0aCAhPSAxKSkgewotCQkJCQlzZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtc1swXSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxheW91dCByZXNwb25zaWJsZSB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzcGFjZXIgY3JlYXRlZAotCSAqIGZvciB0aGUgcmlnaHQgY29udHJvbCB3aGVuIG5vbmUgd2FzIGdpdmVuLiBUaGUgc3BhY2VyIGhlbHBzIHRvIGFsaWduIGFsbAotCSAqIHRoZSByaWdodCBjb250cm9scy4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIExheW91dCBidWlsZFNwYWNlckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJY29tcG9zaXRlLnNldEJvdW5kcygwLCAwLCBkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUGFuZS50aGlzLnN1YmplY3RDaGFuZ2VkKChUKSBlLmdldE9sZFZhbHVlKCksIChUKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCB0b3BNYXJnaW4pIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgMCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCBsZWZ0TWFyZ2luLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLCB0aGUgbmV3IHdpZGdldAotCSAqIHdpbGwgaGF2ZSBpdHMgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGUgbGF5b3V0IHdpbGwKLQkgKiBiZSBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggMSBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBsZWZ0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgbGVmdCBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSBib3R0b21NYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gcmlnaHRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSByaWdodCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21NYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpZ2h0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZSgKLQkJCWNvbnRhaW5lciwKLQkJCTEsCi0JCQl0b3BNYXJnaW4sCi0JCQlsZWZ0TWFyZ2luLAotCQkJYm90dG9tTWFyZ2luLAotCQkJcmlnaHRNYXJnaW4pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUsIHRoZSBuZXcgd2lkZ2V0Ci0JICogd2lsbCBoYXZlIGl0cyBsYXlvdXQgYW5kIGxheW91dCBkYXRhIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZSBsYXlvdXQgd2lsbAotCSAqIGJlIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4gd2l0aCAxIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGJvdHRvbU1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSByaWdodE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW5Db3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wTWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0TWFyZ2luLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21NYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpZ2h0TWFyZ2luKSB7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChjb2x1bW5Db3VudCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSB0b3BNYXJnaW47Ci0JCWxheW91dC5tYXJnaW5MZWZ0ICAgPSBsZWZ0TWFyZ2luOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gYm90dG9tTWFyZ2luOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgID0gcmlnaHRNYXJnaW47Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgbGF5b3V0KTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgd2hpY2ggY2FuIGJlIHR5cGVkIGNhc3QgZGlyZWN0bHkgYXMgYSA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRhYmxlIHRhYmxlID0gYWRkVW5tYW5hZ2VkVGFibGUoY29udGFpbmVyLCBzdHlsZSwgaGVscElkKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQodGFibGUpOwotCi0JCXJldHVybiB0YWJsZTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgdGFibGUuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgdG8gYXBwbHkgdG8gdGhlIHRhYmxlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFVubWFuYWdlZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0eWxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUYWJsZShjb250YWluZXIsIHN0eWxlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhICAgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHRhYmxlLmdldEl0ZW1IZWlnaHQoKSAqIDQ7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGFibGUsIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZFRhYmxlKAotCQkJY29udGFpbmVyLAotCQkJU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIHRhYmxlLiAgVW5tYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKLQkgKiBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZQotCSAqIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVW5tYW5hZ2VkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZFVubWFuYWdlZFRhYmxlKAotCQkJY29udGFpbmVyLAotCQkJU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQodGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMgCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICAKLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucyAKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIAotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGFkZFVubWFuYWdlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVW5tYW5hZ2VkVGV4dChjb250YWluZXIpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGV4dCwgaGVscElkKTsKLQkJfQotCQkKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgaGVscElkKTsKLQkJU1dUVG9vbHMuYmluZCh0ZXh0SG9sZGVyLCB0ZXh0KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dCgKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JCQlTdHJpbmcgaGVscElkLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbAotCSkgewotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCB0ZXh0KTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zIAotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFVubWFuYWdlZFRleHQoY29udGFpbmVyLCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkVGl0bGVkR3JvdXAoY29udGFpbmVyLCB0aXRsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgd2l0aCBhIHRpdGxlZCBib3JkZXIuCi0JICoKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIHRleHQgb2YgdGhlIHRpdGxlZCBib3JkZXIKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGdyb3VwCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHdpdGggYSB0aXRsZWQgYm9yZGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEdyb3VwIGFkZFRpdGxlZEdyb3VwKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIGFkZFRpdGxlZEdyb3VwKGNvbnRhaW5lciwgdGl0bGUsIDEsIGhlbHBJZCk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBncm91cAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUdyb3VwIGdyb3VwID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUdyb3VwKGNvbnRhaW5lciwgdGl0bGUpOwotCQkvL21hbmFnZVdpZGdldChncm91cCk7IFRPRE8gdW5zdXJlIGlmIEkgd2FudCB0byBtYW5hZ2UgZ3JvdXBzLCAKLQkJLy9hbHNvIHNob3VsZCBwcm9iYWJseSByZW5hbWUgdGhpcyBhZGRVbm1hbmFnZWRUaXRsZWRQYW5lCi0JCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoY29sdW1uQ291bnQsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wICAgID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IDU7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSA1OwotCQlsYXlvdXQubWFyZ2luUmlnaHQgID0gNTsKLQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBuZXcgdG9nZ2xlIGJ1dHRvbiAocmFkaW8gYnV0dG9uIG9yIGNoZWNrIGJveCkuICAKLQkgKiBVbm1hbmFnZWQgbWVhbnMgIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIAotCSAqIG9mIHRoaXMgd2lkZ2V0LiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgCi0JICogb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYWRkVW5tYW5hZ2VkVG9nZ2xlQnV0dG9uKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICBpbnQgdG9nZ2xlQnV0dG9uVHlwZSkgewotCQkKLQkJQnV0dG9uIGJ1dHRvbjsKLQkJCi0JCWlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5QVVNIKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgaWYgKHRvZ2dsZUJ1dHRvblR5cGUgPT0gU1dULlJBRElPKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5DSEVDSykgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJU1dUVG9vbHMuYmluZChib29sZWFuSG9sZGVyLCBidXR0b24pOwotCQkKLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQkJCi0JCXJldHVybiBidXR0b247Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdG9nZ2xlIGJ1dHRvbiAocmFkaW8gYnV0dG9uIG9yIGNoZWNrIGJveCkgdXNpbmcgdGhlIGdpdmVuCi0JICogaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gYWRkVG9nZ2xlQnV0dG9uKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICBpbnQgdG9nZ2xlQnV0dG9uVHlwZSkgewotCQkKLQkJQnV0dG9uIGJ1dHRvbiA9IGFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbigKLQkJCQlwYXJlbnQsIAotCQkJCWJ1dHRvblRleHQsIAotCQkJCWJvb2xlYW5Ib2xkZXIsIAotCQkJCWhlbHBJZCwgCi0JCQkJdG9nZ2xlQnV0dG9uVHlwZSk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KGJ1dHRvbik7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGFkZFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3goCi0JCQlwYXJlbnQsCi0JCQl0ZXh0LAotCQkJdGhpcy5nZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQotCQl0aGlzLm1hbmFnZVdpZGdldChjaGVja0JveC5nZXRDaGVja0JveCgpKTsKLQotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWNoZWNrQm94Ci0JCSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjaGVja0JveC5nZXRDaGVja0JveCgpLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHRoYXQgY2FuIGhhdmUgMyBzZWxlY3Rpb24gc3RhdGVzIChzZWxlY3RlZCwKLQkgKiB1bnNlbGVjdGVkIGFuZCBwYXJ0aWFsbHkgc2VsZWN0ZWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIHdoZXJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogbWVhbnMgcGFydGlhbGx5IHNlbGVjdGVkCi0JICogQHBhcmFtIHN0cmluZ0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdHJpbmcgdG8gcHV0IGluIHBhcmVudGhlc2lzIGFmdGVyCi0JICogdGhlIGNoZWNrIGJveCdzIHRleHQgd2hlbiBpdCBpcyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmlTdGF0ZUNoZWNrQm94IGFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94KAotCQkJcGFyZW50LAotCQkJdGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQKLQkJKTsKLQotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKAotCQkJbmV3IExhYmVsZWRCdXR0b24oY2hlY2tCb3guZ2V0Q2hlY2tCb3goKSksCi0JCQlzdHJpbmdIb2xkZXIKLQkJKTsKLQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhpcyBwYW5lIHRvIHBvcHVsYXRlIGl0cyB3aWRnZXRzIHdpdGggdGhlIHN1YmplY3QncyB2YWx1ZXMuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+ZG9Qb3B1bGF0ZSgpIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlXyh0aGlzLndyYXBFbmFibGVkTW9kZWwoYm9vbGVhbk1vZGVsKSwgY29udHJvbHMpOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZSB0aGUgImVuYWJsZWQiIG1vZGVscyBjYW4gcmV0dXJuIG51bGwgKHdoaWNoIGlzIHR5cGljYWwgd2l0aCBhc3BlY3QKLQkgKiBhZGFwdGVycyBldGMuKS4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB3cmFwRW5hYmxlZE1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBCb29sZWFuPihib29sZWFuTW9kZWwsIE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuRkFMU0UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZV8oUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuYW5kRW5hYmxlZE1vZGVsKGJvb2xlYW5Nb2RlbCksIGNvbnRyb2xzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZ2V0Q29tYmluZWRFbmFibGVkTW9kZWwoKSB7Ci0JCXJldHVybiAodGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCAhPSBudWxsKSA/IHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwgOiB0aGlzLmJhc2VFbmFibGVkTW9kZWw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRDb21iaW5lZEVuYWJsZW1lbnQoKSB7Ci0JCUJvb2xlYW4gZW5hYmxlZCA9IGdldENvbWJpbmVkRW5hYmxlZE1vZGVsKCkuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIChlbmFibGVkID09IG51bGwpID8gdHJ1ZSA6IGVuYWJsZWQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFuZEVuYWJsZWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsKSB7Ci0JCXJldHVybiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmFuZChnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpLCBib29sZWFuTW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb250cm9sbGVyRW5hYmxlbWVudENoYW5nZWQoKSB7Ci0JCWVuYWJsZVdpZGdldHNfKGdldENvbWJpbmVkRW5hYmxlbWVudCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgZW5hYmxlbWVudCBzdGF0ZSBvZiB0aGUgd2lkZ2V0cyBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIHdpZGdldHMgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gZGlzYWJsZSB0aGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5iYXNlRW5hYmxlZE1vZGVsLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihlbmFibGVkKSk7Ci0JCWVuYWJsZVdpZGdldHNfKGdldENvbWJpbmVkRW5hYmxlbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVdpZGdldHNfKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoISB0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvciAoQ29udHJvbCBjb250cm9sIDogdGhpcy5tYW5hZ2VkV2lkZ2V0cykgewotCQkJCWNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCX0KLQkJCQotCQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLm1hbmFnZWRTdWJQYW5lcykgewotCQkJCXN1YlBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIGVuZ2FnZSB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlTGlzdGVuZXJzXyhzdWJqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBzdWJqZWN0IGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzXyhUIHN1YmplY3QpIHsKLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPmVuZ2FnZUxpc3RlbmVyc18oIiArIHN1YmplY3QgKyAnKScpOwotCi0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMuZ2V0UHJvcGVydHlOYW1lcygpKSB7Ci0JCQlzdWJqZWN0LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGRpc2VuZ2FnZSB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoVCBzdWJqZWN0KSB7Ci0JCWlmIChzdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzXyhzdWJqZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBzdWJqZWN0IGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzXyhUIHN1YmplY3QpIHsKLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICIgICAtPmRpc2VuZ2FnZUxpc3RlbmVyc18oIiArIHN1YmplY3QgKyAnKScpOwotCi0JCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMuZ2V0UHJvcGVydHlOYW1lcygpKSB7Ci0JCQlzdWJqZWN0LnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLmFzcGVjdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYWluIDxjb2RlPkNvbnRyb2w8L2NvZGU+IG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG1haW4gY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZSBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBob2xkZXIgdXNlZCBieSB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0U3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdEhvbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgd2lkZ2V0cy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGZhY3RvcnkgdXNlZCBieSB0aGlzIHBhbmUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXJnaW4gdGFrZW4gYnkgYSBncm91cCBib3gsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YgcGl4ZWwgdGhlCi0JICogZ3JvdXAgYm94IGJvcmRlciBhbmQgaXRzIG1hcmdpbiB0YWtlcyBiZWZvcmUgZGlzcGxheWluZyBpdHMgd2lkZ2V0cyBwbHVzCi0JICogNSBwaXhlbHMgc2luY2UgdGhlIHdpZGdldHMgaW5zaWRlIG9mIHRoZSBncm91cCBib3ggYW5kIHRoZSBib3JkZXIgc2hvdWxkCi0JICogaGF2ZSB0aGF0IGV4dHJhIDUgcGl4ZWxzLgotCSAqCi0JICogQHJldHVybiBUaGUgd2lkdGggdGFrZW4gYnkgdGhlIGdyb3VwIGJveCBib3JkZXIgd2l0aCBpdHMgbWFyZ2luCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBnZXRHcm91cEJveE1hcmdpbigpIHsKLQkJR3JvdXAgZ3JvdXAgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlR3JvdXAoU1dUVXRpbC5nZXRTaGVsbCgpLCAiIik7Ci0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gZ3JvdXAuZ2V0Q2xpZW50QXJlYSgpOwotCQlncm91cC5kaXNwb3NlKCk7Ci0JCXJldHVybiBjbGllbnRBcmVhLnggKyA1OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBsYXRmb3JtJ3MgaGVscCBzeXN0ZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBIZWxwZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyCi0JICoKLQkgKiBAcmV0dXJuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1BvcHVsYXRpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBvcHVsYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogTG9ncyB0aGUgZ2l2ZW4gbWVzc2FnZSBpZiB0aGUgPGNvZGU+VHJhY2luZy5ERUJVR19MQVlPVVQ8L2NvZGU+IGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcGFyYW0gZmxhZwotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBsb2dnaW5nIG1lc3NhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChmbGFnLmVxdWFscyhUcmFjaW5nLlVJX0xBWU9VVCkgJiYgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9MQVlPVVQpKSB7Ci0JCQl0aGlzLmxvZyhtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlDbGFzczw/PiB0aGlzQ2xhc3MgPSB0aGlzLmdldENsYXNzKCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCi0JCWlmICh0aGlzQ2xhc3MuaXNBbm9ueW1vdXNDbGFzcygpKSB7Ci0JCQljbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGNsYXNzTmFtZS5pbmRleE9mKCckJykpOwotCQkJY2xhc3NOYW1lICs9ICItPiIgKyB0aGlzQ2xhc3MuZ2V0U3VwZXJjbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQkJfQotCi0JCVRyYWNpbmcubG9nKGNsYXNzTmFtZSArICI6ICIgKyBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGlzIHBhbmUgdG8gcG9wdWxhdGUgaXRzZWxmIHVzaW5nIHRoZSBzdWJqZWN0J3MgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGUoKSB7Ci0JCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgInBvcHVsYXRlKCkiKTsKLQkJCXRoaXMucmVwb3B1bGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUKLQkgKiBoYXMgY2hhbmdlZC4KLQkgKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgVGhlIHByb3BlcnR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9wZXJ0eSBjaGFuZ2UKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBuYW1lcyB0byBsaXN0ZW4gZm9yIHByb3BlcnRpZXMgY2hhbmdpbmcgZnJvbSB0aGUKLQkgKiBzdWJqZWN0LgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBsaXN0IG9mIHByb3BlcnR5IG5hbWVzCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGgKLQkgKiBpdHMgbGVmdCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGZyb20gdGhpcyBwYW5lJ3MgbGVmdAotCSAqIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiBzbyB0aGF0IHRoZWlyIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlIGFkanVzdGVkCi0JICogd2l0aCB0aGUgd2lkdGggb2YgdGhlIHdpZGVzdCB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSBjb250YWluaW5nIHRoZSB3aWRnZXRzIHRvIHJlbW92ZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduTGVmdChQYW5lPD8+IHBhbmUpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIucmVtb3ZlKHBhbmUubGVmdENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBjb250cm9sIGZyb20gdGhlIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyB0aGF0IGFyZSBhbGlnbmVkCi0JICogdG8gaGF2ZSB0aGUgc2FtZSB3aWR0aCB3aGVuIHRoZXkgYXJlIHNob3duIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIDMKLQkgKiB3aWRnZXQgY29sdW1zLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gcmVtb3ZlLCBpdHMgd2lkdGggd2lsbCBubyBsb25nZXIgYmUKLQkgKiBhanVzdGVkIHRvIGJlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnbkxlZnQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLnJlbW92ZShjb250cm9sKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiBwYW5lJ3Mgd2lkZ2V0cyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgd2l0aAotCSAqIGl0cyByaWdodCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIGZyb20gdGhpcyBwYW5lJ3MgcmlnaHQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZSBhZGp1c3RlZAotCSAqIHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byByZW1vdmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnblJpZ2h0KFBhbmU8Pz4gcGFuZSkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIucmVtb3ZlKHBhbmUucmlnaHRDb250cm9sQWxpZ25lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29udHJvbCBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBhcmUgYWxpZ25lZAotCSAqIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggd2hlbiB0aGV5IGFyZSBzaG93biB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgMwotCSAqIHdpZGdldCBjb2x1bXMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byByZW1vdmUsIGl0cyB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZQotCSAqIGFqdXN0ZWQgdG8gYmUgdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZUFsaWduUmlnaHQoQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMucmlnaHRDb250cm9sQWxpZ25lci5yZW1vdmUoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFuZSdzIGNvbnRyb2xzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCBmb3IKLQkgKiBhbGlnbm1lbnQpIGZyb20gdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0aGF0IG5vIGxvbmdlcgotCSAqIHJlcXVpcmVzIHRoZWlyIHdpZHRoIGFkanVzdGVkIHdpdGggdGhlIHdpZHRoIG9mIHRoZSBsb25nZXN0IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlbW92ZVBhbmVGb3JBbGlnbm1lbnQoUGFuZTw/PiBwYW5lKSB7Ci0JCXJlbW92ZUFsaWduTGVmdChwYW5lKTsKLQkJcmVtb3ZlQWxpZ25SaWdodChwYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHBlcmhhcHMgaW50ZXJuYWxseSkgd2hlbiB0aGlzIG5lZWRzIHRvIHJlcG9wdWxhdGUKLQkgKiBidXQgdGhlIG9iamVjdCBvZiBpbnRlcmVzdCBoYXMgbm90IGNoYW5nZWQuCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZXBvcHVsYXRlKCkgewotCi0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5yZXBvcHVsYXRlKCkiKTsKLQotCQkvLyBQb3B1bGF0ZSB0aGlzIHBhbmUKLQkJdHJ5IHsKLQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQlkb1BvcHVsYXRlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCi0JCS8vIEFzayB0aGUgc3ViLXBhbmVzIHRvIHJlcG9wdWxhdGUgdGhlbXNlbHZlcwotCQlmb3IgKFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUucmVwb3B1bGF0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW50ZXJuYWwgZmxhZyB0aGF0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhbmUgaXMgYmVpbmcKLQkgKiBwb3B1bGF0ZWQgb3Igbm90LiBEdXJpbmcgcG9wdWxhdGlvbiwgaXQgaXMgcmVxdWlyZWQgdG8gbm90IHVwZGF0ZSB0aGUKLQkgKiB3aWRnZXRzIHdoZW4gdGhlIG1vZGVsIGlzIHVwZGF0ZWQgbm9yIHRvIHVwZGF0ZSB0aGUgbW9kZWwgd2hlbiB0aGUgd2lkZ2V0cwotCSAqIGFyZSBiZWluZyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyB2YWx1ZXMuCi0JICoKLQkgKiBAcGFyYW0gcG9wdWxhdGluZwotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0UG9wdWxhdGluZyhib29sZWFuIHBvcHVsYXRpbmcpIHsKLQkJdGhpcy5wb3B1bGF0aW5nID0gcG9wdWxhdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBFaXRoZXIgc2hvdyBvciBoaWRlcyB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gdmlzaWJsZSBUaGUgbmV3IHZpc2liaWxpdHkgc3RhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5jb250YWluZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5lYXJlc3QgPGNvZGU+U2hlbGw8L2NvZGU+IGRpc3BsYXlpbmcgdGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMKLQkgKiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgbmVhcmVzdCB3aW5kb3cgZGlzcGxheWluZyB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgZmluYWwgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRhaW5lci5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgc3ViamVjdCBpZiB0aGlzIHBhbmUgd2FzIG5vdCBkaXNwb3NlZDsgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBpdCB3YXMKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXB1YmxpYyBUIGdldFN1YmplY3QoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBoYXMgY2hhbmdlZCwgZGlzY29ubmVjdHMgYW55IGxpc3RlbmVycyBmcm9tIHRoZSBvbGQgc3ViamVjdAotCSAqIGFuZCBjb25uZWN0cyB0aG9zZSBsaXN0ZW5lcnMgb250byB0aGUgbmV3IHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gb2xkc3ViamVjdCBUaGUgb2xkIHN1YmplY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSB3YXMgc2V0Ci0JICogQHBhcmFtIG5ld1N1YmplY3QgVGhlIG5ldyBzdWJqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgbmVlZHMgdG8gYmUKLQkgKiBzZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHN1YmplY3RDaGFuZ2VkKFQgb2xkU3ViamVjdCwgVCBuZXdTdWJqZWN0KSB7Ci0JCWlmICghdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0KLQkJCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAic3ViamVjdENoYW5nZWQoKSIpOwotCQkJdGhpcy5kaXNlbmdhZ2VMaXN0ZW5lcnMob2xkU3ViamVjdCk7Ci0KLQkJCXRoaXMucmVwb3B1bGF0ZSgpOwotCi0JCQl0aGlzLmVuZ2FnZUxpc3RlbmVycyhuZXdTdWJqZWN0KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFub3RoZXIgPGNvZGU+UGFuZTwvY29kZT4gd2l0aCB0aGlzIG9uZSBzbyBpdCBjYW4KLQkgKiBiZSBhdXRvbWF0aWNhbGx5IG5vdGlmaWVkIGFib3V0IGNlcnRhaW4gZXZlbnRzIHN1Y2ggYXMgZW5nYWdpbmcgb3IKLQkgKiBkaXNlbmdhZ2luZyB0aGUgbGlzdGVuZXJzLCBldGMuCi0JICoKLQkgKiBAcGFyYW0gc3ViUGFuZSBUaGUgc3ViLXBhbmUgdG8gcmVnaXN0ZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb250cm9sbGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVnaXN0ZXJTdWJQYW5lKFBhbmU8Pz4gc3ViUGFuZSkgewotCQl0aGlzLnN1YlBhbmVzLmFkZChzdWJQYW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVycyB0aGUgZ2l2ZW4gPGNvZGU+UGFuZTwvY29kZT4gZnJvbSB0aGlzIG9uZSBzbyBpdAotCSAqIGNhbiBubyBsb25nZXIgYmUgYXV0b21hdGljYWxseSBub3RpZmllZCBhYm91dCBjZXJ0YWluIGV2ZW50cyBzdWNoIGFzCi0JICogZW5nYWdpbmcgb3IgZGlzZW5nYWdpbmcgdGhlIGxpc3RlbmVycywgZXRjLgotCSAqCi0JICogQHBhcmFtIHN1YlBhbmUgVGhlIHN1Yi1wYW5lIHRvIHVucmVnaXN0ZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb250cm9sbGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdW5yZWdpc3RlclN1YlBhbmUoUGFuZTw/PiBzdWJQYW5lKSB7Ci0JCXRoaXMuc3ViUGFuZXMucmVtb3ZlKHN1YlBhbmUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVQYW5lKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKCFpc1BvcHVsYXRpbmcoKSAmJiAhdGhpcy5jb250YWluZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnBvcHVsYXRpbmcgPSB0cnVlOwotCi0JCQl0cnkgewotCQkJCXByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5wb3B1bGF0aW5nID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJkaXNwb3NlKCkiKTsKLQotCQkvLyBEaXNwb3NlIHRoaXMgcGFuZQotCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhnZXRTdWJqZWN0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQkJCi0JCWlmICh0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsICE9IG51bGwgJiYgdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRoaXMuY29tYmluZWRFbmFibGVkTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQotCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byBkaXNwb3NlIHRoZW1zZWx2ZXMKLQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qb3N0RXhlY3V0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUG9zdEV4ZWN1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU0YjYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qb3N0RXhlY3V0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5Qb3N0RXhlY3V0aW9uPC9jb2RlPiBpcyB1c2VkIHRvIHBvc3QgZXhlY3V0ZSBhIHBvcnRpb24gb2YgY29kZQotICogb25jZSBhIGRpYWxvZywgdGhhdCB3YXMgbGF1bmNoZWQgaW50byBhIGRpZmZlcmVudCBVSSB0aHJlYWQsIGhhcyBiZWVuCi0gKiBkaXNwb3NlZC4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBQb3N0RXhlY3V0aW9uPFQgZXh0ZW5kcyBEaWFsb2c+IHsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgcG9zdCBleGVjdGlvbiB0aGUgZGlhbG9nIHRoYXQgd2FzIGxhdW5jaGVkIGludG8gYSBkaWZmZXJlbnQKLQkgKiBVSSB0aHJlYWQgaGFzIGJlZW4gZGlzcG9zZWQuCi0JICoKLQkgKiBAcGFyYW0gZGlhbG9nIFRoZSBkaWFsb2cgdGhhdCB3YXMgbGF1bmNoZWQgaW50byBhIGRpZmZlcmVudCB0aHJlYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKFQgZGlhbG9nKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDE5NzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzIHVzaW5nCi0gKiA8Y29kZT5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTwvY29kZT4gaW4gb3JkZXIgdXNlIHRoZSBmb3JtIHN0eWxlCi0gKiAoZmxhdC1zdHlsZSkgbG9vayBhbmQgZmVlbC4KLSAqCi0gKiBAc2VlIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBleHRlbmRzIEZvcm1XaWRnZXRGYWN0b3J5IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGFjdHVhbCBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3Ci0JICogd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeShUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVHcm91cChwYXJlbnQsIHRpdGxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpIHN1cGVyLmdldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9UcmlTdGF0ZUNoZWNrQm94LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYjBkMjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPiBjYW4gZGlzcGxheSBvbmUgb2YgdGhyZWUgc3RhdGVzOgotICogdW5jaGVja2VkLCBjaGVja2VkLCBvciBwYXJ0aWFsbHkgY2hlY2tlZC4gSXQgY2FuIGJlIG1vZGlmaWVkIHZpYSBhIG1vdXNlCi0gKiBzZWxlY3Rpb24sIHZpYSBhIGtleWJvYXJkIHNlbGVjdGlvbiwgb3IgcHJvZ3JhbW1hdGljYWxseS4gVGhlIHNlbGVjdGlvbiBzdGF0ZSBpcwotICogcmVwcmVzZW50ZWQgYnkgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPiB2YWx1ZSB3aGVyZSBhIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiB2YWx1ZSBtZWFucyBwYXJ0aWFsbHkgY2hlY2tlZC4KLSAqIDxwPgotICogVGhlIG9yZGVyIG9mIHN0YXRlIGNoYW5nZXMgaXM6IHVuY2hlY2tlZCAtPiBwYXJ0aWFsbHkgY2hlY2tlZCAtPiBjaGVja2VkLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmlTdGF0ZUNoZWNrQm94Ci17Ci0JLyoqCi0JICogQSBjaGVjayBib3ggYnV0dG9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgQnV0dG9uIGJ1dHRvbjsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIFRyaVN0YXRlIHN0YXRlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPiB3aXRoIG5vIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQl0aGlzKHBhcmVudCwgbnVsbCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmlTdGF0ZUNoZWNrQm94PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gdGV4dCBUaGUgY2hlY2sgYm94J3MgdGV4dAotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXRlID0gVHJpU3RhdGUuVU5DSEVDS0VEOwotCQl0aGlzLmJ1dHRvbiA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0KTsKLQkJdGhpcy5idXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogQWRkcyBhIGRpc3Bvc2UgbGlzdGVuZXIgdG8gdGhlIGNoZWNrIGJveC4KLQkgKiBUaGUgc291cmNlIG9mIGFueSBldmVudHMgc2VudCB0byB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0aGUgY2hlY2sgYm94IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZHMgYSBzZWxlY3Rpb24gbGlzdGVuZXIgdG8gdGhlIGNoZWNrIGJveC4KLQkgKiBUaGUgc291cmNlIG9mIGFueSBldmVudHMgc2VudCB0byB0aGUgbGlzdGVuZXIgd2lsbCBiZSB0aGUgY2hlY2sgYm94IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94LnRoaXMuY2hlY2tCb3hDbGlja2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVGhlIGNoZWNrIGJveCB3YXMgY2xpY2tlZCwgY2hhbmdlIHRoZSB0cmktc3RhdGUgdG8gdGhlIG5leHQgdmFsdWUgYW5kCi0JICogdXBkYXRlIHRoZSBjaGVjayBib3gncyBzdGF0ZS4KLQkgKi8KLQl2b2lkIGNoZWNrQm94Q2xpY2tlZCgpIHsKLQkJdGhpcy5zdGF0ZSA9IHRoaXMubmV4dFN0YXRlKCk7Ci0JCXRoaXMudXBkYXRlQ2hlY2tCb3goKTsKLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGUgY2hlY2sgYm94IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmJ1dHRvbi5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QnV0dG9uPC9jb2RlPiB1c2VkIHRvIHNob3cgYSB0cmktc3RhdGUgY2hlY2sgYm94LgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+QnV0dG9uPC9jb2RlPiB1c2VkIHRvIHNob3cgYSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIEJ1dHRvbiBnZXRDaGVja0JveCgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrIGJveCdzIGltYWdlLgotCSAqCi0JICogQHJldHVybiBUaGUgY2hlY2sgYm94J3MgaW1hZ2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gdGhpcy5idXR0b24uZ2V0SW1hZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVjayBib3gncyBzZWxlY3Rpb24gc3RhdGUuCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGNoZWNrZWQgb3IKLQkgKiB1bmNoZWNrZWQ7IG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiAodGhpcy5zdGF0ZSA9PSBUcmlTdGF0ZS5QQVJUSUFMTFlfQ0hFQ0tFRCkgPyBudWxsIDogQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3RhdGUgPT0gVHJpU3RhdGUuQ0hFQ0tFRCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2sgYm94J3MgdGV4dC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRleHQgb2YgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoZWNrIGJveCBpcyBkaXNwb3NlZC4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIGJveCBpcyBkaXNwb3NlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNoZWNrIGJveCBpcyBlbmFibGVkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgYm94IGlzIGVuYWJsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIHRoaXMuYnV0dG9uLmlzRW5hYmxlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgc3RhdGU6Ci0JICogICAgIFVOQ0hFQ0tFRCAtPiBQQVJUSUFMTFlfQ0hFQ0tFRAotCSAqICAgICBQQVJUSUFMTFlfQ0hFQ0tFRCAtPiBDSEVDS0VECi0JICogICAgIENIRUNLRUQgLT4gVU5DSEVDS0VECi0JICovCi0JcHJpdmF0ZSBUcmlTdGF0ZSBuZXh0U3RhdGUoKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZSkgewotCQkJY2FzZSBVTkNIRUNLRUQ6Ci0JCQkJcmV0dXJuIFRyaVN0YXRlLlBBUlRJQUxMWV9DSEVDS0VEOwotCQkJY2FzZSBQQVJUSUFMTFlfQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gVHJpU3RhdGUuQ0hFQ0tFRDsKLQkJCWNhc2UgQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gVHJpU3RhdGUuVU5DSEVDS0VEOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHN0YXRlOiAiICsgdGhpcy5zdGF0ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IFJlbW92ZXMgYSBkaXNwb3NlIGxpc3RlbmVyIGZyb20gdGhlIGNoZWNrIGJveC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGRpc3Bvc2VMaXN0ZW5lcikgewotCQl0aGlzLmJ1dHRvbi5yZW1vdmVEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IFJlbW92ZXMgYSBzZWxlY3Rpb24gbGlzdGVuZXIgZnJvbSB0aGUgY2hlY2sgYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCXRoaXMuYnV0dG9uLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjaGVjayBib3gncyBlbmFibGVtZW50IHN0YXRlLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIHRoZSBjaGVjayBib3ggb3IgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gZGlzYWJsZSBpdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuYnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2sgYm94J3MgaW1hZ2UuCi0JICoKLQkgKiBAcGFyYW0gaW1hZ2UgVGhlIG5ldyBpbWFnZSBvZiB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoSW1hZ2UgaW1hZ2UpIHsKLQkJdGhpcy5idXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGNoZWNrIGJveCdzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24gRWl0aGVyIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IKLQkgKiBjaGVja2VkIGFuZCB1bmNoZWNrZWQ7IG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oQm9vbGVhbiBzZWxlY3Rpb24pIHsKLQkJVHJpU3RhdGUgb2xkID0gdGhpcy5zdGF0ZTsKLQkJdGhpcy5zdGF0ZSA9IHRoaXMuc3RhdGVGb3JCb29sZWFuKHNlbGVjdGlvbik7Ci0JCWlmIChvbGQgIT0gdGhpcy5zdGF0ZSkgewotCQkJdGhpcy51cGRhdGVDaGVja0JveCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2hlY2sgYm94J3MgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBuZXcgdGV4dCBvZiB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRyaS1zdGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBib29sZWFuLgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGlvbiBUaGUgYm9vbGVhbiB0byBiZSBjb252ZXJ0ZWQgdG8gYSB0cmktc3RhdGUKLQkgKi8KLQlwcml2YXRlIFRyaVN0YXRlIHN0YXRlRm9yQm9vbGVhbihCb29sZWFuIHNlbGVjdGlvbikgewotCQlyZXR1cm4gKHNlbGVjdGlvbiA9PSBudWxsKSA/IFRyaVN0YXRlLlBBUlRJQUxMWV9DSEVDS0VEIDoKLQkJCXNlbGVjdGlvbi5ib29sZWFuVmFsdWUoKSA/IFRyaVN0YXRlLkNIRUNLRUQgOiBUcmlTdGF0ZS5VTkNIRUNLRUQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIHRoZSBvZiB0aGUgY2hlY2sgYm94IGJhc2VkIG9uIHRoZSB0cmktc3RhdGUKLQkgKiB2YWx1ZS4KLQkgKi8KLQl2b2lkIHVwZGF0ZUNoZWNrQm94KCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUpIHsKLQkJCWNhc2UgVU5DSEVDS0VEOgotCQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJdGhpcy5idXR0b24uc2V0R3JheWVkKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUEFSVElBTExZX0NIRUNLRUQ6Ci0JCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCXRoaXMuYnV0dG9uLnNldEdyYXllZCh0cnVlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0hFQ0tFRDoKLQkJCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJdGhpcy5idXR0b24uc2V0R3JheWVkKGZhbHNlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBzdGF0ZTogIiArIHRoaXMuc3RhdGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gZW51bSBjb250YWluaW5nIHRoZSBwb3NzaWJsZSBzZWxlY3Rpb25zLgotCSAqLwotCWVudW0gVHJpU3RhdGUgewotCQlDSEVDS0VELAotCQlQQVJUSUFMTFlfQ0hFQ0tFRCwKLQkJVU5DSEVDS0VECi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1ZhbGlkYXRpbmdEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiNmNkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgc2ltaWxhciB0byBpdCBzdXBlcmNsYXNzLCA8Y29kZT5EaWFsb2c8L2NvZGU+LCB3aXRoCi0gKiB0aGUgYWRkZWQgdmFsdWUgb2YgYW4gZXJyb3IgbWVzc2FnZSBsYWJlbCBiZWxvdyB0aGUgbWFpbiBwYW5lbC4gQSBzdWJjbGFzcwotICogY2FuIHNldCB0aGlzIGVycm9yIG1lc3NhZ2UgYXMgbmVlZGVkIHNvIHRoYXQgaXQgY2FuIGluZm9ybSB0aGUgdXNlciBzb21ldGhpbmcKLSAqIGluY29ycmVjdCBoYXMgYmVlbiBlbnRlcmVkLgotICogPHA+Ci0gKiBJZiB0aGVyZSBpcyBhbiBlcnJvciBtZXNzYWdlLCBpdCB3aWxsIGJlIHNob3duLiBJZiB0aGVyZSBpcyBhIHdhcm5pbmcKLSAqIG1lc3NhZ2UsIGl0IHdpbGwgb25seSBiZSBzaG93biBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiBXYXJuaW5nIG1lc3NhZ2VzCi0gKiBoYXZlIGEgZGlmZmVyZW50IGljb24gdGhhbiBlcnJvciBtZXNzYWdlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFZhbGlkYXRpbmdEaWFsb2c8VCBleHRlbmRzIE5vZGU+IGV4dGVuZHMgRGlhbG9nPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGluZ0RpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGluZ0RpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHRpdGxlIFRoZSBkaWFsb2cncyB0aXRsZQotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdGl0bGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCWZpbmFsIE5vZGUuVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IE5vZGUuVmFsaWRhdG9yKCkgewotCQkJcHVibGljIHZvaWQgcGF1c2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlc3VtZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCQkJVmFsaWRhdGluZ0RpYWxvZy50aGlzLnZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBtZXNzYWdlcyBmcm9tIHRoZSBkZXNjcmlwdGlvbiBwYW5lCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2xlYXJNZXNzYWdlKCl7Ci0JCXNldE1lc3NhZ2UoZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGRlc2NyaXB0aW9uIHBhbmUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2xlYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGRlc2NyaXB0aW9uIHVuZGVyIHRoZSBkZXNjcmlwdGlvbidzIHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2Ugc2hvd24gaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gcGFuZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzCi0JICogcmVxdWlyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0RGVzY3JpcHRpb25JbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIGRlc2NyaXB0aW9uIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB0aXRsZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQlQb2ludCByZXN1bHQgPSBnZXRTaGVsbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCVBvaW50IHBhbmVTaXplID0gZ2V0UGFuZSgpLmdldENvbnRyb2woKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlpbnQgd2lkdGggPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyg0MDApOwotCQlyZXN1bHQueCA9IE1hdGgubWF4KHdpZHRoLCBwYW5lU2l6ZS54KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBoYXNUaXRsZUFyZWEoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVSSgpIHsKLQotCQlzdXBlci5pbml0aWFsaXplVUkoKTsKLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIHRpdGxlCi0JCVN0cmluZyBkZXNjcmlwdGlvblRpdGxlID0gZ2V0RGVzY3JpcHRpb25UaXRsZSgpOwotCi0JCWlmIChkZXNjcmlwdGlvblRpdGxlICE9IG51bGwpIHsKLQkJCXNldFRpdGxlKGRlc2NyaXB0aW9uVGl0bGUpOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiB0aXRsZQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbigpOwotCi0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlzZXRNZXNzYWdlKGRlc2NyaXB0aW9uKTsKLQkJfQotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gaW1hZ2UKLQkJSW1hZ2UgaW1hZ2UgPSBnZXREZXNjcmlwdGlvbkltYWdlKCk7Ci0KLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCXNldFRpdGxlSW1hZ2UoaW1hZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGVzY3JpcHRpb24gcGFuZSBieSBzaG93aW5nIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlIGFuZCBmb3JtYXQKLQkgKiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIGFyZ3VtZW50cyBpZiBhbnkgZXhpc3RzLgotCSAqCi0JICogQHBhcmFtIGVycm9yTWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lCi0JICogQHBhcmFtIGFyZ3VtZW50cyBUaGUgbGlzdCBvZiBhcmd1bWVudHMgdXNlZCB0byBmb3JtYXQgdGhlIGVycm9yIG1lc3NhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgT2JqZWN0Li4uIGFyZ3VtZW50cykgewotCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoZXJyb3JNZXNzYWdlLCBhcmd1bWVudHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBwYW5lIGJ5IHNob3dpbmcgdGhlIGdpdmVuIHdhcm5pbmcgbWVzc2FnZSBhbmQgZm9ybWF0Ci0JICogdGhlIHRleHQgd2l0aCB0aGUgZ2l2ZW4gbGlzdCBvZiBhcmd1bWVudHMgaWYgYW55IGV4aXN0cy4KLQkgKgotCSAqIEBwYXJhbSB3YXJuaW5nTWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50cyB1c2VkIHRvIGZvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFdhcm5pbmdNZXNzYWdlKFN0cmluZyB3YXJuaW5nTWVzc2FnZSwgT2JqZWN0Li4uIGFyZ3VtZW50cykgewotCQlzZXRNZXNzYWdlKE5MUy5iaW5kKHdhcm5pbmdNZXNzYWdlLCBhcmd1bWVudHMpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGVycm9yIG1lc3NhZ2UsIGVpdGhlciBzaG93cyB0aGUgZmlyc3QgZXJyb3IgcHJvYmxlbSBvciBoaWRlcwotCSAqIHRoZSBlcnJvciBwYW5lLiBJZiB0aGUgcHJvZ3Jlc3MgYmFyIGlzIHNob3duLCB0aGVuIHRoZSBlcnJvciBtZXNzYWdlIHdpbGwKLQkgKiBub3QgYmUgc2hvd24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lc3NhZ2UoKSB7Ci0JCWlmIChnZXRTdWJqZWN0KCkuYnJhbmNoUHJvYmxlbXNTaXplKCkgPT0gMCkgewotCQkJY2xlYXJNZXNzYWdlKCk7Ci0JCX0gZWxzZSB7Ci0JCQkJZm9yIChMaXN0SXRlcmF0b3I8UHJvYmxlbT4gcHJvYmxlbXMgPSBnZXRTdWJqZWN0KCkuYnJhbmNoUHJvYmxlbXMoKTsgcHJvYmxlbXMuaGFzTmV4dCgpOyl7Ci0JCQkJCVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zLm5leHQoKTsKLQkJCQkJaWYgKHByb2JsZW0ubWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKXsKLQkJCQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKHByb2JsZW0ubWVzc2FnZUtleSgpLCBwcm9ibGVtLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgaWYgKHByb2JsZW0ubWVzc2FnZVR5cGUoKSA9PSBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpewotCQkJCQkJdGhpcy5zZXRXYXJuaW5nTWVzc2FnZShwcm9ibGVtLm1lc3NhZ2VLZXkoKSwgcHJvYmxlbS5tZXNzYWdlQXJndW1lbnRzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCWlmICghdGhpcy5jb250YWluc0Vycm9yTWVzc2FnZSgpKXsKLQkJCWNsZWFyRXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY29udGFpbnNFcnJvck1lc3NhZ2UoKXsKLQkJYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxQcm9ibGVtPiBwcm9ibGVtcyA9IGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpOyBwcm9ibGVtcy5oYXNOZXh0KCk7KXsKLQkJCVByb2JsZW0gcHJvYmxlbSA9IHByb2JsZW1zLm5leHQoKTsKLQkJCWlmIChwcm9ibGVtLm1lc3NhZ2VUeXBlKCkgPT1JTWVzc2FnZVByb3ZpZGVyLkVSUk9SKXsKLQkJCQllcnJvciA9IHRydWU7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBzdGF0ZSBvYmplY3QgYW5kIGJhc2VkIG9uIGl0cyBzdGF0dXMsIHVwZGF0ZSB0aGUgZGVzY3JpcHRpb24KLQkgKiBwYW5lIHRvIHNob3cgdGhlIGZpcnN0IGVycm9yIGlmIGFueSBleGlzdHMgYW5kIHVwZGF0ZSB0aGUgZW5hYmxlbWVudCBvZgotCSAqIHRoZSBPSyBidXR0b24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotCQlnZXRTdWJqZWN0KCkudmFsaWRhdGVCcmFuY2goKTsKLQkJdXBkYXRlTWVzc2FnZSgpOwotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoIWNvbnRhaW5zRXJyb3JNZXNzYWdlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDk1N2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aXphcmRzL0phdmFQcm9qZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotLyoqCi0gKiAgSmF2YVByb2plY3RXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUHJvamVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGRlc3RpbmF0aW9uTGFiZWw7Ci0JcHJpdmF0ZSBUYWJsZSBwcm9qZWN0VGFibGU7Ci0JcHJpdmF0ZSBUYWJsZVZpZXdlciBwcm9qZWN0VGFibGVWaWV3ZXI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSA9ICJTZWxlY3RKYXZhUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBpbnQgUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCA9IDA7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgSmF2YVByb2plY3RXaXphcmRQYWdlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlzdXBlcihTRUxFQ1RfUFJPSkVDVF9QQUdFX05BTUUpOwotCi0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBJRGlhbG9nUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMuYnVpbGRMYWJlbChjb21wb3NpdGUsIHRoaXMuZGVzdGluYXRpb25MYWJlbCk7Ci0JCQotCQl0aGlzLnByb2plY3RUYWJsZSA9IHRoaXMuYnVpbGRQcm9qZWN0VGFibGUoY29tcG9zaXRlLCB0aGlzLmJ1aWxkUHJvamVjdFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQl0aGlzLnByb2plY3RUYWJsZVZpZXdlciA9IHRoaXMuYnVpbGRQcm9qZWN0VGFibGVWaWV3ZXIoCi0JCQkJCQkJCQkJCQl0aGlzLnByb2plY3RUYWJsZSwgCi0JCQkJCQkJCQkJCQl0aGlzLmJ1aWxkUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlcigpLCAKLQkJCQkJCQkJCQkJCXRoaXMuYnVpbGRQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuZmlsbFByb2plY3RMaXN0KCk7Ci0JCXRoaXMuc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQl0aGlzLnNldFRhYmxlU2VsZWN0aW9uKHRoaXMuamF2YVByb2plY3QpOwotCQl0aGlzLnZhbGlkYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFByb2plY3RUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RlZFByb2plY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUHJvbXB0UHJvamVjdFdpemFyZFBhZ2UgcHJvamVjdCB0YWJsZSBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRQcm9qZWN0Q2hhbmdlZCgpIHsKLQkJaWYodGhpcy5wcm9qZWN0VGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkgewotCQkJVGFibGVJdGVtIGl0ZW0gPSAgdGhpcy5wcm9qZWN0VGFibGUuZ2V0SXRlbSh0aGlzLnByb2plY3RUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGl0ZW0uZ2V0VGV4dCgwKTsKLQkJCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvamVjdE5hbWUpKSB7Ci0KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJCQl0aGlzLnNldEphdmFQcm9qZWN0KEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JCQkJdGhpcy52YWxpZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb25MYWJlbChTdHJpbmcgZGVzdGluYXRpb25MYWJlbCkgewotCQl0aGlzLmRlc3RpbmF0aW9uTGFiZWwgPSBkZXN0aW5hdGlvbkxhYmVsOwotCX0KLQotCS8vICoqKioqKioqKiogcHJvdGVjdGVkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVTZWxlY3Rpb24oSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCWlmKGphdmFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCQlmb3IoVGFibGVJdGVtIGl0ZW06IHRoaXMucHJvamVjdFRhYmxlLmdldEl0ZW1zKCkpIHsKLQkJCQlpZihpdGVtLmdldFRleHQoMCkuZXF1YWxzKHByb2plY3ROYW1lKSkgewotCQkJCQl0aGlzLnByb2plY3RUYWJsZS5zZXRTZWxlY3Rpb24oaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGZpbGxQcm9qZWN0TGlzdCgpIHsKLQkJdGhpcy5wcm9qZWN0VGFibGVWaWV3ZXIuc2V0SW5wdXQodGhpcy5nZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLnByb2plY3RUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEphdmFQcm9qZWN0KElKYXZhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuamF2YVByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0U29ydGVkSmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQodGhpcy5nZXRKYXZhUHJvamVjdHNOYW1lcygpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldEphdmFQcm9qZWN0c05hbWVzKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSgKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElQcm9qZWN0LCBTdHJpbmc+KHRoaXMuZ2V0SmF2YVByb2plY3RzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkJCXJldHVybiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9LAotCQkJbmV3IFN0cmluZ1swXSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxJUHJvamVjdD4gZ2V0SmF2YVByb2plY3RzKCkgewotCSAgIHJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SVByb2plY3Q+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdHMoKSkpIHsKLQkgICAgICBAT3ZlcnJpZGUKLQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVByb2plY3QgbmV4dCkgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBuZXh0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JICAgICAgfQotCSAgIH07Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPElQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPElQcm9qZWN0PihSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKGNvbHVtbkluZGV4ID09IFBST0pFQ1RfTkFNRV9DT0xVTU5fSU5ERVgpCi0JCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2Uob3JnLmVjbGlwc2UudWkuaWRlLklERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWFzc2VydCBlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZyllbGVtZW50OwotCQkJaWYoY29sdW1uSW5kZXggPT0gUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCkKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFN0cmluZ1tdKWlucHV0RWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JfQotCi0JLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQkKLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGJ1aWxkUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSApOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBidWlsZFByb2plY3RUYWJsZShDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQsIAotCQkJCQkJCQkJCQkJU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuVklSVFVBTCk7CQkKLQotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkUHJvamVjdFRhYmxlVmlld2VyKFRhYmxlIHBhcmVudCwgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQotCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihwYXJlbnQpOwotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsKLQkJcmV0dXJuIHRhYmxlVmlld2VyOwotCX0KLX0JCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0RlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmM2JlMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0RlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSURlc2NyaXB0aW9uUHJvdmlkZXI7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyfSBhbmQge0BsaW5rIElMYWJlbFByb3ZpZGVyfSB0aGF0IAotICogbWFpbnRhaW5zIGEgY29sbGVjdGlvbiAoTWFwLCBhY3R1YWxseSkgb2Yge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJ9IAotICogZGVsZWdhdGVzIHRoYXQgcGVyZm9ybSB0aGUgZnVuY3Rpb24gb2YgcHJvdmlkaW5nIGNvbnRlbnQgYW5kIGxhYmVsIGluZm9ybWF0aW9uCi0gKiBmb3IgZWFjaCByZXByZXNlbnRlZCBpdGVtCi0gKiAKLSAqIE5COiBUaGlzIGNsYXNzLCBpZiB1c2VkIGFzIGEgbGFiZWwgcHJvdmlkZXIgKk1VU1QqIGJlIHVzZWQgYXMgYSBjb250ZW50IHByb3ZpZGVyCi0gKiBmb3IgdGhlIHNhbWUgdmlld2VyLiAgSXQgbWF5IGJlIHVzZWQgYXMgYSBjb250ZW50IHByb3ZpZGVyIHdpdGggYSBkaWZmZXJlbnQKLSAqIGxhYmVsIHByb3ZpZGVyLCBob3dldmVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIAotCWV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciwgSURlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLQlwcml2YXRlIGZpbmFsIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCQotCXByaXZhdGUgZmluYWwgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQkKLQlwcml2YXRlIGZpbmFsIE1hcDxPYmplY3QsIEl0ZW1Db250ZW50UHJvdmlkZXI+IGl0ZW1Db250ZW50UHJvdmlkZXJzOwotCQotCXByaXZhdGUgZmluYWwgTWFwPE9iamVjdCwgSXRlbUxhYmVsUHJvdmlkZXI+IGl0ZW1MYWJlbFByb3ZpZGVyczsKLQkKLQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLQkKLQkKLQlwcm90ZWN0ZWQgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAotCQkJSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJdGhpcyhpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSwgbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSwKLQkJCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBpdGVtTGFiZWxQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSA9IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSA9IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQkJdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgSXRlbUNvbnRlbnRQcm92aWRlcj4oKTsKLQkJdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIEl0ZW1MYWJlbFByb3ZpZGVyPigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCUl0ZW1Db250ZW50UHJvdmlkZXIgaXRlbUNvbnRlbnRQcm92aWRlciA9IHRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoaXRlbUNvbnRlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbUNvbnRlbnRQcm92aWRlcjsKLQkJfQotCQlpdGVtQ29udGVudFByb3ZpZGVyID0gdGhpcy5pdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgdGhpcyk7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMucHV0KGl0ZW0sIGl0ZW1Db250ZW50UHJvdmlkZXIpOwotCQlyZXR1cm4gaXRlbUNvbnRlbnRQcm92aWRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZW1MYWJlbFByb3ZpZGVyIGl0ZW1MYWJlbFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCWlmICh0aGlzLnZpZXdlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotCQkJCQkiVGhpcyBwcm92aWRlciBtdXN0IGJlIHVzZWQgYXMgYSBjb250ZW50IiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJInByb3ZpZGVyICphcyB3ZWxsIGFzKiBhIGxhYmVsIHByb3ZpZGVyLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIgPSB0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5nZXQoaXRlbSk7Ci0JCWlmIChpdGVtTGFiZWxQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXI7Ci0JCX0KLQkJaXRlbUxhYmVsUHJvdmlkZXIgPSB0aGlzLml0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIHRoaXMpOwotCQlpZiAoaXRlbUxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMucHV0KGl0ZW0sIGl0ZW1MYWJlbFByb3ZpZGVyKTsKLQkJcmV0dXJuIGl0ZW1MYWJlbFByb3ZpZGVyOwotCX0KLQkKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gaXRlbUNvbnRlbnRQcm92aWRlcihpbnB1dEVsZW1lbnQpLmdldEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJdGVtTGFiZWxQcm92aWRlciBwcm92aWRlciA9IGl0ZW1MYWJlbFByb3ZpZGVyKGVsZW1lbnQpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6cHJvdmlkZXIuZ2V0SW1hZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0VGV4dCgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0JCi0JLyoqCi0JICogRGlzcG9zZXMgYWxsIGl0ZW1zCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzcG9zZVByb3ZpZGVycygpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZVByb3ZpZGVycygpIHsKLQkJLy8gY29kZWQgdGhpcyB3YXkgdG8gYWxsb3cgc29tZSBpdGVtIHByb3ZpZGVycyB0byBkaXNwb3NlIG9mIHRoZWlyIGNoaWxkIAotCQkvLyBlbGVtZW50cyB3aXRob3V0IGRpc3J1cHRpbmcgdGhlIGVudGlyZSBwcm9jZXNzCi0JCXdoaWxlICghIHRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlkaXNwb3NlKHRoaXMuaXRlbUNvbnRlbnRQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCS8vIHRoaXMgY2F0Y2hlcyBhbnkgaXRlbXMgdGhhdCB3ZXJlbid0IGRpc3Bvc2VkIGZyb20gdGhlIGNvbnRlbnQgcHJvdmlkZXJzLAotCQkvLyB0aG91Z2ggdGhlcmUgbW9zdCBsaWtlbHkgd29uJ3QgYmUgYW55IGl0ZW1zIHJlcHJlc2VudGVkIGhlcmUgdGhhdCAKLQkJLy8gaGF2ZW4ndCBhbHJlYWR5IGJlZW4gZGlzcG9zZWQKLQkJd2hpbGUgKCEgdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMuaXNFbXB0eSgpKSB7Ci0JCQlkaXNwb3NlKHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZShPYmplY3QgaXRlbSkgewotCQlpZiAodGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5jb250YWluc0tleShpdGVtKSkgewotCQkJdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5nZXQoaXRlbSkuZGlzcG9zZSgpOwotCQkJdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQkJaWYgKHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5nZXQoaXRlbSkuZGlzcG9zZSgpOwotCQkJdGhpcy5pdGVtTGFiZWxQcm92aWRlcnMucmVtb3ZlKGl0ZW0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgc3RydWN0dXJlZFZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG5ld0lucHV0KSB7Ci0JCQlkaXNwb3NlUHJvdmlkZXJzKCk7Ci0JCX0KLQkJdGhpcy52aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgc3RydWN0dXJlZFZpZXdlcjsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gaXRlbQotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbnRlbnQoZmluYWwgT2JqZWN0IGl0ZW0pIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpZiAoIXZpZXdlcklzRGlzcG9zZWQoKSkgewotCQkJdGhpcy52aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9Ci0JfQotCQotCS8vIG9wZW4gdXAgdmlzaWJpbGl0eSBhIGJpdCBmb3IgaW5uZXIgY2xhc3NlcwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMYWJlbFByb3ZpZGVyQ2hhbmdlZChldmVudCk7Ci0JfQotCQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgbGFiZWwgZm9yIHRoZSBnaXZlbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlTGFiZWwoZmluYWwgT2JqZWN0IGl0ZW0pIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsICYmIHZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKG5ldyBMYWJlbFByb3ZpZGVyQ2hhbmdlZEV2ZW50KERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci50aGlzLCBpdGVtKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQlpZiAoIXZpZXdlcklzRGlzcG9zZWQoKSkgewotCQkJdGhpcy52aWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHZpZXdlcklzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyMTIwNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIE1hcmtlciBpbnRlcmZhY2UgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIERlbGVnYXRpbmdDb250ZW50UHJvdmlkZXIgdG8gcmV0dXJuIAotICogY29udGVudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCi0gKiBAc2VlIERlbGVnYXRpbmdDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUNvbnRlbnRQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHJlcHJlc2VudGVkIGl0ZW0uCi0JICogTm90ZSB0aGF0IHdoZW4gdGhpcyBpcyBjYWxsZWQsIHRoZSByZXByZXNlbnRlZCBpdGVtIGlzIGFuIGlucHV0IGVsZW1lbnQuCi0JICovCi0JT2JqZWN0W10gZ2V0RWxlbWVudHMoKTsKLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgY29udGVudCBwcm92aWRlciwgY2xlYW5pbmcgdXAgYWxsIHJlZmVyZW5jZXMsIGxpc3RlbmVycywgZXRjLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWM5NTFkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHRvIGJ1aWxkIHtAbGluayBJdGVtQ29udGVudFByb3ZpZGVyfXMKLSAqIGZvciBhIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIAotCQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyYThhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyIHRvIHJldHVybiAKLSAqIGxhYmVsIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaXRlbS4KLSAqIEBzZWUgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXIKLSAqIEBzZWUgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBpbWFnZSBmb3IgdGhlIGl0ZW0KLQkgKi8KLQlJbWFnZSBnZXRJbWFnZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBmb3IgdGhlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgaXRlbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQkKLQkvKioKLQkgKiBEaXNwb3NlIG9mIHRoaXMgbGFiZWwgcHJvdmlkZXIsIGNsZWFuaW5nIHVwIGFsbCByZWZlcmVuY2VzLCBsaXN0ZW5lcnMsIGV0Yy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjYxYjM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZSB1c2VkIHRvIGRlc2NyaWJlIGhvdyB0byBidWlsZCBJSXRlbUxhYmVsUHJvdmlkZXJzCi0gKiBmb3IgYSBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcihPYmplY3QgaXRlbSwgCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTk3OGYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXIgdG8gcmV0dXJuIAotICogdHJlZSBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGl0ZW0uCi0gKiBAc2VlIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyCi0gKiBAc2VlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEl0ZW1Db250ZW50UHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgcmVwcmVzZW50ZWQgaXRlbQotCSAqLwotCU9iamVjdCBnZXRQYXJlbnQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcmVwcmVzZW50ZWQgaXRlbSBoYXMgY2hpbGRyZW4KLQkgKi8KLQlib29sZWFuIGhhc0NoaWxkcmVuKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBvZiB0aGUgcmVwcmVzZW50ZWQgaXRlbQotCSAqLwotCU9iamVjdFtdIGdldENoaWxkcmVuKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzYTczNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLS8qKgotICogRXh0ZW5zaW9uIG9mIHtAbGluayBJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeX0gdGhhdCBleHRlbmRzIGZ1bmN0aW9uYWxpdHkKLSAqIGZvciB0cmVlIGNvbnRlbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtLCAKLQkJCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmNsYXNzcGF0aCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY3ZzaWdub3JlIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjg2MDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8ucHJvamVjdCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlNmU1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNWIyYzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MjIgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MzgyNjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6MzcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTAwM2YyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ci1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWFiOGQ0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9jb21wb25lbnQueG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzNhNTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjkzY2Q0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFV0aWxpdHkKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1MmJhNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9Db21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgR09GIENvbW1hbmQgZGVzaWduIHBhdHRlcm4sCi0gKiBhbmQgaXQgZG9lc24ndCBjYXJyeSB0aGUgYmFnZ2FnZSBvZiB7QGxpbmsgamF2YS5sYW5nLlJ1bm5hYmxlfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZCB7Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBjb21tYW5kCi0JICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBleGVjdXRlKCk7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCBkbyBub3RoaW5nCi0JICogd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgQ29tbWFuZCwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIHRocm93IGFuCi0JICogZXhjZXB0aW9uIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQgaW1wbGVtZW50cyBDb21tYW5kLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ29tbWFuZC5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9Db21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFhYjg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBjb250cm9sIGhvdyBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCi0gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2ZXIgcHJvdmlkZXMgdGhlIGNvbW1hbmQgYnV0IHRoZSBjbGllbnQgcHJvdmlkZXMKLSAqIHRoZSBjb250ZXh0IChlLmcuIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBkaXNwYXRjaCB0aGUgY29tbWFuZCB0byB0aGUgVUkKLSAqIHRocmVhZCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbW1hbmRFeGVjdXRvciB7Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgc2ltcGx5IGV4ZWN1dGVzIHRoZSBjb21tYW5kIHdpdGhvdXQgYW55IHNvcnQgb2YgZW5oYW5jZW1lbnQuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdCBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJDb21tYW5kRXhlY3V0b3IuRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9GaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjIxODU5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gZmlsdGVyIG9iamVjdHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWV0YXRpb24gb2YgdGhlIGZpbHRlciBpbnRlcmZhY2UgdGhhdCBhY2NlcHRzIGFsbCB0aGUKLQkgKiBvYmplY3RzIChpLmUuIGl0IGRvZXMgbm8gZmlsdGVyaW5nKS4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgRmlsdGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJGaWx0ZXIuTnVsbCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgYWNjZXB0cyBub25lIG9mIHRoZQotCSAqIG9iamVjdHMgKGkuZS4gaXQgZmlsdGVycyBvdXQgYWxsIHRoZSBvYmplY3RzKS4KLQkgKi8KLQlmaW5hbCBjbGFzcyBPcGFxdWU8Uz4gaW1wbGVtZW50cyBGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBPcGFxdWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmlsdGVyLk9wYXF1ZSI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1ldGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgdGhyb3dzIGFuIGV4Y2VwdGlvbgotCSAqIGlmIGNhbGxlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRmlsdGVyLkRpc2FibGVkIjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE2NDFhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9JbmRlbnRpbmdQcmludFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFByaW50V3JpdGVyfSB0byBhdXRvbWF0aWNhbGx5IGluZGVudCBuZXcgbGluZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRlbnRpbmdQcmludFdyaXRlcgotCWV4dGVuZHMgUHJpbnRXcml0ZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpbmRlbnQ7Ci0JcHJpdmF0ZSBpbnQgaW5kZW50TGV2ZWw7Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRzSW5kZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9JTkRFTlQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRlciB0aGF0IGluZGVudHMgd2l0aCB0YWJzLgotCSAqLwotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlcihXcml0ZXIgb3V0KSB7Ci0JCXRoaXMob3V0LCBERUZBVUxUX0lOREVOVCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGVyIHRoYXQgaW5kZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlcihXcml0ZXIgb3V0LCBTdHJpbmcgaW5kZW50KSB7Ci0JCXN1cGVyKG91dCk7Ci0JCXRoaXMuaW5kZW50ID0gaW5kZW50OwotCQl0aGlzLmluZGVudExldmVsID0gMDsKLQkJdGhpcy5uZWVkc0luZGVudCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogU2V0IGZsYWcgc28gZm9sbG93aW5nIGxpbmUgaXMgaW5kZW50ZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRsbigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXN1cGVyLnByaW50bG4oKTsKLQkJCXRoaXMubmVlZHNJbmRlbnQgPSB0cnVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGFwcHJvcHJpYXRlIGluZGVudC4KLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJpbnRJbmRlbnQoKSB7Ci0JCWlmICh0aGlzLm5lZWRzSW5kZW50KSB7Ci0JCQl0aGlzLm5lZWRzSW5kZW50ID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gdGhpcy5pbmRlbnRMZXZlbDsgaS0tID4gMDsgKSB7Ci0JCQkJdGhpcy5wcmludCh0aGlzLmluZGVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIHBvcnRpb24gb2YgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShjaGFyIGJ1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShidWYsIG9mZiwgbGVuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgc2luZ2xlIGNoYXJhY3Rlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUoYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIHBvcnRpb24gb2YgYSBzdHJpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIHMsIGludCBvZmYsIGludCBsZW4pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKHMsIG9mZiwgbGVuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1bXAgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbmRlbnQoKSB7Ci0JCXRoaXMuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmRlbnQoKSB7Ci0JCXRoaXMuZGVjcmVtZW50SW5kZW50TGV2ZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdW1wIHRoZSBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIHZvaWQgaW5jcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLmluZGVudExldmVsKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIGluZGVudCBsZXZlbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMuaW5kZW50TGV2ZWwtLTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRlbnRMZXZlbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXJldHVybiB0aGlzLmluZGVudExldmVsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgdGhlIGluZGVudCBsZXZlbCB0byBiZSBzZXQgZGlyZWN0bHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIGludCBzZXRJbmRlbnRMZXZlbChpbnQgaW5kZW50TGV2ZWwpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCWludCBvbGQgPSB0aGlzLmluZGVudExldmVsOwotCQkJdGhpcy5pbmRlbnRMZXZlbCA9IGluZGVudExldmVsOwotCQkJcmV0dXJuIG9sZDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSmF2YVR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0phdmFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDE5ZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgSmF2YSB0eXBlOyBpLmUuIGl0cyAiZWxlbWVudCB0eXBlIgotICogYW5kIGl0cyAiYXJyYXkgZGVwdGgiLiBUaGUgZWxlbWVudCB0eXBlIGlzIHJlZmVyZW5jZWQgYnkgbmFtZSwKLSAqIGFsbG93aW5nIHVzIHRvIHJlZmVyZW5jZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCAob3IgY2Fubm90IGJlKSBsb2FkZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVHlwZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUncyAiZWxlbWVudCB0eXBlIi4KLQkgKiBBIG1lbWJlciB0eXBlIHdpbGwgaGF2ZSBvbmUgb3IgbW9yZSA8Y29kZT4nJCc8L2NvZGU+IGNoYXJhY3RlcnMgaW4gaXRzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgImFycmF5IGRlcHRoIi4KLQkgKi8KLQlpbnQgZ2V0QXJyYXlEZXB0aCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYW4gYXJyYXkgKGkuZS4gaXRzICJhcnJheSBkZXB0aCIgaXMgZ3JlYXRlcgotCSAqIHRoYW4gemVybykuCi0JICovCi0JYm9vbGVhbiBpc0FycmF5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJwcmltaXRpdmUiIChlLmcuIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYSAicHJpbWl0aXZlIHdyYXBwZXIiIChlLmcuIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0sCi0JICoge0BsaW5rIGphdmEubGFuZy5GbG9hdH0pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNQcmltaXRpdmVXcmFwcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJ2YXJpYWJsZSBwcmltaXRpdmUiIChlLmcuIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwKLQkgKiBidXQgbm90IDxjb2RlPnZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiB2YXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkIDxjb2RlPnZvaWQ8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJ2YXJpYWJsZSBwcmltaXRpdmUgd3JhcHBlciIgKGUuZy4KLQkgKiB7QGxpbmsgamF2YS5sYW5nLkludGVnZXJ9LCB7QGxpbmsgamF2YS5sYW5nLkZsb2F0fSwKLQkgKiBidXQgbm90IHtAbGluayBqYXZhLmxhbmcuVm9pZH0pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IHZhcmlhYmxlcyBjYW5ub3QgYmUgZGVjbGFyZWQgPGNvZGU+dm9pZDwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUncyBlbGVtZW50IHR5cGUgYW5kIGFycmF5IGRlcHRoLgotCSAqLwotCUNsYXNzPD8+IGdldEphdmFDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IG1hdGNoZXMgdGhhdAotCSAqIHJldHVybmVkIGJ5IHtAbGluayBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpfQotCSAqIChlLmcuIDxjb2RlPiJbW0oiPC9jb2RlPiwgPGNvZGU+IltMamF2YS5sYW5nLk9iamVjdDsiPC9jb2RlPiwKLQkgKiA8Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+KS4KLQkgKi8KLQlTdHJpbmcgZ2V0SmF2YUNsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlckVsZW1lbnRUeXBlTmFtZSwgaW50IG90aGVyQXJyYXlEZXB0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBkZXNjcmliZXMgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKFN0cmluZyBjbGFzc05hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgZGVzY3JpYmVzIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlib29sZWFuIGRlc2NyaWJlcyhDbGFzczw/PiBqYXZhQ2xhc3MpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKEphdmFUeXBlIG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJbW0oiPC9jb2RlPiA9PiA8Y29kZT4ibG9uZ1tdW10iPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+ID0+IDxjb2RlPiJqYXZhLnV0aWwuTWFwLkVudHJ5IjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCVN0cmluZyBkZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQXBwZW5kIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOjx1bD4KLQkgKiA8bGk+PGNvZGU+IltbSiI8L2NvZGU+ID0+IDxjb2RlPiJsb25nW11bXSI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4gPT4gPGNvZGU+ImphdmEudXRpbC5NYXAuRW50cnkiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0Jdm9pZCBhcHBlbmREZWNsYXJhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCi0JLyoqCi0JICogUHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6PHVsPgotCSAqIDxsaT48Y29kZT4iW1tKIjwvY29kZT4gPT4gPGNvZGU+ImxvbmdbXVtdIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPiA9PiA8Y29kZT4iamF2YS51dGlsLk1hcC5FbnRyeSI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQl2b2lkIHByaW50RGVjbGFyYXRpb25PbihQcmludFdyaXRlciBwdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L01ldGhvZFNpZ25hdHVyZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZTc5M2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlc2NyaWJlcyBhIEphdmEgbWV0aG9kIHNpZ25hdHVyZTsgaS5lLiBpdHMgIm5hbWUiCi0gKiBhbmQgaXRzICJwYXJhbWV0ZXIgdHlwZXMiLiBUaGUgcGFyYW1ldGVyIHR5cGVzIGFyZSByZWZlcmVuY2VkIGJ5IG5hbWUsCi0gKiBhbGxvd2luZyB1cyB0byByZWZlcmVuY2UgY2xhc3NlcyB0aGF0IGFyZSBub3QgKG9yIGNhbm5vdCBiZSkgbG9hZGVkLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kU2lnbmF0dXJlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBwYXJhbWV0ZXIgdHlwZXMuCi0JICovCi0JSmF2YVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBzaWduYXR1cmUgZGVzY3JpYmVzIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKE1ldGhvZCBtZXRob2QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBzaWduYXR1cmUgZXF1YWxzIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlck5hbWUsIEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlOjxwPgotCSAqIDxjb2RlPiJmb28oaW50LCBqYXZhLmxhbmcuU3RyaW5nKSI8L2NvZGU+Ci0JICovCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotCi0JLyoqCi0JICogQXBwZW5kIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncyBzaWduYXR1cmU6PHA+Ci0JICogPGNvZGU+ImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIjwvY29kZT4KLQkgKi8KLQl2b2lkIGFwcGVuZFNpZ25hdHVyZVRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCi0JLyoqCi0JICogUHJpbnQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZTo8cD4KLQkgKiA8Y29kZT4iZm9vKGludCwgamF2YS5sYW5nLlN0cmluZykiPC9jb2RlPgotCSAqLwotCXZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L09iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvT2JqZWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MWMyYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSByZWNpcGllbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT2JqZWN0UmVmZXJlbmNlPFY+Ci0JZXh0ZW5kcyBSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPgotewotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlWIHNldFZhbHVlKFYgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCVYgc2V0TnVsbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvUmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L1JlYWRPbmx5T2JqZWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzRmZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvUmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIGhvbGRpbmcgYW4gb2JqZWN0IHRoYXQgY2Fubm90IGJlIGNoYW5nZWQuCi0gKiAKLSAqIEBzZWUgT2JqZWN0UmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlPYmplY3RSZWZlcmVuY2U8Vj4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUuCi0JICovCi0JViBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHZhbHVlRXF1YWxzKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiB2YWx1ZU5vdEVxdWFsKE9iamVjdCBvYmplY3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc051bGwoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlib29sZWFuIGlzTm90TnVsbCgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRkOTVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Fic3RyYWN0QXNzb2NpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEltcGxlbWVudCBzb21lIG9mIHRoZSBtZXRob2RzIGluIHtAbGluayBBc3NvY2lhdGlvbn0gdGhhdCBjYW4KLSAqIGJlIGRlZmluZWQgaW4gdGVybXMgb2YgdGhlIG90aGVyIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFzc29jaWF0aW9uPEssIFY+Ci0JaW1wbGVtZW50cyBBc3NvY2lhdGlvbjxLLCBWPgotewotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QXNzb2NpYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBBc3NvY2lhdGlvbjw/LCA/PikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlBc3NvY2lhdGlvbjw/LCA/PiBvdGhlciA9IChBc3NvY2lhdGlvbjw/LCA/PikgbzsKLQkJcmV0dXJuIHRoaXMua2V5RXF1YWxzKG90aGVyKSAmJiB0aGlzLnZhbHVlRXF1YWxzKG90aGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZXlFcXVhbHMoQXNzb2NpYXRpb248PywgPz4gb3RoZXIpIHsKLQkJT2JqZWN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7Ci0JCXJldHVybiAoa2V5ID09IG51bGwpID8KLQkJCQkob3RoZXIuZ2V0S2V5KCkgPT0gbnVsbCkgOgotCQkJCWtleS5lcXVhbHMob3RoZXIuZ2V0S2V5KCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlRXF1YWxzKEFzc29jaWF0aW9uPD8sID8+IG90aGVyKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/Ci0JCQkJKG90aGVyLmdldFZhbHVlKCkgPT0gbnVsbCkgOgotCQkJCXZhbHVlLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5SGFzaENvZGUoKSBeIHRoaXMudmFsdWVIYXNoQ29kZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQga2V5SGFzaENvZGUoKSB7Ci0JCU9iamVjdCBrZXkgPSB0aGlzLmdldEtleSgpOwotCQlyZXR1cm4gKGtleSA9PSBudWxsKSA/IDAgOiBrZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHZhbHVlSGFzaENvZGUoKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRLZXkoKSArICIgPT4gIiArIHRoaXMuZ2V0VmFsdWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1MjAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0FycmF5VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogQXJyYXktcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcnJheVRvb2xzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfQ0hBUl9BUlJBWSA9IG5ldyBjaGFyWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfSU5UX0FSUkFZID0gbmV3IGludFswXTsKLQotCS8vICoqKioqKioqKiogaW5zdGFudGlhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCB0aGUgc2FtZSBsZW5ndGgKLQkgKiBhbmQgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubmV3QXJyYXkoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShFW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ld0FycmF5KGFycmF5LCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgbGVuZ3RoCi0JICogYW5kIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlIGFzIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm5ld0FycmF5KE9iamVjdFtdIGFycmF5LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gbmV3QXJyYXkoRVtdIGFycmF5LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXdBcnJheShjb21wb25lbnRUeXBlKGFycmF5KSwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhcnJheSdzIGNvbXBvbmVudCB0eXBlLCB3aXRoIGFwcHJvcHJpYXRlIHN1cHBvcnQKLQkgKiBmb3IgZ2VuZXJpY3MuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUoRVtdIGFycmF5KSB7Ci0JCUNsYXNzPD8+IHJhd0NvbXBvbmVudFR5cGUgPSBhcnJheS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlID0gKENsYXNzPD8gZXh0ZW5kcyBFPikgcmF3Q29tcG9uZW50VHlwZTsKLQkJcmV0dXJuIGNvbXBvbmVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBjb21wb25lbnQgdHlwZSBhbmQgbGVuZ3RoLAotCSAqIHdpdGggYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3IgZ2VuZXJpY3MuIFRoZSBjb21wb25lbnQgdHlwZSBjYW5ub3QgYmUgYQotCSAqIHByaW1pdGl2ZSB0eXBlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZSwgaW50IGxlbmd0aCkgewotCQlpZiAoY29tcG9uZW50VHlwZS5pc1ByaW1pdGl2ZSgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBcnJheSBjbGFzcyBjYW5ub3QgYmUgcHJpbWl0aXZlOiAiICsgY29tcG9uZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3QXJyYXlfKGNvbXBvbmVudFR5cGUsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb21wb25lbnQgdHlwZSBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5XyhDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZSwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gKEVbXSkgKChjb21wb25lbnRUeXBlID09IE9CSkVDVF9DTEFTUykgPwotCQkJCW5ldyBPYmplY3RbbGVuZ3RoXSA6Ci0JCQkJQXJyYXkubmV3SW5zdGFuY2UoY29tcG9uZW50VHlwZSwgbGVuZ3RoKSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPE9iamVjdD4gT0JKRUNUX0NMQVNTID0gT2JqZWN0LmNsYXNzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhYmxlIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBhcnJheShpdGVyYWJsZS5pdGVyYXRvcigpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhYmxlIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKS50b0FycmF5KCkgOgotCQkJCUVNUFRZX09CSkVDVF9BUlJBWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheSgpPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdFtdIGFycmF5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLnRvQXJyYXkoKSA6Ci0JCQkJRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYXRvciBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikudG9BcnJheShhcnJheSkgOgotCQkJCWVtcHR5QXJyYXkoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkgaXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIElmIHRoZSBpdGVyYXRvciBmaXRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXksIGl0IGlzIHJldHVybmVkIHRoZXJlaW4uCi0JICogT3RoZXJ3aXNlLCBhIG5ldyBhcnJheSBpcyBhbGxvY2F0ZWQgd2l0aCB0aGUgcnVudGltZSB0eXBlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBhbmQgdGhlIHNpemUgb2YgdGhlIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLnRvQXJyYXkoYXJyYXkpIDoKLQkJCQllbXB0eUFycmF5KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGFycmF5IGlzIGVtcHR5LCByZXR1cm4gaXQ7Ci0JICogb3RoZXJ3aXNlLCBzZXQgaXRzIGZpcnN0IGVsZW1lbnQgdG8gbnVsbC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGVtcHR5QXJyYXkoRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gYXJyYXkgOiBjbGVhckZpcnN0KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBhcnJheSdzIGZpcnN0IGVsZW1lbnQgdG8gbnVsbCBhbmQgYW5kIHJldHVybiB0aGUgYXJyYXkuCi0JICogQXNzdW1lIHRoZSBhcnJheSBsZW5ndGggPiAwLgotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gY2xlYXJGaXJzdChFW10gYXJyYXkpIHsKLQkJYXJyYXlbMF0gPSBudWxsOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGJlIGFkZGVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZChFW10gYXJyYXksIGludCBpbmRleCwgRSB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbiArIDEpOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAobGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJlc3VsdFtsZW5dID0gdmFsdWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGQoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJcmVzdWx0W2luZGV4XSA9IHZhbHVlOwotCQlpZiAoaW5kZXggPCBsZW4pIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgMSwgbGVuIC0gaW5kZXgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICo8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBjb2xsZWN0aW9uIHNpemUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gKGNvbGxlY3Rpb25TaXplID09IDApID8gYXJyYXkgOiBhZGRBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gemVybwotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gemVybzsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8KLQkJCQljb2xsZWN0aW9uLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIGNvbGxlY3Rpb25TaXplKSkgOgotCQkJCWFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCBhbmQgY29sbGVjdGlvbiBzaXplID4gemVybwotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgYXJyYXlMZW5ndGggKyBjb2xsZWN0aW9uU2l6ZSk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgYXJyYXlMZW5ndGgpOwotCQlpbnQgaSA9IGFycmF5TGVuZ3RoOwotCQlmb3IgKEUgZWxlbWVudCA6IGNvbGxlY3Rpb24pIHsKLQkJCXJlc3VsdFtpKytdID0gZWxlbWVudDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRS4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5MSwgaW50IGluZGV4LCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXkxLCBhcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb24uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBjb2xsZWN0aW9uIHNpemUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvblNpemUgPT0gMCkgPyBhcnJheSA6IGFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgYXJyYXkubGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gc2l6ZSA+IDA7IGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJaWYgKGluZGV4ID09IDApIHsKLQkJCQlyZXR1cm4gY29sbGVjdGlvbi50b0FycmF5KG5ld0FycmF5KGFycmF5LCBjb2xsZWN0aW9uU2l6ZSkpOwotCQkJfQotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiAoaW5kZXggPT0gYXJyYXlMZW5ndGgpID8gIC8vICdjb2xsZWN0aW9uJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5JwotCQkJCWFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSkgOgotCQkJCWFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggYW5kIGNvbGxlY3Rpb24gc2l6ZSA+IDAgYW5kIGluZGV4ICE9IGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBhcnJheUxlbmd0aCArIGNvbGxlY3Rpb25TaXplKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCWludCBpID0gaW5kZXg7Ci0JCWZvciAoRSBpdGVtIDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBpdGVtOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCByZXN1bHQsIGluZGV4ICsgY29sbGVjdGlvblNpemUsIGFycmF5TGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gYWRkQWxsXyhhcnJheSwgaW5kZXgsIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpbnNlcnRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBpbmRleCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBhZGRBbGxfKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhci4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mi5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IDIgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCQlhcnJheTIgOgotCQkJCQkoaW5kZXggPT0gYXJyYXkxTGVuZ3RoKSA/ICAvLyAnYXJyYXkyJyBhZGRlZCB0byBlbmQgb2YgJ2FycmF5MScKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKSA6Ci0JCQkJCQlhZGRBbGxfKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwIGFuZCBpbmRleCAhPSBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTIgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgYXJyYXkxTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgb2JqZWN0cyBpbiB0aGUgc2Vjb25kCi0JICogc3BlY2lmaWVkIGFycmF5IGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50Li4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGwoaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gYWRkQWxsXyhpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoICsgYXJyYXkyTGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBpbmRleCwgYXJyYXkyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTEsIGluZGV4LCByZXN1bHQsIGluZGV4ICsgYXJyYXkyTGVuZ3RoLCBhcnJheTFMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBlbXB0eSBhcnJheSB3aXRoIHRoZSBzYW1lIGNvbXBvbmVudCB0eXBlIGFzIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNsZWFyKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gY2xlYXIoRVtdIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gYXJyYXkgOiBuZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbmNhdGVuYXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgaW4gYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG9mIG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoT2JqZWN0W10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gY29uY2F0ZW5hdGUoRVtdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChFW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWxlbiArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5c1swXSwgbGVuKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWludCBjdXJyZW50ID0gMDsKLQkJZm9yIChFW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJCWlmIChhcnJheUxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiAgYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoY2hhcltdLi4uIGFycmF5cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29uY2F0ZW5hdGUoY2hhcltdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChjaGFyW10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWxlbiArPSBhcnJheS5sZW5ndGg7Ci0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJaW50IGN1cnJlbnQgPSAwOwotCQlmb3IgKGNoYXJbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoICE9IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiAgYWxsIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheXMsIGNvbmNhdGVuYXRlZCBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb25zdGFudCBhcnJheXMgb3V0IG90aGVyIGNvbnN0YW50IGFycmF5cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29uY2F0ZW5hdGUoaW50W10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGNvbmNhdGVuYXRlKGludFtdLi4uIGFycmF5cykgewotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChpbnRbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JTlRfQVJSQVk7Ci0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW5dOwotCQlpbnQgY3VycmVudCA9IDA7Ci0JCWZvciAoaW50W10gYXJyYXkgOiBhcnJheXMpIHsKLQkJCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJCWlmIChhcnJheUxlbmd0aCAhPSAwKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCBjdXJyZW50LCBhcnJheUxlbmd0aCk7Ci0JCQkJY3VycmVudCArPSBhcnJheUxlbmd0aDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zXyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc18oY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoYXJyYXksIHZhbHVlLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGFycmF5IGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoaW50W10gYXJyYXksIGludCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbnRhaW5zXyhhcnJheSwgdmFsdWUsIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfKGludFtdIGFycmF5LCBpbnQgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoYXJyYXksIGNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCS8vIHVzZSBoYXNoZWQgbG9va3VwCi0JCUhhc2hTZXQ8T2JqZWN0PiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKCAhIHNldC5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0Li4uIGFycmF5MikgewotCQkvLyB1c2UgaGFzaGVkIGxvb2t1cAotCQlIYXNoU2V0PE9iamVjdD4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldChhcnJheTEpOwotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgc2V0LmNvbnRhaW5zKGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkxLCBhcnJheTJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlmb3IgKGludCBpID0gYXJyYXkyLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkxLCBhcnJheTJbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgYXJyYXkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZkVuZChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgbGVuMSA9IGFycmF5MS5sZW5ndGg7Ci0JCWludCBsZW4yID0gYXJyYXkyLmxlbmd0aDsKLQkJaWYgKGxlbjEgIT0gbGVuMikgewotCQkJcmV0dXJuIE1hdGgubWF4KGxlbjEsIGxlbjIpIC0gMTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuMSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlPYmplY3QgbyA9IGFycmF5MVtpXTsKLQkJCWlmIChvID09IG51bGwpIHsKLQkJCQlpZiAoYXJyYXkyW2ldICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoICEgby5lcXVhbHMoYXJyYXkyW2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiBAc2VlICNkaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2RpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBkaWZmRW5kKGFycmF5MSwgYXJyYXkyKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJLy8gdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHRoZSBzdGFydCBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzCi0JCQlyZXR1cm4gbmV3IFJhbmdlKGFycmF5MS5sZW5ndGgsIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGFycmF5cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgYXJyYXkgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgYXJyYXksIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBhcnJheQotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGFycmF5KS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmU3RhcnQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlPYmplY3QgbyA9IGFycmF5MVtpXTsKLQkJCWlmIChvID09IG51bGwpIHsKLQkJCQlpZiAoYXJyYXkyW2ldICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoICEgby5lcXVhbHMoYXJyYXkyW2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gdGhlIGluZGV4IG9mIHRoZQotCSAqIGxhc3QgZWxlbWVudCBpbiB0aGUgbG9uZ2VyIGFycmF5LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpZiAobGVuMSAhPSBsZW4yKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgobGVuMSwgbGVuMikgLSAxOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW4xIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdLCBPYmplY3RbXSkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgaWRlbnRpdHlEaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IGlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5Mik7Ci0JCWlmIChlbmQgPT0gLTEpIHsKLQkJCS8vIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCB0aGUgc3RhcnQgaXMgdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cwotCQkJcmV0dXJuIG5ldyBSYW5nZShhcnJheTEubGVuZ3RoLCBlbmQpOwotCQl9Ci0JCS8vIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50LCBjYWxjdWxhdGUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZQotCQlyZXR1cm4gbmV3IFJhbmdlKGlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGFycmF5cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgYXJyYXkgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgYXJyYXksIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBhcnJheQotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGFycmF5KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBlbmQgPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmQ7IGkrKykgewotCQkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgaWRlbnRpY2FsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXlzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmlkZW50aWNhbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTEgPT0gYXJyYXkyKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoYXJyYXkxID09IG51bGwgfHwgYXJyYXkyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJaWYgKGFycmF5Mi5sZW5ndGggIT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXkxW2ldICE9IGFycmF5MltpXSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pZGVudGl0eUluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eUluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRpb24gaW5kZXggb2YgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBhcnJheSBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBhcnJheSBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gaW50IGluc2VydGlvbkluZGV4T2YoRVtdIHNvcnRlZEFycmF5LCBDb21wYXJhYmxlPEU+IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh2YWx1ZS5jb21wYXJlVG8oc29ydGVkQXJyYXlbaV0pIDwgMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXhpbXVtIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBhcnJheSBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBhcnJheSBzb3J0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gaW50IGluc2VydGlvbkluZGV4T2YoRVtdIHNvcnRlZEFycmF5LCBFIHZhbHVlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlpbnQgbGVuID0gc29ydGVkQXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY29tcGFyYXRvci5jb21wYXJlKHZhbHVlLCBzb3J0ZWRBcnJheVtpXSkgPCAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGFzdEluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBvciByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWluL21heCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWluaW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWluKGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1pbihjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWNoYXIgbWluID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGFycmF5W2ldOwotCQkJaWYgKGMgPCBtaW4pIHsKLQkJCQltaW4gPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5taW4oaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1pbihpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJaW50IG1pbiA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgeCA9IGFycmF5W2ldOwotCQkJaWYgKHggPCBtaW4pIHsKLQkJCQltaW4gPSB4OwotCQkJfQotCQl9Ci0JCXJldHVybiBtaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1heGltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1heChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBtYXgoY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQljaGFyIG1heCA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBhcnJheVtpXTsKLQkJCWlmIChjID4gbWF4KSB7Ci0JCQkJbWF4ID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW50ZWdlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWF4KGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBtYXgoaW50Li4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWludCBtYXggPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJaW50IHggPSBhcnJheVtpXTsKLQkJCWlmICh4ID4gbWF4KSB7Ci0JCQkJbWF4ID0geDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShPYmplY3RbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXQgaW5kZXggIT0gc291cmNlIGluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBtb3ZlXyhFW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUUgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShPYmplY3RbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBtb3ZlKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCUVbXSB0ZW1wID0gbmV3QXJyYXkoYXJyYXksIGxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gbW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIG1vdmVfKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpbnQgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gbW92ZShpbnRbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCWludFtdIHRlbXAgPSBuZXcgaW50W2xlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4LCB0ZW1wLCAwLCBsZW5ndGgpOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIGxlbmd0aCwgc291cmNlSW5kZXggLSB0YXJnZXRJbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCArIGxlbmd0aCwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIGFycmF5LCB0YXJnZXRJbmRleCwgbGVuZ3RoKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gZWxlbWVudCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgPyBhcnJheSA6IG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBtb3ZlXyhjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWNoYXIgdGVtcCA9IGFycmF5W3NvdXJjZUluZGV4XTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyAxLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgMSwgYXJyYXksIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCAtIHNvdXJjZUluZGV4KTsKLQkJfQotCQlhcnJheVt0YXJnZXRJbmRleF0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubW92ZShjaGFyW10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBtb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWlmIChsZW5ndGggPT0gMSkgewotCQkJcmV0dXJuIG1vdmVfKGFycmF5LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCWNoYXJbXSB0ZW1wID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZShPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgaW5kZXhPZihhcnJheSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZShjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZShjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUZpcnN0KEVbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUZpcnN0KGNoYXJbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZmlyc3QgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVGaXJzdChpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVGaXJzdChpbnRbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVMYXN0KEVbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVMYXN0KGNoYXJbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbGFzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUxhc3QoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlTGFzdChpbnRbXSBhcnJheSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGFycmF5Lmxlbmd0aCAtIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYXRvciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyByZW1vdmVBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJLy8gY29udmVydCB0byBhIHNldCB0byB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gcmVtb3ZlQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29sbGVjdGlvbi5pc0VtcHR5KCkgPyBhcnJheSA6IHJlbW92ZUFsbF8oYXJyYXksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsXyhFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIGlzIG5vbi1lbXB0eTsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZW1vdmVBbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJLy8gYnVpbGQgdGhlIGluZGljZXMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIHRvIHJlbWFpbgotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5MSwgT2JqZWN0Li4uIGFycmF5MikgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiAoYXJyYXkyLmxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJlbW92ZUFsbF8oYXJyYXkxLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5MikpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMjcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cyNyZW1vdmVBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlpZiAoYXJyYXkyLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOwotCQl9Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkxTGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoICEgY29udGFpbnMoYXJyYXkyLCBhcnJheTFbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoT2JqZWN0W10gYXJyYXksIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKEVbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGFycmF5TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldICE9IG51bGwpIHsKLQkJCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoICEgdmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIG9jY3VycmVuY2VzIG9mCi0JICogdGhlIHNwZWNpZmllZCBlbGVtZW50IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldICE9IHZhbHVlKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gbm90aGluZyB3YXMgcmVtb3ZlZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbnkgZHVwbGljYXRlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCUFycmF5TGlzdDxFPiB0ZW1wID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYXJyYXkpOwotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHRlbXAsIGxlbikgPwotCQkJCQl0ZW1wLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIHRlbXAuc2l6ZSgpKSkgOgotCQkJCQlhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnQgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50QXRJbmRleChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoRVtdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudEF0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUVsZW1lbnRBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50cyBhdCBpbmRleCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUVsZW1lbnRzQXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBuZXdMZW5ndGgpOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiByZXN1bHQ7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlpbnQgbGVuZ3RoMiA9IG5ld0xlbmd0aCAtIGluZGV4OwotCQlpZiAobGVuZ3RoMiAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoMik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50cyByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGNoYXJbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaW50IG5ld0xlbmd0aCA9IGFycmF5TGVuZ3RoIC0gbGVuZ3RoOwotCQlpZiAoKG5ld0xlbmd0aCA9PSAwKSAmJiAoaW5kZXggPT0gMCkpIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbmV3TGVuZ3RoXTsKLQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCWludCBsZW5ndGgyID0gbmV3TGVuZ3RoIC0gaW5kZXg7Ci0JCWlmIChsZW5ndGgyICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgbGVuZ3RoLCByZXN1bHQsIGluZGV4LCBsZW5ndGgyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuZXdMZW5ndGhdOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJaW50IGxlbmd0aDIgPSBuZXdMZW5ndGggLSBpbmRleDsKLQkJaWYgKGxlbmd0aDIgIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIGxlbmd0aDIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlcGxhY2UgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXBsYWNlQWxsKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlcGxhY2VBbGwoRVtdIGFycmF5LCBPYmplY3Qgb2xkVmFsdWUsIEUgbmV3VmFsdWUpIHsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKG9sZFZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqPHA+Ci0JICogPGNvZGU+IEFycmF5cy5yZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXBsYWNlQWxsKGludFtdIGFycmF5LCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXBsYWNlQWxsKGNoYXJbXSBhcnJheSwgY2hhciBvbGRWYWx1ZSwgY2hhciBuZXdWYWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVwbGFjZUFsbChjaGFyW10gYXJyYXksIGNoYXIgb2xkVmFsdWUsIGNoYXIgbmV3VmFsdWUpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gb2xkVmFsdWUpIHsKLQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV0YWluIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvciwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yKSwgYXJyYXlMZW5ndGgpIDoKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIGludCBhcnJheUxlbmd0aCwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJcmV0YWluQWxsXyhhcnJheSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgYXJyYXlMZW5ndGgpIDoKLQkJCQluZXdBcnJheShhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLmlzRW1wdHkoKSA/Ci0JCQkJbmV3QXJyYXkoYXJyYXksIDApIDoKLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBjb2xsZWN0aW9uLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5IGFuZCBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbGxlY3Rpb24uY29udGFpbnMoYXJyYXlbaV0pKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5OyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGopOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQlhcnJheTEgOgotCQkJCShhcnJheTIubGVuZ3RoID09IDApID8KLQkJCQkJbmV3QXJyYXkoYXJyYXkxLCAwKSA6Ci0JCQkJCXJldGFpbkFsbChhcnJheTEsIENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkyKSwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhci4uLiBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAxIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gRU1QVFlfQ0hBUl9BUlJBWSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRhaW5zXyhhcnJheTIsIGFycmF5MVtpXSwgYXJyYXkyTGVuZ3RoKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWludCBhcnJheTFMZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoKSB7Ci0JCWludCBhcnJheTJMZW5ndGggPSBhcnJheTIubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IEVNUFRZX0lOVF9BUlJBWSA6IHJldGFpbkFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBib3RoIGFycmF5IGxlbmd0aHMgPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gcmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5MUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheTFMZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRhaW5zXyhhcnJheTIsIGFycmF5MVtpXSwgYXJyYXkyTGVuZ3RoKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXkxTGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXkxOyAgLy8gZXZlcnl0aGluZyB3YXMgcmV0YWluZWQKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldmVyc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSwgcmV2ZXJzZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldmVyc2UoT2JqZWN0Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV2ZXJzZShFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXksIHJldmVyc2VkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXZlcnNlKGNoYXIuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldmVyc2UoY2hhci4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5LCByZXZlcnNlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV2ZXJzZShpbnQuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmV2ZXJzZShpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByb3RhdGUoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKE9iamVjdFtdIGFycmF5LCBpbnQgZGlzdGFuY2UpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByb3RhdGUoRVtdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCUUgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCUUgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcm90YXRlKGNoYXIuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShjaGFyW10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQljaGFyIGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJCQlhcnJheVtpXSA9IGRpc3BsYWNlZDsKLQkJCQlkaXNwbGFjZWQgPSB0ZW1wOwotCQkJCW5Nb3ZlZCArKzsKLQkJCX0gd2hpbGUgKGkgIT0gY3ljbGVTdGFydCk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByb3RhdGUoaW50W10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJaW50IGRpc3BsYWNlZCA9IGFycmF5W2N5Y2xlU3RhcnRdOwotCQkJaW50IGkgPSBjeWNsZVN0YXJ0OwotCQkJZG8gewotCQkJCWkgKz0gZGlzdGFuY2U7Ci0JCQkJaWYgKGkgPj0gbGVuKSB7Ci0JCQkJCWkgLT0gbGVuOwotCQkJCX0KLQkJCQlpbnQgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNodWZmbGUgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTSA9IG5ldyBSYW5kb20oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoT2JqZWN0Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoT2JqZWN0W10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc2h1ZmZsZShFW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoY2hhci4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoY2hhcltdIGFycmF5LCBSYW5kb20gcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoaW50Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50Li4uIGFycmF5KSB7Ci0JCXJldHVybiBzaHVmZmxlKGFycmF5LCBSQU5ET00pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgInNodWZmbGluZyIgaXQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnNodWZmbGUoaW50W10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNodWZmbGUoaW50W10gYXJyYXksIFJhbmRvbSByYW5kb20pIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3dhcChhcnJheSwgaSwgcmFuZG9tLm5leHRJbnQobGVuKSk7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdWItYXJyYXkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCBlbGVtZW50cyBjb3BpZWQgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSAiZnJvbSIgaW5kZXggaXMgaW5jbHVzaXZlOyB0aGUgInRvIiBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN1YkFycmF5KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzdWJBcnJheShFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsZW4gPSB0b0luZGV4IC0gZnJvbUluZGV4OwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGxlbik7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBmcm9tSW5kZXgsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggZWxlbWVudHMgY29waWVkIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgImZyb20iIGluZGV4IGlzIGluY2x1c2l2ZTsgdGhlICJ0byIgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zdWJBcnJheShpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc3ViQXJyYXkoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsZW4gPSB0b0luZGV4IC0gZnJvbUluZGV4OwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9JTlRfQVJSQVk7Ci0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBmcm9tSW5kZXgsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIGVsZW1lbnRzIGNvcGllZCBmcm9tCi0JICogdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlICJmcm9tIiBpbmRleCBpcyBpbmNsdXNpdmU7IHRoZSAidG8iIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBBcnJheXMuc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN1YkFycmF5KGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzd2FwICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zd2FwKE9iamVjdFtdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzd2FwKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCXJldHVybiAoaSA9PSBqKSA/IGFycmF5IDogc3dhcF8oYXJyYXksIGksIGopOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaW5kaWNlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBzd2FwXyhFW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlFIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHN3YXAoY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gc3dhcF8oY2hhcltdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJY2hhciB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5zd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc3dhcChpbnRbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCXJldHVybiAoaSA9PSBqKSA/IGFycmF5IDogc3dhcF8oYXJyYXksIGksIGopOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaW5kaWNlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gc3dhcF8oaW50W10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlpbnQgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXJyYXlzIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYm9vbGVhbltdLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYm9vbGVhbltdLCBpbnQsIGludCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW5bXSBmaWxsKGJvb2xlYW5bXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJ5dGVbXSwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgYnl0ZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGJ5dGVbXSwgaW50LCBpbnQsIGJ5dGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gZmlsbChieXRlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChjaGFyW10sIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZmlsbChjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChjaGFyW10sIGludCwgaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZpbGwoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZG91YmxlW10sIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIGZpbGwoZG91YmxlW10gYXJyYXksIGRvdWJsZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGRvdWJsZVtdLCBpbnQsIGludCwgZG91YmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gZmlsbChkb3VibGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGRvdWJsZSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZmxvYXRbXSwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChmbG9hdFtdLCBpbnQsIGludCwgZmxvYXQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIGZpbGwoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGZsb2F0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChpbnRbXSwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gZmlsbChpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoaW50W10sIGludCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgaW50IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChPYmplY3RbXSwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBmaWxsKEVbXSBhcnJheSwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKE9iamVjdFtdLCBpbnQsIGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBmaWxsKEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIEUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGxvbmdbXSwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgbG9uZyB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGxvbmdbXSwgaW50LCBpbnQsIGxvbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gZmlsbChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChzaG9ydFtdLCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBzaG9ydCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKHNob3J0W10sIGludCwgaW50LCBzaG9ydCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gZmlsbChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgc2hvcnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGJ5dGVbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gc29ydChieXRlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGNoYXJbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXIuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc29ydChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGRvdWJsZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gc29ydChkb3VibGUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGRvdWJsZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGRvdWJsZVtdIHNvcnQoZG91YmxlW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGZsb2F0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGZsb2F0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmxvYXRbXSBzb3J0KGZsb2F0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGludFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGludFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHNvcnQoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEUuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBDb21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KE9iamVjdFtdLCBpbnQsIGludCwgQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gc29ydChFW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChsb25nW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gc29ydChsb25nLi4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChsb25nW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIHNvcnQobG9uZ1tdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChzaG9ydFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0Li4uIGFycmF5KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogQHNlZSBBcnJheXMjc29ydChzaG9ydFtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHNob3J0W10gc29ydChzaG9ydFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlBcnJheXMuc29ydChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4KTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQXJyYXlUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMjZiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGRlZmluaXRpb24gb2YgYW4gb2JqZWN0IHBhaXJpbmcuCi0gKiBUaGUga2V5IGlzIGltbXV0YWJsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbjxLLCBWPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3Mga2V5LgotCSAqLwotCUsgZ2V0S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICovCi0JViBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBhc3NvY2lhdGlvbidzIHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JViBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBhc3NvY2lhdGlvbnMnIGtleXMgYW5kIHZhbHVlcwotCSAqIGFyZSBlcXVhbC4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGNvZGUgYmFzZWQgb24gdGhlIGFzc29jaWF0aW9uJ3MKLQkgKiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0FzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmIyZTcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0FzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY29tbWFuZCBleGVjdXRvciB3aWxsIGRpc3BhdGNoIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUKLSAqIHRocmVhZCwgYWxsb3dpbmcgY2FsbHMgdG8ge0BsaW5rIENvbW1hbmRFeGVjdXRvciNleGVjdXRlKENvbW1hbmQpfSB0byByZXR1cm4KLSAqIGltbWVkaWF0ZWx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmRzIHNob3VsZCBoYW5kbGUgYW55Ci0gKiBleGNlcHRpb24gYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkpIHNvCi0gKiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkIGNhbiBjb250aW51ZSBleGVjdXRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yCi17Ci0JLyoqCi0JICogVGhpcyBjb21tYW5kIHF1ZXVlIGlzIHNoYXJlZCB3aXRoIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi9jb25zdW1lciB0aHJlYWQuCi0JICogQWRkaW5nIGEgY29tbWFuZCB0byBpdCB3aWxsIHRyaWdnZXIgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlCi0JICogY29tbWFuZCBleGVjdXRpb24gdGhyZWFkIG9yLCBpZiBhbm90aGVyIGNvbW1hbmQgaXMgY3VycmVudGx5IGV4ZWN1dGluZywKLQkgKiB0byBleGVjdXRlIHRoZSBuZXcgY29tbWFuZCBvbmNlIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgaGFzCi0JICogZmluaXNoZWQgZXhlY3V0aW5nLgotCSAqLwotCWZpbmFsIFN5bmNocm9uaXplZFF1ZXVlPENvbW1hbmQ+IGNvbW1hbmRzID0gbmV3IFN5bmNocm9uaXplZFF1ZXVlPENvbW1hbmQ+KCk7Ci0KLQkvKioKLQkgKiBNb3N0IG9mIHRoZSB0aHJlYWQtcmVsYXRlZCBiZWhhdmlvciBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBjb29yZGluYXRvci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgY29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcigpIHsKLQkJdGhpcyhTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkpIHsKLQkJdGhpcyh0aHJlYWRGYWN0b3J5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXRoaXMoU2ltcGxlVGhyZWFkRmFjdG9yeS5pbnN0YW5jZSgpLCB0aHJlYWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogQXNzaWduIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgPSB0aGlzLmJ1aWxkQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcih0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgYnVpbGRDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKHRoaXMuYnVpbGRDb25zdW1lcigpLCB0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcigpIHsKLQkJcmV0dXJuIG5ldyBDb25zdW1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29tbWFuZCBleGVjdXRpb24vY29uc3VtZXIgdGhyZWFkLgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSBjb21tYW5kIHF1ZXVlIGhlcmU7IHNvIGlmIGEgY29tbWFuZCBoYXMgYmVlbgotCSAqIGFkZGVkIHRvIHRoZSBxdWV1ZSA8ZW0+YmVmb3JlPC9lbT4gZ2V0dGluZyBoZXJlLCB0aGUgZmlyc3QgY29tbWFuZCB3aWxsCi0JICogYmUgZXhlY3V0ZWQgcHJvbXB0bHkgKGFsYmVpdCwgYXN5bmNocm9ub3VzbHkpLgotCSAqIFRoZSBjb21tYW5kIHF1ZXVlIHdpbGwgYmUgbm9uLWVtcHR5IGlmOjx1bD4KLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGV4ZWN1dG9yIHdhcwotCSAqICAgICBjb25zdHJ1Y3RlZCBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZDsgb3IKLQkgKiA8bGk+e0BsaW5rICNleGVjdXRlKENvbW1hbmQpfSB3YXMgY2FsbGVkIGFmdGVyIHtAbGluayAjc3RvcCgpfSB3YXMgY2FsbGVkCi0JICogICAgIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkICh0byByZXN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3ZXJlIHN0aWxsIG91dHN0YW5kaW5nIGNvbW1hbmRzCi0JICogICAgIHJlbWFpbmluZyBpbiB0aGUgY29tbWFuZCBxdWV1ZQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgb24gdGhlIGNvbW1hbmQgcXVldWUsIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZQotCSAqIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmNvbW1hbmRzLmVucXVldWUoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJydXB0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQuIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsCi0JICogdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIGV4ZWN1dGlvbiB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RvcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyfQotCSAqIHdpbGwgZXhlY3V0ZSB0aGUgY29tbWFuZHMgZW5xdWV1ZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIEl0IHdpbGwgd2FpdCB1bnRpbCB0aGUgc2hhcmVkIGNvbW1hbmQgcXVldWUgaXMgbm9uLWVtcHR5IHRvIGJlZ2luIGV4ZWN1dGluZyB0aGUKLQkgKiBjb21tYW5kcyBpbiB0aGUgcXVldWUuIE9uY2UgYSBjb21hbmQgaXMgZXhlY3V0ZWQsIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlIHVudGlsCi0JICogYW5vdGhlciBjb21tYW5kIGlzIHBsYWNlZCBpbiB0aGUgY29tbWFuZCBxdWV1ZS4gSWYgYSBuZXcgY29tbWFuZCBpcwotCSAqIGVucXVldWVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIGFub3RoZXIgY29tbWFuZCAoZWl0aGVyIHJlY3Vyc2l2ZWx5IGJ5Ci0JICogdGhlIGNvbW1hbmQgaXRzZWxmIG9yIGJ5IGFub3RoZXIgdGhyZWFkKSwKLQkgKiB0aGUgbmV3IGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudGx5Ci0JICogZXhlY3V0aW5nIGNvbW1hbmQgaXMgZmluaXNoZWQuCi0JICogU3RvcCB0aGUgdGhyZWFkIGJ5IGNhbGxpbmcge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQoKX0uCi0JICovCi0JY2xhc3MgQ29uc3VtZXIKLQkJaW1wbGVtZW50cyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyCi0JewotCQlDb25zdW1lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogV2FpdCB1bnRpbCBhIGNvbW1hbmQgaGFzIGJlZW4gcGxhY2VkIGluIHRoZSBxdWV1ZS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHdhaXRGb3JQcm9kdWNlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQlBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IudGhpcy5jb21tYW5kcy53YWl0VW50aWxOb3RFbXB0eSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IudGhpcy5jb21tYW5kcy5kZXF1ZXVlKCkuZXhlY3V0ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JhZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWNmOTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLS8qKgotICogQSBjb2xsZWN0aW9uIHRoYXQgYWxsb3dzIGR1cGxpY2F0ZSBlbGVtZW50cy4KLSAqIDxwPgotICogVGhlIDxjb2RlPkJhZzwvY29kZT4gaW50ZXJmYWNlIHBsYWNlcyBhZGRpdGlvbmFsIHN0aXB1bGF0aW9ucywKLSAqIGJleW9uZCB0aG9zZSBpbmhlcml0ZWQgZnJvbSB0aGUge0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ufSBpbnRlcmZhY2UsCi0gKiBvbiB0aGUgY29udHJhY3RzIG9mIHRoZSB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBhbmQge0BsaW5rICNoYXNoQ29kZSgpfSBtZXRob2RzLgotICogCi0gKiBAc2VlIEhhc2hCYWcKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEJhZzxFPiBleHRlbmRzIGphdmEudXRpbC5Db2xsZWN0aW9uPEU+IHsKLQotCS8qKgotCSAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBiYWcgZm9yIGVxdWFsaXR5LiBSZXR1cm5zCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYWxzbyBhIGJhZywgdGhlIHR3byBiYWdzCi0JICogaGF2ZSB0aGUgc2FtZSBzaXplLCBhbmQgZXZlcnkgbWVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgYmFnIGlzCi0JICogY29udGFpbmVkIGluIHRoaXMgYmFnIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIChvciBlcXVpdmFsZW50bHksCi0JICogZXZlcnkgbWVtYmVyIG9mIHRoaXMgYmFnIGlzIGNvbnRhaW5lZCBpbiB0aGUgc3BlY2lmaWVkIGJhZyB3aXRoIHRoZSBzYW1lCi0JICogbnVtYmVyIG9mIG9jY3VycmVuY2VzKS4gVGhpcyBkZWZpbml0aW9uIGVuc3VyZXMgdGhhdCB0aGUKLQkgKiBlcXVhbHMgbWV0aG9kIHdvcmtzIHByb3Blcmx5IGFjcm9zcyBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mIHRoZQotCSAqIGJhZyBpbnRlcmZhY2UuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIGJhZy4gVGhlIGhhc2ggY29kZSBvZiBhIGJhZyBpcwotCSAqIGRlZmluZWQgdG8gYmUgdGhlIHN1bSBvZiB0aGUgaGFzaCBjb2RlcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZywKLQkgKiB3aGVyZSB0aGUgaGFzaGNvZGUgb2YgYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50IGlzIGRlZmluZWQgdG8gYmUgemVyby4KLQkgKiBUaGlzIGVuc3VyZXMgdGhhdCA8Y29kZT5iMS5lcXVhbHMoYjIpPC9jb2RlPiBpbXBsaWVzIHRoYXQKLQkgKiA8Y29kZT5iMS5oYXNoQ29kZSgpID09IGIyLmhhc2hDb2RlKCk8L2NvZGU+IGZvciBhbnkgdHdvIGJhZ3MKLQkgKiA8Y29kZT5iMTwvY29kZT4gYW5kIDxjb2RlPmIyPC9jb2RlPiwgYXMgcmVxdWlyZWQgYnkgdGhlIGdlbmVyYWwKLQkgKiBjb250cmFjdCBvZiB0aGUge0BsaW5rIE9iamVjdCNoYXNoQ29kZSgpfSBtZXRob2QuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIG9iamVjdCBvY2N1cnMgaW4gdGhlIGJhZy4KLQkgKi8KLQlpbnQgY291bnQoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHRpbWVzIHRvIHRoZSBiYWcuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGJhZyBjaGFuZ2VkLgotCSAqLwotCWJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGZyb20gdGhlIGJhZy4gUmV0dXJuIHdoZXRoZXIgdGhlIGJhZyBjaGFuZ2VkLgotCSAqLwotCWJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBlYWNoIGl0ZW0gaW4gdGhlIGJhZwotCSAqIG9uY2UgYW5kIG9ubHkgb25jZSwgaXJyZXNwZWN0aXZlIG9mIGhvdyBtYW55IHRpbWVzCi0JICogdGhlIGl0ZW0gd2FzIGFkZGVkIHRvIHRoZSBiYWcuCi0JICovCi0JamF2YS51dGlsLkl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB1bmlxdWUgaXRlbXMgaW4gdGhlIGJhZy4KLQkgKi8KLQlpbnQgdW5pcXVlQ291bnQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgYW4gZW50cnkgZm9yIGVhY2ggaXRlbSBpbiB0aGUgYmFnCi0JICogb25jZSBhbmQgb25seSBvbmNlLCBpcnJlc3BlY3RpdmUgb2YgaG93IG1hbnkgdGltZXMKLQkgKiB0aGUgaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGJhZy4gVGhlIGVudHJ5IHdpbGwgaW5kaWNhdGUgdGhlIGl0ZW0ncwotCSAqIGNvdW50LgotCSAqLwotCWphdmEudXRpbC5JdGVyYXRvcjxFbnRyeTxFPj4gZW50cmllcygpOwotCi0KLQkvKioKLQkgKiBBIGJhZyBlbnRyeSAoZWxlbWVudC1jb3VudCBwYWlyKS4KLQkgKiBUaGUge0BsaW5rIEJhZyNlbnRyaWVzKCl9IG1ldGhvZCByZXR1cm5zIGFuIGl0ZXJhdG9yIHdob3NlCi0JICogZWxlbWVudHMgYXJlIG9mIHRoaXMgY2xhc3MuIFRoZSA8ZW0+b25seTwvZW0+IHdheSB0byBvYnRhaW4gYSByZWZlcmVuY2UKLQkgKiB0byBhIGJhZyBlbnRyeSBpcyBmcm9tIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4gVGhlc2UKLQkgKiA8Y29kZT5CYWcuRW50cnk8L2NvZGU+IG9iamVjdHMgYXJlIHZhbGlkIDxlbT5vbmx5PC9lbT4gZm9yIHRoZSBkdXJhdGlvbgotCSAqIG9mIHRoZSBpdGVyYXRpb247IG1vcmUgZm9ybWFsbHksIHRoZSBiZWhhdmlvciBvZiBhIGJhZyBlbnRyeSBpcwotCSAqIHVuZGVmaW5lZCBpZiB0aGUgYmFja2luZyBiYWcgaGFzIGJlZW4gbW9kaWZpZWQgYWZ0ZXIgdGhlIGVudHJ5IHdhcwotCSAqIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciwgZXhjZXB0IHRocm91Z2ggdGhlIHtAbGluayAjc2V0Q291bnQoaW50KX0KLQkgKiBvcGVyYXRpb24gb24gdGhlIGJhZyBlbnRyeS4KLQkgKi8KLQlpbnRlcmZhY2UgRW50cnk8RT4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgZWxlbWVudC4KLQkJICovCi0JCUUgZ2V0RWxlbWVudCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gZW50cnkncyBjb3VudDsgaS5lLiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbnRyeSdzIGVsZW1lbnQKLQkJICogb2NjdXJzIGluIHRoZSBiYWcuCi0JCSAqIEBzZWUgQmFnI2NvdW50KE9iamVjdCkKLQkJICovCi0JCWludCBnZXRDb3VudCgpOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIGVudHJ5J3MgY291bnQ7IGkuZS4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZW50cnkncyBlbGVtZW50Ci0JCSAqIG9jY3VycyBpbiB0aGUgYmFnLiBUaGUgbmV3IGNvdW50IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIuCi0JCSAqIFJldHVybiB0aGUgcHJldmlvdXMgY291bnQgb2YgdGhlIGVudHJ5J3MgZWxlbWVudC4KLQkJICogTkI6IFVzZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IHRvIHNldCB0aGUKLQkJICogY291bnQgdG8gemVyby4KLQkJICovCi0JCWludCBzZXRDb3VudChpbnQgY291bnQpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3Q7Ci0JCSAqIGkuZS4gdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSA8Y29kZT5CYWcuRW50cnk8L2NvZGU+IGFuZCBpdHMKLQkJICogZWxlbWVudCBhbmQgY291bnQgYXJlIHRoZSBzYW1lIGFzIHRoZSBlbnRyeSdzLgotCQkgKi8KLQkJYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyBoYXNoIGNvZGUuCi0JCSAqLwotCQlpbnQgaGFzaENvZGUoKTsKLQotCX0KLQotCi0JZmluYWwgY2xhc3MgRW1wdHk8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4gaW1wbGVtZW50cyBCYWc8RT4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmFnIElOU1RBTkNFID0gbmV3IEVtcHR5KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxUPiBCYWc8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmIChvID09IHRoaXMpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEJhZzw/PikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gKChCYWc8Pz4pIG8pLnNpemUoKSA9PSAwOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODk0NzkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byBmaWx0ZXIgb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlGaWx0ZXI8VD4gZXh0ZW5kcyBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiAicmV2ZXJzZSIgZmlsdGVyLiBXaGF0IHRoYXQgbWVhbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCWJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgInJldmVyc2UtZmlsdGVyZWQiIC0gZXZlcnl0aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFMgbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgT3BhcXVlPFM+IGltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgT3BhcXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBldmVyeXRoaW5nIGlzIGZpbHRlcmVkIC0gbm90aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyBpcyAicmV2ZXJzZS1maWx0ZXJlZCIgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlGaWx0ZXIuT3BhcXVlIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlGaWx0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpRmlsdGVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlTdHJpbmdDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2YjI5YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzIGFuZCB2aWNlIHZlcnNhLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlTdHJpbmdDb252ZXJ0ZXI8VD4gZXh0ZW5kcyBTdHJpbmdDb252ZXJ0ZXI8VD4gewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbnRvIGFuIG9iamVjdC4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJjb252ZXJ0IHRvIG9iamVjdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICogVHlwaWNhbGx5LCBpZiB0aGUgc3RyaW5nIGlzIG51bGwsIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JVCBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgc3RyaW5nCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXJldHVybiAoUykgczsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIEJpZGlTdHJpbmdDb252ZXJ0ZXI8Uz4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaVN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBCb29sZWFuQ29udmVydGVyIGltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+IElOU1RBTkNFID0gbmV3IEJvb2xlYW5Db252ZXJ0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBCb29sZWFuQ29udmVydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvKiogUmV0dXJuICJ0cnVlIiBpZiB0aGUgQm9vbGVhbiBpcyB0cnVlLCBvdGhlcndpc2UgcmV0dXJuICJmYWxzZSIuICovCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEJvb2xlYW4gYikgewotCQkJcmV0dXJuIChiID09IG51bGwpID8gbnVsbCA6IGIudG9TdHJpbmcoKTsKLQkJfQotCQkvKiogUmV0dXJuIEJvb2xlYW4uVFJVRSBpZiB0aGUgc3RyaW5nIGlzICJ0cnVlIiAoY2FzZS1pbnNlbnNpdGl2ZSksIG90aGVyd2lzZSByZXR1cm4gQm9vbGVhbi5GQUxTRS4gKi8KLQkJcHVibGljIEJvb2xlYW4gY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogQm9vbGVhbi52YWx1ZU9mKHMpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIEludGVnZXJDb252ZXJ0ZXIgaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPEludGVnZXI+LCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgSW50ZWdlckNvbnZlcnRlcigpOwotCQlwdWJsaWMgc3RhdGljIEJpZGlTdHJpbmdDb252ZXJ0ZXI8SW50ZWdlcj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEludGVnZXJDb252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8qKiBJbnRlZ2VyJ3MgI3RvU3RyaW5nKCkgd29ya3Mgd2VsbC4gKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoSW50ZWdlciBpbnRlZ2VyKSB7Ci0JCQlyZXR1cm4gKGludGVnZXIgPT0gbnVsbCkgPyBudWxsIDogaW50ZWdlci50b1N0cmluZygpOwotCQl9Ci0JCS8qKiBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gYW4gSW50ZWdlciwgaWYgcG9zc2libGUuICovCi0JCXB1YmxpYyBJbnRlZ2VyIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IEludGVnZXIudmFsdWVPZihzKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDVkOWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIHRyYW5zZm9ybSBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaVRyYW5zZm9ybWVyPFQxLCBUMj4gZXh0ZW5kcyBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgInJldmVyc2UtdHJhbnNmb3JtZWQiIG9iamVjdC4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZXZlcnNlLXRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiBvKTsKLQotCi0JZmluYWwgY2xhc3MgTnVsbDxTMSwgUzI+IGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFMxLCBTMj4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gQmlkaVRyYW5zZm9ybWVyPFIxLCBSMj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXJldHVybiAoUzIpIG87Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0LCB1bmNoYW5nZWQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXJldHVybiAoUzEpIG87Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkJpZGlUcmFuc2Zvcm1lci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTMSwgUzI+IGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPFMxLCBTMj4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTMSByZXZlcnNlVHJhbnNmb3JtKFMyIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpdFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2JmN2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBc3NvcnRlZCBiaXQgdG9vbHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpdFRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbGFnSXNTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmbGFnSXNPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdJc1NldChpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gb25seUZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnSXNPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ1RvQ2hlY2spIHsKLQkJcmV0dXJuIG9ubHlGbGFnc0FyZU9mZihmbGFncywgZmxhZ1RvQ2hlY2spOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSA9PSBmbGFnc1RvQ2hlY2s7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrKSAmJiBhbGxGbGFnc0FyZU9mZihmbGFncywgfmZsYWdzVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgZmxhZ3NUb0NoZWNrKSAmJiBhbGxGbGFnc0FyZVNldChmbGFncywgfmZsYWdzVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50IGZsYWdzVG9DaGVjaykgewotCQlyZXR1cm4gKGZsYWdzICYgZmxhZ3NUb0NoZWNrKSAhPSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYW55IG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spICE9IGZsYWdzVG9DaGVjazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbGxGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgT05MWSB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWludCBjb21iaW5lZEZsYWdzID0gb3JGbGFncyhmbGFnc1RvQ2hlY2spOwotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGNvbWJpbmVkRmxhZ3MpICYmIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCB+Y29tYmluZWRGbGFncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWludCBjb21iaW5lZEZsYWdzID0gb3JGbGFncyhmbGFnc1RvQ2hlY2spOwotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGNvbWJpbmVkRmxhZ3MpICYmIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCB+Y29tYmluZWRGbGFncyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlU2V0KGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYW55RmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJZm9yIChpbnQgaSA9IGZsYWdzVG9DaGVjay5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFueUZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2tbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE9SIGFsbCB0aGUgc3BlY2lmaWVkICdmbGFncycgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG9yRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgfD0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBBTkQgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYW5kRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgJj0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBYT1IgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgeG9yRmxhZ3MoaW50Li4uIGZsYWdzKSB7Ci0JCWludCBsYXN0ID0gZmxhZ3MubGVuZ3RoIC0gMTsKLQkJaW50IHJlc3VsdCA9IGZsYWdzW2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHQgXj0gZmxhZ3NbaV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEJpdFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxMTQyNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGEgZmxhZyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5Ci0gKiB0aGUgcmVjaXBpZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJvb2xlYW5SZWZlcmVuY2UKLQlleHRlbmRzIFJlYWRPbmx5Qm9vbGVhblJlZmVyZW5jZQotewotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byB0aGUgTk9UIG9mIGl0cyBjdXJyZW50IHZhbHVlLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCWJvb2xlYW4gZmxpcCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHNldE5vdChib29sZWFuIHYpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gc2V0VHJ1ZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHNldEZhbHNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Cb29sZWFuVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNjMGYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEFzc29ydGVkICJDYXBpdGFsLUIgQm9vbGVhbiIgb3BlcmF0aW9ucy4KLSAqLwotIC8vIGNvbW1lbnRlZCBjb2RlIGlzIGp1c3QgcGxheWluZyBhcm91bmQgd2l0aCBidWlsZGluZyAqZXZlcnl0aGluZyogZnJvbSBOQU5ECi1wdWJsaWMgZmluYWwgY2xhc3MgQm9vbGVhblRvb2xzIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbi4KLQkgKiBCb29sZWFuI25vdCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5vdChCb29sZWFuIGIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggISBiLmJvb2xlYW5WYWx1ZSgpKTsKLS8vCQlyZXR1cm4gbmFuZChiLCBiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFORCBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jYW5kKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIGFuZChCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYjEuYm9vbGVhblZhbHVlKCkgJiYgYjIuYm9vbGVhblZhbHVlKCkpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kLCBuYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNvcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBvcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYjEuYm9vbGVhblZhbHVlKCkgfHwgYjIuYm9vbGVhblZhbHVlKCkpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlCb29sZWFuIHhvciA9IG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLS8vCQlCb29sZWFuIGFuZCA9IG5hbmQobmFuZCwgbmFuZCk7Ci0vLwkJQm9vbGVhbiBuYW5kMiA9IG5hbmQoeG9yLCBhbmQpOwotLy8JCXJldHVybiBuYW5kKG5hbmQoeG9yLCBuYW5kMiksIG5hbmQoYW5kLCBuYW5kMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgWE9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiN4b3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4geG9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIGFuZChvcihiMSwgYjIpLCBuYW5kKGIxLCBiMikpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTkFORCBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jbmFuZChCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiBuYW5kKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdChhbmQoYjEsIGIyKSk7Ci0vLwkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZiggISAoYjEuYm9vbGVhblZhbHVlKCkgJiYgYjIuYm9vbGVhblZhbHVlKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE5PUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jbm9yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5vcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBub3Qob3IoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCUJvb2xlYW4gYW5kID0gbmFuZChuYW5kLCBuYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQyID0gbmFuZCh4b3IsIGFuZCk7Ci0vLwkJQm9vbGVhbiBuYW5kMyA9IG5hbmQobmFuZCh4b3IsIG5hbmQyKSwgbmFuZChhbmQsIG5hbmQyKSk7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZDMsIG5hbmQzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhOT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI3hub3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4geG5vcihCb29sZWFuIGIxLCBCb29sZWFuIGIyKSB7Ci0JCXJldHVybiBub3QoeG9yKGIxLCBiMikpOwotLy8JCUJvb2xlYW4gbmFuZCA9IG5hbmQoYjEsIGIyKTsKLS8vCQlCb29sZWFuIHhvciA9IG5hbmQobmFuZChiMSwgbmFuZCksIG5hbmQoYjIsIG5hbmQpKTsKLS8vCQlyZXR1cm4gbmFuZCh4b3IsIHhvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBCb29sZWFuVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NOYW1lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFmNGJlMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byBKYXZhIGNsYXNzIG5hbWVzIGFzIHJldHVybmVkIGJ5Ci0gKiB7QGxpbmsgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKX0uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc05hbWUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfQ0xBU1MuZ2V0TmFtZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZPSURfV1JBUFBFUl9DTEFTU19OQU1FID0gUmVmbGVjdGlvblRvb2xzLlZPSURfV1JBUFBFUl9DTEFTUy5nZXROYW1lKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuY2hhckF0KDApID09ICdbJzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgc2ltcGx5IHJldHVybiB0aGVtc2VsdmVzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBkZXB0aCA9IGdldEFycmF5RGVwdGgoY2xhc3NOYW1lKTsKLQkJaWYgKGRlcHRoID09IDApIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiamF2YS5sYW5nLk9iamVjdCIgb3IgImludCIKLQkJCXJldHVybiBjbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCBkZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogYXJyYXkgZGVwdGggaXMgbm90IHplcm8KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGFycmF5RGVwdGgpID09IFJFRkVSRU5DRV9DTEFTU19DT0RFKSB7Ci0JCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGFycmF5RGVwdGggKyAxLCBsYXN0KTsJLy8gZHJvcCB0aGUgdHJhaWxpbmcgJzsnCi0JCX0KLQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tJIgotCQlyZXR1cm4gZm9yQ29kZShjbGFzc05hbWUuY2hhckF0KGxhc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGNsYXNzTmFtZS5jaGFyQXQoZGVwdGgpID09ICdbJykgewotCQkJZGVwdGgrKzsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MncyBjb21wb25lbnQgdHlwZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXN3aXRjaCAoZ2V0QXJyYXlEZXB0aChjbGFzc05hbWUpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIDE6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZV8oY2xhc3NOYW1lLCAxKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHNpbXBsZSBuYW1lLgotCSAqIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbm9ueW1vdXMuCi0JICogPHA+Ci0JICogVGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgaXMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZQotCSAqIGNvbXBvbmVudCB0eXBlIHdpdGggPGNvZGU+IltdIjwvY29kZT4gYXBwZW5kZWQuIEluIHBhcnRpY3VsYXIsCi0JICogdGhlIHNpbXBsZSBuYW1lIG9mIGFuIGFycmF5IHR5cGUgd2hvc2UgY29tcG9uZW50IHR5cGUgaXMKLQkgKiBhbm9ueW1vdXMgaXMgc2ltcGx5IDxjb2RlPiJbXSI8L2NvZGU+LgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNBcnJheShjbGFzc05hbWUpID8KLQkJCQlnZXRTaW1wbGVOYW1lKGdldENvbXBvbmVudFR5cGVOYW1lKGNsYXNzTmFtZSkpICsgIltdIiA6IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRTaW1wbGVOYW1lXyhjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHNwZWNpZmllZCBjbGFzcyBpcyBub3QgYW4gYXJyYXkgdHlwZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaW1wbGVOYW1lXyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsgIC8vICJ0b3AtbGV2ZWwiIGNsYXNzIC0gc3RyaXAgcGFja2FnZSBuYW1lCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQl9Ci0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhpKTsgIC8vICJtZW1iZXIiIG9yICJsb2NhbCIgY2xhc3MKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIHBhY2thZ2UgbmFtZSAoZS5nLgotCSAqIDxjb2RlPiJqYXZhLmxhbmcuT2JqZWN0IjwvY29kZT4gcmV0dXJucwotCSAqIDxjb2RlPiJqYXZhLmxhbmciPC9jb2RlPikuCi0JICogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzOjx1bD4KLQkgKiA8bGk+aW4gdGhlICJkZWZhdWx0IiBwYWNrYWdlCi0JICogPGxpPmFuIGFycmF5IGNsYXNzCi0JICogPGxpPmEgcHJpbXRpdmUgY2xhc3MKLQkgKiA8L3VsPgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldFBhY2thZ2UoKQotCSAqIEBzZWUgamF2YS5sYW5nLlBhY2thZ2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlyZXR1cm4gKGxhc3RQZXJpb2QgPT0gLTEpID8gIiIgOiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAibWVtYmVyIiwgImxvY2FsIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIEpESyBuYW1pbmcgY29udmVudGlvbnMgKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBkb2VzIE5PVCBjb250YWluIGEgPGNvZGU+JyQnPC9jb2RlPikuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gYmUgZWl0aGVyIHRoZSAicHJpbWFyeSIgKHB1YmxpYykgY2xhc3MgZGVmaW5lZAotCSAqIGluIGEgZmlsZS9jb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgaXRzCi0JICogZmlsZSdzIHNpbXBsZSBiYXNlIG5hbWUpIG9yIGEgIm5vbi1wcmltYXJ5IiAocGFja2FnZSB2aXNpYmxlKSBjbGFzcwotCSAqIChpLmUuIHRoZSBvdGhlciB0b3AtbGV2ZWwgY2xhc3NlcyBkZWZpbmVkIGluIGEgZmlsZSkuCi0JICogQSAidG9wLWxldmVsIiBjbGFzcyBjYW4gY29udGFpbiBhbnkgb2YgdGhlIG90aGVyIHR5cGVzIG9mIGNsYXNzZXMuIAotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RvcExldmVsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKSA9PSAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgIm1lbWJlciIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgSkRLIG5hbWluZyBjb252ZW50aW9uIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZW5kcyB3aXRoIGEgPGNvZGU+JyQnPC9jb2RlPiBmb2xsb3dlZCBieSBhIGxlZ2FsIGNsYXNzIG5hbWU7IGUuZy4KLQkgKiA8Y29kZT4iVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyRNZW1iZXJDbGFzcyI8L2NvZGU+KS4KLQkgKiBBICJtZW1iZXIiIGNsYXNzIGNhbiBiZSBlaXRoZXIgIm5lc3RlZCIgKHN0YXRpYykgb3IgImlubmVyIjsKLQkgKiBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRldGVybWluZSB3aGljaCBmcm9tIHRoZSBjbGFzcydzIG5hbWUuCi0JICogQSAibWVtYmVyIiBjbGFzcyBjYW4gY29udGFpbiAibG9jYWwiLCAiYW5vbnltb3VzIiwgb3Igb3RoZXIKLQkgKiAibWVtYmVyIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCS8vIHRoZSBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhbiBBU0NJSSBkaWdpdAotCQlyZXR1cm4gISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibG9jYWwiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzIG5hbWUKLQkgKiBlbmRzIHdpdGggPGNvZGU+IiRubm5YWFgiPC9jb2RlPiwKLQkgKiB3aGVyZSB0aGUgPGNvZGU+JyQnPC9jb2RlPiBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOyBlLmcuIDxjb2RlPiJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIjwvY29kZT4pLgotCSAqIEEgImxvY2FsIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImFub255bW91cyIsIG9yIG90aGVyCi0JICogImxvY2FsIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdCgrK2luZGV4KSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vICJtZW1iZXIiIGNsYXNzCi0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUgJyQnIGFyZSBBU0NJSSBkaWdpdHMgKCJhbm9ueW1vdXMiIGNsYXNzKQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJtZW1iZXIiLCBvciAibG9jYWwiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggPGNvZGU+IiRubm4iPC9jb2RlPiB3aGVyZSBhbGwgdGhlIGNoYXJhY3RlcnMgcGFzdCB0aGUKLQkgKiBsYXN0IDxjb2RlPickJzwvY29kZT4gYXJlIEFTQ0lJIG51bWVyaWMgZGlnaXRzOwotCSAqIGUuZy4gPGNvZGU+IlRvcExldmVsQ2xhc3MkMSI8L2NvZGU+KS4KLQkgKiBBbiAiYW5vbnltb3VzIiBjbGFzcyBjYW4gY29udGFpbiAibWVtYmVyIiwgImxvY2FsIiwgb3Igb3RoZXIKLQkgKiAiYW5vbnltb3VzIiBjbGFzc2VzOyBhbmQgdmljZS12ZXJzYS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyAidG9wLWxldmVsIiBjbGFzcwotCQl9Ci0JCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoKytpbmRleCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyAibWVtYmVyIiBjbGFzcwotCQl9Ci0JCWludCBsZW4gPSBjbGFzc05hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSArK2luZGV4OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICggISBjaGFySXNBc2NpaURpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOyAgLy8gImxvY2FsIiBjbGFzcwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAnJCcgYXJlIEFTQ0lJIGRpZ2l0cyAoImFub255bW91cyIgY2xhc3MpCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNEaWdpdChjaGFyKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc29tZSBub24tQVNDSUkKLQkgKiBkaWdpdHMuIFRoaXMgbWV0aG9kIGRvZXMgbm90LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hhcklzQXNjaWlEaWdpdChjaGFyIGMpIHsKLQkJcmV0dXJuICgnMCcgPD0gYykgJiYgKGMgPD0gJzknKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyIDxjb2RlPnZvaWQ8L2NvZGU+IG5vciBvbmUgb2YgdGhlIHByaW1pdGl2ZSB2YXJpYWJsZSBjbGFzc2VzLAotCSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlZmVyZW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiAhIGlzUHJpbWl0aXZlKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPnZvaWQ8L2NvZGU+IG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gUmVmbGVjdGlvblRvb2xzLk1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPiBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZQotCSAqIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAotCSAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IFJlZmxlY3Rpb25Ub29scy5NQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKGNsYXNzTmFtZS5lcXVhbHMocHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmJvb2xlYW48L2NvZGU+LCA8Y29kZT5pbnQ8L2NvZGU+LCA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT52b2lkPC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmUoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCi0JICogPGNvZGU+amF2YS5sYW5nLkludGVnZXI8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LCBldGMuLAotCSAqIGJ1dCBub3QgPGNvZGU+amF2YS5sYW5nLlZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gaXNQcmltaXRpdmVXcmFwcGVyKGNsYXNzTmFtZSkKLQkJCSYmICggISBjbGFzc05hbWUuZXF1YWxzKFZPSURfV1JBUFBFUl9DTEFTU19OQU1FKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgd3JhcHBlciBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmltaXRpdmUgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhIHByaW1pdGl2ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXcmFwcGVyQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVDbGFzc05hbWUpIHsKLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKHByaW1pdGl2ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmltaXRpdmUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCi0JICogcHJpbWl0aXZlIHdyYXBwZXIgY2xhc3MuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIHdyYXBwZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKFN0cmluZyBwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSB7Ci0JCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR3byBjbGFzcyBuYW1lcyBhcmUgZXF1aXZhbGVudCwgZ2l2ZW4gYXV0b2JveGluZy4KLQkgKiAoZS5nLiAiamF2YS5sYW5nLkludGVnZXIiIGFuZCAiaW50IiBzaG91bGQgYmUgZXF1aXZhbGVudCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXJlQXV0b2JveEVxdWl2YWxlbnRzKFN0cmluZyBjbGFzc05hbWUxLCBTdHJpbmcgY2xhc3NOYW1lMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoY2xhc3NOYW1lMSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFByaW1pdGl2ZUNsYXNzTmFtZShjbGFzc05hbWUxKSwgY2xhc3NOYW1lMikKLQkJCXx8IFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldFdyYXBwZXJDbGFzc05hbWUoY2xhc3NOYW1lMSksIGNsYXNzTmFtZTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltaXRpdmUgY29kZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yQ29kZShpbnQgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBmb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JDb2RlKGNsYXNzQ29kZSk7Ci0JCXJldHVybiAocHJpbWl0aXZlQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogcHJpbWl0aXZlQ2xhc3MuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzc05hbWUoU3RyaW5nIHByaW1pdGl2ZUNsYXNzTmFtZSkgewotCQlpZiAoKCAhIGlzQXJyYXkocHJpbWl0aXZlQ2xhc3NOYW1lKSkgJiYgKHByaW1pdGl2ZUNsYXNzTmFtZS5sZW5ndGgoKSA8PSBSZWZsZWN0aW9uVG9vbHMuTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCWZvciAoUmVmbGVjdGlvblRvb2xzLlByaW1pdGl2ZSBwcmltaXRpdmUgOiBSZWZsZWN0aW9uVG9vbHMuUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWl0aXZlQ2xhc3NOYW1lKSkgewotCQkJCQlyZXR1cm4gcHJpbWl0aXZlLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXN0YXRpYyB2b2lkIGFwcGVuZChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCXNiLmFwcGVuZChjbGFzc05hbWUpOwotCQlzYi5hcHBlbmQoUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwcHJlc3NlZCBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NOYW1lKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NsYXNzcGF0aC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjAzYmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogPGNvZGU+Q2xhc3NwYXRoPC9jb2RlPiBtb2RlbHMgYSBKYXZhIGNsYXNzcGF0aCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsaXN0IG9mCi0gKiB7QGxpbmsgRW50cnl9cywgZWFjaCBvZiB3aGljaCBjb250YWluIEphdmEgY2xhc3Nlcy4gVGhlIGNsYXNzcGF0aCBjYW4gcmV0dXJuCi0gKiB0aGUgbmFtZXMgb2YgY2xhc3NlcyBmb3VuZCBpbiBpdCBldGMuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBzdGF0aWMKLSAqIGNvbnZlbmllbmNlIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlIHRvIGNvbnN0cnVjdCA8Y29kZT5DbGFzc3BhdGg8L2NvZGU+cwotICogY29ycmVzcG9uZGluZyB0byB0aGUgSmF2YSBjbGFzc3BhdGggZXRjLgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoCi0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCAqLwotCXByaXZhdGUgZmluYWwgRW50cnlbXSBlbnRyaWVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2RzIGZvciAic3RhbmRhcmQiIGNsYXNzcGF0aHMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAiYm9vdCIgY2xhc3NwYXRoLiBUaGlzIGluY2x1ZGVzIDxjb2RlPnJ0LmphcjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggYm9vdENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJzdW4uYm9vdC5jbGFzcy5wYXRoIikpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHVybiBhICJ2aXJ0dWFsIGNsYXNzcGF0aCIgdGhhdCBjb250YWlucyBhbGwgdGhlIGphcnMKLQkgKiB0aGF0IHdvdWxkIGJlIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkgewotCQlGaWxlW10gZGlycyA9IGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpOwotCQlMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoRmlsZSBkaXIgOiBkaXJzKSB7Ci0JCQlpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRKYXJGaWxlTmFtZXNUbyhkaXIsIGphckZpbGVOYW1lcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoamFyRmlsZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB1bnJldG91Y2hlZCAiY29tcGxldGUiIGNsYXNzcGF0aC4KLQkgKiBUaGlzIGluY2x1ZGVzIHRoZSBib290IGNsYXNzcGF0aCwgdGhlIEphdmEgRXh0ZW5zaW9uCi0JICogTWVjaGFuaXNtIGNsYXNzcGF0aCwgYW5kIHRoZSBub3JtYWwgInN5c3RlbSIgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNvbXBsZXRlQ2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChuZXcgQ2xhc3NwYXRoW10gewotCQkJCWJvb3RDbGFzc3BhdGgoKSwKLQkJCQlqYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCksCi0JCQkJamF2YUNsYXNzcGF0aCgpCi0JCX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNsYXNzcGF0aCB0aGF0IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGNsYXNzcGF0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgobG9jYXRpb25Gb3IoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBmaWxlID0+IGNsYXNzICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3MgbmFtZTsgdGhpcyB3aWxsIHdvcmsgZm9yCi0JICogYW55IGZpbGUgdGhhdCBoYXMgYSBzaW5nbGUgZXh0ZW5zaW9uIGJleW9uZCB0aGUgYmFzZQotCSAqIGNsYXNzIG5hbWU6PHVsPgotCSAqIDxsaT48Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0byA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmphdmEiPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NOYW1lKFN0cmluZyBjbGFzc0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oY2xhc3NGaWxlTmFtZSk7Ci0JCS8vIGRvIHRoaXMgZm9yIGFyY2hpdmUgZW50cnkgbmFtZXMKLQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoJy8nLCAnLicpOwotCQkvLyBkbyB0aGlzIGZvciBPL1Mtc3BlY2lmaWMgZmlsZSBuYW1lcwotCQlpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGZpbGUgdG8gYSBjbGFzcyBuYW1lOwotCSAqIGUuZy4gPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc05hbWUoRmlsZSBjbGFzc0ZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShjbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSBuYW1lIHRvIGEgY2xhc3M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY29udmVydFRvQ2xhc3MoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY29udmVydFRvQ2xhc3NOYW1lKGNsYXNzRmlsZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgcmVsYXRpdmUgZmlsZSB0byBhIGNsYXNzOwotCSAqIGUuZy4gPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhGaWxlIGNsYXNzRmlsZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3MoY2xhc3NGaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKiBjbGFzcyA9PiBKQVIgZW50cnkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGFuIGFyY2hpdmUgZW50cnkgbmFtZSBiYXNlOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhbiBhcmNoaXZlIGNsYXNzIGZpbGUgZW50cnkgbmFtZTsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKGNsYXNzTmFtZSkgKyAiLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBjbGFzcyBmaWxlIGVudHJ5IG5hbWU7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQotCS8vICoqKioqIGNsYXNzID0+IGZpbGUgKC5jbGFzcyBvciAuamF2YSkgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgZmlsZSBuYW1lIGJhc2UgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmciPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmciPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGZpbGUgbmFtZSBiYXNlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvRmlsZU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBVbml4IGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmcuY2xhc3MiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmNsYXNzKTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0NsYXNzRmlsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBjbGFzcyBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBVbml4bCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoY2xhc3NOYW1lKSArICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSBqYXZhIGZpbGUgbmFtZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuamF2YSI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5qYXZhIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBqYXZhIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29udmVydFRvSmF2YUZpbGVOYW1lKGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+RmlsZShqYXZhL2xhbmcvU3RyaW5nLmphdmEpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvSmF2YUZpbGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhRmlsZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqIGNsYXNzID0+IHJlc291cmNlICoqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYSByZXNvdXJjZSBuYW1lOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+Ii9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvUmVzb3VyY2VOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gJy8nICsgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlOwotCSAqIGUuZy4gPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+VVJMKGphcjpmaWxlOi9DOi9qZGsvMS40LjJfMDQvanJlL2xpYi9ydC5qYXIhL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBjb252ZXJ0VG9SZXNvdXJjZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5nZXRSZXNvdXJjZShjb252ZXJ0VG9SZXNvdXJjZU5hbWUoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKiB1dGlsaXRpZXMgKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhbiBhcmNoaXZlIGZpbGU7Ci0JICogaS5lLiBpdHMgbmFtZSBlbmRzIHdpdGggPGNvZGU+Ii56aXAiPC9jb2RlPiBvciA8Y29kZT4iLmphciI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzQXJjaGl2ZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGV4dCA9IEZpbGVUb29scy5leHRlbnNpb24oZmlsZU5hbWUpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBleHQuZXF1YWxzKCIuamFyIikgfHwgZXh0LmVxdWFscygiLnppcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGFuIGFyY2hpdmUgZmlsZTsKLQkgKiBpLmUuIGl0cyBuYW1lIGVuZHMgd2l0aCA8Y29kZT4iLnppcCI8L2NvZGU+IG9yIDxjb2RlPiIuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVJc0FyY2hpdmUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlTmFtZUlzQXJjaGl2ZShmaWxlLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGF0IHNob3VsZCBiZSB0aGUgZnVsbHktcXVhbGlmaWVkIGZpbGUgbmFtZQotCSAqIGZvciB0aGUgSlJFIHJ1bnRpbWUgSkFSOwotCSAqIGUuZy4gPGNvZGU+IkM6XGpkazEuNC4yXzA0XGpyZVxsaWJccnQuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcnRKYXJOYW1lKCkgewotCQlyZXR1cm4gbG9jYXRpb25Gb3IoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gZnJvbSB3aGVyZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHdhcyBsb2FkZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25Gb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVVSTCB1cmwgPSBjb252ZXJ0VG9SZXNvdXJjZShqYXZhQ2xhc3MpOwotCQlTdHJpbmcgcGF0aDsKLQkJdHJ5IHsKLQkJCXBhdGggPSBGaWxlVG9vbHMuYnVpbGRGaWxlKHVybCkuZ2V0UGF0aCgpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKS50b0xvd2VyQ2FzZSgpOwotCQlpZiAocHJvdG9jb2wuZXF1YWxzKCJqYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBKQVIsIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGguaW5kZXhPZignIScpKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBkaXJlY3RvcnksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgZmlsZTovQzovZGV2L21haW4vbXdkZXYvY2xhc3Mvb3JnL2VjbGlwc2UvZGFsaS91dGlsaXR5L0NsYXNzcGF0aC5jbGFzcwotCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGphdmFDbGFzcykubGVuZ3RoKCkgLSAxKTsKLQkJfSBlbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoImJ1bmRsZXJlc291cmNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaWYgdGhlIGNsYXNzIGlzIGluIGEgYnVuZGxlIHJlc291cmNlIChFY2xpcHNlPyksIHRoZSBVUkwgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6Ci0JCQkvLyAgICAgYnVuZGxlcmVzb3VyY2U6Ly80My9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9Ci0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih1cmwudG9TdHJpbmcoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3JpZXMgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIGphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVzKGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRpcmVjdG9yeSBuYW1lcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBqYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuZXh0LmRpcnMiKS5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKiBpbnRlcm5hbCAqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGNvbnZlcnRUb0ZpbGVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IGZpbGVOYW1lcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShmaWxlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphckZpbGVOYW1lc1RvKEZpbGUgZGlyLCBMaXN0PFN0cmluZz4gamFyRmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBqYXJGaWxlcyA9IGphckZpbGVzSW4oZGlyKTsKLQkJZm9yIChGaWxlIGphckZpbGUgOiBqYXJGaWxlcykgewotCQkJamFyRmlsZU5hbWVzLmFkZChGaWxlVG9vbHMuY2Fub25pY2FsRmlsZShqYXJGaWxlKS5nZXRQYXRoKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGphckZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yeS5saXN0RmlsZXMoamFyRmlsZUZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlRmlsdGVyIGphckZpbGVGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlLmdldE5hbWUoKSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXByaXZhdGUgQ2xhc3NwYXRoKEVudHJ5W10gZW50cmllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKFN0cmluZy4uLiBmaWxlTmFtZXMpIHsKLQkJdGhpcyhidWlsZEVudHJpZXMoZmlsZU5hbWVzKSk7Ci0JfQotCi0JLyoqCi0JICogU2tpcCBlbXB0eSBmaWxlIG5hbWVzIGJlY2F1c2UgdGhleSB3aWxsIGVuZCB1cCBleHBhbmRpbmcgdG8gdGhlIGN1cnJlbnQKLQkgKiB3b3JraW5nIGRpcmVjdG9yeSwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudC4gRW1wdHkgZmlsZSBuYW1lcyBhY3R1YWxseQotCSAqIG9jY3VyIHdpdGggc29tZSBmcmVxdWVuY3k7IHN1Y2ggYXMgd2hlbiB0aGUgY2xhc3NwYXRoIGhhcyBiZWVuIGJ1aWx0IHVwCi0JICogZHluYW1pY2FsbHkgd2l0aCB0b28gbWFueSBzZXBhcmF0b3JzLiBGb3IgZXhhbXBsZTo8cHJlPgotCSAqICAgICAiQzpcZGV2XGZvby5qYXI7O0M6XGRldlxiYXIuamFyIgotCSAqIDwvcHJlPndpbGwgYmUgcGFyc2VkIGludG8gdGhyZWUgZmlsZSBuYW1lczo8cHJlPgotCSAqICAgICB7ICJDOlxkZXZcZm9vLmphciIsICIiLCAiQzpcZGV2XGJhci5qYXIiIH0KLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGJ1aWxkRW50cmllcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoU3RyaW5nIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7Ci0JCQlpZiAoKGZpbGVOYW1lICE9IG51bGwpICYmIChmaWxlTmFtZS5sZW5ndGgoKSAhPSAwKSkgewotCQkJCWVudHJpZXMuYWRkKG5ldyBFbnRyeShmaWxlTmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBwYXRoLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoU3RyaW5nIHBhdGgpIHsKLQkJdGhpcyhwYXRoLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNsYXNzcGF0aCB3aXRoIHRoZSBzcGVjaWZpZWQgZW50cmllcy4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKEl0ZXJhYmxlPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXRoaXMoQXJyYXlUb29scy5hcnJheShmaWxlTmFtZXMsIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWSkpOwotCX0KLQotCS8qKgotCSAqIENvbnNvbGlkYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocyBpbnRvIGEgc2luZ2xlIGNsYXNzcGF0aC4KLQkgKi8KLQlwdWJsaWMgQ2xhc3NwYXRoKENsYXNzcGF0aC4uLiBjbGFzc3BhdGhzKSB7Ci0JCXRoaXMoY29uc29saWRhdGVFbnRyaWVzKGNsYXNzcGF0aHMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFbnRyeVtdIGNvbnNvbGlkYXRlRW50cmllcyhDbGFzc3BhdGhbXSBjbGFzc3BhdGhzKSB7Ci0JCUxpc3Q8RW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PigpOwotCQlmb3IgKENsYXNzcGF0aCBjbGFzc3BhdGggOiBjbGFzc3BhdGhzKSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGVudHJpZXMsIGNsYXNzcGF0aC5nZXRFbnRyaWVzKCkpOwotCQl9Ci0JCXJldHVybiBlbnRyaWVzLnRvQXJyYXkobmV3IEVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxFbnRyeT4gZ2V0RW50cmllcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEVudHJ5Pih0aGlzLmVudHJpZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3NwYXRoJ3MgcGF0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7Ci0JCWludCBtYXggPSB0aGlzLmVudHJpZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMDApOwotCQkvLyBzdG9wIG9uZSBzaG9ydCBvZiB0aGUgZW5kIG9mIHRoZSBhcnJheQotCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5lbnRyaWVzW2ldLmdldEZpbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotCQl9Ci0JCXNiLmFwcGVuZCh0aGlzLmVudHJpZXNbbWF4XS5nZXRGaWxlTmFtZSgpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBzcGVjaWZpZWQgKHVucXVhbGlmaWVkKSBmaWxlCi0JICogYW5kIHJldHVybiBpdHMgZW50cnkuIFJldHVybiBudWxsIGlmIGFuIGVudHJ5IGlzIG5vdCBmb3VuZC4KLQkgKiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBmaW5kIHRoZSBlbnRyeQotCSAqIGZvciA8Y29kZT4icnQuamFyIjwvY29kZT4gb3IgPGNvZGU+InRvcGxpbmsuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yRmlsZU5hbWVkKFN0cmluZyBzaG9ydEZpbGVOYW1lKSB7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscyhzaG9ydEZpbGVOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGZpbGUgaW4gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBSZXR1cm4gbnVsbCBpZiBhbiBlbnRyeSBpcyBub3QgZm91bmQuCi0JICovCi0JcHVibGljIEVudHJ5IGdldEVudHJ5Rm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUgPSBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKGNsYXNzTmFtZSk7Ci0JCVN0cmluZyBhcmNoaXZlRW50cnlOYW1lID0gY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpOwotCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5lbnRyaWVzKSB7Ci0JCQlpZiAoZW50cnkuY29udGFpbnMocmVsYXRpdmVDbGFzc0ZpbGVOYW1lLCBhcmNoaXZlRW50cnlOYW1lKSkgewotCQkJCXJldHVybiBlbnRyeTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgsCi0JICogd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICogQHNlZSAjY2xhc3NOYW1lcygpCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICogQHNlZSAjY2xhc3NOYW1lcyhGaWx0ZXIpCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KDEwMDAwKTsKLQkJdGhpcy5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJcmV0dXJuIGNsYXNzTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJZm9yIChFbnRyeSBlbnRyeSA6IHRoaXMuZW50cmllcykgewotCQkJZW50cnkuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGguCi0JICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoKX0uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCSAqIHRoYXQgYXJlIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPih0aGlzLmVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGVudHJ5Q2xhc3NOYW1lc0l0ZXJhdG9ycyhmaW5hbCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudHJ5LCBJdGVyYXRvcjxTdHJpbmc+PihuZXcgQXJyYXlJdGVyYXRvcjxFbnRyeT4odGhpcy5lbnRyaWVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiB0cmFuc2Zvcm0oRW50cnkgZW50cnkpIHsKLQkJCQlyZXR1cm4gZW50cnkuY2xhc3NOYW1lcyhmaWx0ZXIpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhICJjb21wcmVzc2VkIiB2ZXJzaW9uIG9mIHRoZSBjbGFzc3BhdGggd2l0aCBpdHMKLQkgKiBkdXBsaWNhdGUgZW50cmllcyBlbGltaW5hdGVkLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGggY29tcHJlc3NlZCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyh0aGlzLmVudHJpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBjbGFzc3BhdGggdG8gYW4gYXJyYXkgb2YgVVJMcwotCSAqICh0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEge0BsaW5rIGphdmEubmV0LlVSTENsYXNzTG9hZGVyfSkuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFVSTD4gZ2V0VVJMcygpIHsKLQkJaW50IGxlbiA9IHRoaXMuZW50cmllcy5sZW5ndGg7Ci0JCVVSTFtdIHVybHMgPSBuZXcgVVJMW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXVybHNbaV0gPSB0aGlzLmVudHJpZXNbaV0uZ2V0VVJMKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFVSTD4odXJscyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiA8Y29kZT5FbnRyeTwvY29kZT4gbW9kZWxzIGEgSmF2YSBjbGFzc3BhdGggZW50cnksIHdoaWNoIGNhbiBiZSBlaXRoZXIgYQotCSAqIGRpcmVjdG9yeSBjb250YWluaW5nIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgb3IgYSBKQVIgZmlsZSAob3IsCi0JICogc2ltaWxhcmx5LCBhIDxjb2RlPi56aXA8L2NvZGU+IGZpbGUpLiBUaGUgZW50cnkgY2FuIHJldHVybiB0aGUgbmFtZXMgb2YKLQkgKiBjbGFzc2VzIGZvdW5kIGluIGl0IGV0Yy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVudHJ5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBmaWxlOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgY2Fub25pY2FsRmlsZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlFbnRyeShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGZpbGVOYW1lID09IG51bGwpIHx8IChmaWxlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidmaWxlTmFtZScgbXVzdCBiZSBub24tZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5maWxlTmFtZSA9IGZpbGVOYW1lOwotCQkJdGhpcy5maWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQkJdGhpcy5jYW5vbmljYWxGaWxlID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUodGhpcy5maWxlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKLQkJfQotCi0JCXB1YmxpYyBGaWxlIGdldEZpbGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWxlOwotCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0Q2Fub25pY2FsRmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENhbm9uaWNhbEZpbGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEVudHJ5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEVudHJ5KSBvKS5jYW5vbmljYWxGaWxlLmVxdWFscyh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzICJjYW5vbmljYWwiIFVSTC4KLQkJICovCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLnRvVVJJKCkudG9VUkwoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250YWlucyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSwgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShjbGFzc05hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkgY29udGFpbnMgZWl0aGVyIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUKLQkJICogY2xhc3MgZmlsZSBvciB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgZW50cnkuCi0JCSAqIE5vdCB0aGUgcHJldHRpZXN0IHNpZ25hdHVyZSwgYnV0IGl0J3MgaW50ZXJuYWwuLi4uCi0JCSAqLwotCQlib29sZWFuIGNvbnRhaW5zKFN0cmluZyByZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIFN0cmluZyBhcmNoaXZlRW50cnlOYW1lKSB7Ci0JCQlpZiAoICEgdGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpICYmIChuZXcgRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUsIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSkpLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gKGZpbGVJc0FyY2hpdmUodGhpcy5jYW5vbmljYWxGaWxlKSAmJiB0aGlzLmFyY2hpdmVDb250YWluc0VudHJ5KGFyY2hpdmVFbnRyeU5hbWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50cnkncyBhcmNoaXZlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZW50cnkuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gYXJjaGl2ZUNvbnRhaW5zRW50cnkoU3RyaW5nIHppcEVudHJ5TmFtZSkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCVppcEVudHJ5IHppcEVudHJ5ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQkJemlwRW50cnkgPSB6aXBGaWxlLmdldEVudHJ5KHppcEVudHJ5TmFtZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZywgbGVhdmUgdGhlIGVudHJ5IG51bGwKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkgewotCQkJCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJemlwRW50cnkgPSBudWxsOwkvLyBzb21ldGhpbmcgaXMgd3JvbmcsIGNsZWFyIG91dCB0aGUgZW50cnkKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gemlwRW50cnkgIT0gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeS4KLQkJICogQHNlZSAjY2xhc3NOYW1lcygpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICogQHNlZSAjY2xhc3NOYW1lcyhGaWx0ZXIpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMjAwMCk7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJcmV0dXJuIGNsYXNzTmFtZXM7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5Ci0JCSAqIGFuZCBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQl0aGlzLmFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0gZWxzZSBpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckFyY2hpdmVUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JEaXJlY3RvcnlUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJZm9yIChJdGVyYXRvcjxGaWxlPiBzdHJlYW0gPSB0aGlzLmNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZShzdHJlYW0ubmV4dCgpLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgY2xhc3MgZmlsZXMgZGlzY292ZXJlZAotCQkgKiB1bmRlciB0aGUgZW50cnkncyBkaXJlY3RvcnkuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPEZpbGU+IGNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KEZpbGVUb29scy5maWxlc0luVHJlZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRW50cnkudGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUobmV4dC5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRDbGFzc05hbWVzRm9yQXJjaGl2ZVRvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlmb3IgKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gc3RyZWFtID0gemlwRmlsZS5lbnRyaWVzKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTsgKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCQlTdHJpbmcgemlwRW50cnlOYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCWlmICh0aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZSh6aXBFbnRyeU5hbWUpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjb252ZXJ0VG9DbGFzc05hbWUoemlwRW50cnlOYW1lKTsKLQkJCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQkJY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRyeSB7Ci0JCQkJemlwRmlsZS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG1pZ2h0IGJlIGEgSmF2YSBjbGFzcyBmaWxlLgotCQkgKiBUaGUgZmlsZSBuYW1lIG11c3QgYXQgbGVhc3QgZW5kIHdpdGggPGNvZGU+Ii5jbGFzcyI8L2NvZGU+IGFuZCBjb250YWluIG5vIHNwYWNlcy4KLQkJICogKE5laXRoZXIgY2xhc3MgbmFtZXMgbm9yIHBhY2thZ2UgbmFtZXMgbWF5IGNvbnRhaW4gc3BhY2VzLikKLQkJICogV2hldGhlciBpdCBhY3R1YWxseSBpcyBhIGNsYXNzIGZpbGUgd2lsbCBuZWVkIHRvIGJlIGRldGVybWluZWQgYnkKLQkJICogYSBjbGFzcyBsb2FkZXIuCi0JCSAqLwotCQlib29sZWFuIGZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIEZpbGVUb29scy5leHRlbnNpb24obmFtZSkudG9Mb3dlckNhc2UoKS5lcXVhbHMoIi5jbGFzcyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJJiYgKG5hbWUuaW5kZXhPZignICcpID09IC0xKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGguCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKCl9LgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXMoRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkJICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqIEp1c3QgYSBiaXQgbW9yZSBwZXJmb3JtYW50IHRoYW4ge0BsaW5rICNnZXRDbGFzc05hbWVzKEZpbHRlcil9LgotCQkgKi8KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShmaWx0ZXIpOwotCQkJCX0KLQkJCQlpZiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpKSB7Ci0JCQkJCXJldHVybiB0aGlzLmNsYXNzTmFtZXNGb3JBcmNoaXZlKGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeSBhbmQgYWNjZXB0ZWQgYnkKLQkJICogdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPih0aGlzLmNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSwgZmlsdGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUcmFuc2Zvcm0gdGhlIGNsYXNzIGZpbGVzIHRvIGNsYXNzIG5hbWVzLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JEaXJlY3RvcnkoKSB7Ci0JCQlmaW5hbCBpbnQgc3RhcnQgPSB0aGlzLmNhbm9uaWNhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkubGVuZ3RoKCkgKyAxOwotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEZpbGUsIFN0cmluZz4odGhpcy5jbGFzc0ZpbGVzRm9yRGlyZWN0b3J5KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWxlIGYpIHsKLQkJCQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzTmFtZShmLmdldEFic29sdXRlUGF0aCgpLnN1YnN0cmluZyhzdGFydCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZAotCQkgKiBpbiB0aGUgZW50cnkncyBhcmNoaXZlIGZpbGUgYW5kIGFjY2VwdGVkIGJ5IHRoZQotCQkgKiBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKi8KLQkJcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGNsYXNzTmFtZXNGb3JBcmNoaXZlKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJLy8gd2UgY2FuJ3Qgc2ltcGx5IHdyYXAgaXRlcmF0b3JzIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGNsb3NlIHRoZSBhcmNoaXZlIGZpbGUuLi4KLQkJCVppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXppcEZpbGUgPSBuZXcgWmlwRmlsZSh0aGlzLmNhbm9uaWNhbEZpbGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHppcEZpbGUuc2l6ZSgpKTsKLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gY2xhc3NOYW1lcy5pdGVyYXRvcigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbGxlY3Rpb25Ub29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYThkMmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJJdGVyYXRvcldyYXBwZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbGxlY3Rpb259LXJlbGF0ZWQgdXRpbGl0eSBtZXRob2RzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvblRvb2xzIHsKLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGNvbGxlY3Rpb24sIGl0ZXJhdG9yKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgaXRlcmF0b3IgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsXyhDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbW9kaWZpZWQgfD0gY29sbGVjdGlvbi5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gY29sbGVjdGlvbi5hZGRBbGwobGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uYWRkQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gc3VwZXIgRT4gY29sbGVjdGlvbiwgRS4uLiBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogYWRkQWxsXyhjb2xsZWN0aW9uLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBhcnJheSBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGxfKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFLi4uIGFycmF5KSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJZm9yIChFIGVsZW1lbnQgOiBhcnJheSkgewotCQkJbW9kaWZpZWQgfD0gY29sbGVjdGlvbi5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGxpc3QsIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QuYWRkQWxsKGluZGV4LCBsaXN0KGl0ZXJhdG9yKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LmFkZEFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoTGlzdDw/IHN1cGVyIEU+IGxpc3QsIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IsIHNpemUpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBFLi4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBsaXN0LmFkZEFsbChpbmRleCwgQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgbmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoRW51bWVyYXRpb24gZW51bWVyYXRpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbiwgaW50IGVudW1lcmF0aW9uU2l6ZSkgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPihlbnVtZXJhdGlvblNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWJhZy5hZGQoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvciwgbmV3IEhhc2hCYWc8RT4oaXRlcmF0b3JTaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgSGFzaEJhZzxFPiBiYWcpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYmFnLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUhhc2hCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4obGVuKTsKLQkJZm9yIChFIGl0ZW0gOiBhcnJheSkgewotCQkJYmFnLmFkZChpdGVtKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICogVGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbiBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgZW51bWVyYXRpb25TaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIGVudW1lcmF0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24oaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBiYWcoYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkVudW1lcmF0aW9uLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb24sIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWlucyhPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdCB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWlmIChpdGVyYXRvci5uZXh0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIGludCBpdGVyYWJsZTFTaXplLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTFTaXplLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkuY29udGFpbnNBbGwoY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yKSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yMSksIGl0ZXJhdG9yMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciAxIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBpbnQgaXRlcmF0b3IxU2l6ZSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IxLCBpdGVyYXRvcjFTaXplKSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgbGlzdC4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5kaWZmRW5kKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5kaWZmRW5kKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJhbmdlIG9mIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIFtzaXplLCAtMV0uCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuZGlmZlJhbmdlKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqIEBzZWUgI2RpZmZTdGFydChMaXN0LCBMaXN0KQotCSAqIEBzZWUgI2RpZmZFbmQoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGRpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZSYW5nZShsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudC4gSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMgKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXgpLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgZGlmZmVyZW50IHNpemVzIGFuZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNob3J0ZXIgbGlzdCBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBsaXN0LCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIHNob3J0ZXIgbGlzdAotCSAqIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4IG9mIHRoZSBzaG9ydGVyIGxpc3QpLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmRpZmZTdGFydChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmU3RhcnQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5kaWZmU3RhcnQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGl0eSBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gLTEuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgbGlzdC4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZkVuZChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoTGlzdDw/PiBsaXN0MSwgTGlzdDw/PiBsaXN0MikgewotCQlyZXR1cm4gQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqIEBzZWUgI2lkZW50aXR5RGlmZlN0YXJ0KExpc3QsIExpc3QpCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmRW5kKExpc3QsIExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBpZGVudGl0eURpZmZSYW5nZShMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5pZGVudGl0eURpZmZTdGFydChMaXN0IGxpc3QxLCBMaXN0IGxpc3QyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIGRvIG5vdCByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc2FtZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIGVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvcnMgZG8gbm90IHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gISBlbGVtZW50c0FyZUVxdWFsKGl0ZXJhdG9yMSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcyByZXR1cm4gZXF1YWwgZWxlbWVudHMKLQkgKiBpbiB0aGUgc2FtZSBvcmRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5lbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiBlcXVhbCBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmVsZW1lbnRzQXJlRXF1YWwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUVxdWFsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoaXRlcmF0b3IxLm5leHQoKSwgaXRlcmF0b3IyLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmlkZW50aWNhbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBlbGVtZW50c0FyZUlkZW50aWNhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIHJldHVybiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5pZGVudGljYWwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUlkZW50aWNhbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQl3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSAmJiBpdGVyYXRvcjIuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoaXRlcmF0b3IxLm5leHQoKSAhPSBpdGVyYXRvcjIubmV4dCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiAhIChpdGVyYXRvcjEuaGFzTmV4dCgpIHx8IGl0ZXJhdG9yMi5oYXNOZXh0KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuZ2V0KGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldChpdGVyYWJsZS5pdGVyYXRvcigpLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuZ2V0KGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBnZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaW5kZXgpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaSsrID09IGluZGV4KSB7Ci0JCQkJcmV0dXJuIG5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YoaW5kZXgpICsgJzonICsgU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJaWYgKGl0ZXJhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBoYXNoID0gMTsKLQkJZm9yIChPYmplY3QgZWxlbWVudCA6IGl0ZXJhYmxlKSB7Ci0JCQloYXNoID0gMzEgKiBoYXNoICsgKGVsZW1lbnQgPT0gbnVsbCA/IDAgOiBlbGVtZW50Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCXJldHVybiBoYXNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuaW5kZXhPZihPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpbmRleE9mKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3I7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuaW5kZXhPZihPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAoaXRlcmF0b3IubmV4dCgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGl0ZXJhdG9yLmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhpdGVyYXRvci5uZXh0KCkpKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuIElmIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgaXMgYW4gaW5zdGFuY2Ugb2YKLQkgKiB7QGxpbmsgUmFuZG9tQWNjZXNzfSByZXR1cm4gdGhlIDxlbT5tYXhpbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4OwotCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIDxlbT5taW5pbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IGludCBpbnNlcnRpb25JbmRleE9mKExpc3Q8RT4gc29ydGVkTGlzdCwgQ29tcGFyYWJsZTxFPiB2YWx1ZSkgewotCQlpZiAoc29ydGVkTGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJZm9yIChpbnQgaSA9IHNvcnRlZExpc3Quc2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAodmFsdWUuY29tcGFyZVRvKHNvcnRlZExpc3QuZ2V0KGkpKSA+PSAwKSB7Ci0JCQkJCXJldHVybiBpICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBlbGVtZW50IDogc29ydGVkTGlzdCkgewotCQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhlbGVtZW50KSA8PSAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGluZGV4IG9mIHdoZXJlIHRoZSBzcGVjaWZpZWQgY29tcGFyYWJsZSBvYmplY3QKLQkgKiBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGxpc3Qgc29ydGVkLiBJZiB0aGUgc3BlY2lmaWVkIHNvcnRlZCBsaXN0IGlzIGFuIGluc3RhbmNlIG9mCi0JICoge0BsaW5rIFJhbmRvbUFjY2Vzc30gcmV0dXJuIHRoZSA8ZW0+bWF4aW11bTwvZW0+IGluc2VydGlvbiBpbmRleDsKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSA8ZW0+bWluaW11bTwvZW0+IGluc2VydGlvbiBpbmRleC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihMaXN0PEU+IHNvcnRlZExpc3QsIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWlmIChzb3J0ZWRMaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQlmb3IgKGludCBpID0gc29ydGVkTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZExpc3QuZ2V0KGkpKSA+PSAwKSB7Ci0JCQkJCXJldHVybiBpICsgMTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBlbGVtZW50IDogc29ydGVkTGlzdCkgewotCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgZWxlbWVudCkgPD0gMCkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYWJsZS9pdGVyYXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLml0ZXJhYmxlKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBpdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxFPihhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pdGVyYXRvcihPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gaXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8RT4oYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlJ3MgbGFzdCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmxhc3QoKTwvY29kZT4KLQkgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGl0ZXJhYmxlIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgbGFzdChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gbGFzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcidzIGxhc3QgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0KCk8L2NvZGU+Ci0JICogCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpdGVyYXRvciBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGxhc3QoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJRSBsYXN0OwotCQlkbyB7Ci0JCQlsYXN0ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpOwotCQlyZXR1cm4gbGFzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGU7Ci0JICogcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBsYXN0SW5kZXhPZihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5sYXN0SW5kZXhPZihPYmplY3QgbykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0KGl0ZXJhdG9yKS5sYXN0SW5kZXhPZih2YWx1ZSkgOiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkubGFzdEluZGV4T2YodmFsdWUpIDogLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9MaXN0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBsaXN0KGl0ZXJhdG9yLCBuZXcgQXJyYXlMaXN0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEFycmF5TGlzdDxFPiBsaXN0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxpc3QuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVW5saWtlIHtAbGluayBBcnJheXMjYXNMaXN0KE9iamVjdFtdKX0sIHRoZSBsaXN0Ci0JICogaXMgbW9kaWZpYWJsZSBhbmQgaXMgbm90IGJhY2tlZCBieSB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IGxpc3QoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxFPihBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGxpc3RJdGVyYXRvcihhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5saXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gbGlzdEl0ZXJhdG9yKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubGlzdEl0ZXJhdG9yKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxFPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGxpc3QuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5tb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmUoTGlzdDxFPiBsaXN0LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGxpc3QgOiBtb3ZlXyhsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmVfKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCS8vIG1vdmUgZWxlbWVudHMsIGxlYXZpbmcgdGhlIGxpc3QgaW4gcGxhY2UKLQkJCUUgdGVtcCA9IGxpc3QuZ2V0KHNvdXJjZUluZGV4KTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyAxLCBsaXN0LmdldChpKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPCB0YXJnZXRJbmRleDsgaSsrKSB7Ci0JCQkJCWxpc3Quc2V0KGksIGxpc3QuZ2V0KGkgKyAxKSk7Ci0JCQkJfQotCQkJfQotCQkJbGlzdC5zZXQodGFyZ2V0SW5kZXgsIHRlbXApOwotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlbGVtZW50IGFuZCByZS1hZGQgaXQgYXQgdGhlIHRhcmdldCBpbmRleAotCQkJbGlzdC5hZGQodGFyZ2V0SW5kZXgsIGxpc3QucmVtb3ZlKHNvdXJjZUluZGV4KSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0Ci0JICogaW5kZXguIFJldHVybiB0aGUgYWx0ZXJlZCBsaXN0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QubW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBtb3ZlKExpc3Q8RT4gbGlzdCwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8obGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQlpZiAobGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJLy8gbW92ZSBlbGVtZW50cywgbGVhdmluZyB0aGUgbGlzdCBpbiBwbGFjZQotCQkJQXJyYXlMaXN0PEU+IHRlbXAgPSBuZXcgQXJyYXlMaXN0PEU+KGxpc3Quc3ViTGlzdChzb3VyY2VJbmRleCwgc291cmNlSW5kZXggKyBsZW5ndGgpKTsKLQkJCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpLS0gPiB0YXJnZXRJbmRleDsgKSB7Ci0JCQkJCWxpc3Quc2V0KGkgKyBsZW5ndGgsIGxpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKLQkJCQkJbGlzdC5zZXQoaSwgbGlzdC5nZXQoaSArIGxlbmd0aCkpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlsaXN0LnNldCh0YXJnZXRJbmRleCArIGksIHRlbXAuZ2V0KGkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHJlbW92ZSB0aGUgZWxlbWVudHMgYW5kIHJlLWFkZCB0aGVtIGF0IHRoZSB0YXJnZXQgaW5kZXgKLQkJCWxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCByZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgc291cmNlSW5kZXgsIGxlbmd0aCkpOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvcikpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLnJlbW92ZUFsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChhcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgYWxsIG9jY3VycmVuY2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbE9jY3VycmVuY2VzKE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbE9jY3VycmVuY2VzKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8Pz4gc3RyZWFtID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudHMgYXQgaW5kZXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBlbGVtZW50cyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJlbW92ZShpbnQgaW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZW1vdmVFbGVtZW50c0F0SW5kZXgoTGlzdDxFPiBsaXN0LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGxlbmd0aCk7Ci0JCUFycmF5TGlzdDxFPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3QsCi0JICogd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9yZGVyLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QpIHsKLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKChzaXplID09IDApIHx8IChzaXplID09IDEpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QsIHNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBsaXN0IGlzIG5vbi1lbXB0eQotCSAqLwotCXN0YXRpYyA8RT4gYm9vbGVhbiByZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhMaXN0PEU+IGxpc3QsIGludCBzaXplKSB7Ci0JCUxpbmtlZEhhc2hTZXQ8RT4gdGVtcCA9IG5ldyBMaW5rZWRIYXNoU2V0PEU+KHNpemUpOwkJLy8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgaXRlbSA6IGxpc3QpIHsKLQkJCWlmICggISB0ZW1wLmFkZChpdGVtKSkgewotCQkJCW1vZGlmaWVkID0gdHJ1ZTsgIC8vIGR1cGxpY2F0ZSBpdGVtCi0JCQl9Ci0JCX0KLQkJaWYgKG1vZGlmaWVkKSB7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEUgZSA6IHRlbXApIHsKLQkJCQlsaXN0LnNldChpLCBlKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlpbnQgdGVtcFNpemUgPSB0ZW1wLnNpemUoKTsKLQkJCWZvciAoaSA9IGxpc3Quc2l6ZSgpOyBpLS0gPiB0ZW1wU2l6ZTsgKSB7Ci0JCQkJbGlzdC5yZW1vdmUoaSk7ICAvLyBwdWxsIG9mZiB0aGUgZW5kCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmV0YWluQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJldGFpbkFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvcikpOwotCQl9Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGNvbGxlY3Rpb24ucmV0YWluQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCWlmIChhcnJheS5sZW5ndGggPiAwKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGFycmF5KSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXZlcnNlTGlzdChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiByZXZlcnNlTGlzdChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAoQXJyYXlMaXN0PEU+KSByZXZlcnNlKGxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHdpdGggZW50cmllcyBpbiByZXZlcnNlIG9yZGVyIGZyb20gdGhvc2UKLQkgKiByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IucmV2ZXJzZUxpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gcmV2ZXJzZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gKEFycmF5TGlzdDxFPikgcmV2ZXJzZShsaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJvdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJvdGF0ZWQiIGJ5IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0LnJvdGF0ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCkgewotCQlyZXR1cm4gcm90YXRlKGxpc3QsIDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc2V0KGl0ZXJhdG9yLCBuZXcgSGFzaFNldDxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KGl0ZXJhdG9yU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEhhc2hTZXQ8RT4gc2V0KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNldC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoRS4uLiBhcnJheSkgewotCQlIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PEU+KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlzZXQuYWRkKGFycmF5W2ldKTsKLQkJfQotCQlyZXR1cm4gc2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzaW5nbGUsCi0JICogc3BlY2lmaWVkIG9iamVjdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QudG9JdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkl0ZXJhdG9yKEUgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNpbmdsZSwKLQkgKiBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC50b0xpc3RJdGVyYXRvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzaW5nbGV0b25MaXN0SXRlcmF0b3IoRSB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc2l6ZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNpemUoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zaXplKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2l6ZShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpbnQgc2l6ZSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCXNpemUrKzsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBpcyBlbXB0eQotCSAqIChTaG9ydGN1dHMgdGhlIGl0ZXJhdG9yIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbnRpcmUgc2l6ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gaXNFbXB0eShpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpcyBlbXB0eQotCSAqIChTaG9ydGN1dHMgdGhlIGl0ZXJhdG9yIHJhdGhlciB0aGFuIGNhbGN1bGF0aW5nIHRoZSBlbnRpcmUgc2l6ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbXB0eShJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gISBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc29ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgc29ydGVkIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhYmxlLCBudWxsLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYWJsZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhYmxlLCBpdGVyYWJsZVNpemUpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZXJhdG9yIGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0KGl0ZXJhdG9yLCBudWxsLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnQobGlzdChpdGVyYXRvciksIGNvbXBhcmF0b3IpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBjb21wYXJhdG9yKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc29ydGVkIHNldCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29tcGFyYXRvciwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYXRvciwgbnVsbCwgaXRlcmF0b3JTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGxpc3QoaXRlcmF0b3IpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvciwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJVHJlZVNldDxFPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxFPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChsaXN0KTsKLQkJcmV0dXJuIHNvcnRlZFNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBUcmVlU2V0PEU+IHNvcnRlZFNldChFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoYXJyYXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChPYmplY3RbXSBhcnJheSwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChFW10gYXJyYXksIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCVRyZWVTZXQ8RT4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8RT4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcnJheSkpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPbGQgU2Nob29sIFZlY3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmFibGUgaXRlcmFibGUsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmF0b3IgaXRlcmF0b3IsIGludCBzaXplKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJcmV0dXJuIHZlY3RvcihpdGVyYXRvciwgbmV3IFZlY3RvcjxFPihzaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBWZWN0b3I8RT4gdikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIFRoaXMgaXMgdXNlZnVsIGZvciBsZWdhY3kgY29kZSB0aGF0IHJlcXVpcmVzIGEge0BsaW5rIFZlY3Rvcn0uCi0JICogPHA+Ci0JICogPGNvZGU+VmVjdG9yKE9iamVjdC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihFLi4uIGFycmF5KSB7Ci0JCVZlY3RvcjxFPiB2ID0gbmV3IFZlY3RvcjxFPihhcnJheS5sZW5ndGgpOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQl2LmFkZEVsZW1lbnQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZS11c2UgSXRlcmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgb25lLXVzZSB7QGxpbmsgSXRlcmFibGV9IGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBJdGVyYXRvcn0uCi0JICogVGhyb3cgYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYge0BsaW5rIEl0ZXJhYmxlI2l0ZXJhdG9yKCl9Ci0JICogaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS11c2Ugc2l0dWF0aW9ucywgc3VjaCBhcwotCSAqIGEgZm9yZWFjaCBsb29wLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFNpbmdsZVVzZUl0ZXJhYmxlPEU+KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgb25lLXRpbWUgdXNlIGl0ZXJhYmxlIHRoYXQgY2FuIHJldHVybiBhIHNpbmdsZSBpdGVyYXRvci4KLQkgKiBPbmNlIHRoZSBpdGVyYXRvciBpcyByZXR1cm5lZCB0aGUgaXRlcmFibGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotCSAqIEFzIHN1Y2gsIHRoaXMgdXRpbGl0eSBzaG91bGQgb25seSBiZSB1c2VkIGluIG9uZS10aW1lIHVzZSBzaXR1YXRpb25zLAotCSAqIHN1Y2ggYXMgYSAnZm9yLWVhY2gnIGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVVc2VJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+IHsKLQkJcHJpdmF0ZSBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQotCQlwdWJsaWMgU2luZ2xlVXNlSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGl0ZXJhdG9yID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuaXRlcmF0b3IgPSBuZXcgU3VwZXJJdGVyYXRvcldyYXBwZXI8RT4oaXRlcmF0b3IpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkJaWYgKHRoaXMuaXRlcmF0b3IgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlJdGVyYXRvcjxFPiByZXN1bHQgPSB0aGlzLml0ZXJhdG9yOwotCQkJdGhpcy5pdGVyYXRvciA9IG51bGw7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEudXRpbC5Db2xsZWN0aW9ucyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBsaXN0IGFmdGVyIHRoZSBzb3VyY2UgbGlzdCBoYXMgYmVlbiBjb3BpZWQgaW50byBpdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI2NvcHkoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGNvcHkoTGlzdDxFPiBkZXN0LCBMaXN0PD8gZXh0ZW5kcyBFPiBzcmMpIHsKLQkJQ29sbGVjdGlvbnMuY29weShkZXN0LCBzcmMpOwotCQlyZXR1cm4gZGVzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNmaWxsKExpc3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IGZpbGwoTGlzdDxFPiBsaXN0LCBFIHZhbHVlKSB7Ci0JCUNvbGxlY3Rpb25zLmZpbGwobGlzdCwgdmFsdWUpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInJldmVyc2VkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3JldmVyc2UoTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHJldmVyc2UoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicm90YXRlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNyb3RhdGUoTGlzdCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcm90YXRlKExpc3Q8RT4gbGlzdCwgaW50IGRpc3RhbmNlKSB7Ci0JCUNvbGxlY3Rpb25zLnJvdGF0ZShsaXN0LCBkaXN0YW5jZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic2h1ZmZsZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc2h1ZmZsZShMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzaHVmZmxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzaHVmZmxlKExpc3QsIFJhbmRvbSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNodWZmbGUoTGlzdDxFPiBsaXN0LCBSYW5kb20gcmFuZG9tKSB7Ci0JCUNvbGxlY3Rpb25zLnNodWZmbGUobGlzdCwgcmFuZG9tKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIE5COiBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gcGxhY2UgYXMgYSBzaWRlLWVmZmVjdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NvcnQoTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0KSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBOQjogVGhlIGxpc3QgaXMgc29ydGVkIGluIHBsYWNlIGFzIGEgc2lkZS1lZmZlY3QuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzb3J0KExpc3QsIENvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzb3J0KExpc3Q8RT4gbGlzdCwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0LCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3N3YXAoTGlzdCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzd2FwKExpc3Q8RT4gbGlzdCwgaW50IGksIGludCBqKSB7Ci0JCUNvbGxlY3Rpb25zLnN3YXAobGlzdCwgaSwgaik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjZlZjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFdyYXAgYSBDb21tYW5kIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgUnVubmFibGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tYW5kUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgY29tbWFuZDsKLQotCXB1YmxpYyBDb21tYW5kUnVubmFibGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiUnVubmFibGVbIiArIHRoaXMuY29tbWFuZC50b1N0cmluZygpICsnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlNjYxMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotLyoqCi0gKiA8Y29kZT5Db21wb3NpdGVDb21tYW5kPC9jb2RlPiBwcm92aWRlcyBzdXBwb3J0IGZvciB0cmVhdGluZyBhIGNvbGxlY3Rpb24gb2YKLSAqIHtAbGluayBDb21tYW5kfXMgYXMgYSBzaW5nbGUgY29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbW1hbmQKLQlpbXBsZW1lbnRzIENvbW1hbmQKLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPENvbW1hbmQ+IGNvbW1hbmRzOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbW1hbmQoQ29tbWFuZC4uLiBjb21tYW5kcykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhYmxlPENvbW1hbmQ+KGNvbW1hbmRzKSk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZUNvbW1hbmQoSXRlcmFibGU8Q29tbWFuZD4gY29tbWFuZHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kcyA9IGNvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWZvciAoQ29tbWFuZCBjb21tYW5kIDogdGhpcy5jb21tYW5kcykgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbW1hbmRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjUxMjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGEgd2F5IGZvciBtdWx0aXBsZSBleGNlcHRpb25zIHRvIGJlIHBhY2thZ2VkIGFuZCByZXBvcnRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUV4Y2VwdGlvbgotCWV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgotewotCXByaXZhdGUgZmluYWwgVGhyb3dhYmxlW10gZXhjZXB0aW9uczsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUV4Y2VwdGlvbihDb2xsZWN0aW9uPFRocm93YWJsZT4gZXhjZXB0aW9ucykgewotCQl0aGlzKGV4Y2VwdGlvbnMudG9BcnJheShuZXcgVGhyb3dhYmxlW2V4Y2VwdGlvbnMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhjZXB0aW9ucyBsaXN0IG11c3Qgbm90IGJlIGVtcHR5LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVFeGNlcHRpb24oVGhyb3dhYmxlW10gZXhjZXB0aW9ucykgewotCQkvLyBwcm92aWRlIGEgbGlzdCBvZiB0aGUgbmVzdGVkIGV4Y2VwdGlvbnMgYW5kCi0JCS8vIGdyYWIgdGhlIGZpcnN0IGV4Y2VwdGlvbiBhbmQgbWFrZSBpdCB0aGUgImNhdXNlIgotCQlzdXBlcihidWlsZE1lc3NhZ2UoZXhjZXB0aW9ucykpOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSBleGNlcHRpb25zOwotCX0KLQotCXB1YmxpYyBUaHJvd2FibGVbXSBnZXRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5leGNlcHRpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZE1lc3NhZ2UoVGhyb3dhYmxlW10gZXhjZXB0aW9ucykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGV4Y2VwdGlvbnMubGVuZ3RoKTsKLQkJc2IuYXBwZW5kKCIgZXhjZXB0aW9uczogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCWZvciAoVGhyb3dhYmxlIGV4IDogZXhjZXB0aW9ucykgewotCQkJc2IuYXBwZW5kKGV4LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDIpOyAgLy8gY2hvcCBvZmYgdHJhaWxpbmcgY29tbWEKLQkJc2IuYXBwZW5kKCddJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFN0cmVhbSBzKSB7Ci0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogdGhpcy5nZXRTdGFja1RyYWNlKCkpIHsKLQkJCQlzLnByaW50KCJcdGF0ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludGxuKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IGkgPSAxOwotCQkJZm9yIChUaHJvd2FibGUgZXggOiB0aGlzLmV4Y2VwdGlvbnMpIHsKLQkJCQlzLnByaW50KCJOZXN0ZWQgZXhjZXB0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludChpKyspOwotCQkJCXMucHJpbnQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlleC5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgewotCQlzeW5jaHJvbml6ZWQgKHMpIHsKLQkJCXMucHJpbnRsbih0aGlzKTsKLQkJCWZvciAoU3RhY2tUcmFjZUVsZW1lbnQgZWxlbWVudCA6IHRoaXMuZ2V0U3RhY2tUcmFjZSgpKSB7Ci0JCQkJcy5wcmludCgiXHRhdCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXMucHJpbnRsbihlbGVtZW50KTsKLQkJCX0KLQkJCWludCBpID0gMTsKLQkJCWZvciAoVGhyb3dhYmxlIGV4IDogdGhpcy5leGNlcHRpb25zKSB7Ci0JCQkJcy5wcmludCgiTmVzdGVkIGV4Y2VwdGlvbiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXMucHJpbnQoaSsrKTsKLQkJCQlzLnByaW50KCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZXgucHJpbnRTdGFja1RyYWNlKHMpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzNGU5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3I8L2NvZGU+IGNvbnRyb2xzIHRoZSBjcmVhdGlvbiwKLSAqIHN0YXJ0aW5nLCBhbmQgc3RvcHBpbmcgb2YgYSBnZW5lcmFsIHB1cnBvc2UgImNvbnN1bWVyIiB0aHJlYWQuIENvbnN0cnVjdAotICogdGhlIGNvb3JkaW5hdG9yIHdpdGggYSB7QGxpbmsgQ29uc3VtZXJ9IHRoYXQgYm90aCB3YWl0cyBmb3IgdGhlIHByb2R1Y2VyCi0gKiB0byAicHJvZHVjZSIgc29tZXRoaW5nIHRvICJjb25zdW1lIiBhbmQsIG9uY2UgdGhlIHdhaXQgaXMgb3ZlciwKLSAqICJjb25zdW1lcyIgd2hhdGV2ZXIgaXMgYXZhaWxhYmxlLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgY2xpZW50LXN1cHBsaWVkIGNvbnN1bWVyIHNob3VsZCBoYW5kbGUgYW55Ci0gKiBleGNlcHRpb24gYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkpIHNvCi0gKiB0aGUgdGhyZWFkIGNhbiBjb250aW51ZSBleGVjdXRpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIHsKLQkvKioKLQkgKiBUaGUgcnVubmFibGUgcGFzc2VkIHRvIHRoZSBjb25zdW1lciB0aHJlYWQgZWFjaCB0aW1lIGl0IGlzIGJ1aWx0LgotCSAqLwotCXByaXZhdGUgZmluYWwgUnVubmFibGUgcnVubmFibGU7Ci0KLQkvKioKLQkgKiBDbGllbnQtc3VwcGxpZWQgdGhyZWFkIGZhY3RvcnkuIERlZmF1bHRzIHRvIGEgc3RyYWlnaHRmb3J3YXJkCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCwgY2xpZW50LXN1cHBsaWVkIG5hbWUgZm9yIHRoZSBjb25zdW1lciB0aHJlYWQuCi0JICogSWYgbnVsbCwgdGhlIEpESyBhc3NpZ25zIGEgbmFtZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0aHJlYWROYW1lOwotCi0JLyoqCi0JICogVGhlIGNvbnN1bWVyIGlzIGV4ZWN1dGVkIG9uIHRoaXMgdGhyZWFkLiBBIG5ldyB0aHJlYWQgaXMgYnVpbHQKLQkgKiBmb3IgZXZlcnkgc3RhcnQvc3RvcCBjeWNsZSAoc2luY2UgYSB0aHJlYWQgY2Fubm90IGJlIHN0YXJ0ZWQgbW9yZSB0aGFuCi0JICogb25jZSkuCi0JICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWQgdGhyZWFkOwotCi0JLyoqCi0JICogQSBsaXN0IG9mIHRoZSB1bmNhdWdodCBleGNlcHRpb25zIHRocm93biBieSB0aGUgY29uc3VtZXIKLQkgKiBkdXJpbmcgdGhlIGN1cnJlbnQgc3RhcnQvc3RvcCBjeWNsZS4KLQkgKi8KLQlmaW5hbCBWZWN0b3I8VGhyb3dhYmxlPiBleGNlcHRpb25zID0gbmV3IFZlY3RvcjxUaHJvd2FibGU+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbnN1bWVyIHRocmVhZCBjb29yZGluYXRvciBmb3IgdGhlIHNwZWNpZmllZCBjb25zdW1lci4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBjb25zdW1lciB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCXRoaXMoY29uc3VtZXIsIFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgY29uc3VtZXIgdGhyZWFkKHMpLgotCSAqIEFsbG93IHRoZSBjb25zdW1lciB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcihDb25zdW1lciBjb25zdW1lciwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5KSB7Ci0JCXRoaXMoY29uc3VtZXIsIHRocmVhZEZhY3RvcnksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbnN1bWVyIHRocmVhZCBjb29yZGluYXRvciBmb3IgdGhlIHNwZWNpZmllZCBjb25zdW1lci4KLQkgKiBBc3NpZ24gdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29uc3VtZXIgdGhyZWFkKHMpLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyLCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQl0aGlzKGNvbnN1bWVyLCBTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCksIHRocmVhZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbnN1bWVyIHRocmVhZCBjb29yZGluYXRvciBmb3IgdGhlIHNwZWNpZmllZCBjb25zdW1lci4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIGNvbnN1bWVyIHRocmVhZChzKS4KLQkgKiBBc3NpZ24gdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5ydW5uYWJsZSA9IHRoaXMuYnVpbGRSdW5uYWJsZShjb25zdW1lcik7Ci0JCXRoaXMudGhyZWFkRmFjdG9yeSA9IHRocmVhZEZhY3Rvcnk7Ci0JCXRoaXMudGhyZWFkTmFtZSA9IHRocmVhZE5hbWU7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGVDb25zdW1lcihjb25zdW1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpZmVjeWNsZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCBzdGFydCB0aGUgY29uc3VtZXIgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHRoaXMudGhyZWFkICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdG9wcGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy50aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKCk7Ci0JCXRoaXMudGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRUaHJlYWQoKSB7Ci0JCVRocmVhZCB0ID0gdGhpcy50aHJlYWRGYWN0b3J5Lm5ld1RocmVhZCh0aGlzLnJ1bm5hYmxlKTsKLQkJaWYgKHRoaXMudGhyZWFkTmFtZSAhPSBudWxsKSB7Ci0JCQl0LnNldE5hbWUodGhpcy50aHJlYWROYW1lKTsKLQkJfQotCQlyZXR1cm4gdDsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIGNvbnN1bWVyIHRocmVhZCBzbyB0aGF0IGl0IHN0b3BzIGV4ZWN1dGluZyBhdCB0aGUKLQkgKiBlbmQgb2YgaXRzIGN1cnJlbnQgaXRlcmF0aW9uLiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbAotCSAqIHRoZSBjb25zdW1lciB0aHJlYWQgaXMgZmluaXNoZWQgZXhlY3V0aW5nLiBJZiBhbnkgdW5jYXVnaHQKLQkgKiBleGNlcHRpb25zIHdlcmUgdGhyb3duIHdoaWxlIHRoZSBjb25zdW1lciB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJaWYgKHRoaXMudGhyZWFkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdGFydGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy50aHJlYWQuaW50ZXJydXB0KCk7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRocmVhZC5qb2luKCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgdG8KLQkJCS8vIGpvaW4gdGhlIGNvbnN1bWVyIHRocmVhZCAtIGlnbm9yZTsKLQkJCS8vICd0aHJlYWQnIGlzIHN0aWxsICJpbnRlcnJ1cHRlZCIsIHNvIGl0cyAjcnVuKCkgbG9vcCB3aWxsIHN0aWxsIHN0b3AKLQkJCS8vIGFmdGVyIGl0cyBjdXJyZW50IGV4ZWN1dGlvbiAtIHdlIGp1c3Qgd29uJ3Qgd2FpdCBhcm91bmQgZm9yIGl0Li4uCi0JCX0KLQkJdGhpcy50aHJlYWQgPSBudWxsOwotCi0JCWlmICh0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJVGhyb3dhYmxlW10gdGVtcCA9IHRoaXMuZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbdGhpcy5leGNlcHRpb25zLnNpemUoKV0pOwotCQkJdGhpcy5leGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRlbXApOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy50aHJlYWQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciB0aHJlYWQgcnVubmFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUnVubmFibGV9IGlzIGEgbG9uZy1ydW5uaW5nIGNvbnN1bWVyIHRoYXQKLQkgKiB3aWxsIHJlcGVhdGVkbHkgZXhlY3V0ZSB0aGUgY29uc3VtZXIge0BsaW5rIENvbnN1bWVyI2V4ZWN1dGUoKX0gbWV0aG9kLgotCSAqIFdpdGggZWFjaCBpdGVyYXRpb24sIHRoZSBjb25zdW1lciB0aHJlYWQgd2lsbCB3YWl0Ci0JICogdW50aWwgdGhlIG90aGVyIGNvbnN1bWVyIG1ldGhvZCwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfSwgYWxsb3dzIHRoZQotCSAqIGNvbnN1bWVyIHRocmVhZCB0byBwcm9jZWVkIChpLmUuIHRoZXJlIGlzIHNvbWV0aGluZyBmb3IgdGhlIGNvbnN1bWVyIHRvCi0JICogY29uc3VtZSkuIE9uY2Uge0BsaW5rIENvbnN1bWVyI2V4ZWN1dGUoKX0gaXMgZmluaXNoZWQsIHRoZSB0aHJlYWQgd2lsbCBxdWllc2NlCi0JICogdW50aWwge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfSByZXR1cm5zIGFnYWluLgotCSAqIFN0b3AgdGhlIHRocmVhZCBieSBjYWxsaW5nIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUnVubmFibGVDb25zdW1lcgotCQlpbXBsZW1lbnRzIFJ1bm5hYmxlCi0JewotCQkvKioKLQkJICogQ2xpZW50LXN1cHBsaWVkIGNvbnN1bWVyIHRoYXQgY29udHJvbHMgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGNvbnN1bWUKLQkJICogYW5kIHRoZSBjb25zdW1pbmcgaXRzZWxmLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb25zdW1lciBjb25zdW1lcjsKLQotCQlSdW5uYWJsZUNvbnN1bWVyKENvbnN1bWVyIGNvbnN1bWVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb25zdW1lciA9IGNvbnN1bWVyOwotCQl9Ci0KLQkJLyoqCi0JCSAqIExvb3Agd2hpbGUgdGhpcyB0aHJlYWQgaGFzIG5vdCBiZWVuIGludGVycnVwdGVkIGJ5IGFub3RoZXIgdGhyZWFkLgotCQkgKiBJbiBlYWNoIGxvb3A6IFBhdXNlIGV4ZWN1dGlvbiB1bnRpbCB7QGxpbmsgQ29uc3VtZXIjd2FpdEZvclByb2R1Y2VyKCl9Ci0JCSAqIGFsbG93cyB1cyB0byBwcm9jZWVkLgotCQkgKiA8cD4KLQkJICogSWYgdGhpcyB0aHJlYWQgaXMgaW50ZXJydXB0ZWQgPGVtPmR1cmluZzwvZW0+IHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9LAotCQkgKiB0aGUgY2FsbCB0byB7QGxpbmsgVGhyZWFkI2ludGVycnVwdGVkKCl9IHdpbGwgc3RvcCB0aGUgbG9vcC4gSWYgdGhpcyB0aHJlYWQgaXMKLQkJICogaW50ZXJydXB0ZWQgZHVyaW5nIHRoZSBjYWxsIHRvIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0sCi0JCSAqIHdlIHdpbGwgY2F0Y2ggdGhlIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gYW5kIHN0b3AgdGhlIGxvb3AgYWxzby4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXdoaWxlICggISBUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXRoaXMuY29uc3VtZXIud2FpdEZvclByb2R1Y2VyKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gd2Ugd2VyZSBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nLCBtdXN0IGJlIFF1aXR0aW4nIFRpbWUKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0aGlzLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBFeGVjdXRlIHRoZSBjb25zdW1lciB7QGxpbmsgQ29uc3VtZXIjZXhlY3V0ZSgpfSBtZXRob2QuCi0JCSAqIERvIG5vdCBhbGxvdyBhbnkgdW5oYW5kbGVkIGV4Y2VwdGlvbnMgdG8ga2lsbCB0aGUgdGhyZWFkLgotCQkgKiBTdG9yZSB0aGVtIHVwIGZvciBsYXRlciBwYWluLgotCQkgKiBAc2VlIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Ijc3RvcCgpCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5leGVjdXRlXygpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQkJQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci50aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBTdWJjbGFzcy1pbXBsZW1lbnRlZCBiZWhhdmlvcjogY29uc3VtZSBzdHVmZi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBleGVjdXRlXygpIHsKLQkJCXRoaXMuY29uc3VtZXIuZXhlY3V0ZSgpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3VtZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIHRoYXQgY29udHJvbHM6PHVsPgotCSAqIDxsaT53aGVuIHRoZSBjb25zdW1lciB0aHJlYWQgc3VzcGVuZHMsIHdhaXRpbmcgZm9yIHNvbWV0aGluZyB0byBjb25zdW1lCi0JICogPGxpPnRoZSBjb25zdW1pbmcgb2Ygd2hhdGV2ZXIgaXMgYmVpbmcgcHJvZHVjZWQKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQ29uc3VtZXIgewotCQkvKioKLQkJICogV2FpdCBmb3Igc29tZXRoaW5nIHRvIGNvbnN1bWUuCi0JCSAqIFRocm93IGFuIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaWYgdGhlIHRocmVhZCBpcyBpbnRlcnJ1cHRlZC4KLQkJICovCi0JCXZvaWQgd2FpdEZvclByb2R1Y2VyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCi0JCS8qKgotCQkgKiBDb25zdW1lIHdoYXRldmVyIGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCi0JCSAqLwotCQl2b2lkIGV4ZWN1dGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMzMmY1NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGFsbG93aW5nIGNsaWVudHMgdG8gcGFzcyBhbiBleGNlcHRpb24gaGFuZGxlciB0byBhCi0gKiBzZXJ2aWNlIChlLmcuIHRvIGxvZyB0aGUgZXhjZXB0aW9uKS4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgaGVscGZ1bCBpZiB0aGUKLSAqIHNlcnZpY2UgZXhlY3V0ZXMgb24gYW5vdGhlciwgcG9zc2libHkgaW5hY2Nlc3NpYmxlLCB0aHJlYWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvbkhhbmRsZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb24gd2FzIHRocm93bi4gSGFuZGxlIGl0IGFwcHJvcHJpYXRlbHkuCi0JICovCi0Jdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIHQpOwotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdCBkb2VzCi0JICogbm90aGluZyB3aXRoIHRoZSBleGNlcHRpb24uCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEV4Y2VwdGlvbkhhbmRsZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjZXB0aW9uSGFuZGxlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgRXhjZXB0aW9uSGFuZGxlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaGFuZGxlRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkV4Y2VwdGlvbkhhbmRsZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbnRlcmZhY2UgdGhhdAotCSAqIHdyYXBzIHRoZSBleGNlcHRpb24gaW4gYSBydW50aW1lIGV4Y2VwdGlvbiBhbmQgdGhyb3dzIGl0LgotCSAqLwotCWZpbmFsIGNsYXNzIFJ1bnRpbWUgaW1wbGVtZW50cyBFeGNlcHRpb25IYW5kbGVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUnVudGltZSgpOwotCQlwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFJ1bnRpbWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQkJLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiB1bmNoZWNrZWQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJFeGNlcHRpb25IYW5kbGVyLlJ1bnRpbWUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlOTNhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GaWxlVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQXNzb3J0ZWQgZmlsZSB0b29sczoKLSAqIC0gZGVsZXRlIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgaXRlcmF0b3JzIG9uIGVudGlyZSB0cmVlcyBvZiBkaXJlY3RvcmllcyBhbmQgZmlsZXMKLSAqIC0gYnVpbGQgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5Ci0gKiAtICJjYW5vbml6ZSIgZmlsZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpbGVUb29scyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0hPTUVfRElSRUNUT1JZX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSA9ICJ0bXBkaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOVF9XT1JLSU5HX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0KLSAgICAvKiogQSBsaXN0IG9mIHNvbWUgaW52YWxpZCBmaWxlIG5hbWUgY2hhcmFjdGVycy4KLQkJCQk6IGlzIHRoZSBmaWxlbmFtZSBzZXBhcmF0b3IgaW4gTWFjT1MgYW5kIHRoZSBkcml2ZSBpbmRpY2F0b3IgaW4gRE9TCi0JCQkJKiBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQl8IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCSYgaXMgb3VyIG93biBlc2NhcGUgY2hhcmFjdGVyCi0JCQkJLyBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIFVuaXggYW5kIHRoZSBjb21tYW5kIG9wdGlvbiB0YWcgaW4gRE9TCi0JCQkJXCBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIERPUy9XaW5kb3dzIGFuZCB0aGUgZXNjYXBlIGNoYXJhY3RlciBpbiBVbml4Ci0JCQkJOyBpcyA/Pz8KLQkJCQk/IGlzIGEgRE9TIHdpbGRjYXJkIGNoYXJhY3RlcgotCQkJCVsgaXMgPz8/Ci0JCQkJXSBpcyA/Pz8KLQkJCQk9IGlzID8/PwotCQkJCSsgaXMgPz8/Ci0JCQkJPCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQk+IGlzIGEgRE9TIHJlZGlyZWN0aW9uIGNoYXJhY3RlcgotCQkJCSIgaXMgdXNlZCBieSBET1MgdG8gZGVsaW1pdCBmaWxlIG5hbWVzIHdpdGggc3BhY2VzCi0JCQkJLCBpcyA/Pz8KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMgPSB7ICc6JywgJyonLCAnfCcsICcmJywgJy8nLCAnXFwnLCAnOycsICc/JywgJ1snLCAnXScsICc9JywgJysnLCAnPCcsICc+JywgJyInLCAnLCcgfTsKLQotCS8qKiBUaGlzIGVuY29kZXIgd2lsbCBjb252ZXJ0IHN0cmluZ3MgaW50byB2YWxpZCBmaWxlIG5hbWVzLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU3RyaW5nRW5jb2RlciBGSUxFX05BTUVfRU5DT0RFUiA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkvKiogV2luZG93cyBmaWxlcyB0aGF0IGFyZSByZWRpcmVjdGVkIHRvIGRldmljZXMgZXRjLiAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFdJTkRPV1NfUkVTRVJWRURfRklMRV9OQU1FUyA9IHsKLQkJImNvbiIsCi0JCSJhdXgiLAotCQkiY29tMSIsICJjb20yIiwgImNvbTMiLCAiY29tNCIsICJjb201IiwgImNvbTYiLCAiY29tNyIsICJjb204IiwgImNvbTkiLAotCQkibHB0MSIsICJscHQyIiwgImxwdDMiLCAibHB0NCIsICJscHQ1IiwgImxwdDYiLCAibHB0NyIsICJscHQ4IiwgImxwdDkiLAotCQkicHJuIiwKLQkJIm51bCIKLQl9OwotCi0JLyoqIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIHNob3J0ZW5lZCBmaWxlIG5hbWUuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCA9IDYwOwotCi0KLQkvLyAqKioqKioqKioqIGRlbGV0aW5nIGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBjb250ZW50cy4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlQWxsKCk/Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlkZWxldGVEaXJlY3RvcnkobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoZGlyZWN0b3J5KTsKLQkJaWYgKCAhIGRpcmVjdG9yeS5kZWxldGUoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5OiAiICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkKLQkgKiAoYnV0IG5vdCB0aGUgZGlyZWN0b3J5IGl0c2VsZikuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJZGVsZXRlRGlyZWN0b3J5KGZpbGUpOwkvLyByZWN1cnNlIHRocm91Z2ggc3ViZGlyZWN0b3JpZXMKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCAhIGZpbGUuZGVsZXRlKCkpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInVuYWJsZSB0byBkZWxldGUgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBjb3B5aW5nIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuCi0JICogRmlsZSNjb3B5KEZpbGUgZGVzdGluYXRpb25GaWxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5VG9GaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkZpbGUpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZUNoYW5uZWwgc291cmNlQ2hhbm5lbCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSkuZ2V0Q2hhbm5lbCgpOwotCQlGaWxlQ2hhbm5lbCBkZXN0aW5hdGlvbkNoYW5uZWwgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbkZpbGUpLmdldENoYW5uZWwoKTsKLQkJdHJ5IHsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC50cmFuc2ZlckZyb20oc291cmNlQ2hhbm5lbCwgMCwgc291cmNlQ2hhbm5lbC5zaXplKCkpOwotCQl9IGZpbmFsbHkgewotCQkJc291cmNlQ2hhbm5lbC5jbG9zZSgpOwotCQkJZGVzdGluYXRpb25DaGFubmVsLmNsb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29waWVzIHRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZSB0byBhIGZpbGUgYnkKLQkgKiB0aGUgc2FtZSBuYW1lIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0JICogRmlsZSNjb3B5VG9EaXJlY3RvcnkoRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRGlyZWN0b3J5KEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSkKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlIGRlc3RpbmF0aW9uRmlsZSA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uRGlyZWN0b3J5LCBzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0JCWlmICggISBkZXN0aW5hdGlvbkZpbGUuZXhpc3RzKCkgJiYgISBkZXN0aW5hdGlvbkZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY3JlYXRlTmV3RmlsZSgpIGZhaWxlZDogIiArIGRlc3RpbmF0aW9uRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb3B5VG9GaWxlKHNvdXJjZUZpbGUsIGRlc3RpbmF0aW9uRmlsZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcmluZyBvdmVyIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNmaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBmaWxlc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZmlsZXNJbihkaXJlY3RvcnkubGlzdEZpbGVzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luKEZpbGVbXSBmaWxlcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KG5ldyBBcnJheUl0ZXJhdG9yPEZpbGU+KGZpbGVzKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXNGaWxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgc3ViZGlyZWN0b3JpZXMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiBGaWxlI3N1YkRpcmVjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRGlyZWN0b3J5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciB0aGUgc3ViZGlyZWN0b3JpZXMgdGhlbXNlbHZlcy4KLQkgKiBGaWxlI2ZpbGVzUmVjdXJzZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0luVHJlZShTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJblRyZWUobmV3IEZpbGUoZGlyZWN0b3J5TmFtZSkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlQXNTZXQoZGlyZWN0b3J5KS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNldDxGaWxlPiBmaWxlc0luVHJlZUFzU2V0KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCVNldDxGaWxlPiBmaWxlcyA9IG5ldyBIYXNoU2V0PEZpbGU+KDEwMDAwKTsKLQkJYWRkRmlsZXNJblRyZWVUbyhkaXJlY3RvcnksIGZpbGVzKTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXNJblRyZWVUbyhGaWxlIGRpcmVjdG9yeSwgQ29sbGVjdGlvbjxGaWxlPiBhbGxGaWxlcykgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNGaWxlKCkpIHsKLQkJCQlhbGxGaWxlcy5hZGQoZmlsZSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEZpbGVzSW5UcmVlVG8oZmlsZSwgYWxsRmlsZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGRpcmVjdG9yaWVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogRmlsZSNzdWJEaXJlY3Rvcmllc1JlY3Vyc2UoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWUoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KGRpcmVjdG9yaWVzSW4oZmlsZXMpLCBkaXJlY3Rvcmllc0luVHJlZXMoZGlyZWN0b3JpZXNJbihmaWxlcykpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJblRyZWVzKEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RmlsZT4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBJdGVyYXRvcjxGaWxlPj4oZGlyZWN0b3JpZXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmlsZT4gdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCQlyZXR1cm4gRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKG5leHQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHNob3J0IGZpbGUgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUncyBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzdHJpcEV4dGVuc2lvbihmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubyBleHRlbnNpb24sIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCi0JICogRmlsZSNleHRlbnNpb24oKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUgZG90LCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUncyBuYW1lLgotCSAqIElmIHRoZSBmaWxlJ3MgbmFtZSBoYXMgbm8gZXh0ZW5zaW9uLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqIEZpbGUjZXh0ZW5zaW9uKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb24oRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBleHRlbnNpb24oZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKGRpci5leGlzdHMoKSkgewotCQkJZGVsZXRlRGlyZWN0b3J5Q29udGVudHMoZGlyKTsKLQkJfSBlbHNlIHsKLQkJCW1rZGlycyhkaXIpOwotCQl9Ci0JCXJldHVybiBkaXI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBta2RpcnMoRmlsZSBkaXIpIHsKLQkJaWYgKCAhIGRpci5ta2RpcnMoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIm1rZGlycygpIGZhaWxlZDogIiArIGRpcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGFuIGVtcHR5IHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhCi0JICogbmFtZSBvZiAidG1wZGlyIi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBjbGVhcmVkIG91dC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgbGVmdCB1bmNoYW5nZWQ7Ci0JICogaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0ZW1wb3JhcnlEaXJlY3RvcnkoU3RyaW5nIG5hbWUpIHsKLQkJRmlsZSBkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIG5hbWUpOwotCQlpZiAoICEgZGlyLmV4aXN0cygpKSB7Ci0JCQlta2RpcnMoZGlyKTsKLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEgbmFtZSBvZgotCSAqICJ0bXBkaXIiLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gdGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhICpuZXcqIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogcHJlZml4LiBUaGUgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKCAhIHByZWZpeC5lbmRzV2l0aCgiLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByZWZpeCA9IHByZWZpeCArICcuJzsKLQkJfQotCQlGaWxlIGRpcjsKLQkJaW50IGkgPSAwOwotCQlkbyB7Ci0JCQlpKys7Ci0JCQlkaXIgPSBuZXcgRmlsZSh1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCksIHByZWZpeCArIGkpOwotCQl9IHdoaWxlICggISBkaXIubWtkaXJzKCkpOwotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgKm5ldyogdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIGEKLQkgKiBwcmVmaXggb2YgInRtcGRpciIuIFRoaXMgcHJlZml4IHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG51bWJlciB0aGF0Ci0JICogaXMgaW5jcmVtZW50ZWQsIHN0YXJ0aW5nIHdpdGggMSwgdW50aWwgYSBub24tcHJlLWV4aXN0aW5nIGRpcmVjdG9yeQotCSAqIGlzIGZvdW5kIGFuZCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhCi0JICogc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFzIGluZGljYXRlZCBieQotCSAqIHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3VGVtcG9yYXJ5RGlyZWN0b3J5KERFRkFVTFRfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIFRoZSByZXNvdXJjZSBuYW1lIG11c3QgYmUgZnVsbHktcXVhbGlmaWVkLCBpLmUuIGl0IGNhbm5vdCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBwYWNrYWdlIG5hbWUvZGlyZWN0b3J5LgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCWlmICggISByZXNvdXJjZU5hbWUuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocmVzb3VyY2VOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VGaWxlKHJlc291cmNlTmFtZSwgRmlsZVRvb2xzLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHJlc291cmNlRmlsZShTdHJpbmcgcmVzb3VyY2VOYW1lLCBDbGFzczw/PiBqYXZhQ2xhc3MpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkwgdXJsID0gamF2YUNsYXNzLmdldFJlc291cmNlKHJlc291cmNlTmFtZSk7Ci0JCXJldHVybiBidWlsZEZpbGUodXJsKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgVVJMLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBidWlsZEZpbGUoVVJMIHVybCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZS4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7Ci0JCVVSSSB1cmkgPSBuZXcgVVJJKGZpbGVOYW1lKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpLmdldFBhdGgoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogImNhbm9uaWNhbCIgZmlsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgaW50byBhICJjYW5vbmljYWwiIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNhbm9uaWNhbEZpbGUoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjZXB0aW9uKSB7Ci0JCQkvLyBzZXR0bGUgZm9yIHRoZSBhYnNvbHV0ZSBmaWxlCi0JCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKEl0ZXJhdG9yPEZpbGU+IGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGaWxlLCBGaWxlPihmaWxlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmlsZSB0cmFuc2Zvcm0oRmlsZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gY2Fub25pY2FsRmlsZXMoQ29sbGVjdGlvbjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gY2Fub25pY2FsRmlsZXMoZmlsZXMuaXRlcmF0b3IoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaW50byBhICJjYW5vbmljYWwiIGZpbGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZmlsZU5hbWUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBjYW5vbmljYWxGaWxlTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihmaWxlTmFtZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gY2Fub25pY2FsRmlsZU5hbWUobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lcyhmaWxlTmFtZXMuaXRlcmF0b3IoKSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBmaWxlIG5hbWUgdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyBpbnZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlTmFtZUlzSW52YWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuICEgZmlsZU5hbWVJc1ZhbGlkKGZpbGVuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSBpcyB2YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc1ZhbGlkKFN0cmluZyBmaWxlbmFtZSkgewotCQlpbnQgbGVuID0gZmlsZW5hbWUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKFN0cmluZyBmaWxlbmFtZSwgY2hhciByZXBsYWNlbWVudENoYXIpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBmaWxlbmFtZUNoYXIgPSBmaWxlbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMsIGZpbGVuYW1lQ2hhcikpIHsKLQkJCQlzYi5hcHBlbmQocmVwbGFjZW1lbnRDaGFyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKGZpbGVuYW1lQ2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgaWxsZWdhbCBjaGFyYWN0ZXJzIGluIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIHRvCi0JICogcGVyaW9kcyAoJy4nKSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoZmlsZW5hbWUsICcuJyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgInJlc2VydmVkIgotCSAqIChpLmUuIGl0IGNhbm5vdCBiZSB1c2VkIGZvciAidXNlciIgZmlsZXMpLiBXaW5kb3dzIHJlc2VydmVzCi0JICogYSBudW1iZXIgb2YgZmlsZSBuYW1lcyAoZS5nLiBDT04sIEFVWCwgUFJOKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc1Jlc2VydmVkKFN0cmluZyBmaWxlTmFtZSkgewotCQkvLyBVbml4L0xpbnV4IGRvZXMgbm90IGhhdmUgYW55ICJyZXNlcnZlZCIgZmlsZSBuYW1lcyAoSSB0aGluay4uLikKLQkJcmV0dXJuIFRvb2xzLm9zSXNXaW5kb3dzKCkgJiYgQXJyYXlUb29scy5jb250YWlucyhXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMsIGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBjb250YWlucyBhbnkgInJlc2VydmVkIgotCSAqIGNvbXBvbmVudHMuCi0JICogV2luZG93cyByZXNlcnZlcyBhIG51bWJlciBvZiBmaWxlIG5hbWVzIChlLmcuIENPTiwgQVVYLCBQUk4pOwotCSAqIGFuZCB0aGVzZSBmaWxlIG5hbWVzIGNhbm5vdCBiZSB1c2VkIGZvciBlaXRoZXIgdGhlIG5hbWVzIG9mCi0JICogZmlsZXMgb3IgZGlyZWN0b3JpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMoRmlsZSBmaWxlKSB7Ci0JCUZpbGUgdGVtcCA9IGZpbGU7Ci0JCXdoaWxlICh0ZW1wICE9IG51bGwpIHsKLQkJCWlmIChmaWxlTmFtZUlzUmVzZXJ2ZWQodGVtcC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaG9ydGVuZWQgZmlsZSBuYW1lcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUodXJsLCBNQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzaG9ydGVyIHZlcnNpb24gb2YgdGhlIGFic29sdXRlIGZpbGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFRoZSBzaG9ydGVyIHZlcnNpb24gd2lsbCBub3QgYmUgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gbGVuZ3RoLgotCSAqIFRoZSBmaXJzdCBkaXJlY3RvcnkgKHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcikgYW5kIHRoZSBmaWxlIG5hbWUgb3IgdGhlCi0JICogbGFzdCBkaXJlY3Rvcnkgd2lsbCBhbHdheXMgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBzdHJpbmcgcmVnYXJkbGVzcyBvZgotCSAqIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0ZW5GaWxlTmFtZShVUkwgdXJsLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCUZpbGUgZmlsZTsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBidWlsZEZpbGUodXJsKTsKLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJfQotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKGZpbGUsIG1heExlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBzaG9ydGVuRmlsZU5hbWUoZmlsZSwgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoRmlsZSBmaWxlLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCVN0cmluZyBhYnNvbHV0ZUZpbGVOYW1lID0gY2Fub25pY2FsRmlsZShmaWxlKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJaWYgKGFic29sdXRlRmlsZU5hbWUubGVuZ3RoKCkgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkvLyBubyBuZWVkIHRvIHNob3J0ZW4KLQkJCXJldHVybiBhYnNvbHV0ZUZpbGVOYW1lOwotCQl9Ci0KLQkJLy8gYnJlYWsgZG93biB0aGUgcGF0aCBpbnRvIGl0cyBjb21wb25lbnRzCi0JCVN0cmluZyBmcyA9IEZpbGUuc2VwYXJhdG9yOwotCQlTdHJpbmdbXSBwYXRocyA9IGFic29sdXRlRmlsZU5hbWUuc3BsaXQoJ1xcJyArIGZzKTsKLQotCQlpZiAocGF0aHMubGVuZ3RoIDw9IDEpIHsKLQkJCS8vIGUuZy4gIkM6XCIKLQkJCXJldHVybiBwYXRoc1swXTsKLQkJfQotCi0JCWlmIChwYXRocy5sZW5ndGggPT0gMikgewotCQkJLy8gZS5nLiAiQzpcTXlSZWFsbHlMb25nRmlsZU5hbWUuZXh0IiBvciAiQzpcTXlSZWFsbHlMb25nRGlyZWN0b3J5TmFtZSIKLQkJCS8vIHJldHVybiB0aGUgY29tcGxldGUgZmlsZSBuYW1lIHNpbmNlIHRoaXMgaXMgYSBtaW5pbXVtIHJlcXVpcmVtZW50LAotCQkJLy8gcmVnYXJkbGVzcyBvZiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZAotCQkJcmV0dXJuIGFic29sdXRlRmlsZU5hbWU7Ci0JCX0KLQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHBhdGhzWzBdKTsJCS8vIGFsd2F5cyBhZGQgdGhlIGZpcnN0IGRpcmVjdG9yeSwgd2hpY2ggaXMgdXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyCi0KLQkJLy8gS2VlcCB0aGUgaW5kZXggb2YgaW5zZXJ0aW9uIGludG8gdGhlIHN0cmluZyBidWZmZXIKLQkJaW50IGluc2VydEluZGV4ID0gc2IubGVuZ3RoKCk7Ci0KLQkJc2IuYXBwZW5kKGZzKTsKLQkJc2IuYXBwZW5kKHBhdGhzW3BhdGhzLmxlbmd0aCAtIDFdKTsJCS8vIGFwcGVuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZSBsYXN0IGRpcmVjdG9yeQotCi0JCW1heExlbmd0aCAtPSA0OyAgICAgICAgICAgICAgICAgICAgICAvLyAtNCBmb3IgIi8uLi4iCi0KLQkJaW50IGN1cnJlbnRMZW5ndGggPSBzYi5sZW5ndGgoKSAtIDQ7IC8vIC00IGZvciAiLy4uLiIKLQkJaW50IGxlZnRJbmRleCA9IDE7ICAgICAgICAgICAgICAgICAgIC8vICAxIHRvIHNraXAgdGhlIHJvb3QgZGlyZWN0b3J5Ci0JCWludCByaWdodEluZGV4ID0gcGF0aHMubGVuZ3RoIC0gMjsgICAvLyAtMSBmb3IgdGhlIGZpbGUgbmFtZSBvciB0aGUgbGFzdCBkaXJlY3RvcnkKLQotCQlib29sZWFuIGNhbkFkZEZyb21MZWZ0ID0gdHJ1ZTsKLQkJYm9vbGVhbiBjYW5BZGRGcm9tUmlnaHQgPSB0cnVlOwotCi0JCS8vIEFkZCBlYWNoIGRpcmVjdG9yeSwgdGhlIGluc2VydGlvbiBpcyBnb2luZyBpbiBib3RoIGRpcmVjdGlvbjogbGVmdCBhbmQKLQkJLy8gcmlnaHQsIG9uY2UgYSBzaWRlIGNhbid0IGJlIGFkZGVkLCB0aGUgb3RoZXIgc2lkZSBpcyBzdGlsbCBjb250aW51aW5nCi0JCS8vIHVudGlsIGJvdGggY2FuJ3QgYWRkIGFueW1vcmUKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmICghY2FuQWRkRnJvbUxlZnQgJiYgIWNhbkFkZEZyb21SaWdodCkKLQkJCQlicmVhazsKLQotCQkJaWYgKGNhbkFkZEZyb21SaWdodCkgewotCQkJCVN0cmluZyByaWdodERpcmVjdG9yeSA9IHBhdGhzW3JpZ2h0SW5kZXhdOwotCQkJCWludCByaWdodExlbmd0aCA9IHJpZ2h0RGlyZWN0b3J5Lmxlbmd0aCgpOwotCi0JCQkJLy8gQWRkIHRoZSBkaXJlY3Rvcnkgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxvb3AKLQkJCQlpZiAoY3VycmVudExlbmd0aCArIHJpZ2h0TGVuZ3RoICsgMSA8PSBtYXhMZW5ndGgpIHsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCAgICAgZnMpOwotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCByaWdodERpcmVjdG9yeSk7Ci0KLQkJCQkJY3VycmVudExlbmd0aCArPSByaWdodExlbmd0aCArIDE7Ci0JCQkJCXJpZ2h0SW5kZXgtLTsKLQotCQkJCQkvLyBUaGUgcmlnaHQgc2lkZSBpcyBub3cgb3ZlcmxhcHBpbmcgdGhlIGxlZnQgc2lkZSwgdGhhdCBtZWFucwotCQkJCQkvLyB3ZSBjYW4ndCBhZGQgZnJvbSB0aGUgcmlnaHQgc2lkZSBhbnltb3JlCi0JCQkJCWlmIChsZWZ0SW5kZXggPj0gcmlnaHRJbmRleCkgewotCQkJCQkJY2FuQWRkRnJvbVJpZ2h0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljYW5BZGRGcm9tUmlnaHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChjYW5BZGRGcm9tTGVmdCkgewotCQkJCVN0cmluZyBsZWZ0RGlyZWN0b3J5ID0gcGF0aHNbbGVmdEluZGV4XTsKLQkJCQlpbnQgbGVmdExlbmd0aCA9IGxlZnREaXJlY3RvcnkubGVuZ3RoKCk7Ci0KLQkJCQkvLyBBZGQgdGhlIGRpcmVjdG9yeSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBsb29wCi0JCQkJaWYgKGN1cnJlbnRMZW5ndGggKyBsZWZ0TGVuZ3RoICsgMSA8PSBtYXhMZW5ndGgpIHsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCAgICAgZnMpOwotCQkJCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCBsZWZ0RGlyZWN0b3J5KTsKLQotCQkJCQlpbnNlcnRJbmRleCArPSBsZWZ0TGVuZ3RoICsgMTsKLQkJCQkJY3VycmVudExlbmd0aCArPSBsZWZ0TGVuZ3RoICsgMTsKLQkJCQkJbGVmdEluZGV4Kys7Ci0KLQkJCQkJLy8gVGhlIGxlZnQgc2lkZSBpcyBub3cgb3ZlcmxhcHBpbmcgdGhlIHJpZ2h0IHNpZGUsIHRoYXQgbWVhbnMKLQkJCQkJLy8gd2UgY2FuJ3QgYWRkIGZyb20gdGhlIGxlZnQgc2lkZSBhbnltb3JlCi0JCQkJCWlmIChsZWZ0SW5kZXggPj0gcmlnaHRJbmRleCkgewotCQkJCQkJY2FuQWRkRnJvbUxlZnQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWNhbkFkZEZyb21MZWZ0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGxlZnRJbmRleCA8PSByaWdodEluZGV4KSB7Ci0JCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXgsIGZzKTsKLQkJCXNiLmluc2VydChpbnNlcnRJbmRleCArIDEsICIuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHVzZXJIb21lRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIHVzZXIncyB0ZW1wb3JhcnkgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VyVGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRmlsZShDVVJSRU5UX1dPUktJTkdfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgZmlsZXMgdGhhdCBmaXQgdGhlIGZpbHRlci4KLQkgKiBGaWxlI2ZpbGVzKEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbHRlcihJdGVyYXRvcjxGaWxlPiBmaWxlcywgZmluYWwgRmlsZUZpbHRlciBmaWxlRmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBmaWxlRmlsdGVyLmFjY2VwdChuZXh0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWM6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoL2Zvby9iYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3M6Ci0JICogICAgICAgICBjb252ZXJ0VG9SZWxhdGl2ZUZpbGUoQzpcZm9vXGJhclxiYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5OyB0aGUgZGlyZWN0b3J5Ci0JICogKnNob3VsZCogYmUgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IHJlbGF0aXZlCi0JCWlmICggISBmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQlGaWxlIGNGaWxlID0gY2Fub25pY2FsRmlsZShmaWxlKTsKLQkJRmlsZSBjRGlyID0gY2Fub25pY2FsRmlsZShkaXIpOwotCi0JCS8vIHRoZSB0d28gYXJlIHRoZSBzYW1lIGRpcmVjdG9yeQotCQlpZiAoY0ZpbGUuZXF1YWxzKGNEaXIpKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGUoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJRmlsZVtdIGZpbGVQYXRoRmlsZXMgPSBwYXRoRmlsZXMoY0ZpbGUpOwotCQlGaWxlW10gZGlyUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNEaXIpOwotCi0JCS8vIFdpbmRvd3Mgb25seSAoPyk6IHRoZSByb290cyBhcmUgZGlmZmVyZW50IC0gZS5nLiBEOlwgdnMuIEM6XAotCQlpZiAoICEgZGlyUGF0aEZpbGVzWzBdLmVxdWFscyhmaWxlUGF0aEZpbGVzWzBdKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQotCQkvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlIHJvb3QgaXMgdGhlIHNhbWUsIG5vdyBmaW5kIGhvdyBtdWNoIGlzIGluIGNvbW1vbgotCQlpbnQgaSA9IDA7CQkvLyB0aGlzIHdpbGwgcG9pbnQgYXQgdGhlIGZpcnN0IG1pc2NvbXBhcmUKLQkJd2hpbGUgKChpIDwgZGlyUGF0aEZpbGVzLmxlbmd0aCkgJiYgKGkgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkpIHsKLQkJCWlmIChkaXJQYXRoRmlsZXNbaV0uZXF1YWxzKGZpbGVQYXRoRmlsZXNbaV0pKSB7Ci0JCQkJaSsrOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkvLyBzYXZlIG91ciBjdXJyZW50IHBvc2l0aW9uCi0JCWludCBmaXJzdE1pc21hdGNoID0gaTsKLQotCQkvLyBjaGVjayB3aGV0aGVyIHRoZSBmaWxlIGlzIEFCT1ZFIHRoZSBkaXJlY3Rvcnk6IC4uLy4uCi0JCWlmIChmaXJzdE1pc21hdGNoID09IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXJlbnRGaWxlKGRpclBhdGhGaWxlcy5sZW5ndGggLSBmaXJzdE1pc21hdGNoKTsKLQkJfQotCi0JCS8vIGJ1aWxkIGEgbmV3IGZpbGUgZnJvbSB0aGUgcGF0aCBiZXlvbmQgdGhlIG1hdGNoaW5nIHBvcnRpb25zCi0JCUZpbGUgZGlmZiA9IG5ldyBGaWxlKGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJd2hpbGUgKCsraSA8IGZpbGVQYXRoRmlsZXMubGVuZ3RoKSB7Ci0JCQlkaWZmID0gbmV3IEZpbGUoZGlmZiwgZmlsZVBhdGhGaWxlc1tpXS5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBCRUxPVyB0aGUgZGlyZWN0b3J5OiBzdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJaWYgKGZpcnN0TWlzbWF0Y2ggPT0gZGlyUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGRpZmY7Ci0JCX0KLQotCQkvLyB0aGUgZmlsZSBtdXN0IGJlIGEgUEVFUiBvZiB0aGUgZGlyZWN0b3J5OiAuLi8uLi9zdWJkaXIxL3N1YmRpcjIvZmlsZS5leHQKLQkJcmV0dXJuIG5ldyBGaWxlKHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCksIGRpZmYuZ2V0UGF0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEpCi0JICogICAgICAgICAgICAgPT4gYmFyL2Jhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZSBvciBpdCBjYW5ub3QgYmUgbWFkZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbmFsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBmaWxlcyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIHNwZWNpZmllZAotCSAqIGZpbGUuIEZvciBleGFtcGxlOgotCSAqICAgICBDOi9mb28vYmFyL2Jhei50eHQgPT4KLQkgKiAgICAgeyBDOi8sIEM6L2ZvbywgQzovZm9vL2JhciwgQzovZm9vL2Jhci9iYXoudHh0IH0KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlMaXN0PEZpbGU+IHBhdGggPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0JCWZvciAoRmlsZSBmID0gZmlsZTsgZiAhPSBudWxsOyBmID0gZi5nZXRQYXJlbnRGaWxlKCkpIHsKLQkJCXBhdGguYWRkKGYpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UocGF0aCk7Ci0JCXJldHVybiBwYXRoLnRvQXJyYXkobmV3IEZpbGVbcGF0aC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCAobm9uLXplcm8pIG51bWJlciBvZiByZWxhdGl2ZQotCSAqIGZpbGUgbmFtZXMsIGUuZy4geHh4KDMpID0+IC4uLy4uLy4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlpZiAobGVuIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgbGVuKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IGxlbiAtIDE7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0ID0gbmV3IEZpbGUocmVzdWx0LCAiLi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgL2ZvbykKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSwgQzpcZm9vKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgYWJzb2x1dGUsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIAotCSAqIE5COiBUaGlzIG1ldGhvZCBoYXMgYmVlbiB0ZXN0ZWQgb24gV2luZG93cyBhbmQgTGludXgsCi0JICogYnV0IG5vdCBNYWMgKGJ1dCB0aGUgTWFjIGlzIFVuaXgtYmFzZWQgdGhlc2UgZGF5cywgc28KLQkgKiBpdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLi4uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgRmlsZSBkaXIpIHsKLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlCi0JCWlmIChmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJcmV0dXJuIGZpbGU7CQkvLyByZXR1cm4gdW5jaGFuZ2VkCi0JCX0KLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGUobmV3IEZpbGUoZGlyLCBmaWxlLmdldFBhdGgoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYyAoQ1dEID0gL2Zvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IC9mb28vYmFyL2Jhei5qYXZhCi0JICogICAgIFdpbmRvd3MgKENXRCA9IEM6XGZvbyk6Ci0JICogICAgICAgICBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoYmFyL2Jhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IEM6XGZvb1xiYXJcYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEZpbGVUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GbGFnZ2VkT2JqZWN0UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9GbGFnZ2VkT2JqZWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDA2YzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmxhZ2dlZE9iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB0aGUKLSAqIHJlY2lwaWVudC4gSWYgdGhlIHZhbHVlIGlzIHNldCBhdCBhbnkgdGltZSBhZnRlciBjb25zdHJ1Y3Rpb24gb2YgdGhlCi0gKiByZWZlcmVuY2UsIHRoZSByZWZlcmVuY2UgaXMgbWFya2VkICJzZXQiLiBUaGlzIGFsbG93cyB0aGUgY2xpZW50IHRvCi0gKiBkZXRlY3Qgd2hldGhlciB0aGUgc2VydmVyL3JlY2lwaWVudCBldmVyIHNldCB0aGUgdmFsdWUsIGV2ZW4gaWYgaXQgcmVtYWlucwotICogdW5jaGFuZ2VkLiBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgd2hlbiB0aGUgdmFsdWUgY2FuIGJlIHNldCB0bwotICogPGNvZGU+bnVsbDwvY29kZT4uCi0gKiA8cD4KLSAqIFRoZSByZWZlcmVuY2UgY2FuIGJlIHNldCBtdWx0aXBsZSB0aW1lcywgYnV0IGl0IGNhbgotICogbmV2ZXIgYmUgInVuc2V0IiBvbmNlIGl0IGlzICJzZXQiLgotICovCi1wdWJsaWMgY2xhc3MgRmxhZ2dlZE9iamVjdFJlZmVyZW5jZTxWPgotCWV4dGVuZHMgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFY+Ci17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNldCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBGbGFnZ2VkT2JqZWN0UmVmZXJlbmNlKFYgdmFsdWUpIHsKLQkJc3VwZXIodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGbGFnZ2VkT2JqZWN0UmVmZXJlbmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNTZXQoKSB7Ci0JCXJldHVybiB0aGlzLnNldDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJdGhpcy5zZXQgPSB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBzID0gc3VwZXIudG9TdHJpbmcoKTsKLQkJcmV0dXJuICh0aGlzLnNldCkgPyAnKicgKyBzIDogczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9IYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTRiYmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UsIGJhY2tlZCBieSBhCi0gKiBoYXNoIHRhYmxlLiBJdCBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoZSBvcmRlcgotICogd2lsbCByZW1haW4gY29uc3RhbnQgb3ZlciB0aW1lLiBUaGlzIGNsYXNzIHBlcm1pdHMgdGhlIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG9mZmVycyBjb25zdGFudCB0aW1lIHBlcmZvcm1hbmNlIGZvciB0aGUgYmFzaWMgb3BlcmF0aW9ucwotICogKDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnJlbW92ZTwvY29kZT4sIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBhbmQKLSAqIDxjb2RlPnNpemU8L2NvZGU+KSwgYXNzdW1pbmcgdGhlIGhhc2ggZnVuY3Rpb24gZGlzcGVyc2VzIHRoZSBlbGVtZW50cwotICogcHJvcGVybHkgYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLjwvc3Ryb25nPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8ZW0+bXVzdDwvZW0+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSGFzaEJhZyguLi4pKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgY2xhc3MncyA8Y29kZT5pdGVyYXRvcjwvY29kZT4gbWV0aG9kIGFyZQotICogPGVtPmZhaWwtZmFzdDwvZW0+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LgotICogVGh1cywgaW4gdGhlIGZhY2Ugb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24sIHRoZSBpdGVyYXRvciBmYWlscyBxdWlja2x5Ci0gKiBhbmQgY2xlYW5seSwgcmF0aGVyIHRoYW4gcmlza2luZyBhcmJpdHJhcnksIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yIGF0Ci0gKiBhbiB1bmRldGVybWluZWQgdGltZSBpbiB0aGUgZnV0dXJlLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBhbiBpdGVyYXRvciBjYW5ub3QgYmUgZ3VhcmFudGVlZAotICogYXMgaXQgaXMsIGdlbmVyYWxseSBzcGVha2luZywgaW1wb3NzaWJsZSB0byBtYWtlIGFueSBoYXJkIGd1YXJhbnRlZXMgaW4gdGhlCi0gKiBwcmVzZW5jZSBvZiB1bnN5bmNocm9uaXplZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4gRmFpbC1mYXN0IGl0ZXJhdG9ycwotICogdGhyb3cgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4gb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KLSAqIFRoZXJlZm9yZSwgaXQgd291bGQgYmUgd3JvbmcgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgZGVwZW5kZWQgb24gdGhpcwotICogZXhjZXB0aW9uIGZvciBpdHMgY29ycmVjdG5lc3M6IDxlbT50aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGl0ZXJhdG9ycwotICogc2hvdWxkIGJlIHVzZWQgb25seSB0byBkZXRlY3QgYnVncy48L2VtPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIG1haW50YWluZWQgYnkgdGhlIGJhZwotICogCi0gKiBAc2VlIENvbGxlY3Rpb24KLSAqIEBzZWUgQmFnCi0gKiBAc2VlIFN5bmNocm9uaXplZEJhZwotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKiBAc2VlIElkZW50aXR5SGFzaEJhZwotICovCi1wdWJsaWMgY2xhc3MgSGFzaEJhZzxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBoYXNoIHRhYmxlLiBSZXNpemVkIGFzIG5lY2Vzc2FyeS4gTGVuZ3RoIE1VU1QgQWx3YXlzIGJlIGEgcG93ZXIgb2YgdHdvLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgc2l6ZSA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiBVTklRVUUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT4oaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTwvY29kZT4uKQotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLgotCSAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gKDEgPDwgMzApLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuNzVmOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxNiwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEBwYXJhbSBsb2FkRmFjdG9yIHRoZSBsb2FkIGZhY3RvcgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvIG9yIGlmIHRoZSBsb2FkIGZhY3RvciBpcyBub24tcG9zaXRpdmUKLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCB0cnVlKTsgIC8vIHRydWUgPSB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCXByaXZhdGUgSGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoTWF0aC5tYXgoKGludCkgKGMuc2l6ZSgpIC8gREVGQVVMVF9MT0FEX0ZBQ1RPUikgKyAxLCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpLCBERUZBVUxUX0xPQURfRkFDVE9SKTsKLQkJdGhpcy5hZGRBbGxfKGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGhhc2goT2JqZWN0IG8pIHsKLQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6IHRoaXMudHdlYWtIYXNoKG8uaGFzaENvZGUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWsgdGhlIHNwZWNpZmllZCBoYXNoLCB0byBkZWZlbmQgYWdhaW5zdCBwb29yIGltcGxlbWVudGF0aW9ucwotCSAqIG9mIHtAbGluayBPYmplY3QjaGFzaENvZGUoKX0uCi0JICovCi0JcHJpdmF0ZSBpbnQgdHdlYWtIYXNoKGludCBoKSB7Ci0JCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7Ci0JCXJldHVybiBoIF4gKGggPj4+IDcpIF4gKGggPj4+IDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleChpbnQgaGFzaCkgewotCQlyZXR1cm4gdGhpcy5pbmRleChoYXNoLCB0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoCi0JICogd2l0aGluIGEgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlpbnQgaW5kZXgoaW50IGhhc2gsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGhhc2ggJiAobGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGRBbGwoQ29sbGVjdGlvbil9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxfKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCWZvciAoRSBlIDogYykgewotCQkJdGhpcy5hZGRfKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0KX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvKSB7Ci0JCXRoaXMuYWRkXyhvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QsIGludCl9IGZvciBjb25zdHJ1Y3Rpb24sIGNsb25pbmcsIGFuZCBzZXJpYWxpemF0aW9uLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8sIGludCBjbnQpIHsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCU9iamVjdCBlbzsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmICgoKGVvID0gZS5vYmplY3QpID09IG8pIHx8ICgobyAhPSBudWxsKSAmJiBvLmVxdWFscyhlbykpKSkgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVt0aGlzLmluZGV4KGhhc2gpXTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRyeShvKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT4gZSA9IHRoaXMuZ2V0RW50cnkobyk7Ci0JCXJldHVybiAoZSA9PSBudWxsKSA/IDAgOiBlLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFJlaGFzaCB0aGUgY29udGVudHMgb2YgdGhlIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBiYWcgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKLQotCQlpZiAob2xkQ2FwYWNpdHkgPT0gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJdGhpcy50aHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBuZXdDYXBhY2l0eSA9IDIgKiBvbGRDYXBhY2l0eTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkVGFibGVbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChlLmhhc2gsIG5ld0NhcGFjaXR5KTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCi0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9ICkKLQlwcml2YXRlIEVudHJ5PEU+IGJ1aWxkRW50cnkoaW50IGhhc2gsIE9iamVjdCBvLCBpbnQgY250LCBFbnRyeSBuZXh0KSB7Ci0JCXJldHVybiBuZXcgRW50cnk8RT4oaGFzaCwgKEUpIG8sIGNudCwgKEVudHJ5PEU+KSBuZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZShvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWNudCA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQ7Ci0JCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRoaXMudGFibGVbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5zaXplIC09IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbGVhcnMgb3V0IGFsbCBvZiB0aGUgaGFzaCB0YWJsZSBidWNrZXRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJdGFiW2ldID0gbnVsbDsKLQkJfQotCQl0aGlzLnNpemUgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSGFzaEJhZzxFPiBjbG9uZSA9IChIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJY2xvbmUuc2l6ZSA9IDA7Ci0JCQljbG9uZS51bmlxdWVDb3VudCA9IDA7Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQljbG9uZS5hZGRBbGxfKHRoaXMpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBIYXNoIHRhYmxlIGNvbGxpc2lvbiBsaXN0IGVudHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEU+IGltcGxlbWVudHMgQmFnLkVudHJ5PEU+IHsKLQkJZmluYWwgaW50IGhhc2g7Ci0JCWZpbmFsIEUgb2JqZWN0OwotCQlpbnQgY291bnQ7Ci0JCUVudHJ5PEU+IG5leHQ7Ci0KLQkJRW50cnkoaW50IGhhc2gsIEUgb2JqZWN0LCBpbnQgY291bnQsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMuaGFzaCA9IGhhc2g7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXRoaXMubmV4dCA9IG5leHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBCYWcuRW50cnkgaW1wbGVtZW50YXRpb24KLQkJcHVibGljIEUgZ2V0RWxlbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgPD0gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm86ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGQgPSB0aGlzLmNvdW50OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJcmV0dXJuIG9sZDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEJhZy5FbnRyeTw/PikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJQmFnLkVudHJ5IGUgPSAoQmFnLkVudHJ5KSBvOwotCQkJcmV0dXJuICh0aGlzLmNvdW50ID09IGUuZ2V0Q291bnQoKSkgJiYKLQkJCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5vYmplY3QsIGUuZ2V0RWxlbWVudCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJRSBvID0gdGhpcy5vYmplY3Q7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKHRoaXMuY291bnQgKiBvLmhhc2hDb2RlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3QgKyAiPT4iICsgdGhpcy5jb3VudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ291bnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0JCUVtcHR5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlwcml2YXRlIGludCBpbmRleCA9IEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5Q291bnQgPSAwOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUhhc2hJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJRW50cnk8RT4gZSA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5Q291bnQrKzsKLQkJCWlmICh0aGlzLm5leHRFbnRyeUNvdW50ID09IGUuY291bnQpIHsKLQkJCQl0aGlzLm5leHRFbnRyeSA9IGUubmV4dDsKLQkJCQl0aGlzLm5leHRFbnRyeUNvdW50ID0gMDsKLQkJCX0KLQkJCXJldHVybiBlLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IEhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJCX0KLQkJCQkJCUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gc2xpZGUgYmFjayB0aGUgY291bnQgdG8gYWNjb3VudCBmb3IgdGhlIGp1c3QtcmVtb3ZlZCBlbGVtZW50Ci0JCQkJCQl0aGlzLm5leHRFbnRyeUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJSGFzaEJhZy50aGlzLnNpemUtLTsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEVudHJ5PEU+PiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUVudHJ5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IEhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQkvLyByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSGFzaEJhZy50aGlzLnNpemUgLT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5jb3VudDsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVW5pcXVlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCXByaXZhdGUgRW50cnlJdGVyYXRvciBlbnRyeUl0ZXJhdG9yID0gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLQkJCi0JCVVuaXF1ZUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnRyeUl0ZXJhdG9yLm5leHQoKS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLmVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIEJhZzw/PikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQmFnPEU+IGIgPSAoQmFnPEU+KSBvOwotCQlpZiAoYi5zaXplKCkgIT0gdGhpcy5zaXplKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoYi51bmlxdWVDb3VudCgpICE9IHRoaXMudW5pcXVlQ291bnQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBzdHJlYW0gPSBiLmVudHJpZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlCYWcuRW50cnk8RT4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKGVudHJ5LmdldENvdW50KCkgIT0gdGhpcy5jb3VudChlbnRyeS5nZXRFbGVtZW50KCkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoID0gMDsKLQkJZm9yIChFIG8gOiB0aGlzKSB7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJaCArPSBvLmhhc2hDb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGg7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBiYWcgdG8gYSBzdHJlYW0gKGkuZS4gc2VyaWFsaXplIGl0KS4KLQkgKgotCSAqIEBzZXJpYWxEYXRhIEVtaXQgdGhlIGNhcGFjaXR5IG9mIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IHRoZSBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzIGluIHRoZSBiYWcgKGludCksCi0JICogICAgIGZvbGxvd2VkIGJ5IGFsbCBvZiB0aGUgYmFnJ3MgZWxlbWVudHMgKGVhY2ggYW4gT2JqZWN0KSBhbmQKLQkgKiAgICAgdGhlaXIgY291bnRzIChlYWNoIGFuIGludCksIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgdGhlIHRocmVzaG9sZCwgbG9hZCBmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiBidWNrZXRzCi0JCXMud3JpdGVJbnQodGhpcy50YWJsZS5sZW5ndGgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCXMud3JpdGVJbnQodGhpcy51bmlxdWVDb3VudCk7Ci0KLQkJLy8gd3JpdGUgb3V0IGVsZW1lbnRzIGFuZCBjb3VudHMgKGFsdGVybmF0aW5nKQotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+IDApIHsKLQkJCWZvciAoRW50cnk8RT4gZW50cnkgOiB0aGlzLnRhYmxlKSB7Ci0JCQkJd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJcy53cml0ZU9iamVjdChlbnRyeS5vYmplY3QpOwotCQkJCQlzLndyaXRlSW50KGVudHJ5LmNvdW50KTsKLQkJCQkJZW50cnkgPSBlbnRyeS5uZXh0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogUmVjb25zdGl0dXRlIHRoZSBiYWcgZnJvbSBhIHN0cmVhbSAoaS5lLiBkZXNlcmlhbGl6ZSBpdCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgYnVja2V0cyBhbmQgYWxsb2NhdGUgdGhlIGJ1Y2tldCBhcnJheQotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHMucmVhZEludCgpKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJaW50IHVuaXF1ZSA9IHMucmVhZEludCgpOwotCi0JCS8vIHJlYWQgdGhlIGVsZW1lbnRzIGFuZCBjb3VudHMsIGFuZCBwdXQgdGhlIGVsZW1lbnRzIGluIHRoZSBiYWcKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bmlxdWU7IGkrKykgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlFIGVsZW1lbnQgPSAoRSkgcy5yZWFkT2JqZWN0KCk7Ci0JCQlpbnQgZWxlbWVudENvdW50ID0gcy5yZWFkSW50KCk7Ci0JCQl0aGlzLmFkZF8oZWxlbWVudCwgZWxlbWVudENvdW50KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyZmJjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JZGVudGl0eUhhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlIHdpdGggYQotICogaGFzaCB0YWJsZSwgdXNpbmcgb2JqZWN0LWlkZW50aXR5IGluIHBsYWNlIG9mIG9iamVjdC1lcXVhbGl0eSB3aGVuCi0gKiBjb21wYXJpbmcgZWxlbWVudHMuIEluIG90aGVyIHdvcmRzLCBpbiBhbiA8Y29kZT5JZGVudGl0eUhhc2hCYWc8L2NvZGU+LAotICogdHdvIG9iamVjdHMgPGNvZGU+bzE8L2NvZGU+IGFuZCA8Y29kZT5vMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQKLSAqIGVxdWFsIGlmIGFuZCBvbmx5IGlmIDxjb2RlPihvMSA9PSBvMik8L2NvZGU+LiAoSW4gbm9ybWFsIHtAbGluayBCYWd9Ci0gKiBpbXBsZW1lbnRhdGlvbnMgKGxpa2Uge0BsaW5rIEhhc2hCYWd9KSB0d28gb2JqZWN0cyA8Y29kZT5vMTwvY29kZT4KLSAqIGFuZCA8Y29kZT5vMjwvY29kZT4gYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgYW5kIG9ubHkgaWYKLSAqIDxjb2RlPihvMSA9PSBudWxsID8gbzIgPT0gbnVsbCA6IG8xLmVxdWFscyhvMikpPC9jb2RlPi4pCi0gKiA8cD4KLSAqIDxzdHJvbmc+Ci0gKiBUaGlzIGNsYXNzIGlzIDxlbT5ub3Q8L2VtPiBhIGdlbmVyYWwtcHVycG9zZSB7QGxpbmsgQmFnfQotICogaW1wbGVtZW50YXRpb24hIFdoaWxlIHRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlLCBpdAotICogaW50ZW50aW9uYWxseSB2aW9sYXRlcyB7QGxpbmsgQmFnfSdzIGdlbmVyYWwgY29udHJhY3QsIHdoaWNoIG1hbmRhdGVzIHRoZQotICogdXNlIG9mIHRoZSA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZCB3aGVuIGNvbXBhcmluZyBvYmplY3RzLiBUaGlzIGNsYXNzIGlzCi0gKiBkZXNpZ25lZCBmb3IgdXNlIG9ubHkgaW4gdGhlIHJhcmUgY2FzZXMgd2hlcmVpbiBvYmplY3QtaWRlbnRpdHkKLSAqIHNlbWFudGljcyBhcmUgcmVxdWlyZWQuCi0gKiA8L3N0cm9uZz4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYWtlcyBubyBndWFyYW50ZWVzIGFzIHRvIHRoZSBpdGVyYXRpb24gb3JkZXIgb2YKLSAqIHRoZSBiYWcncyBlbGVtZW50czsgaW4gcGFydGljdWxhciwgaXQgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIG9yZGVyCi0gKiB3aWxsIHJlbWFpbiBjb25zdGFudCBvdmVyIHRpbWUuIFRoaXMgY2xhc3MgcGVybWl0cyB0aGUgPGNvZGU+bnVsbDwvY29kZT4KLSAqIGVsZW1lbnQuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3Mgb2ZmZXJzIGNvbnN0YW50IHRpbWUgcGVyZm9ybWFuY2UgZm9yIHRoZSBiYXNpYyBvcGVyYXRpb25zCi0gKiAoPGNvZGU+YWRkPC9jb2RlPiwgPGNvZGU+cmVtb3ZlPC9jb2RlPiwgPGNvZGU+Y29udGFpbnM8L2NvZGU+IGFuZAotICogPGNvZGU+c2l6ZTwvY29kZT4pLCBhc3N1bWluZyB0aGUgc3lzdGVtIGlkZW50aXR5IGhhc2ggZnVuY3Rpb24KLSAqICh7QGxpbmsgU3lzdGVtI2lkZW50aXR5SGFzaENvZGUoT2JqZWN0KX0pIGRpc3BlcnNlcyBlbGVtZW50cyBwcm9wZXJseQotICogYW1vbmcgdGhlIGJ1Y2tldHMuIEl0ZXJhdGluZyBvdmVyIHRoaXMgYmFnIHJlcXVpcmVzIHRpbWUKLSAqIHByb3BvcnRpb25hbCB0byB0aGUgc3VtIG9mIHRoZSBiYWcncyBzaXplICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzKSBwbHVzIHRoZQotICogImNhcGFjaXR5IiBvZiB0aGUgYmFja2luZyBoYXNoIHRhYmxlICh0aGUgbnVtYmVyIG9mIGJ1Y2tldHMpLiBUaHVzLCBpdCBpcwotICogaW1wb3J0YW50IG5vdCB0byBzZXQgdGhlIGluaXRpYWwgY2FwYWNpdHkgdG9vIGhpZ2ggKG9yIHRoZSBsb2FkIGZhY3RvciB0b28KLSAqIGxvdykgaWYgaXRlcmF0aW9uIHBlcmZvcm1hbmNlIGlzIGltcG9ydGFudC4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLjwvc3Ryb25nPiBJZiBtdWx0aXBsZQotICogdGhyZWFkcyBhY2Nlc3MgYSBiYWcgY29uY3VycmVudGx5LCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzCi0gKiB0aGUgYmFnLCBpdCA8ZW0+bXVzdDwvZW0+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiBUaGlzIGlzIHR5cGljYWxseQotICogYWNjb21wbGlzaGVkIGJ5IHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzCi0gKiB0aGUgYmFnLiBJZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIHRoZSBiYWcgc2hvdWxkIGJlICJ3cmFwcGVkIiB1c2luZyB0aGUKLSAqIDxjb2RlPkNvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb248L2NvZGU+IG1ldGhvZC4gVGhpcyBpcwotICogYmVzdCBkb25lIGF0IGNyZWF0aW9uIHRpbWUsIHRvIHByZXZlbnQgYWNjaWRlbnRhbCB1bnN5bmNocm9uaXplZCBhY2Nlc3MKLSAqIHRvIHRoZSBiYWc6Ci0gKiA8cHJlPgotICogQ29sbGVjdGlvbiBjID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihuZXcgSWRlbnRpdHlIYXNoQmFnKC4uLikpOwotICogPC9wcmU+Ci0gKiA8cD4KLSAqIFRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBjbGFzcydzIDxjb2RlPml0ZXJhdG9yPC9jb2RlPiBtZXRob2QgYXJlCi0gKiA8ZW0+ZmFpbC1mYXN0PC9lbT46IGlmIHRoZSBiYWcgaXMgbW9kaWZpZWQgYXQgYW55IHRpbWUgYWZ0ZXIgdGhlIGl0ZXJhdG9yIGlzCi0gKiBjcmVhdGVkLCBpbiBhbnkgd2F5IGV4Y2VwdCB0aHJvdWdoIHRoZSBpdGVyYXRvcidzIG93biA8Y29kZT5yZW1vdmU8L2NvZGU+Ci0gKiBtZXRob2QsIHRoZSBpdGVyYXRvciB0aHJvd3MgYSB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0uCi0gKiBUaHVzLCBpbiB0aGUgZmFjZSBvZiBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiwgdGhlIGl0ZXJhdG9yIGZhaWxzIHF1aWNrbHkKLSAqIGFuZCBjbGVhbmx5LCByYXRoZXIgdGhhbiByaXNraW5nIGFyYml0cmFyeSwgbm9uLWRldGVybWluaXN0aWMgYmVoYXZpb3IgYXQKLSAqIGFuIHVuZGV0ZXJtaW5lZCB0aW1lIGluIHRoZSBmdXR1cmUuCi0gKiA8cD4KLSAqIE5vdGUgdGhhdCB0aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGFuIGl0ZXJhdG9yIGNhbm5vdCBiZSBndWFyYW50ZWVkCi0gKiBhcyBpdCBpcywgZ2VuZXJhbGx5IHNwZWFraW5nLCBpbXBvc3NpYmxlIHRvIG1ha2UgYW55IGhhcmQgZ3VhcmFudGVlcyBpbiB0aGUKLSAqIHByZXNlbmNlIG9mIHVuc3luY2hyb25pemVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLiBGYWlsLWZhc3QgaXRlcmF0b3JzCi0gKiB0aHJvdyA8Y29kZT5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uPC9jb2RlPiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotICogVGhlcmVmb3JlLCBpdCB3b3VsZCBiZSB3cm9uZyB0byB3cml0ZSBhIHByb2dyYW0gdGhhdCBkZXBlbmRlZCBvbiB0aGlzCi0gKiBleGNlcHRpb24gZm9yIGl0cyBjb3JyZWN0bmVzczogPGVtPnRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgaXRlcmF0b3JzCi0gKiBzaG91bGQgYmUgdXNlZCBvbmx5IHRvIGRldGVjdCBidWdzLjwvZW0+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgbWFpbnRhaW5lZCBieSB0aGUgYmFnCi0gKiAKLSAqIEBzZWUgQ29sbGVjdGlvbgotICogQHNlZSBCYWcKLSAqIEBzZWUgU3luY2hyb25pemVkQmFnCi0gKiBAc2VlCUNvbGxlY3Rpb25zI3N5bmNocm9uaXplZENvbGxlY3Rpb24oQ29sbGVjdGlvbikKLSAqIEBzZWUgSGFzaEJhZwotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248RT4KLQlpbXBsZW1lbnRzIEJhZzxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIGhhc2ggdGFibGUuIFJlc2l6ZWQgYXMgbmVjZXNzYXJ5LiBMZW5ndGggTVVTVCBBbHdheXMgYmUgYSBwb3dlciBvZiB0d28uICovCi0JdHJhbnNpZW50IEVudHJ5PEU+W10gdGFibGU7Ci0KLQkvKiogVGhlIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCBzaXplID0gMDsKLQotCS8qKiBUaGUgbnVtYmVyIG9mIFVOSVFVRSBlbnRyaWVzIGluIHRoZSBiYWcuICovCi0JdHJhbnNpZW50IGludCB1bmlxdWVDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgaGFzaCB0YWJsZSBpcyByZWhhc2hlZCB3aGVuIGl0cyBzaXplIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuIChUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGZpZWxkIGlzIDxjb2RlPihpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpPC9jb2RlPi4pCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBpbnQgdGhyZXNob2xkOwotCi0JLyoqCi0JICogVGhlIGxvYWQgZmFjdG9yIGZvciB0aGUgaGFzaCB0YWJsZS4KLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3I7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgYmFnIGhhcyBiZWVuIHN0cnVjdHVyYWxseSBtb2RpZmllZC4KLQkgKiBTdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbnMgYXJlIHRob3NlIHRoYXQgY2hhbmdlIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbgotCSAqIHRoZSBiYWcgb3Igb3RoZXJ3aXNlIG1vZGlmeSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIChlLmcuIHJlaGFzaCkuCi0JICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIG1ha2UgaXRlcmF0b3JzIG9uIHRoaXMgYmFnIGZhaWwtZmFzdC4KLQkgKgotCSAqIEBzZWUgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkgKi8KLQl0cmFuc2llbnQgaW50IG1vZENvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgLSBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkCi0JICogYnkgZWl0aGVyIG9mIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuCi0JICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAoMSA8PCAzMCkuCi0JCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgREVGQVVMVF9MT0FEX0ZBQ1RPUiA9IDAuNzVmOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUKLQkgKiBkZWZhdWx0IGNhcGFjaXR5LCB3aGljaCBpcyAxNiwgYW5kIGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoKSB7Ci0JCXRoaXMoREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGJhZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eQotCSAqIGFuZCB0aGUgZGVmYXVsdCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVybwotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgREVGQVVMVF9MT0FEX0ZBQ1RPUiwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGJhZyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3IKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVybyBvciBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbm9uLXBvc2l0aXZlCi0JICovCi0JcHVibGljIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCB0cnVlKTsgIC8vIHRydWUgPSB2YWxpZGF0ZSBwYXJtcwotCX0KLQotCXByaXZhdGUgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IsIGJvb2xlYW4gdmFsaWRhdGVQYXJtcykgewotCQlzdXBlcigpOwotCQlpbnQgY2FwYWNpdHkgPSBpbml0aWFsQ2FwYWNpdHk7Ci0JCWlmICh2YWxpZGF0ZVBhcm1zKSB7Ci0JCQlpZiAoY2FwYWNpdHkgPCAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBJbml0aWFsIENhcGFjaXR5OiAiICsgY2FwYWNpdHkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoY2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKSB7Ci0JCQkJY2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOwotCQkJfQotCQkJaWYgKGxvYWRGYWN0b3IgPD0gMCB8fCBGbG9hdC5pc05hTihsb2FkRmFjdG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgTG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQotCQkJLy8gZmluZCBhIHBvd2VyIG9mIDIgPj0gJ2luaXRpYWxDYXBhY2l0eScKLQkJCWNhcGFjaXR5ID0gMTsKLQkJCXdoaWxlIChjYXBhY2l0eSA8IGluaXRpYWxDYXBhY2l0eSkgewotCQkJCWNhcGFjaXR5IDw8PSAxOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5sb2FkRmFjdG9yID0gbG9hZEZhY3RvcjsKLQkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZShjYXBhY2l0eSk7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKGNhcGFjaXR5ICogbG9hZEZhY3Rvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGJhZyBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogY29sbGVjdGlvbi4gVGhlIGJhZydzIGxvYWQgZmFjdG9yIHdpbGwgYmUgdGhlIGRlZmF1bHQsIHdoaWNoIGlzIDAuNzUsCi0JICogYW5kIGl0cyBpbml0aWFsIGNhcGFjaXR5IHdpbGwgYmUgc3VmZmljaWVudCB0byBob2xkIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGMgdGhlIGNvbGxlY3Rpb24gd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIHBsYWNlZCBpbnRvIHRoaXMgYmFnLgotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKE1hdGgubWF4KChpbnQpIChjLnNpemUoKSAvIERFRkFVTFRfTE9BRF9GQUNUT1IpICsgMSwgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7Ci0JCXRoaXMuYWRkQWxsXyhjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXgoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXgodGhpcy5oYXNoKG8pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIGludCBoYXNoKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiB0aGlzLnR3ZWFrSGFzaChTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWsgdGhlIHNwZWNpZmllZCBoYXNoLgotCSAqLwotCXByaXZhdGUgaW50IHR3ZWFrSGFzaChpbnQgaCkgewotCQlyZXR1cm4gaDsKLS8vCQloIF49IChoID4+PiAyMCkgXiAoaCA+Pj4gMTIpOwotLy8JCXJldHVybiBoIF4gKGggPj4+IDcpIF4gKGggPj4+IDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleChpbnQgaGFzaCkgewotCQlyZXR1cm4gdGhpcy5pbmRleChoYXNoLCB0aGlzLnRhYmxlLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHNwZWNpZmllZCBoYXNoCi0JICogd2l0aGluIGEgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlpbnQgaW5kZXgoaW50IGhhc2gsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGhhc2ggJiAobGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGRBbGwoQ29sbGVjdGlvbil9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxfKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCWZvciAoRSBlIDogYykgewotCQkJdGhpcy5hZGRfKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0KX0gZm9yIGNvbnN0cnVjdGlvbiBhbmQgY2xvbmluZy4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvKSB7Ci0JCXRoaXMuYWRkXyhvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCB7QGxpbmsgI2FkZChPYmplY3QsIGludCl9IGZvciBjb25zdHJ1Y3Rpb24sIGNsb25pbmcsIGFuZCBzZXJpYWxpemF0aW9uLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkXyhFIG8sIGludCBjbnQpIHsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJdGhpcy5zaXplICs9IGNudDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGhpcy50YWJsZVtpbmRleF0pOwotCQl0aGlzLnRhYmxlW2luZGV4XSA9IGU7Ci0JCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSByZXR1cm5zIHRoZSBtYWludGFpbmVkIHNpemUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IGNvbXBhcmVzIHRoZSBtYWludGFpbmVkIHNpemUgdG8gemVyby4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5zaXplID09IDA7Ci0JfQotCi0JLyoqCi0JICogU2VhcmNoIGZvciB0aGUgb2JqZWN0J3MgZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwcml2YXRlIEVudHJ5PEU+IGdldEVudHJ5KE9iamVjdCBvKSB7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbdGhpcy5pbmRleChvKV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKGUub2JqZWN0ID09IG8pIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRyeShvKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJRW50cnk8RT4gZSA9IHRoaXMuZ2V0RW50cnkobyk7Ci0JCXJldHVybiAoZSA9PSBudWxsKSA/IDAgOiBlLmNvdW50OwotCX0KLQotCS8qKgotCSAqIFJlaGFzaCB0aGUgY29udGVudHMgb2YgdGhlIGJhZyBpbnRvIGEgbmV3IGhhc2ggdGFibGUKLQkgKiB3aXRoIGEgbGFyZ2VyIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUKLQkgKiBudW1iZXIgb2YgZGlmZmVyZW50IGVsZW1lbnRzIGluIHRoZSBiYWcgZXhjZWVkcyBpdHMKLQkgKiBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlaGFzaCgpIHsKLQkJRW50cnk8RT5bXSBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCWludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKLQotCQlpZiAob2xkQ2FwYWNpdHkgPT0gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJdGhpcy50aHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBuZXdDYXBhY2l0eSA9IDIgKiBvbGRDYXBhY2l0eTsKLQkJRW50cnk8RT5bXSBuZXdUYWJsZSA9IHRoaXMuYnVpbGRUYWJsZShuZXdDYXBhY2l0eSk7Ci0KLQkJZm9yIChpbnQgaSA9IG9sZENhcGFjaXR5OyBpLS0gPiAwOyApIHsKLQkJCWZvciAoRW50cnk8RT4gb2xkID0gb2xkVGFibGVbaV07IG9sZCAhPSBudWxsOyApIHsKLQkJCQlFbnRyeTxFPiBlID0gb2xkOwotCQkJCW9sZCA9IG9sZC5uZXh0OwotCi0JCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChlLmhhc2gsIG5ld0NhcGFjaXR5KTsKLQkJCQllLm5leHQgPSBuZXdUYWJsZVtpbmRleF07Ci0JCQkJbmV3VGFibGVbaW5kZXhdID0gZTsKLQkJCX0KLQkJfQotCi0JCXRoaXMudGFibGUgPSBuZXdUYWJsZTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAobmV3Q2FwYWNpdHkgKiB0aGlzLmxvYWRGYWN0b3IpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEVudHJ5PEU+W10gYnVpbGRUYWJsZShpbnQgY2FwYWNpdHkpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeVtjYXBhY2l0eV07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvLCBpbnQgY250KSB7Ci0JCWlmIChjbnQgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWludCBpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7Ci0KLQkJLy8gaWYgdGhlIG9iamVjdCBpcyBhbHJlYWR5IGluIHRoZSBiYWcsIHNpbXBseSBidW1wIGl0cyBjb3VudAotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZWhhc2ggdGhlIHRhYmxlIGlmIHdlIGFyZSBnb2luZyB0byBleGNlZWQgdGhlIHRocmVzaG9sZAotCQlpZiAodGhpcy51bmlxdWVDb3VudCA+PSB0aGlzLnRocmVzaG9sZCkgewotCQkJdGhpcy5yZWhhc2goKTsKLQkJCWluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsgIC8vIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZSBpbmRleAotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCi0JcHJpdmF0ZSBFbnRyeTxFPiBidWlsZEVudHJ5KGludCBoYXNoLCBPYmplY3QgbywgaW50IGNudCwgRW50cnkgbmV4dCkgewotCQlyZXR1cm4gbmV3IEVudHJ5PEU+KGhhc2gsIChFKSBvLCBjbnQsIChFbnRyeTxFPikgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmUobywgMSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBpZGVudGl0eSBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KG8pOwotCi0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbaW5kZXhdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJaWYgKGUub2JqZWN0ID09IG8pIHsKLQkJCQl0aGlzLm1vZENvdW50Kys7Ci0JCQkJY250ID0gKGNudCA8IGUuY291bnQpID8gY250IDogZS5jb3VudDsKLQkJCQllLmNvdW50IC09IGNudDsKLQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3QgZWxlbWVudChzKSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJdGhpcy50YWJsZVtpbmRleF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJdGhpcy51bmlxdWVDb3VudC0tOwotCQkJCX0KLQkJCQl0aGlzLnNpemUgLT0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBvYmplY3QtaWRlbnRpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0JICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gc3VwZXIucmVtb3ZlQWxsKG5ldyBJZGVudGl0eUhhc2hCYWc8T2JqZWN0PihjKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIG9iamVjdC1pZGVudGl0eSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgZWxlbWVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBzdXBlci5yZXRhaW5BbGwobmV3IElkZW50aXR5SGFzaEJhZzxPYmplY3Q+KGMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjbGVhcnMgb3V0IGFsbCBvZiB0aGUgaGFzaCB0YWJsZSBidWNrZXRzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlFbnRyeTxFPltdIHRhYiA9IHRoaXMudGFibGU7Ci0JCXRoaXMubW9kQ291bnQrKzsKLQkJZm9yIChpbnQgaSA9IHRhYi5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJdGFiW2ldID0gbnVsbDsKLQkJfQotCQl0aGlzLnNpemUgPSAwOwotCQl0aGlzLnVuaXF1ZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgYmFnOiB0aGUgZWxlbWVudHMKLQkgKiB0aGVtc2VsdmVzIGFyZSBub3QgY2xvbmVkLgotCSAqCi0JICogQHJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlJZGVudGl0eUhhc2hCYWc8RT4gY2xvbmUgPSAoSWRlbnRpdHlIYXNoQmFnPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJY2xvbmUudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUodGhpcy50YWJsZS5sZW5ndGgpOwotCQkJY2xvbmUuc2l6ZSA9IDA7Ci0JCQljbG9uZS51bmlxdWVDb3VudCA9IDA7Ci0JCQljbG9uZS5tb2RDb3VudCA9IDA7Ci0JCQljbG9uZS5hZGRBbGxfKHRoaXMpOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBIYXNoIHRhYmxlIGNvbGxpc2lvbiBsaXN0IGVudHJ5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEU+IGltcGxlbWVudHMgQmFnLkVudHJ5PEU+IHsKLQkJZmluYWwgaW50IGhhc2g7ICAvLyBjYWNoZSB0aGUgaGFzaCBmb3IgcmUtaGFzaGVzCi0JCWZpbmFsIEUgb2JqZWN0OwotCQlpbnQgY291bnQ7Ci0JCUVudHJ5PEU+IG5leHQ7Ci0KLQkJRW50cnkoaW50IGhhc2gsIEUgb2JqZWN0LCBpbnQgY291bnQsIEVudHJ5PEU+IG5leHQpIHsKLQkJCXRoaXMuaGFzaCA9IGhhc2g7Ci0JCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXRoaXMubmV4dCA9IG5leHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBCYWcuRW50cnkgaW1wbGVtZW50YXRpb24KLQkJcHVibGljIEUgZ2V0RWxlbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgPD0gMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm86ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGQgPSB0aGlzLmNvdW50OwotCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJcmV0dXJuIG9sZDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmICggISAobyBpbnN0YW5jZW9mIEJhZy5FbnRyeTw/PikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJQmFnLkVudHJ5IGUgPSAoQmFnLkVudHJ5KSBvOwotCQkJcmV0dXJuICh0aGlzLm9iamVjdCA9PSBlLmdldEVsZW1lbnQoKSkKLQkJCQkJJiYgKHRoaXMuY291bnQgPT0gZS5nZXRDb3VudCgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJRSBvID0gdGhpcy5vYmplY3Q7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogKHRoaXMuY291bnQgKiBvLmhhc2hDb2RlKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3QgKyAiPT4iICsgdGhpcy5jb3VudDsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgSGFzaEl0ZXJhdG9yKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IFVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ291bnQ7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBFbXB0eSBpdGVyYXRvciB0aGF0IGRvZXMganVzdCBhYm91dCBub3RoaW5nLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3IgRU1QVFlfSVRFUkFUT1IgPSBuZXcgRW1wdHlJdGVyYXRvcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCi0JCUVtcHR5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgSGFzaEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlwcml2YXRlIGludCBpbmRleCA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aDsJLy8gc3RhcnQgYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUKLQkJcHJpdmF0ZSBFbnRyeTxFPiBuZXh0RW50cnkgPSBudWxsOwotCQlwcml2YXRlIGludCBuZXh0RW50cnlDb3VudCA9IDA7Ci0JCXByaXZhdGUgRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlIYXNoSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFIG5leHQoKSB7Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGV0ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeUNvdW50Kys7Ci0JCQlpZiAodGhpcy5uZXh0RW50cnlDb3VudCA9PSBlLmNvdW50KSB7Ci0JCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQkJdGhpcy5uZXh0RW50cnlDb3VudCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IElkZW50aXR5SGFzaEJhZy50aGlzLmluZGV4KHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCwgSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCWUuY291bnQtLTsKLQkJCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IG9uZSwgcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gc2xpZGUgYmFjayB0aGUgY291bnQgdG8gYWNjb3VudCBmb3IgdGhlIGp1c3QtcmVtb3ZlZCBlbGVtZW50Ci0JCQkJCQl0aGlzLm5leHRFbnRyeUNvdW50LS07Ci0JCQkJCX0KLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMuc2l6ZS0tOwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8RT4+IHsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50OwotCi0JCUVudHJ5SXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZSA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZSA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZTsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJcmV0dXJuIGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFbnRyeTxFPiBuZXh0KCkgewotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQlyZXR1cm4gZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQgIT0gdGhpcy5leHBlY3RlZE1vZENvdW50KSB7Ci0JCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCWludCBzbG90ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGgpOwotCQkJZm9yIChFbnRyeTxFPiBlID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0sIHByZXYgPSBudWxsOyBlICE9IG51bGw7IHByZXYgPSBlLCBlID0gZS5uZXh0KSB7Ci0JCQkJaWYgKGUgPT0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSkgewotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy51bmlxdWVDb3VudC0tOwotCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy5zaXplIC09IHRoaXMubGFzdFJldHVybmVkRW50cnkuY291bnQ7Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlwcml2YXRlIEVudHJ5SXRlcmF0b3IgZW50cnlJdGVyYXRvciA9IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JCQotCQlVbmlxdWVJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5uZXh0KCkub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5lbnRyeUl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0KLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSWRlbnRpdHlIYXNoQmFnPD8+KSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUlkZW50aXR5SGFzaEJhZzxFPiBiID0gKElkZW50aXR5SGFzaEJhZzxFPikgbzsKLQkJCWlmIChiLnNpemUoKSAhPSB0aGlzLnNpemUoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChiLnVuaXF1ZUNvdW50KCkgIT0gdGhpcy51bmlxdWVDb3VudCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjxCYWcuRW50cnk8RT4+IHN0cmVhbSA9IGIuZW50cmllcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlCYWcuRW50cnk8RT4gZW50cnkgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChlbnRyeS5nZXRDb3VudCgpICE9IHRoaXMuY291bnQoZW50cnkuZ2V0RWxlbWVudCgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5lcXVhbHNfKG8pOwotCQl9Ci0vLwkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQmFnPD8+KSB7Ci0vLwkJCS8vIGhtbW0uLi4KLS8vCQkJcmV0dXJuIG5ldyBIYXNoQmFnPE9iamVjdD4odGhpcykuZXF1YWxzKG8pOwotLy8JCX0gZWxzZSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVxdWFsc18oT2JqZWN0IG8pIHsKLQkJLy8gaG1tbS4uLgotCQlyZXR1cm4gKG8gaW5zdGFuY2VvZiBCYWc8Pz4pICYmIAotCQkJCW5ldyBIYXNoQmFnPE9iamVjdD4odGhpcykuZXF1YWxzKG8pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCBoID0gMDsKLQkJZm9yIChFIG8gOiB0aGlzKSB7Ci0JCQloICs9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pOwotCQl9Ci0JCXJldHVybiBoOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoaXMgYmFnIHRvIGEgc3RyZWFtIChpLmUuIHNlcmlhbGl6ZSBpdCkuCi0JICoKLQkgKiBAc2VyaWFsRGF0YSBFbWl0IHRoZSBjYXBhY2l0eSBvZiB0aGUgYmFnIChpbnQpLAotCSAqICAgICBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGUgYmFnIChpbnQpLAotCSAqICAgICBmb2xsb3dlZCBieSBhbGwgb2YgdGhlIGJhZydzIGVsZW1lbnRzIChlYWNoIGFuIE9iamVjdCkgYW5kCi0JICogICAgIHRoZWlyIGNvdW50cyAoZWFjaCBhbiBpbnQpLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCS8vIHdyaXRlIG91dCBlbGVtZW50cyBhbmQgY291bnRzIChhbHRlcm5hdGluZykKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPiAwKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGhpcy50YWJsZSkgewotCQkJCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQkJcy53cml0ZUludChlbnRyeS5jb3VudCk7Ci0JCQkJCWVudHJ5ID0gZW50cnkubmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHJlYWQgaW4gdGhlIHRocmVzaG9sZCwgbG9hZGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIGFsbG9jYXRlIHRoZSBidWNrZXQgYXJyYXkKLQkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZShzLnJlYWRJbnQoKSk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCWludCB1bmlxdWUgPSBzLnJlYWRJbnQoKTsKLQotCQkvLyByZWFkIHRoZSBlbGVtZW50cyBhbmQgY291bnRzLCBhbmQgcHV0IHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlOyBpKyspIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJRSBlbGVtZW50ID0gKEUpIHMucmVhZE9iamVjdCgpOwotCQkJaW50IGVsZW1lbnRDb3VudCA9IHMucmVhZEludCgpOwotCQkJdGhpcy5hZGRfKGVsZW1lbnQsIGVsZW1lbnRDb3VudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTg5YjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGFuIGludGVnZXIgdGhhdCBjYW4gYmUgY2hhbmdlZCBieQotICogdGhlIHJlY2lwaWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRSZWZlcmVuY2UKLQlleHRlbmRzIFJlYWRPbmx5SW50UmVmZXJlbmNlCi17Ci0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JaW50IHNldFZhbHVlKGludCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgdG8gemVyby4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWludCBzZXRaZXJvKCk7Ci0KLQkvKioKLQkgKiBJbmNyZW1lbnQgYW5kIHJldHVybiB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlpbnQgaW5jcmVtZW50KCk7Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnQgYW5kIHJldHVybiB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlpbnQgZGVjcmVtZW50KCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjYzYThlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggdGhlIEpEQkMgQVBJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSkRCQ1Rvb2xzIHsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUphdmFUb0pEQkNUeXBlTWFwcGluZyBtYXBwaW5nID0gamF2YVRvSkRCQ1R5cGVNYXBwaW5nKGNsYXNzTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkRCQ19UWVBFIDogbWFwcGluZy5nZXRKREJDVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJcmV0dXJuIGpkYmNUeXBlRm9yQ2xhc3NOYW1lZChqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBqZGJjVG9KYXZhVHlwZU1hcHBpbmcoamRiY1R5cGVOYW1lKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gREVGQVVMVF9KQVZBX1RZUEUgOiBtYXBwaW5nLmdldEphdmFUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvcihKREJDVHlwZSBqZGJjVHlwZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3JKREJDVHlwZU5hbWVkKGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEpEQkMgdHlwZS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZSBqYXZhVHlwZUZvckpEQkNUeXBlQ29kZShpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCXJldHVybiBqYXZhVHlwZUZvcihKREJDVHlwZS50eXBlKGpkYmNUeXBlQ29kZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBzdHVmZiAqKioqKioqKioqCi0KLQotCS8vICoqKioqKioqKiogSkRCQyA9PiBKYXZhICoqKioqKioqKioKLQotCS8qKgotCSAqIEpEQkMgPT4gSmF2YSB0eXBlIG1hcHBpbmdzLCBrZXllZCBieSBKREJDIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gSkRCQ19UT19KQVZBX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBERUZBVUxUX0pBVkFfVFlQRSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsgIC8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCi0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgamRiY1RvSmF2YVR5cGVNYXBwaW5nKFN0cmluZyBqZGJjVHlwZU5hbWUpIHsKLQkJcmV0dXJuIGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKS5nZXQoamRiY1R5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gamRiY1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJaWYgKEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID09IG51bGwpIHsKLQkJCUpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTID0gYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4oKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKG1hcHBpbmdzKTsKLQkJcmV0dXJuIG1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIGhhcmQgY29kZSB0aGUgZGVmYXVsdCBtYXBwaW5ncyBmcm9tIHRoZSBKREJDIHR5cGVzIHRvIHRoZQotCSAqIGFwcHJvcHJpYXRlIEphdmEgdHlwZXMKLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICogc2VlICJKREJDIDMuMCBTcGVjaWZpY2F0aW9uIiBBcHBlbmRpeCBCCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdzVG8oSGFzaE1hcDxTdHJpbmcsIEpEQkNUb0phdmFUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQVJSQVksIGphdmEuc3FsLkFycmF5LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJJR0lOVCwgbG9uZy5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSVQsIGJvb2xlYW4uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQkxPQiwgamF2YS5zcWwuQmxvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CT09MRUFOLCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQ0xPQiwgamF2YS5zcWwuQ2xvYi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRBTElOSywgamF2YS5uZXQuVVJMLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRBVEUsIGphdmEuc3FsLkRhdGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREVDSU1BTCwgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRElTVElOQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5ET1VCTEUsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5GTE9BVCwgZG91YmxlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLklOVEVHRVIsIGludC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5KQVZBX09CSkVDVCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOyAgLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkxPTkdWQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0vLwkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVMTCwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5OVU1FUklDLCBqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5PVEhFUiwgamF2YS5sYW5nLk9iamVjdC5jbGFzcywgbWFwcGluZ3MpOwkvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVBTCwgZmxvYXQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuUkVGLCBqYXZhLnNxbC5SZWYuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuU01BTExJTlQsIHNob3J0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNUUlVDVCwgamF2YS5zcWwuU3RydWN0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUUsIGphdmEuc3FsLlRpbWUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElNRVNUQU1QLCBqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVElOWUlOVCwgYnl0ZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJCSU5BUlksIGJ5dGVbXS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5WQVJDSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhpbnQgamRiY1R5cGVDb2RlLCBDbGFzczw/PiBqYXZhQ2xhc3MsIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCUpEQkNUeXBlIGpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpOwotCQlPYmplY3QgcHJldiA9IG1hcHBpbmdzLnB1dChqZGJjVHlwZS5uYW1lKCksIGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlLCBqYXZhQ2xhc3MpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEpEQkMgdHlwZTogIiArIGpkYmNUeXBlLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEpEQkNUb0phdmFUeXBlTWFwcGluZyBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZyhKREJDVHlwZSBqZGJjVHlwZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXcgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlLCBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgPT4gSkRCQyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKYXZhID0+IEpEQkMgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSmF2YSBjbGFzcyBuYW1lIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0IikKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBKQVZBX1RPX0pEQkNfVFlQRV9NQVBQSU5HUzsgIC8vIHBzZXVkbyAnZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpEQkNUeXBlIERFRkFVTFRfSkRCQ19UWVBFID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsgIC8vIFRPRE8gVkFSQ0hBUiBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIGphdmFUb0pEQkNUeXBlTWFwcGluZyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkuZ2V0KGNsYXNzTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IGphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKQVZBX1RPX0pEQkNfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKQVZBX1RPX0pEQkNfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKQVZBX1RPX0pEQkNfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSmF2YSB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKREJDIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIHByaW1pdGl2ZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYm9vbGVhbi5jbGFzcywgVHlwZXMuQklULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJ5dGUuY2xhc3MsIFR5cGVzLlRJTllJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oZG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oZmxvYXQuY2xhc3MsIFR5cGVzLlJFQUwsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oaW50LmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGxvbmcuY2xhc3MsIFR5cGVzLkJJR0lOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhzaG9ydC5jbGFzcywgVHlwZXMuU01BTExJTlQsIG1hcHBpbmdzKTsKLQotCQkvLyByZWZlcmVuY2UgY2xhc3NlcwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcywgVHlwZXMuQklULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5CeXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Eb3VibGUuY2xhc3MsIFR5cGVzLkRPVUJMRSwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRmxvYXQuY2xhc3MsIFR5cGVzLlJFQUwsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkludGVnZXIuY2xhc3MsIFR5cGVzLklOVEVHRVIsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkxvbmcuY2xhc3MsIFR5cGVzLkJJR0lOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIFR5cGVzLlZBUkNIQVIsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIFR5cGVzLk5VTUVSSUMsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5uZXQuVVJMLmNsYXNzLCBUeXBlcy5EQVRBTElOSywgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5BcnJheS5jbGFzcywgVHlwZXMuQVJSQVksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQmxvYi5jbGFzcywgVHlwZXMuQkxPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5DbG9iLmNsYXNzLCBUeXBlcy5DTE9CLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkRhdGUuY2xhc3MsIFR5cGVzLkRBVEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuUmVmLmNsYXNzLCBUeXBlcy5SRUYsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuU3RydWN0LmNsYXNzLCBUeXBlcy5TVFJVQ1QsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZS5jbGFzcywgVHlwZXMuVElNRSwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MsIFR5cGVzLlRJTUVTVEFNUCwgbWFwcGluZ3MpOwotCi0JCS8vIGFycmF5cwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlW10uY2xhc3MsIFR5cGVzLlZBUkJJTkFSWSwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKENsYXNzPD8+IGphdmFDbGFzcywgaW50IGpkYmNUeXBlQ29kZSwgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gbWFwcGluZ3MpIHsKLQkJLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMKLQkJT2JqZWN0IHByZXYgPSBtYXBwaW5ncy5wdXQoamF2YUNsYXNzLmdldE5hbWUoKSwgYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmcoamF2YUNsYXNzLCBqZGJjVHlwZUNvZGUpKTsKLQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZHVwbGljYXRlIEphdmEgY2xhc3M6ICIgKyAoKEphdmFUb0pEQkNUeXBlTWFwcGluZykgcHJldikuZ2V0SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKENsYXNzPD8+IGphdmFDbGFzcywgaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gbmV3IEphdmFUb0pEQkNUeXBlTWFwcGluZyhuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKSwgSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEpEQkNUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIEpEQkMgPT4gSmF2YQotCSAqLwotCXN0YXRpYyBjbGFzcyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgewotCQlwcml2YXRlIGZpbmFsIEpEQkNUeXBlIGpkYmNUeXBlOwotCQlwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOwotCi0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyhKREJDVHlwZSBqZGJjVHlwZSwgSmF2YVR5cGUgamF2YVR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmpkYmNUeXBlID0gamRiY1R5cGU7Ci0JCQl0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhpbnQgamRiY1R5cGVDb2RlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZS5jb2RlKCkgPT0gamRiY1R5cGVDb2RlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZS5uYW1lKCkuZXF1YWxzKGpkYmNUeXBlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKEpEQkNUeXBlIHR5cGUpIHsKLQkJCXJldHVybiB0aGlzLmpkYmNUeXBlID09IHR5cGU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJdGhpcy5hcHBlbmRUbyhzYik7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXRoaXMuamRiY1R5cGUuYXBwZW5kVG8oc2IpOwotCQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuamF2YVR5cGUuYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEphdmEgPT4gSkRCQwotCSAqLwotCXN0YXRpYyBjbGFzcyBKYXZhVG9KREJDVHlwZU1hcHBpbmcgewotCQlwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOwotCQlwcml2YXRlIGZpbmFsIEpEQkNUeXBlIGpkYmNUeXBlOwotCi0JCUphdmFUb0pEQkNUeXBlTWFwcGluZyhKYXZhVHlwZSBqYXZhVHlwZSwgSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7Ci0JCQl0aGlzLmpkYmNUeXBlID0gamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBKREJDVHlwZSBnZXRKREJDVHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKYXZhVHlwZSBqdCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGUuZXF1YWxzKGp0KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhTdHJpbmcgamF2YUNsYXNzTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzc05hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3MpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmphdmFUeXBlLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuamRiY1R5cGUuYXBwZW5kVG8oc2IpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmZkMjgzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0pEQkNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnNxbC5UeXBlczsKLQotLyoqCi0gKiBBc3NvY2lhdGUgdGhlIEphdmEgY29uc3RhbnQgYW5kIHRoZSBKREJDIHR5cGUgbmFtZS4KLSAqIFRoZXNlIGFyZSBkZXJpdmVkIGZyb20gamF2YS5zcWwuVHlwZXMuCi0gKiAKLSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUeXBlCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogdGhlIGNvbnN0YW50IG5hbWUgKGUuZy4gVkFSQ0hBUikKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogdGhlIEpEQkMgY29kZSB1c2VkIGJ5IEpEQkMgZHJpdmVycwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGNvZGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSkRCQyB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCB0eXBlIGNvZGUuCi0JICogVGhpcyBpcyBwcml2YXRlIGJlY2F1c2UgYWxsIHRoZSBwb3NzaWJsZSBKREJDIHR5cGVzIGFyZSBidWlsdCBhbmQKLQkgKiBzdG9yZWQgaW4gdGhlIHN0YXRpYyBhcnJheSBUWVBFUy4KLQkgKiBAc2VlICN0eXBlcygpCi0JICovCi0JcHJpdmF0ZSBKREJDVHlwZShTdHJpbmcgbmFtZSwgaW50IGNvZGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5jb2RlID0gY29kZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgY29kZSwgYXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCXRoaXMuYXBwZW5kVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpEQkNUeXBlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChKREJDVHlwZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIHN0dWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIGFsbCB0aGUgSkRCQyB0eXBlIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKREJDVHlwZVtdIFRZUEVTOwkJLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpEQkNUeXBlW10gdHlwZXMoKSB7Ci0JCWlmIChUWVBFUyA9PSBudWxsKSB7Ci0JCQlUWVBFUyA9IGJ1aWxkVHlwZXMoKTsKLQkJfQotCQlyZXR1cm4gVFlQRVM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBjb2RlIChlLmcuIFR5cGVzLlZBUkNIQVIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoaW50IGNvZGUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLmNvZGUoKSA9PSBjb2RlKSB7Ci0JCQkJcmV0dXJuIHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSkRCQyB0eXBlIGNvZGU6ICIgKyBjb2RlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSAoZS5nLiAiVkFSQ0hBUiIpLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIHR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IHR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSB0eXBlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKHR5cGVzW2ldLm5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHlwZXNbaV07Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKREJDIHR5cGUgbmFtZTogIiArIG5hbWUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogYnVpbGQgdXAgdGhlIEpEQkMgdHlwZXMgdmlhIHJlZmxlY3Rpb24KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1R5cGVbXSBidWlsZFR5cGVzKCkgewotCQlGaWVsZFtdIGZpZWxkcyA9IFR5cGVzLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCk7Ci0JCWludCBsZW4gPSBmaWVsZHMubGVuZ3RoOwotCQlKREJDVHlwZVtdIHR5cGVzID0gbmV3IEpEQkNUeXBlW2xlbl07Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJaW50IGNvZGU7Ci0JCQl0cnkgewotCQkJCWNvZGUgPSAoKEludGVnZXIpIGZpZWxkc1tpXS5nZXQobnVsbCkpLmludFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwkvLyBzaG91bGRuJ3QgaGFwcGVuLi4uCi0JCQl9Ci0JCQl0eXBlc1tpXSA9IG5ldyBKREJDVHlwZShuYW1lLCBjb2RlKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9LZXllZFNldC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y0NzFmNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9LZXllZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1haW50YWlucyBhIHtAbGluayBTZXR9IG9mIGl0ZW1zLCBhbmQgYSB7QGxpbmsgTWFwfSBvZiBrZXlzIHRvIHRob3NlIGl0ZW1zLgotICogQW4gaXRlbSBtYXkgaGF2ZSBtdWx0aXBsZSBrZXlzLCBidXQgYW4gaXRlbSBtYXkgaGF2ZSBubyBrZXlzIGFuZCByZW1haW4gaW4gdGhlIHNldC4gIE9uY2UgYW4gCi0gKiBpdGVtJ3MgbGFzdCBrZXkgaXMgcmVtb3ZlZCwgdGhlIGl0ZW0gaXMgYWxzbyByZW1vdmVkLgotICovCi1wdWJsaWMgY2xhc3MgS2V5ZWRTZXQ8SywgVj4gewotCQotCXByaXZhdGUgZmluYWwgU2V0PFY+IGl0ZW1TZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBTZXQ8Vj4gdW5tb2RpZmlhYmxlSXRlbVNldDsKLQlwcml2YXRlIGZpbmFsIE1hcDxLLFY+IG1hcDsKLQkKLQkKLQlwdWJsaWMgS2V5ZWRTZXQoKSB7Ci0JCXRoaXMuaXRlbVNldCA9IG5ldyBIYXNoU2V0PFY+KCk7Ci0JCXRoaXMudW5tb2RpZmlhYmxlSXRlbVNldCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0aGlzLml0ZW1TZXQpOwotCQl0aGlzLm1hcCA9IG5ldyBIYXNoTWFwPEssVj4oKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIHVubW9kaWZpYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2V0IG9mIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBTZXQ8Vj4gZ2V0SXRlbVNldCgpIHsKLQkJcmV0dXJuIHRoaXMudW5tb2RpZmlhYmxlSXRlbVNldDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LgotCSAqLwotCXB1YmxpYyBWIGdldEl0ZW0oSyBrZXkpIHsKLQkJcmV0dXJuIHRoaXMubWFwLmdldChrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbiBpdGVtIGlzIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KEsga2V5KSB7Ci0JCXJldHVybiB0aGlzLm1hcC5jb250YWluc0tleShrZXkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgaXRlbSBpcyBzdG9yZWQgdW5kZXIgKmFueSoga2V5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zSXRlbShWIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuaXRlbVNldC5jb250YWlucyhpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGFuIGl0ZW0gdG8gYmUgc3RvcmVkIHVuZGVyIHRoZSBnaXZlbiBrZXkuICAKLQkgKiBUaGUgaXRlbSBtdXN0IG5vdCBhbHJlYWR5IGJlIHN0b3JlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJdGVtKEsga2V5LCBWIGl0ZW0pIHsKLQkJYWRkSXRlbShpdGVtKTsKLQkJYWRkS2V5KGtleSwgaXRlbSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRJdGVtKFYgaXRlbSkgewotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5pdGVtU2V0LmFkZChpdGVtKTsKLQl9Ci0JCi0JLyoqIAotCSAqIEFkZCBhbiBhZGRpdGlvbmFsIGtleSB0byBhbiBpdGVtIGFscmVhZHkgc3RvcmVkIHVuZGVyIGFuIGFsdGVybmF0ZSBrZXkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5KEsga2V5LCBWIGl0ZW0pIHsKLQkJaWYgKGtleSA9PSBudWxsIHx8IGl0ZW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICghIHRoaXMuaXRlbVNldC5jb250YWlucyhpdGVtKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubWFwLnB1dChrZXksIGl0ZW0pOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGdpdmVuIGl0ZW0gYW5kIHJlbW92ZSBhbnkga2V5LXRvLWl0ZW0gbWFwcGluZyBpdCBtYXkgaGF2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtKFYgaXRlbSkgewotCQlpZiAodGhpcy5pdGVtU2V0LnJlbW92ZShpdGVtKSkgewotCQkJZm9yIChNYXAuRW50cnk8SyxWPiBlbnRyeSA6IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMubWFwLmVudHJ5U2V0KCkpKSB7Ci0JCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgPT0gaXRlbSkgewotCQkJCQltYXAucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUga2V5LXRvLWl0ZW0gbWFwcGluZyBmb3IgdGhlIGdpdmVuIGtleS4KLQkgKiBJZiBpdCBpcyB0aGUgbGFzdCBrZXkgdG8gdGhlIGl0ZW0sIGFsc28gcmVtb3ZlIHRoZSBpdGVtLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUtleShLIGtleSkgewotCQlmaW5hbCBWIGl0ZW0gPSB0aGlzLm1hcC5nZXQoa2V5KTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkgewotCQkJdGhpcy5tYXAucmVtb3ZlKGtleSk7Ci0JCQlib29sZWFuIG90aGVyS2V5ID0gZmFsc2U7Ci0JCQlmb3IgKE1hcC5FbnRyeTxLLFY+IGVudHJ5IDogQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5tYXAuZW50cnlTZXQoKSkpIHsKLQkJCQlpZiAob3RoZXJLZXkgfCBlbnRyeS5nZXRWYWx1ZSgpID09IGl0ZW0pIHsKLQkJCQkJb3RoZXJLZXkgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghIG90aGVyS2V5KSB7Ci0JCQkJcmVtb3ZlSXRlbShpdGVtKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xhenlSZWFkT25seU9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQwMWUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xhenlSZWFkT25seU9iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LlJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFByb3ZpZGUgYSB0aHJlYWQtc2FmZSwgcmVhc29uYWJseSBwZXJmb3JtaW5nIGNvbnRhaW5lciBmb3IgaG9sZGluZyBhbgotICogb2JqZWN0IHRoYXQgd2lsbCBiZSAibGF6eS1pbml0aWFsaXplZCIgdXBvbiBpdHMgZmlyc3QgcmVmZXJlbmNlLiBUaGlzIGlzCi0gKiBhbHNvIHVzZWZ1bCBmb3IgcHJldmVudGluZyBkaXJlY3QgcmVmZXJlbmNlcyAoYWNjaWRlbnRhbCBvciBvdGhlcndpc2UpIHRvCi0gKiBsYXp5LWluaXRpYWxpemVkIHN0YXRlLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgc29tZSBwZW5hbHRpZXM6PHVsPgotICogPGxpPlRoZSByZWZlcmVuY2UncyB1c2Ugb2YgZ2VuZXJpY3Mgd2lsbCByZXF1aXJlIGNhc3RpbmcgKGFuZCB0aGUgcmVxdWlzaXRlCi0gKiAgICAgVk0gdGVzdGluZykgd2l0aCBldmVyeSBhY2Nlc3MKLSAqIDxsaT5JZiB0aGUgdmFsdWUgY2FsY3VsYXRlZCBkdXJpbmcgbGF6eSBpbml0aWFsaXphdGlvbiBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLSAqICAgICBhY2Nlc3Mgd2lsbCBiZSA8Y29kZT5zeW5jaHJvbml6ZWQ8L2NvZGU+IDxlbT5ldmVyeTwvZW0+IHRpbWUuCi0gKiA8L3VsPgotICogQHNlZSBTaW1wbGVPYmplY3RSZWZlcmVuY2UKLSAqIEBzZWUgU3luY2hyb25pemVkT2JqZWN0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2U8Vj4KLQlpbXBsZW1lbnRzIFJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlPFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgViB2YWx1ZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgbGF6eSBvYmplY3QgcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBMYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCS8qKgotCSAqIEluIEpESyA1IGFuZCBsYXRlciwgdGhpcyAiZG91YmxlLWNoZWNrZWQgbG9ja2luZyIgaWRpb20gd29ya3MgYXMgbG9uZwotCSAqIGFzIHRoZSBpbnN0YW5jZSB2YXJpYWJsZSBpcyBtYXJrZWQgPGNvZGU+dm9sYXRpbGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlWIHJlc3VsdCA9IHRoaXMudmFsdWU7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJcmVzdWx0ID0gdGhpcy52YWx1ZTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJdGhpcy52YWx1ZSA9IHJlc3VsdCA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGJ1aWxkVmFsdWUoKTsKLQotCXB1YmxpYyBib29sZWFuIHZhbHVlRXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0VmFsdWUoKSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZU5vdEVxdWFsKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldFZhbHVlKCksIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpID09IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIExhenlSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGF6eVJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlPFY+IGNsb25lID0gKExhenlSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPikgc3VwZXIuY2xvbmUoKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIDxlbT5ub3Q8L2VtPiB0cmlnZ2VyIHRoZSAibGF6eS1pbml0aWFsaXphdGlvbiIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpICsgJ10nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xpc3RlbmVyTGlzdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGlzdGVuZXJMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmIzZmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGlzdGVuZXJMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotLyoqCi0gKiBNYWludGFpbiBhIHRocmVhZC1zYWZlIGxpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgZG9lcyBub3QgYWxsb3cgYWRkaW5nCi0gKiBkdXBsaWNhdGUgbGlzdGVuZXJzIG9yIHJlbW92aW5nIG5vbi1saXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3Q8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKioKLQkgKiBXZSBjYW4gbWFyayB0aGlzIHZvbGF0aWxlIGFuZCBub3Qgc3luY2hyb25pemUgdGhlIHJlYWQgbWV0aG9kcyBiZWNhdXNlCi0JICogd2UgbmV2ZXIgY2hhbmdlIHRoZSA8ZW0+Y29udGVudHM8L2VtPiBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgTFtdIGxpc3RlbmVyczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciBsaXN0IGZvciBsaXN0ZW5lcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIGxpc3QgZm9yIGxpc3RlbmVycyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDEpOwotCQl0aGlzLmxpc3RlbmVyc1swXSA9IGxpc3RlbmVyOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTFtdIGJ1aWxkTGlzdGVuZXJBcnJheShDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoTFtdKSBBcnJheS5uZXdJbnN0YW5jZShsaXN0ZW5lckNsYXNzLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxMPiBnZXRMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMPih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdGVuZXIgbGlzdCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVycy5sZW5ndGggPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciB0byB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiBEdXBsaWNhdGUgbGlzdGVuZXJzIGFyZSBub3QgYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEwgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBmcm9tIHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqIFJlbW92aW5nIGEgbGlzdGVuZXIgdGhhdCBpcyBub3Qgb24gdGhlIGxpc3QgaXMgbm90IGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZShMIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2YodGhpcy5saXN0ZW5lcnMsIGxpc3RlbmVyKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnJlZ2lzdGVyZWQgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgodGhpcy5saXN0ZW5lcnMsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5jbGVhcih0aGlzLmxpc3RlbmVycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIGxpc3RlbmVycyBoZWxkIGJ5IHRoZSBsaXN0ZW5lciBsaXN0LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDbGFzczxMPiBnZXRMaXN0ZW5lclR5cGUoKSB7Ci0JCXJldHVybiAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBBcnJheXMudG9TdHJpbmcodGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNpbGVudGx5IGRyb3AgYW55IG5vbi1zZXJpYWxpemFibGUgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHRoaXMubGlzdGVuZXJzLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyQ2xhc3MpOwotCi0JCS8vIG9ubHkgd3JpdGUgb3V0IHNlcmlhbGl6YWJsZSBsaXN0ZW5lcnMKLQkJZm9yIChMIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lcnMpIHsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFNlcmlhbGl6YWJsZSkgewotCQkJCXMud3JpdGVPYmplY3QobGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJcy53cml0ZU9iamVjdChudWxsKTsKLSAgICB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIGluIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCUNsYXNzPEw+IGxpc3RlbmVyQ2xhc3MgPSAoQ2xhc3M8TD4pIHMucmVhZE9iamVjdCgpOwotCQl0aGlzLmxpc3RlbmVycyA9IHRoaXMuYnVpbGRMaXN0ZW5lckFycmF5KGxpc3RlbmVyQ2xhc3MsIDApOwotCQlPYmplY3QgbzsKLQkJd2hpbGUgKChvID0gcy5yZWFkT2JqZWN0KCkpICE9IG51bGwpIHsKLQkJCXRoaXMubGlzdGVuZXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5saXN0ZW5lcnMsIChMKSBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTmFtZVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3ZDY1Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OYW1lVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLS8qKgotICogVmFyaW91cyBoZWxwZXIgbWV0aG9kcyBmb3IgZ2VuZXJhdGluZyBuYW1lcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVUb29scyB7Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgSXRlcmF0b3I8U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzKSB7Ci0JCXJldHVybiB1bmlxdWVOYW1lRm9yKHJvb3ROYW1lLCBleGlzdGluZ05hbWVzLCByb290TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIE5PVCBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBOT1QgYm90aCBhbGxvd2VkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcklnbm9yZUNhc2Uocm9vdE5hbWUsIENvbGxlY3Rpb25Ub29scy5zZXQoZXhpc3RpbmdOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgTk9UIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgY29udmVydFRvTG93ZXJDYXNlKGV4aXN0aW5nTmFtZXMpLCByb290TmFtZS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgdGhlIHN1ZmZpeGVkICJ0ZW1wbGF0ZSIgbmFtZSB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29ucywgYnV0IFJFVFVSTgotCSAqIHRoZSBzdWZmaXhlZCAicm9vdCIgbmFtZTsgdGhpcyBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwotCSAqIChpLmUuIHRoZSAidGVtcGxhdGUiIG5hbWUgaGFzIGJlZW4gbW9ycGhlZCB0byB0aGUgc2FtZSBjYXNlIGFzCi0JICogdGhlICJleGlzdGluZyIgbmFtZXMsIHdoaWxlIHRoZSAicm9vdCIgbmFtZSBoYXMgbm90LCBidXQgdGhlICJyb290IiBuYW1lCi0JICogaXMgd2hhdCB0aGUgY2xpZW50IHdhbnRzIG1vcnBoZWQgdG8gYmUgdW5pcXVlKQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyB1bmlxdWVOYW1lRm9yKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMsIFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModGVtcGxhdGVOYW1lKSkgewotCQkJcmV0dXJuIHJvb3ROYW1lOwotCQl9Ci0JCVN0cmluZyB1bmlxdWVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQlmb3IgKGludCBzdWZmaXggPSAyOyB0cnVlOyBzdWZmaXgrKykgewotCQkJaWYgKCAhIGV4aXN0aW5nTmFtZXMuY29udGFpbnModW5pcXVlTmFtZSArIHN1ZmZpeCkpIHsKLQkJCQlyZXR1cm4gcm9vdE5hbWUuY29uY2F0KFN0cmluZy52YWx1ZU9mKHN1ZmZpeCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyB0byBhIGNvbGxlY3Rpb24gb2YgdGhlIHNhbWUKLQkgKiBzdHJpbmdzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBjb252ZXJ0VG9Mb3dlckNhc2UoQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJSGFzaFNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oc3RyaW5ncy5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBzdHJpbmdzKSB7Ci0JCQlyZXN1bHQuYWRkKHN0cmluZy50b0xvd2VyQ2FzZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0LgotCSAqIFZhcmlhdGlvbnM6Ci0JICogICAgIGNhdGFsb2cuc2NoZW1hLm5hbWUKLQkgKiAgICAgY2F0YWxvZy4ubmFtZQotCSAqICAgICBzY2hlbWEubmFtZQotCSAqICAgICBuYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoU3RyaW5nIGNhdGFsb2csIFN0cmluZyBzY2hlbWEsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoY2F0YWxvZyA9PSBudWxsKSAmJiAoc2NoZW1hID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoY2F0YWxvZyk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJfQotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChzY2hlbWEpOwotCQl9Ci0JCXNiLmFwcGVuZCgnLicpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcmVzZXJ2ZWQgd29yZHMgaW4gdGhlIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQV9SRVNFUlZFRF9XT1JEUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJImFic3RyYWN0IiwKLQkJCQkiYXNzZXJ0IiwgIC8vIGpkayAxLjQKLQkJCQkiYm9vbGVhbiIsCi0JCQkJImJyZWFrIiwKLQkJCQkiYnl0ZSIsCi0JCQkJImNhc2UiLAotCQkJCSJjYXRjaCIsCi0JCQkJImNoYXIiLAotCQkJCSJjbGFzcyIsCi0JCQkJImNvbnN0IiwgIC8vIHVudXNlZAotCQkJCSJjb250aW51ZSIsCi0JCQkJImRlZmF1bHQiLAotCQkJCSJkbyIsCi0JCQkJImRvdWJsZSIsCi0JCQkJImVsc2UiLAotCQkJCSJlbnVtIiwgIC8vIGpkayAxLjUKLQkJCQkiZXh0ZW5kcyIsCi0JCQkJImZhbHNlIiwKLQkJCQkiZmluYWwiLAotCQkJCSJmaW5hbGx5IiwKLQkJCQkiZmxvYXQiLAotCQkJCSJmb3IiLAotCQkJCSJnb3RvIiwgIC8vIHVudXNlZAotCQkJCSJpZiIsCi0JCQkJImltcGxlbWVudHMiLAotCQkJCSJpbXBvcnQiLAotCQkJCSJpbnN0YW5jZW9mIiwKLQkJCQkiaW50IiwKLQkJCQkiaW50ZXJmYWNlIiwKLQkJCQkibG9uZyIsCi0JCQkJIm5hdGl2ZSIsCi0JCQkJIm5ldyIsCi0JCQkJIm51bGwiLAotCQkJCSJwYWNrYWdlIiwKLQkJCQkicHJpdmF0ZSIsCi0JCQkJInByb3RlY3RlZCIsCi0JCQkJInB1YmxpYyIsCi0JCQkJInJldHVybiIsCi0JCQkJInNob3J0IiwKLQkJCQkic3RhdGljIiwKLQkJCQkic3RyaWN0ZnAiLCAgLy8gamRrIDEuMgotCQkJCSJzdXBlciIsCi0JCQkJInN3aXRjaCIsCi0JCQkJInN5bmNocm9uaXplZCIsCi0JCQkJInRoaXMiLAotCQkJCSJ0aHJvdyIsCi0JCQkJInRocm93cyIsCi0JCQkJInRyYW5zaWVudCIsCi0JCQkJInRydWUiLAotCQkJCSJ0cnkiLAotCQkJCSJ2b2lkIiwKLQkJCQkidm9sYXRpbGUiLAotCQkJCSJ3aGlsZSIKLQkJCX07Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNvcnRlZFNldDxTdHJpbmc+IEpBVkFfUkVTRVJWRURfV09SRFNfU0VUID0gCi0JCUNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNvcnRlZFNldChDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KEpBVkFfUkVTRVJWRURfV09SRFMpKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIEphdmEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgcmVzZXJ2ZWQgd29yZHMuCi0JICogVGhlc2Ugd29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllcnMgKGkuZS4gbmFtZXMpLgotCSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9ib29rcy90dXRvcmlhbC9qYXZhL251dHNhbmRib2x0cy9fa2V5d29yZHMuaHRtbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBqYXZhUmVzZXJ2ZWRXb3JkcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFWQV9SRVNFUlZFRF9XT1JEUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29uc2lzdHMgb2YgSmF2YSBpZGVudGlmaWVyCi0JICogY2hhcmFjdGVycyAoYnV0IG1heSBiZSBhIHJlc2VydmVkIHdvcmQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZy50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb25zaXN0cyBvZiBKYXZhIGlkZW50aWZpZXIKLQkgKiBjaGFyYWN0ZXJzIChidXQgbWF5IGJlIGEgcmVzZXJ2ZWQgd29yZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnNfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBzdHJpbmcgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gc3RyaW5nLmxlbmd0aDsgaS0tID4gMTsgKSB7ICAvLyBOQjogZW5kIHdpdGggMQotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhzdHJpbmcpCi0JCQkJJiYgISBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgYW4gdW5kZXJzY29yZSAnXycgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCBhcHBlbmRpbmcgYW4gdW5kZXJzY29yZSAnXycgdG8gdGhlIHN0cmluZyBpZgotCSAqIGl0IGlzIGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHN0cmluZywgJ18nKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQsIGlmIG5lY2Vzc2FyeSwgYXBwZW5kaW5nIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogdG8gdGhlIHN0cmluZyB1bnRpbCBpdCBpcyBub3QgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUlkZW50aWZpZXIoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkIGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2UganVzdCBuZWVkIHRvIHR3ZWFrIGl0IGEgYml0Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcgKyBjLCBjKTsKLQkJfQotCQljaGFyW10gYXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhhcnJheSwgYykgPyBuZXcgU3RyaW5nKGFycmF5KSA6IHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVC5jb250YWlucyhuZXcgU3RyaW5nKHN0cmluZykpKSB7Ci0JCQkvLyBhIHJlc2VydmVkIHdvcmQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLCB3ZSBqdXN0IG5lZWQgdG8gdHdlYWsgaXQgYSBiaXQKLQkJCWNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCQkJcmV0dXJuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKEFycmF5VG9vbHMuYWRkKHN0cmluZywgYyksIGMpOwotCQl9Ci0JCWNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhzdHJpbmcsIGMpOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgc3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdHJpbmcgd2FzIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udmVydFRvSmF2YUlkZW50aWZpZXJfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlib29sZWFuIG1vZCA9IGZhbHNlOwotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyU3RhcnQoYyk7Ci0JCQlzdHJpbmdbMF0gPSBjOwotCQkJbW9kID0gdHJ1ZTsKLQkJfQotCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gTkI6IGVuZCB3aXRoIDEKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXN0cmluZ1tpXSA9IGM7Ci0JCQkJbW9kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgc3RhcnQgY2hhcjogJyIgKyBjICsgJ1wnJyk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJQYXJ0KGNoYXIgYykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEphdmEgaWRlbnRpZmllciBwYXJ0IGNoYXI6ICciICsgYyArICdcJycpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG1ldGhvZCBuYW1lIHRvIGEgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R2V0dGVyU2V0dGVyTWV0aG9kTmFtZVRvUHJvcGVydHlOYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWludCBiZWdpbkluZGV4ID0gMDsKLQkJaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDM7Ci0JCX0gZWxzZSBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbWV0aG9kTmFtZTsgIC8vIHJldHVybiBtZXRob2QgbmFtZSB1bmNoYW5nZWQ/Ci0JCX0KLQkJcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobWV0aG9kTmFtZS5zdWJzdHJpbmcoYmVnaW5JbmRleCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTmFtZVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NzQ5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIDxjb2RlPk5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXI8L2NvZGU+IHdpbGwgdHJhbnNmb3JtIGEgcG9zc2libHktbnVsbAotICoge0BsaW5rIEJvb2xlYW59IHRvIGEgbm9uLW51bGwge0BsaW5rIEJvb2xlYW59Ojx1bD4KLSAqIDxsaT5XaGVuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gaXMgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIGl0IHVuY2hhbmdlZC4KLSAqIDxsaT5XaGVuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gaXRzIGNsaWVudC1zcGVjaWZpZWQgIm51bGwgdmFsdWUiCi0gKiAoe0BsaW5rIEJvb2xlYW4jVFJVRX0gb3Ige0BsaW5rIEJvb2xlYW4jRkFMU0V9KS4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb25OdWxsQm9vbGVhblRyYW5zZm9ybWVyCi0JaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPgotewotCS8vIG5vdCBudWxsCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIG51bGxWYWx1ZTsKLQotCS8qKgotCSAqIEEge0BsaW5rIFRyYW5zZm9ybWVyfSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gd2hlbgotCSAqIGl0IGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlIHRoZSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHdpbGwgcmV0dXJuCi0JICoge0BsaW5rIEJvb2xlYW4jVFJVRX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBUUlVFID0gbmV3IE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIoQm9vbGVhbi5UUlVFKTsKLQotCS8qKgotCSAqIEEge0BsaW5rIFRyYW5zZm9ybWVyfSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gd2hlbgotCSAqIGl0IGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlIHRoZSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHdpbGwgcmV0dXJuCi0JICoge0BsaW5rIEJvb2xlYW4jRkFMU0V9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gRkFMU0UgPSBuZXcgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuLkZBTFNFKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHRyYW5zZm9ybWVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiB0aGUgb3JpZ2luYWwKLQkgKiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4gVGhyb3cgYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259IGlmIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gdmFsdWVPZihCb29sZWFuIGIpIHsKLQkJcmV0dXJuIHZhbHVlT2YoYi5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdHJhbnNmb3JtZXIgdGhhdCB3aWxsIHJldHVybiB0aGUge0BsaW5rIEJvb2xlYW59IGNvcnJlc3BvbmRpbmcKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gdmFsdWVPZihib29sZWFuIGIpIHsKLQkJcmV0dXJuIGIgPyBUUlVFIDogRkFMU0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG9ubHkgMiBjb25zdGFudCB2ZXJzaW9ucy4KLQkgKi8KLQlwcml2YXRlIE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIoQm9vbGVhbiBudWxsVmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG51bGxWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm51bGxWYWx1ZSA9IG51bGxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIgOiB0aGlzLm51bGxWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bGxWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3RCb29sZWFuVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0YWM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQSA8Y29kZT5Ob3RCb29sZWFuVHJhbnNmb3JtZXI8L2NvZGU+IHdpbGwgdHJhbnNmb3JtIGEKLSAqIHtAbGluayBCb29sZWFufSB0byBpdHMgTk9UIHZhbHVlOjx1bD4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIHtAbGluayBCb29sZWFuI1RSVUV9LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIHtAbGluayBCb29sZWFuI0ZBTFNFfS4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIHtAbGluayBCb29sZWFuI0ZBTFNFfSwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIE5vdEJvb2xlYW5UcmFuc2Zvcm1lcgotCWltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgTm90Qm9vbGVhblRyYW5zZm9ybWVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEJpZGlUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIE5vdEJvb2xlYW5UcmFuc2Zvcm1lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTI3ZTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90TnVsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgYWNjZXB0cyBvbmx5IG5vbi1udWxsIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb3ROdWxsRmlsdGVyPFQ+Ci0JaW1wbGVtZW50cyBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgTm90TnVsbEZpbHRlcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgTm90TnVsbEZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyBhY2NlcHQgb25seSBub24tbnVsbCBvYmplY3RzCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gbyAhPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2NTkzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSAibnVsbCIgbGlzdCBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBhbiAiZW1wdHkiIGxpc3Q6IGl0IGFsbG93cyBjbGllbnRzIHRvCi0gKiBhZGQvcmVtb3ZlIGVsZW1lbnRzIHRvL2Zyb20gaXQgYnV0IG5ldmVyIGNoYW5nZXMuIFRoaXMgaXMgdXNlZnVsCi0gKiBmb3IgcGFzc2luZyB0byBtZXRob2RzIHRoYXQgcmVxdWlyZSBhICJjb2xsZWN0aW5nIHBhcmFtZXRlciIgYnV0IHRoZQotICogY2xpZW50IHdpbGwgaWdub3JlIHRoZSByZXN1bHRpbmcgImNvbGxlY3Rpb24iLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExpc3Q8RT4KLQlpbXBsZW1lbnRzIExpc3Q8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbExpc3QgSU5TVEFOQ0UgPSBuZXcgTnVsbExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gYy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gYTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9RdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M0YmM1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBkZWZpbmluZyB0aGUgY2xhc3NpYyBxdWV1ZSBiZWhhdmlvciwKLSAqIHdpdGhvdXQgdGhlIGJhY2tkb29ycyBhbGxvd2VkIGJ5IHtAbGluayBqYXZhLnV0aWwuUXVldWV9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgcXVldWUKLSAqLwotcHVibGljIGludGVyZmFjZSBRdWV1ZTxFPiB7Ci0KLQkvKioKLQkgKiAiRW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZS4KLQkgKi8KLQl2b2lkIGVucXVldWUoRSBvKTsKLQotCS8qKgotCSAqICJEZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgotCSAqLwotCUUgZGVxdWV1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIG9uIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQotCSAqIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcXVldWUuCi0JICovCi0JRSBwZWVrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkuCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+IGltcGxlbWVudHMgUXVldWU8RT4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgUXVldWUgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IFF1ZXVlPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZW5xdWV1ZShFIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2NjA0Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIHNpbXBsZSBjb250YWluZXIgY2xhc3Mgc2ltcGx5IHB1dHMgYSBiaXQgb2Ygc2VtYW50aWNzCi0gKiBhcm91bmQgYSBwYWlyIG9mIG51bWJlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIHN0YXJ0aW5nIGluZGV4IG9mIHRoZSByYW5nZS4gKi8KLQlwdWJsaWMgZmluYWwgaW50IHN0YXJ0OwotCi0JLyoqIFRoZSBlbmRpbmcgaW5kZXggb2YgdGhlIHJhbmdlLiAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZW5kOwotCi0JLyoqCi0JICogVGhlIHNpemUgY2FuIGJlIG5lZ2F0aXZlIGlmIHRoZSBlbmRpbmcgaW5kZXgKLQkgKiBpcyBsZXNzIHRoYW4gdGhlIHN0YXJ0aW5nIGluZGV4LgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgc2l6ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGFuZCBlbmQsCi0JICogYm90aCBvZiB3aGljaCBhcmUgaW1tdXRhYmxlLgotCSAqLwotCXB1YmxpYyBSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQl0aGlzLmVuZCA9IGVuZDsKLQkJdGhpcy5zaXplID0gZW5kIC0gc3RhcnQgKyAxOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkCi0JICogaW5kZXguCi0JICovCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXMoaW50IGluZGV4KSB7Ci0JCXJldHVybiAodGhpcy5zdGFydCA8PSBpbmRleCkgJiYgKGluZGV4IDw9IHRoaXMuZW5kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMgPT0gbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgUmFuZ2UpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmFuZ2Ugb3RoZXJSYW5nZSA9IChSYW5nZSkgbzsKLQkJcmV0dXJuICh0aGlzLnN0YXJ0ID09IG90aGVyUmFuZ2Uuc3RhcnQpCi0JCQkmJiAodGhpcy5lbmQgPT0gb3RoZXJSYW5nZS5lbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0IF4gdGhpcy5lbmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJhbmdlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChSYW5nZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgdGhpcy5zdGFydCArICIsICIgKyB0aGlzLmVuZCArICddJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVhZE9ubHlCb29sZWFuUmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWFkT25seUJvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQyYzU2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWFkT25seUJvb2xlYW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIGhvbGRpbmcgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB0aGF0IGNhbm5vdCBiZQotICogY2hhbmdlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5Qm9vbGVhblJlZmVyZW5jZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBlcXVhbCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpcyhib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIG5vdCBlcXVhbCB0bwotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc05vdChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc1RydWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNGYWxzZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVhZE9ubHlJbnRSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlYWRPbmx5SW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTUxNTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVhZE9ubHlJbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGEgY29udGFpbmVyIGZvciBob2xkaW5nIGFuIDxjb2RlPmludDwvY29kZT4gdGhhdCBjYW5ub3QgYmUKLSAqIGNoYW5nZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUludFJlZmVyZW5jZQotCWV4dGVuZHMgQ29tcGFyYWJsZTxSZWFkT25seUludFJlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlpbnQgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgZXF1YWwgdG8gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbm90IGVxdWFsIHRvCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIG5vdEVxdWFsKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgemVyby4KLQkgKi8KLQlib29sZWFuIGlzWmVybygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBub3QgemVyby4KLQkgKi8KLQlib29sZWFuIGlzTm90WmVybygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4KLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gaXNHcmVhdGVyVGhhbihpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbgotCSAqIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc0dyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIGxlc3MgdGhhbgotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbGVzcyB0aGFuCi0JICogb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgcG9zaXRpdmUuCi0JICovCi0JYm9vbGVhbiBpc1Bvc2l0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIChpLmUuIG5lZ2F0aXZlIG9yIHplcm8pLgotCSAqLwotCWJvb2xlYW4gaXNOb3RQb3NpdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBuZWdhdGl2ZS4KLQkgKi8KLQlib29sZWFuIGlzTmVnYXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbm90IG5lZ2F0aXZlCi0JICogKGkuZS4gemVybyBvciBwb3NpdGl2ZSkuCi0JICovCi0JYm9vbGVhbiBpc05vdE5lZ2F0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGFicygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotCSAqLwotCWludCBuZWcoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHBsdXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgYWRkKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgbWludXMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgc3VidHJhY3QoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBtdWx0aXBsaWVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IG11bHRpcGx5KGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBkaXZpZGUoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBkaXZpZGVkIGJ5Ci0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgcmVtYWluZGVyKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWluaW11bSBvZiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGFuZAotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IG1pbihpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1heGltdW0gb2YgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBhbmQKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBtYXgoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlcgotCSAqIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JZG91YmxlIHBvdyhpbnQgdik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlZmxlY3Rpb25Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmIzM2M3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlZmxlY3Rpb25Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIDxjb2RlPmphdmEubGFuZy5yZWZsZWN0PC9jb2RlPiBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogPHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBhbmQgd3JhcHBlZCBpbgotICoge0BsaW5rIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9ufXM7IHNvIHRoZXNlIG1ldGhvZHMgc2hvdWxkCi0gKiBiZSB1c2VkIHdoZW4gdGhlcmUgc2hvdWxkIGJlIG5vIHByb2JsZW1zIHVzaW5nIHJlZmxlY3Rpb24gKGkuZS4KLSAqIHRoZSByZWZlcmVuY2VkIG1lbWJlcnMgYXJlIHByZXN1bWFibHkgcHJlc2VudCBldGMuKS4KLSAqIDxwPgotICogVGhlcmUgYXJlIGFsc28gYSBudW1iZXIgb2YgbWV0aG9kcyB3aG9zZSBuYW1lcwotICogZW5kIHdpdGggYW4gdW5kZXJzY29yZS4gVGhlc2UgbWV0aG9kcyBkZWNsYXJlIHRoZSBleHBlY3RlZCBjaGVja2VkCi0gKiBleGNlcHRpb25zIChlLmcuIHtAbGluayBOb1N1Y2hNZXRob2RFeGNlcHRpb259LCB7QGxpbmsgTm9TdWNoRmllbGRFeGNlcHRpb259KS4KLSAqIFRoZXNlIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzLCBmaWVsZHMsIGV0Yy4gdGhhdCBzaG91bGQgYmUgcHJlc2VudCBidXQgbWlnaHQgbm90IGJlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVmbGVjdGlvblRvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBaRVJPX1BBUkFNRVRFUl9UWVBFUyA9IG5ldyBDbGFzc1swXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdFtdIFpFUk9fQVJHVU1FTlRTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gVk9JRF9DTEFTUyA9IHZvaWQuY2xhc3M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxqYXZhLmxhbmcuVm9pZD4gVk9JRF9XUkFQUEVSX0NMQVNTID0gamF2YS5sYW5nLlZvaWQuY2xhc3M7Ci0KLQotCS8vICoqKioqKioqKiogZmllbGRzICoqKioqKioqKioKLQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWVsZFZhbHVlXyhvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmdldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZV8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0RmllbGRfKG9iamVjdCwgZmllbGROYW1lKS5nZXQob2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFN0YXRpY0ZpZWxkVmFsdWVfKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFN0YXRpY0ZpZWxkVmFsdWVfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0RmllbGRfKGphdmFDbGFzcywgZmllbGROYW1lKS5nZXQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5zZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlzZXRGaWVsZFZhbHVlXyhvYmplY3QsIGZpZWxkTmFtZSwgdmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCwgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5zZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpZWxkVmFsdWVfKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlnZXRGaWVsZF8ob2JqZWN0LCBmaWVsZE5hbWUpLnNldChvYmplY3QsIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3Muc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlzZXRTdGF0aWNGaWVsZFZhbHVlXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgdmFsdWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLnNldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdGljRmllbGRWYWx1ZV8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgotCXsKLQkJZ2V0RmllbGRfKGphdmFDbGFzcywgZmllbGROYW1lKS5zZXQobnVsbCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmllbGRfKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZCBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5nZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRGaWVsZF8ob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpZWxkXyhqYXZhQ2xhc3MsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZCBnZXRGaWVsZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQl7Ci0JCUZpZWxkIGZpZWxkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpZWxkID0gamF2YUNsYXNzLmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJcmV0dXJuIGdldEZpZWxkXyhzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOyAgLy8gcmVjdXJzZQotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBmaWVsZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBmaWVsZHMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBbGxGaWVsZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPEZpZWxkPiBnZXRBbGxGaWVsZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCUFycmF5TGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKLQkJZm9yIChDbGFzczw/PiB0ZW1wQ2xhc3MgPSBqYXZhQ2xhc3M7IHRlbXBDbGFzcyAhPSBudWxsOyB0ZW1wQ2xhc3MgPSB0ZW1wQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSB7Ci0JCQlhZGREZWNsYXJlZEZpZWxkc1RvKHRlbXBDbGFzcywgZmllbGRzKTsKLQkJfQotCQlyZXR1cm4gZmllbGRzOwotCX0KLQotCS8qCi0JICogQWRkIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZWNsYXJlZEZpZWxkc1RvKENsYXNzPD8+IGphdmFDbGFzcywgQXJyYXlMaXN0PEZpZWxkPiBmaWVsZHMpIHsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGdldERlY2xhcmVkRmllbGRzKGphdmFDbGFzcykpIHsKLQkJCWZpZWxkcy5hZGQoZmllbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBY2Nlc3NpYmxlRGVjbGFyZWRGaWVsZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPEZpZWxkPiBnZXREZWNsYXJlZEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKTsKLQkJZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgewotCQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RmllbGQ+KGZpZWxkcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChnZXRNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcmVjZWl2ZXIsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBjYWNoZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWV0aG9kLmludm9rZShyZWNlaXZlciwgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIG1ldGhvZCwgZXgpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZU1ldGhvZF8oT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RfKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kXyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kXyhyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGRlZmluZWQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kXyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykuaW52b2tlKHJlY2VpdmVyLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIGFyZ3VtZW50LgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGV4LmdldFRhcmdldEV4Y2VwdGlvbigpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBhcmd1bWVudC4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBhcmd1bWVudHMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykuaW52b2tlKG51bGwsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0TWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltZXRob2QgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QobWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCUNsYXNzPD8+IHN1cGVyY2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJCXRocm93IGV4OwotCQkJfQotCQkJLy8gcmVjdXJzZQotCQkJcmV0dXJuIGdldE1ldGhvZF8oc3VwZXJjbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9Ci0JCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpIHsKLQkJcmV0dXJuIGdldE1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0TWV0aG9kXyhvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCU1ldGhvZCBtZXRob2QgPSBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobWV0aG9kLmdldE1vZGlmaWVycygpKSkgewotCQkJcmV0dXJuIG1ldGhvZDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIG1ldGhvZHMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBjbGFzcywgaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFsbE1ldGhvZHMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE1ldGhvZD4gZ2V0QWxsTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJQXJyYXlMaXN0PE1ldGhvZD4gbWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWFkZERlY2xhcmVkTWV0aG9kc1RvKHRlbXBDbGFzcywgbWV0aG9kcyk7Ci0JCX0KLQkJcmV0dXJuIG1ldGhvZHM7Ci0JfQotCi0JLyoKLQkgKiBBZGQgdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGREZWNsYXJlZE1ldGhvZHNUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIEFycmF5TGlzdDxNZXRob2Q+IG1ldGhvZHMpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogZ2V0RGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcykpIHsKLQkJCW1ldGhvZHMuYWRkKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIG1ldGhvZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8TWV0aG9kPiBnZXREZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxNZXRob2Q+KG1ldGhvZHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXREZWZhdWx0Q29uc3RydWN0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXREZWZhdWx0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3IoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0RGVmYXVsdENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0RGVmYXVsdENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3Rvcl8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCUNvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yID0gamF2YUNsYXNzLmdldERlY2xhcmVkQ29uc3RydWN0b3IocGFyYW1ldGVyVHlwZXMpOwotCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlyZXR1cm4gY29uc3RydWN0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBY2Nlc3NpYmxlRGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxDb25zdHJ1Y3RvcjxUPj4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlDb25zdHJ1Y3RvcjxUPltdIGNvbnN0cnVjdG9ycyA9IChDb25zdHJ1Y3RvcjxUPltdKSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJZm9yIChDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29uc3RydWN0b3I8VD4+KGNvbnN0cnVjdG9ycyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzICh3aXRob3V0IHRoZSBjaGVja2VkIGV4Y2VwdGlvbikuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0Zvck5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lLCBib29sZWFuIGluaXRpYWxpemUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGluaXRpYWxpemUsIGNsYXNzTG9hZGVyKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2xhc3NOYW1lLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhcnJheSBkZXB0aCIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZGVwdGggaXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGZvciBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBoYXZlIGEgZGVwdGggb2YgemVyby4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBcnJheURlcHRoKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aChDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJlbGVtZW50IHR5cGUiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkgdHlwZS4KLQkgKiBBIG5vbi1hcnJheSB0eXBlIHNpbXBseSByZXR1cm5zIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRFbGVtZW50VHlwZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0RWxlbWVudFR5cGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXdoaWxlIChqYXZhQ2xhc3MuaXNBcnJheSgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB3cmFwcGVyIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotCSAqIHByaW1pdGl2ZSBjbGFzcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0V3JhcHBlckNsYXNzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRXcmFwcGVyQ2xhc3MoQ2xhc3M8Pz4gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MgPT0gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJCQlyZXR1cm4gcHJpbWl0aXZlLndyYXBwZXJDbGFzczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4gb3Igb25lIG9mIHRoZSBwcmltaXRpdmUKLQkgKiB2YXJpYWJsZSB3cmFwcGVyIGNsYXNzZXMsIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzUHJpbWl0aXZlV3JhcHBlcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWlmIChqYXZhQ2xhc3MgPT0gcHJpbWl0aXZlLndyYXBwZXJDbGFzcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IFZPSURfV1JBUFBFUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sCi0JICogPGNvZGU+ZmxvYXQ8L2NvZGU+LCBldGMuLCBidXQgbm90IDxjb2RlPnZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5pc1ZhcmlhYmxlUHJpbWl0aXZlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGphdmFDbGFzcy5pc1ByaW1pdGl2ZSgpICYmIChqYXZhQ2xhc3MgIT0gVk9JRF9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY29kZQotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvckNvZGUoY2hhciBjbGFzc0NvZGUpIHsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKHByaW1pdGl2ZS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBwcmltaXRpdmUuamF2YUNsYXNzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29kZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MuCi0JICogUmV0dXJuIDxjb2RlPjA8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGdldENvZGVGb3JDbGFzcyhDbGFzczw/PiBwcmltaXRpdmVDbGFzcykgewotCQlpZiAoKCAhIHByaW1pdGl2ZUNsYXNzLmlzQXJyYXkoKSkgJiYgKHByaW1pdGl2ZUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSkgewotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzID09IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIHBhcmFtZXRlclR5cGUsIGFyZ3VtZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSBjbGFzcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc0Zvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50LCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgYXJndW1lbnQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cywgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlciksIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSArIENSICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4KTsKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIGFyZ3VtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZV8oQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBuZXdJbnN0YW5jZV8oamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBhcmd1bWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShhcmd1bWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGRlY2xhcmF0aW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbiwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgsIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbiwgYXJyYXlEZXB0aCk7Ci0JCXJldHVybiBuZXcgVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy48dWw+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+MTwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPjM8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2UodHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogbm8gd2hpdGVzcGFjZSBpbiB0aGUgdHlwZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIDE7Ci0JCWludCBkZXB0aCA9IDA7Ci0JCWludCBjbG9zZSA9IGxhc3Q7Ci0JCXdoaWxlICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlKSA9PSAnXScpIHsKLQkJCWlmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KGNsb3NlIC0gMSkgPT0gJ1snKSB7Ci0JCQkJZGVwdGgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0eXBlIGRlY2xhcmF0aW9uOiAiICsgdHlwZURlY2xhcmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24sIGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50W10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJpbnQiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogVXNlZnVsIGZvciBjbGllbnRzIHRoYXQgaGF2ZSBhbHJlYWR5IHF1ZXJpZWQgdGhlIHR5cGUgZGVjbGFyYXRpb24ncyBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIGludCBhcnJheURlcHRoKSB7Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpCi0JCXRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBjbGFzc0xvYWRlcik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIEpESyBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MuZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBwcmltaXRpdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoJ1snKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0JCXJldHVybiBDbGFzcy5mb3JOYW1lKHNiLnRvU3RyaW5nKCksIGZhbHNlLCBjbGFzc0xvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLjx1bD4KLQkgKiA8bGk+PGNvZGU+ImludCI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImludCI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+IltJIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEubGFuZy5TdHJpbmdbXVtdW10iPC9jb2RlPiByZXR1cm5zIDxjb2RlPiJbW1tMamF2YS5sYW5nLlN0cmluZzsiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gZWxlbWVudFR5cGVOYW1lOwotCQl9Ci0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHMoQ2xhc3NOYW1lLlZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oJ1wnJyArIENsYXNzTmFtZS5WT0lEX0NMQVNTX05BTUUgKyAiJyBtdXN0IGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQl9Ci0KLQkJLy8gbG9vayBmb3IgYSBwcmltaXRpdmUgZmlyc3QKLQkJUHJpbWl0aXZlIHBjYyA9IG51bGw7Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPD0gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gcHJpbWl0aXZlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCUNsYXNzTmFtZS5hcHBlbmQoZWxlbWVudFR5cGVOYW1lLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4Y2VwdGlvbiBtZXNzYWdlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG51bGwsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCcuJyk7Ci0JCXNiLmFwcGVuZChmaWVsZE5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIHRoaXMgY2hlY2sgYWxsb3dzIHVzIHRvIHVzZSB0aGlzIGNvZGUgZm9yIGNvbnN0cnVjdG9ycywgd2hlcmUgdGhlIG1ldGhvZE5hbWUgaXMgbnVsbAotCQlpZiAobWV0aG9kTmFtZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJCXNiLmFwcGVuZChtZXRob2ROYW1lKTsKLQkJfQotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IG1heCA9IHBhcmFtZXRlclR5cGVzLmxlbmd0aCAtIDE7Ci0JCWlmIChtYXggIT0gLTEpIHsKLQkJCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhcmFtZXRlclR5cGVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWl0aXZlIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlzdGF0aWMgZmluYWwgSXRlcmFibGU8UHJpbWl0aXZlPiBQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQllURV9DT0RFID0gJ0InOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDSEFSX0NPREUgPSAnQyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9DT0RFID0gJ0QnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBGTE9BVF9DT0RFID0gJ0YnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBJTlRfQ09ERSA9ICdJJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgTE9OR19DT0RFID0gJ0onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBTSE9SVF9DT0RFID0gJ1MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCT09MRUFOX0NPREUgPSAnWic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFZPSURfQ09ERSA9ICdWJzsKLQotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCA9IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpOwotCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpbnQgbGVuID0gcHJpbWl0aXZlLmphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZU1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSB7Ci0JCWludCBtYXggPSAtMTsKLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaW50IGxlbiA9IHByaW1pdGl2ZS53cmFwcGVyQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPFByaW1pdGl2ZT4gYnVpbGRQcmltaXRpdmVzKCkgewotCQlQcmltaXRpdmVbXSBhcnJheSA9IG5ldyBQcmltaXRpdmVbOV07Ci0JCWFycmF5WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJYXJyYXlbMV0gPSBuZXcgUHJpbWl0aXZlKENIQVJfQ09ERSwgamF2YS5sYW5nLkNoYXJhY3Rlci5jbGFzcyk7Ci0JCWFycmF5WzJdID0gbmV3IFByaW1pdGl2ZShET1VCTEVfQ09ERSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7Ci0JCWFycmF5WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlhcnJheVs0XSA9IG5ldyBQcmltaXRpdmUoSU5UX0NPREUsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKTsKLQkJYXJyYXlbNV0gPSBuZXcgUHJpbWl0aXZlKExPTkdfQ09ERSwgamF2YS5sYW5nLkxvbmcuY2xhc3MpOwotCQlhcnJheVs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJYXJyYXlbN10gPSBuZXcgUHJpbWl0aXZlKEJPT0xFQU5fQ09ERSwgamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpOwotCQlhcnJheVs4XSA9IG5ldyBQcmltaXRpdmUoVk9JRF9DT0RFLCBqYXZhLmxhbmcuVm9pZC5jbGFzcyk7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxQcmltaXRpdmU+KGFycmF5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBlLmcuIGphdmEubGFuZy5Cb29sZWFuLlRZUEUgPT4gYm9vbGVhbi5jbGFzcwotCQlQcmltaXRpdmUoY2hhciBjb2RlLCBDbGFzczw/PiB3cmFwcGVyQ2xhc3MpIHsKLQkJCXRoaXMuY29kZSA9IGNvZGU7Ci0JCQl0aGlzLndyYXBwZXJDbGFzcyA9IHdyYXBwZXJDbGFzczsKLQkJCXRoaXMuamF2YUNsYXNzID0gKENsYXNzPD8+KSBnZXRTdGF0aWNGaWVsZFZhbHVlKHdyYXBwZXJDbGFzcywgV1JBUFBFUl9DTEFTU19UWVBFX0ZJRUxEX05BTUUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHlwZURlY2xhcmF0aW9uIHsKLQkJZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQkJZmluYWwgaW50IGFycmF5RGVwdGg7Ci0JCVR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkJdGhpcy5lbGVtZW50VHlwZU5hbWUgPSBlbGVtZW50VHlwZU5hbWU7Ci0JCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFJlZmxlY3Rpb25Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4Yjg1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNvbXBhcmF0b3Igd2lsbCByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0gKiBJZiB0aGUgY29tcGFyYXRvciBpcyBudWxsLCB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiB0aGUgb2JqZWN0cyB3aWxsIGJlIHVzZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvcjxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxFPiwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yKENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShFIGUxLCBFIGUyKSB7Ci0JCXJldHVybiAodGhpcy5jb21wYXJhdG9yID09IG51bGwpID8KLQkJCWUyLmNvbXBhcmVUbyhlMSkKLQkJOgotCQkJdGhpcy5jb21wYXJhdG9yLmNvbXBhcmUoZTIsIGUxKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1J1bm5hYmxlQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Nzk5NmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFdyYXAgYSBSdW5uYWJsZSBzbyBpdCBjYW4gYmUgdXNlZCBhcyBhIENvbW1hbmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5uYWJsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgcnVubmFibGU7Ci0KLQlwdWJsaWMgUnVubmFibGVDb21tYW5kKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChydW5uYWJsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdGhpcy5ydW5uYWJsZS5ydW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkNvbW1hbmRbIiArIHRoaXMucnVubmFibGUudG9TdHJpbmcoKSArJ10nOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5MGMyNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEFzc29jaWF0aW9ufS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdEFzc29jaWF0aW9uPEssIFY+Ci0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgSyBrZXk7Ci0JcHJpdmF0ZSBWIHZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3NvY2lhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5Ci0JICogYW5kIGEgbnVsbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb24oSyBrZXkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSwgViB2YWx1ZSkgewotCQl0aGlzKGtleSk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQotCXB1YmxpYyBLIGdldEtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN5bmNocm9uaXplZCBTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlQXNzb2NpYXRpb248SywgVj4pIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWJmNTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQm9vbGVhblJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhIGZsYWcgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZEJvb2xlYW4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UKLQlpbXBsZW1lbnRzIEJvb2xlYW5SZWZlcmVuY2UsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+Ym9vbGVhbjwvY29kZT4uICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIGJvb2xlYW4gdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JcHVibGljIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzKGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWxzZSgpIHsKLQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGZsaXAoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID0gISB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldE5vdChib29sZWFuIHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoICEgdik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0VHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0RmFsc2UoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlQm9vbGVhblJlZmVyZW5jZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY5NjU0YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcn0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb21tYW5kRXhlY3V0b3IKLQlpbXBsZW1lbnRzIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHJpdmF0ZSBib29sZWFuIGFjdGl2ZSA9IGZhbHNlOwotCi0JcHVibGljIFNpbXBsZUNvbW1hbmRFeGVjdXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKHRoaXMuYWN0aXZlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RvcHBlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWN0aXZlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQlpZiAodGhpcy5hY3RpdmUpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJaWYgKCAhIHRoaXMuYWN0aXZlKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWN0aXZlID0gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVGaWx0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ZmMTIxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBTaW1wbGUsIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkZpbHRlcjwvY29kZT4KLSAqIHRoYXQgaG9sZHMgb24gdG8gYSBjcml0ZXJpb24gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gdGhlCi0gKiA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gb3IgPGNvZGU+cmVqZWN0KE9iamVjdCk8L2NvZGU+Ci0gKiBtZXRob2RzLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSBlaXRoZXIgb2YgdGhlc2UgbWV0aG9kcywKLSAqIGRlcGVuZGluZyBvbiB3aGljaCBpcyBlYXNpZXIgdG8gaW1wbGVtZW50LiBOb3RlIHRoYXQgYXQgbGVhc3QKLSAqIG9uZSBvZiB0aGVzZSBtZXRob2RzIDxlbT5tdXN0PC9lbT4gYmUgb3ZlcnJpZGRlbiBvcgotICogYW4gaW5maW5pdGUgbG9vcCB3aWxsIG9jY3VyLiBJZiBib3RoIG9mIHRoZW0gYXJlIG92ZXJyaWRkZW4sCi0gKiBvbmx5IHRoZSA8Y29kZT5hY2NlcHQoT2JqZWN0KTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgdXNlZC4KLSAqIDxwPgotICogU2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2Ygc3RyYWlnaHRmb3J3YXJkIGlubmVyIGNsYXNzZXMuCi0gKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBmaWx0ZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhCi0gKiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gdG8gcmV0dXJuIG9ubHkgdGhvc2Ugc3RyaW5ncwotICogaW4gdGhlIG5lc3RlZCBpdGVyYXRvciBzdGFydCB3aXRoICJwcmVmaXgiOgotICogPHByZT4KLSAqCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nPigicHJlZml4IikgewotICoJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgbykgewotICoJCQlyZXR1cm4gby5zdGFydHNXaXRoKChTdHJpbmcpIGNyaXRlcmlvbik7Ci0gKgkJfQotICoJfTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlRmlsdGVyPFQsIFM+Ci0JaW1wbGVtZW50cyBGaWx0ZXI8VD4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFMgY3JpdGVyaW9uOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIE1vcmUgdXNlZnVsIGNvbnN0cnVjdG9yLiBUaGUgc3BlY2lmaWVkIGNyaXRlcmlvbiBjYW4KLQkgKiBiZSB1c2VkIGJ5IGEgc3ViY2xhc3MgdG8gImFjY2VwdCIgb3IgInJlamVjdCIgb2JqZWN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKFMgY3JpdGVyaW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3JpdGVyaW9uID0gY3JpdGVyaW9uOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHNpbXBsZSBmaWx0ZXIgd2l0aCBhIG51bGwgY3JpdGVyaW9uCi0JICovCi0JcHJvdGVjdGVkIFNpbXBsZUZpbHRlcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGhlIHNwZWNpZmllZCBvYmplY3Qgc2hvdWxkIGJlICJyZWplY3RlZCIuCi0JICogVGhlIHNlbWFudGljcyBvZiAicmVqZWN0ZWQiIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWplY3QoVCBvKSB7Ci0JCXJldHVybiAhIHRoaXMuYWNjZXB0KG8pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBzaG91bGQgYmUgImFjY2VwdGVkIi4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJhY2NlcHRlZCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFjY2VwdChUIG8pIHsKLQkJcmV0dXJuICEgdGhpcy5yZWplY3Qobyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFNpbXBsZUZpbHRlcjxULCBTPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlRmlsdGVyPFQsIFM+KSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBTaW1wbGVGaWx0ZXI8PywgPz4pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU2ltcGxlRmlsdGVyPD8sID8+IG90aGVyID0gKFNpbXBsZUZpbHRlcjw/LCA/PikgbzsKLQkJcmV0dXJuICh0aGlzLmNyaXRlcmlvbiA9PSBudWxsKSA/Ci0JCQkob3RoZXIuY3JpdGVyaW9uID09IG51bGwpIDogdGhpcy5jcml0ZXJpb24uZXF1YWxzKG90aGVyLmNyaXRlcmlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNyaXRlcmlvbiA9PSBudWxsKSA/IDAgOiB0aGlzLmNyaXRlcmlvbi5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY3JpdGVyaW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUludFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhN2EzYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHdoZXJldmVyIGEgbXV0YWJsZSBpbnRlZ2VyIG9iamVjdCBpcyBuZWVkZWQuCi0gKiBJdCBpcyBhIGNyb3NzIGJldHdlZW4gYW4gPGNvZGU+aW50PC9jb2RlPiBhbmQgYW4ge0BsaW5rIEludGVnZXJ9LgotICogSXQgY2FuIGJlIHN0b3JlZCBpbiBhIHN0YW5kYXJkIGNvbnRhaW5lciAoZS5nLiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb259KQotICogYnV0IGNhbiBiZSBtb2RpZmllZC4gSXQgaXMgYWxzbyB1c2VmdWwgcGFzc2luZyBhIHZhbHVlIHRoYXQgY2FuIGJlIGNoYW5nZWQKLSAqIGJ5IHRoZSByZWNpcGllbnQuCi0gKiAKLSAqIEBzZWUgU3luY2hyb25pemVkSW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVJbnRSZWZlcmVuY2UKLQlpbXBsZW1lbnRzIEludFJlZmVyZW5jZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5pbnQ8L2NvZGU+LiAqLwotCXByaXZhdGUgdm9sYXRpbGUgaW50IHZhbHVlID0gMDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSA8Y29kZT5pbnQ8L2NvZGU+IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSW50UmVmZXJlbmNlKGludCBjb3VudCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgPGNvZGU+aW50PC9jb2RlPiByZWZlcmVuY2Ugd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8uCi0JICovCi0JcHVibGljIFNpbXBsZUludFJlZmVyZW5jZSgpIHsKLQkJdGhpcygwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBub3RFcXVhbChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzWmVybygpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbihpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA+IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDwgdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuT3JFcXVhbChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA8PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUG9zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW4oMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3RQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOZWdhdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNMZXNzVGhhbigwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE5lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFicygpIHsKLQkJcmV0dXJuIE1hdGguYWJzKHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgbmVnKCkgewotCQlyZXR1cm4gLXRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBhZGQoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgKyB2OwotCX0KLQotCXB1YmxpYyBpbnQgc3VidHJhY3QoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgLSB2OwotCX0KLQotCXB1YmxpYyBpbnQgbXVsdGlwbHkoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgKiB2OwotCX0KLQotCXB1YmxpYyBpbnQgZGl2aWRlKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIC8gdjsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlbWFpbmRlcihpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAlIHY7Ci0JfQotCi0JcHVibGljIGludCBtaW4oaW50IHYpIHsKLQkJcmV0dXJuIE1hdGgubWluKHRoaXMudmFsdWUsIHYpOwotCX0KLQotCXB1YmxpYyBpbnQgbWF4KGludCB2KSB7Ci0JCXJldHVybiBNYXRoLm1heCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQlwdWJsaWMgZG91YmxlIHBvdyhpbnQgdikgewotCQlyZXR1cm4gTWF0aC5wb3codGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JcHVibGljIGludCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJaW50IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwdWJsaWMgaW50IHNldFplcm8oKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKDApOwotCX0KLQotCXB1YmxpYyBpbnQgaW5jcmVtZW50KCkgewotCQlyZXR1cm4gKyt0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgZGVjcmVtZW50KCkgewotCQlyZXR1cm4gLS10aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKFJlYWRPbmx5SW50UmVmZXJlbmNlIHJlZikgewotCQlpbnQgdiA9IHJlZi5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHRoaXMudmFsdWUgPCB2KSA/IC0xIDogKCh0aGlzLnZhbHVlID09IHYpID8gMCA6IDEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVJbnRSZWZlcmVuY2UgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFNpbXBsZUludFJlZmVyZW5jZSkgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUphdmFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNDdiYTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgSmF2YVR5cGV9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUphdmFUeXBlCi0JaW1wbGVtZW50cyBKYXZhVHlwZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSB0eXBlIGFzIGEgbmFtZSwgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZTsKLQotCS8qKgotCSAqIG5vbi1hcnJheSB0eXBlcyBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm8KLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBhcnJheURlcHRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJSQUNLRVRTID0gIltdIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoZWxlbWVudFR5cGVOYW1lID09IG51bGwpIHx8IChlbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbGVtZW50IHR5cGUgbmFtZSBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChlbGVtZW50VHlwZU5hbWUpICE9IDApIHsJCS8vIGUuZy4gIltMamF2YS5sYW5nLk9iamVjdDsiCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZWxlbWVudCB0eXBlIG11c3Qgbm90IGJlIGFuIGFycmF5OiAiICsgZWxlbWVudFR5cGVOYW1lICsgJy4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChhcnJheURlcHRoIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGFycmF5IGRlcHRoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSAmJiAoYXJyYXlEZXB0aCAhPSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3ZvaWQnIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmVsZW1lbnRUeXBlTmFtZSA9IGVsZW1lbnRUeXBlTmFtZTsKLQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGNsYXNzIG5hbWUgY2FuIGJlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOjx1bD48Y29kZT4KLQkgKiA8bGk+amF2YS5sYW5nLk9iamVjdAotCSAqIDxsaT5pbnQKLQkgKiA8bGk+amF2YS51dGlsLk1hcCRFbnRyeQotCSAqIDxsaT5bTGphdmEubGFuZy5PYmplY3Q7Ci0JICogPGxpPltJCi0JICogPGxpPltMamF2YS51dGlsLk1hcCRFbnRyeTsKLQkgKiA8L2NvZGU+PC91bD4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJdGhpcyhDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmFDbGFzc05hbWUpLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhQ2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgSmF2YSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVKYXZhVHlwZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJdGhpcyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXRBcnJheURlcHRoKCkgewotCQlyZXR1cm4gdGhpcy5hcnJheURlcHRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5RGVwdGggPiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWl0aXZlV3JhcHBlcigpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcih0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gMCkgJiYgQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIodGhpcy5lbGVtZW50VHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBDbGFzczw/PiBnZXRKYXZhQ2xhc3MoKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGhpcy5lbGVtZW50VHlwZU5hbWUsIHRoaXMuYXJyYXlEZXB0aCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0aGlzLmVsZW1lbnRUeXBlTmFtZSwgdGhpcy5hcnJheURlcHRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tcGFyaXNvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IG90aGVyQXJyYXlEZXB0aCkKLQkJCSYmIHRoaXMuZWxlbWVudFR5cGVOYW1lLmVxdWFscyhvdGhlckVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoY2xhc3NOYW1lKSwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoY2xhc3NOYW1lKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gdGhpcy5kZXNjcmliZXMoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKEphdmFUeXBlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5nZXRFbGVtZW50VHlwZU5hbWUoKSwgb3RoZXIuZ2V0QXJyYXlEZXB0aCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuICh0aGlzID09IG8pID8gdHJ1ZSA6IChvIGluc3RhbmNlb2YgSmF2YVR5cGUpID8gdGhpcy5lcXVhbHMoKEphdmFUeXBlKSBvKSA6IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5oYXNoQ29kZSgpIF4gdGhpcy5hcnJheURlcHRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGRlY2xhcmF0aW9uKCkgewotCQlpZiAodGhpcy5hcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCk7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoaXMuZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpICsgKDIgKiB0aGlzLmFycmF5RGVwdGgpKTsKLQkJdGhpcy5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kRGVjbGFyYXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZChCUkFDS0VUUyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludERlY2xhcmF0aW9uT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5nZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpKTsKLQkJZm9yIChpbnQgaSA9IHRoaXMuYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlwdy5wcmludChCUkFDS0VUUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+JyQnPC9jb2RlPiB2ZXJzaW9uIG9mIHRoZSBuYW1lIGlzIHVzZWQgaW4ge0BsaW5rIENsYXNzI2Zvck5hbWUoU3RyaW5nKX0sCi0JICogYnV0IHRoZSA8Y29kZT4nLic8L2NvZGU+IHZlcnNpb24gb2YgdGhlIG5hbWUgaXMgdXNlZCBpbiBzb3VyY2UgY29kZS4KLQkgKiBWZXJ5IGlycml0YXRpbmcuLi4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJdGhpcy5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU1ldGhvZFNpZ25hdHVyZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNGI1MjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRob2RTaWduYXR1cmUgaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlTWV0aG9kU2lnbmF0dXJlCi0JaW1wbGVtZW50cyBNZXRob2RTaWduYXR1cmUsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHN0b3JlIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXMgbmFtZXMsIHNvIHdlIGNhbiByZWZlcmVuY2UgY2xhc3NlcwotCSAqIHRoYXQgYXJlIG5vdCBsb2FkZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEphdmFUeXBlW10gRU1QVFlfUEFSQU1FVEVSX1RZUEVTID0gbmV3IEphdmFUeXBlWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9TRVBBUkFUT1IgPSAiLCAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCi0JICogbm8gcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcyhuYW1lLCBFTVBUWV9QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIEphdmFUeXBlLi4uIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobmFtZSA9PSBudWxsKSB8fCAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG5hbWUgaXMgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocGFyYW1ldGVyVHlwZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciB0eXBlcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljaGVja1BhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVzKTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5wYXJhbWV0ZXJUeXBlcyA9IHBhcmFtZXRlclR5cGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQYXJhbWV0ZXJUeXBlcyhKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgdHlwZTogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAocGFyYW1ldGVyVHlwZXNbaV0uZ2V0RWxlbWVudFR5cGVOYW1lKCkuZXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkEgcGFyYW1ldGVyIHR5cGUgb2YgJ3ZvaWQnIGlzIG5vdCBhbGxvd2VkOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIFN0cmluZy4uLiBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJdGhpcyhuYW1lLCBidWlsZFBhcmFtZXRlclR5cGVzKHBhcmFtZXRlclR5cGVOYW1lcykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlW10gYnVpbGRQYXJhbWV0ZXJUeXBlcyhTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMpIHsKLQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIHR5cGUgbmFtZXMgYXJlIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlcyA9IG5ldyBKYXZhVHlwZVtwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIHR5cGUgbmFtZTogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBTaW1wbGVKYXZhVHlwZShwYXJhbWV0ZXJUeXBlTmFtZXNbaV0pOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBwYXJhbWV0ZXIKLQkgKiB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKFN0cmluZyBuYW1lLCBDbGFzczw/Pi4uLiBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQl0aGlzKG5hbWUsIGJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKHBhcmFtZXRlckphdmFDbGFzc2VzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJKYXZhQ2xhc3NlcykgewotCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmFtZXRlciBKYXZhIGNsYXNzZXMgYXJlIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzID0gbmV3IFN0cmluZ1twYXJhbWV0ZXJKYXZhQ2xhc3Nlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlckphdmFDbGFzc2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFyYW1ldGVySmF2YUNsYXNzZXNbaV0gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk1pc3NpbmcgcGFyYW1ldGVyIEphdmEgY2xhc3M6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcGFyYW1ldGVyVHlwZU5hbWVzW2ldID0gcGFyYW1ldGVySmF2YUNsYXNzZXNbaV0uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBKYXZhIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKE1ldGhvZCBtZXRob2QpIHsKLQkJdGhpcyhtZXRob2QuZ2V0TmFtZSgpLCBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIEphdmFUeXBlW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmFtZXRlclR5cGVzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wYXJpc29uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlcyhNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCi0JCQkJJiYgdGhpcy5wYXJhbWV0ZXJUeXBlc0Rlc2NyaWJlKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcGFyYW1ldGVyVHlwZXNEZXNjcmliZShDbGFzczw/PltdIG90aGVyUGFyYW1ldGVyVHlwZXMpIHsKLQkJSmF2YVR5cGVbXSBsb2NhbFBhcmFtZXRlclR5cGVzID0gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQkJaW50IGxlbiA9IGxvY2FsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlpZiAob3RoZXJQYXJhbWV0ZXJUeXBlcy5sZW5ndGggIT0gbGVuKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgbG9jYWxQYXJhbWV0ZXJUeXBlc1tpXS5kZXNjcmliZXMob3RoZXJQYXJhbWV0ZXJUeXBlc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBvdGhlck5hbWUsIEphdmFUeXBlW10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gdGhpcy5uYW1lLmVxdWFscyhvdGhlck5hbWUpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBvdGhlclBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTWV0aG9kU2lnbmF0dXJlIG90aGVyKSB7Ci0JCXJldHVybiB0aGlzLmVxdWFscyhvdGhlci5nZXROYW1lKCksIG90aGVyLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBNZXRob2RTaWduYXR1cmUpID8gdGhpcy5lcXVhbHMoKE1ldGhvZFNpZ25hdHVyZSkgbykgOiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lLmhhc2hDb2RlKCkgXiBBcnJheXMuaGFzaENvZGUodGhpcy5wYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZFNpZ25hdHVyZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlzYi5hcHBlbmQoUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0JCQl9Ci0JCQlsb2NhbFBhcmFtZXRlclR5cGVzW2ldLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U2lnbmF0dXJlT24oUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQodGhpcy5uYW1lKTsKLQkJcHcucHJpbnQoJygnKTsKLQkJSmF2YVR5cGVbXSBsb2NhbFBhcmFtZXRlclR5cGVzID0gdGhpcy5wYXJhbWV0ZXJUeXBlczsKLQkJaW50IGxlbiA9IGxvY2FsUGFyYW1ldGVyVHlwZXMubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJcHcucHJpbnQoUEFSQU1FVEVSX1NFUEFSQVRPUik7Ci0JCQl9Ci0JCQlsb2NhbFBhcmFtZXRlclR5cGVzW2ldLnByaW50RGVjbGFyYXRpb25Pbihwdyk7Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJdGhpcy5hcHBlbmRTaWduYXR1cmVUbyhzYik7Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVPYmplY3RSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTM0YWE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuT2JqZWN0UmVmZXJlbmNlOwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHJlY2lwaWVudC4KLSAqIAotICogQHNlZSBTeW5jaHJvbml6ZWRPYmplY3QKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPgotCWltcGxlbWVudHMgT2JqZWN0UmVmZXJlbmNlPFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgViB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlT2JqZWN0UmVmZXJlbmNlKFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTaW1wbGVPYmplY3RSZWZlcmVuY2UoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyBWIHNldE51bGwoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8Vj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSA9IChTaW1wbGVPYmplY3RSZWZlcmVuY2U8Vj4pIHN1cGVyLmNsb25lKCk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMudmFsdWUpICsgJ10nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmUwMjZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFF1ZXVlfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVRdWV1ZTxFPgotCWltcGxlbWVudHMgUXVldWU8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0PEU+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUXVldWUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHF1ZXVlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgcXVldWUgd2lsbCBkZXF1ZXVlIGl0cyBlbGVtZW50cyBpbiB0aGUgc2FtZQotCSAqIG9yZGVyIHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3IgKGkuZS4gdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB7QGxpbmsgI2RlcXVldWUoKX0pLgotCSAqLwotCXB1YmxpYyBTaW1wbGVRdWV1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVldWUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZW5xdWV1ZShFIG8pIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KG8pOwotCX0KLQotCXB1YmxpYyBFIGRlcXVldWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUZpcnN0KCk7Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuZ2V0Rmlyc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENsb25lYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlUXVldWU8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVF1ZXVlPEU+IGNsb25lID0gKFNpbXBsZVF1ZXVlPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wZWVrKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTZiNDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFN0YWNrfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdGFjazxFPgotCWltcGxlbWVudHMgU3RhY2s8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBMaW5rZWRMaXN0PEU+IGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RhY2soKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YWNrIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgc3RhY2sgd2lsbCBwb3AgaXRzIGVsZW1lbnRzIGluIHJldmVyc2Ugb2YgdGhlCi0JICogb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciAoaS5lLiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciB3aWxsIGJlIHRoZQotCSAqIGZpcnN0IGVsZW1lbnQgcmV0dXJuZWQgYnkge0BsaW5rICNwb3AoKX0pLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjayhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBuZXcgTGlua2VkTGlzdDxFPihjb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RhY2sgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJdGhpcy5lbGVtZW50cy5hZGRMYXN0KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLnJlbW92ZUxhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5nZXRMYXN0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5pc0VtcHR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNpbXBsZVN0YWNrPEU+IGNsb25lKCkgewotCQl0cnkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlTaW1wbGVTdGFjazxFPiBjbG9uZSA9IChTaW1wbGVTdGFjazxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGlua2VkTGlzdDxFPiBsbCA9IChMaW5rZWRMaXN0PEU+KSB0aGlzLmVsZW1lbnRzLmNsb25lKCk7Ci0JCQljbG9uZS5lbGVtZW50cyA9IGxsOwotCQkJcmV0dXJuIGNsb25lOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucGVlaygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4NWY3OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdHJpbmdNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vLyBUT0RPIHRoZSByZWdleCBjb2RlIGlzIG5vdCB2ZXJ5IGZhc3QgLSB3ZSBjb3VsZCBwcm9iYWJseSBkbyBiZXR0ZXIsCi0vLyBoYW5kLWNvZGluZyB0aGUgbWF0Y2hpbmcgYWxnb3JpdGhtIChlY2xpcHNlIFN0cmluZ01hdGNoZXI/KQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzaW1wbGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0aGF0IGlzIGEgbGl0dGxlCi0gKiBtb3JlIHVzZXItZnJpZW5kbHkgdGhhbiBzdGFuZGFyZCByZWd1bGFyIGV4cHJlc3Npb25zLiBJbnN0YW50aWF0ZSBhCi0gKiBzdHJpbmcgbWF0Y2hlciB3aXRoIGEgZmlsdGVyIHBhdHRlcm4gYW5kIHRoZW4geW91IGNhbiB1c2UgdGhlIG1hdGNoZXIKLSAqIHRvIGRldGVybWluZSB3aGV0aGVyIGFub3RoZXIgc3RyaW5nIChvciBvYmplY3QpIG1hdGNoZXMgdGhlIHBhdHRlcm4uCi0gKiBZb3UgY2FuIGFsc28gc3BlY2lmeSB3aGV0aGVyIHRoZSBtYXRjaGluZyBzaG91bGQgYmUgY2FzZS1zZW5zaXRpdmUuCi0gKiAKLSAqIFRoZSBwYXR0ZXJuIGNhbiBjb250YWluIHR3byAibWV0YS1jaGFyYWN0ZXJzIjoKLSAqIAknKicgd2lsbCBtYXRjaCBhbnkgc2V0IG9mIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCi0gKiAJJz8nIHdpbGwgbWF0Y2ggYW55IHNpbmdsZSBjaGFyYWN0ZXIKLSAqIAotICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgI3ByZWZpeCgpIGFuZC9vciAjc3VmZml4KCkgdG8gY2hhbmdlIHdoYXQKLSAqIHN0cmluZ3MgYXJlIHByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0gKiBUaGlzIGNhbiBvZmZlciBhIHNsaWdodCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbmNhdGVuYXRpbmcKLSAqIHN0cmluZ3MgYmVmb3JlIGNhbGxpbmcgI3NldFBhdHRlcm5TdHJpbmcoU3RyaW5nKS4KLSAqIEJ5IGRlZmF1bHQsIGEgJyonIGlzIGFwcGVuZGVkIHRvIGV2ZXJ5IHN0cmluZy4KLSAqIAotICogVGhpcyBjbGFzcyBhbHNvIHVzZXMgdGhlIHN0cmluZy1tYXRjaGluZyBhbGdvcml0aG0gdG8gImZpbHRlciIgb2JqZWN0cwotICogKGFuZCwgYXMgYSByZXN1bHQsIGFsc28gaW1wbGVtZW50cyB0aGUgRmlsdGVyIGludGVyZmFjZSkuCi0gKiBBIHN0cmluZyBjb252ZXJ0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmcgYXNwZWN0IG9mIHRoZQotICogb2JqZWN0IGlzIGNvbXBhcmVkIHRvIHRoZSBwYXR0ZXJuLiBCeSBkZWZhdWx0IHRoZSBzdHJpbmcgcmV0dXJuZWQKLSAqIGJ5IHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSBtZXRob2QgaXMgcGFzc2VkIHRvIHRoZSBwYXR0ZXJuIG1hdGNoZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJpbmdNYXRjaGVyPFQ+Ci0JaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCi0JLyoqIEFuIGFkYXB0ZXIgdGhhdCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbnRvIHN0cmluZ3MgdG8gYmUgbWF0Y2hlZCB3aXRoIHRoZSBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcjsKLQotCS8qKiBUaGUgc3RyaW5nIHVzZWQgdG8gY29uc3RydWN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4gKi8KLQlwcml2YXRlIFN0cmluZyBwYXR0ZXJuU3RyaW5nOwotCi0JLyoqIFdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlIC0gdGhlIGRlZmF1bHQgaXMgdHJ1ZS4gKi8KLQlwcml2YXRlIGJvb2xlYW4gaWdub3Jlc0Nhc2U7Ci0KLQkvKiogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIGJ1aWx0IGZyb20gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXByaXZhdGUgUGF0dGVybiBwYXR0ZXJuOwotCi0JLyoqIEEgbGlzdCBvZiB0aGUgbWV0YS1jaGFyYWN0ZXJzIHdlIG5lZWQgdG8gZXNjYXBlIGlmIGZvdW5kIGluIHRoZSBwYXR0ZXJuIHN0cmluZy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBSRUdfRVhfTUVUQV9DSEFSUyA9IHsgJygnLCAnWycsICd7JywgJ1xcJywgJ14nLCAnJCcsICd8JywgJyknLCAnPycsICcqJywgJysnLCAnLicgfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIGFuIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoCi0JICogYW55IHN0cmluZyBhbmQgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoKSB7Ci0JCXRoaXMoIioiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggdGhlIHNwZWNpZmllZCBwYXR0ZXJuCi0JICogdGhhdCB3aWxsIGlnbm9yZSBjYXNlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMocGF0dGVyblN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gdGhhdCB3aWxsCi0JICogaWdub3JlIGNhc2UgYXMgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdHJpbmdNYXRjaGVyKFN0cmluZyBwYXR0ZXJuU3RyaW5nLCBib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogcmUtYnVpbGQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkUGF0dGVybigpIHsKLQkJdGhpcy5wYXR0ZXJuID0gdGhpcy5idWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgY3VycmVudCBwYXR0ZXJuIHN0cmluZyBhbmQgY2FzZS1zZW5zaXRpdml0eSBzZXR0aW5nLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkCi0JICogdG8gbWF0Y2ggc3RyaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgUGF0dGVybiBidWlsZFBhdHRlcm4oKSB7Ci0JCWludCBwYXR0ZXJuRmxhZ3MgPSAweDA7Ci0JCWlmICh0aGlzLmlnbm9yZXNDYXNlKSB7Ci0JCQlwYXR0ZXJuRmxhZ3MgPSBQYXR0ZXJuLlVOSUNPREVfQ0FTRSB8IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRTsKLQkJfQotCQlyZXR1cm4gUGF0dGVybi5jb21waWxlKHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKSwgcGF0dGVybkZsYWdzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RyaW5nTWF0Y2hlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQl0aGlzLnBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuU3RyaW5nOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm4ubWF0Y2hlcihzdHJpbmcpLm1hdGNoZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRmlsdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhY2NlcHQoVCBvKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXModGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3RyaW5nIGNvbnZlcnRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMKLQkgKiBwYXNzZWQgdG8gdGhlIG1hdGNoZXIgaW50byBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikgewotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciA9IHN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhdHRlcm5TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm5TdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpZ25vcmVzQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMuaWdub3Jlc0Nhc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIG1hdGNoZXIgaWdub3JlcyBjYXNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRJZ25vcmVzQ2FzZShib29sZWFuIGlnbm9yZXNDYXNlKSB7Ci0JCXRoaXMuaWdub3Jlc0Nhc2UgPSBpZ25vcmVzQ2FzZTsKLQkJdGhpcy5yZWJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQYXR0ZXJuIHBhdHRlcm4oKSB7Ci0JCXJldHVybiB0aGlzLnBhdHRlcm47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG90aGVyIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0bwotCSAqIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyByZWd1bGFyRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvUmVnRXgodGhpcy5wYXR0ZXJuU3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvUmVnRXgoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cmluZy5sZW5ndGgoKSArIDEwKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHRoaXMucHJlZml4KCksIHNiKTsKLQkJdGhpcy5jb252ZXJ0VG9SZWdFeE9uKHN0cmluZywgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5zdWZmaXgoKSwgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW55IHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyBwcmVmaXguCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwcmVmaXgoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgc3VmZml4IHRoYXQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbAotCSAqIHN0cmluZy4gU2luY2UgdGhpcyBjbGFzcyBpcyB0eXBpY2FsbHkgdXNlZCBpbiBVSSBzaXR1YXRpb24gd2hlcmUKLQkgKiB0aGUgdXNlciBpcyB0eXBpbmcgaW4gYSBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIGEgbGlzdCwgdGhlIGRlZmF1bHQKLQkgKiBzdWZmaXggaXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzdWZmaXgoKSB7Ci0JCXJldHVybiAiKiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbnZlcnRUb1JlZ0V4T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBjaGFyQXJyYXkgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJaW50IGxlbmd0aCA9IGNoYXJBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IGNoYXJBcnJheVtpXTsKLQkJCS8vIGNvbnZlcnQgdXNlci1mcmllbmRseSBtZXRhLWNoYXJzIGludG8gcmVnZXggbWV0YS1jaGFycwotCQkJaWYgKGMgPT0gJyonKSB7Ci0JCQkJc2IuYXBwZW5kKCIuKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoYyA9PSAnPycpIHsKLQkJCQlzYi5hcHBlbmQoJy4nKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vIGVzY2FwZSByZWdleCBtZXRhLWNoYXJzCi0JCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhSRUdfRVhfTUVUQV9DSEFSUywgYykpIHsKLQkJCQlzYi5hcHBlbmQoJ1xcJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVRocmVhZEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVRocmVhZEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMyYmJiMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVUaHJlYWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLS8qKgotICogQSA8Y29kZT5TaW1wbGVUaHJlYWRGYWN0b3J5PC9jb2RlPiBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgotICogdGhlIEpESyB7QGxpbmsgVGhyZWFkRmFjdG9yeX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUaHJlYWRGYWN0b3J5Ci0JaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlVGhyZWFkRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBTaW1wbGVUaHJlYWRGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRocmVhZEZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2ltcGxlVGhyZWFkRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkKHIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxODZiZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNsYXNzaWMgc3RhY2sgYmVoYXZpb3IsCi0gKiB3aXRob3V0IHRoZSBiYWNrZG9vcnMgYWxsb3dlZCBieSB7QGxpbmsgamF2YS51dGlsLlN0YWNrfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHN0YWNrCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhY2s8RT4gewotCi0JLyoqCi0JICogIlB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQl2b2lkIHB1c2goRSBlbGVtZW50KTsKLQotCS8qKgotCSAqICJQb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBvcCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogd2l0aG91dCByZW1vdmluZyBpdCBmcm9tIHRoZSBzdGFjay4KLQkgKi8KLQlFIHBlZWsoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdGFjayBpcyBlbXB0eS4KLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCi0JZmluYWwgY2xhc3MgRW1wdHk8RT4gaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdGFjayBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gU3RhY2s8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBwdXNoKEUgZWxlbWVudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcG9wKCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRSBwZWVrKCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ZTk5ZGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBjb250cm9sIGhvdyBhIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCi0gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2ZXIgcHJvdmlkZXMgdGhlIGNvbW1hbmQgYnV0IHRoZSBjbGllbnQgcHJvdmlkZXMKLSAqIHRoZSBjb250ZXh0IChlLmcuIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBkaXNwYXRjaCB0aGUgY29tbWFuZCB0byB0aGUgVUkKLSAqIHRocmVhZCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLQlleHRlbmRzIENvbW1hbmRFeGVjdXRvcgotewotCS8qKgotCSAqIFN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dG9yLgotCSAqLwotCXZvaWQgc3RhcnQoKTsKLQotCS8qKgotCSAqIFN0b3AgdGhlIGNvbW1hbmQgZXhlY3V0b3IuCi0JICovCi0Jdm9pZCBzdG9wKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbGxhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb2xsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ5Yjc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbGxhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNvbGxhdG9yIHNpbXBseSB3cmFwcyB0aGUgZGVmYXVsdCBKYXZhIGNvbGxhdG9yIGFuZCBpbXBsZW1lbnRzIGEKLSAqIHtAbGluayBTdHJpbmd9IHtAbGluayBDb21wYXJhdG9yfSAoaW5zdGVhZCBvZiBhbiB7QGxpbmsgT2JqZWN0fQotICoge0BsaW5rIENvbXBhcmF0b3J9LCB3aGljaCBpcyB3aGF0IHtAbGluayBDb2xsYXRvcn0gZG9lcywgcG9zc2libHkgZm9yCi0gKiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlYXNvbnMoPykpLgotICogCi0gKiBAc2VlIENvbGxhdG9yI2dldEluc3RhbmNlKCkKLSAqLwotcHVibGljIGNsYXNzIFN0cmluZ0NvbGxhdG9yCi0JaW1wbGVtZW50cyBDb21wYXJhdG9yPFN0cmluZz4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NvbGxhdG9yIElOU1RBTkNFID0gbmV3IFN0cmluZ0NvbGxhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3I8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdDb2xsYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHN0cmluZzEsIFN0cmluZyBzdHJpbmcyKSB7Ci0JCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoc3RyaW5nMSwgc3RyaW5nMik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTJjOWMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+IGltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBTdHJpbmdDb252ZXJ0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlZmF1bHQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCdzICN0b1N0cmluZygpIHJlc3VsdAotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXJldHVybiAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ0NvbnZlcnRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIFN0cmluZ0NvbnZlcnRlcjxTPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IFN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjY5MDBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIHNpbXBsZSBBUEkgZm9yIGFsbG93aW5nICJwbHVnZ2FibGUiCi0gKiBzdHJpbmcgbWF0Y2hlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgcGF0dGVybiBzdHJpbmcKLSAqIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmdzIG1hdGNoIHRoZSBwYXR0ZXJuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ01hdGNoZXIgewotCi0JLyoqCi0JICogU2V0IHRoZSBwYXR0ZXJuIHN0cmluZyB1c2VkIHRvIGRldGVybWluZSBmdXR1cmUKLQkgKiBtYXRjaGVzLiBUaGUgZm9ybWF0IGFuZCBzZW1hbnRpY3Mgb2YgdGhlIHBhdHRlcm4KLQkgKiBzdHJpbmcgYXJlIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlCi0JICogY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCXZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZQotCSAqIGVzdGFibGlzaGVkIHBhdHRlcm4gc3RyaW5nLiBUaGUgc2VtYW50aWNzIG9mIGEgbWF0Y2gKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZQotCSAqIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ01hdGNoZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIFN0cmluZ01hdGNoZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFBhdHRlcm5TdHJpbmcoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJCS8vIGlnbm9yZSB0aGUgcGF0dGVybiBzdHJpbmcKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpIHsKLQkJCS8vIGV2ZXJ5dGhpbmcgaXMgYSBtYXRjaAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlN0cmluZ01hdGNoZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhYjNiNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzLgotICoKLSAqIEFzIG9mIGpkayAxLjUsIGl0J3MgdGVtcHRpbmcgdG8gY29udmVydCBhbGwgb2YgdGhlc2UgbWV0aG9kcyB0byB1c2UKLSAqIGphdmEubGFuZy5BcHBlbmRhYmxlIChpbnN0ZWFkIG9mIFN0cmluZ0J1ZmZlciwgU3RyaW5nQnVpbGRlciwgYW5kIFdyaXRlcik7Ci0gKiBidXQgYWxsIHRoZSBBcHBlbmRhYmxlIG1ldGhvZHMgdGhyb3cgamF2YS5pby5JT0V4Y2VwdGlvbiAoeWVjaCkgYW5kIHdlCi0gKiBbbWlnaHQ/XSBnZXQgYSBiaXQgYmV0dGVyIHBlcmZvcm1hbmNlIGludm9raW5nIG1ldGhvZHMgb24gY2xhc3NlcyB0aGFuCi0gKiB3ZSBnZXQgb24gaW50ZXJmYWNlcy4gOi0pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdUb29scyB7Ci0KLQkvKiogY2FycmlhZ2UgcmV0dXJuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQkvKiogZG91YmxlIHF1b3RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwotCi0JLyoqIHBhcmVudGhlc2lzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fUEFSRU5USEVTSVMgPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX1BBUkVOVEhFU0lTID0gJyknOwotCi0JLyoqIGJyYWNrZXRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fQlJBQ0tFVCA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQlJBQ0tFVCA9ICddJzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0JSQUNFID0gJ3snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9CUkFDRSA9ICd9JzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0NIRVZST04gPSAnPCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0NIRVZST04gPSAnPic7Ci0KLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBlbXB0eSBjaGFyIGFycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfQ0hBUl9BUlJBWSA9IG5ldyBjaGFyWzBdOwotCi0JLyoqIGVtcHR5IHN0cmluZyBhcnJheSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIHdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZChpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBwYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBwYWRPclRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZygwLCBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogU3RyaW5nI3BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZShpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiBTdHJpbmcjcGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIFN0cmluZyNwYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhwYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlUb29scy5maWxsKG5ldyBjaGFyW2xlbmd0aCAtIHN0cmluZ0xlbmd0aF0sIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcubGVuZ3RoKCksIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oaW50IHN0cmluZ0xlbmd0aCwgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheVRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHBhZF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgMCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCBzdHJpbmdMZW5ndGgsIGxlbmd0aCwgYyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZChpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gemVyb1BhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZChzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI3plcm9QYWRPbihpbnQsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkKGludCwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHplcm9QYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZyb250UGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyN6ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiBTdHJpbmcjemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGZyb250UGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5ndGhdOwotCQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIFN0cmluZyNmcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogU3RyaW5nI2Zyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBGcm9udC1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRfKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlyZXR1cm4gbmV3IFN0cmluZyhmcm9udFBhZF8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYykpOwotCX0KLQotCS8qCi0JICogWmVyby1wYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gZnJvbnRQYWRfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWludCBwYWRMZW5ndGggPSBsZW5ndGggLSBzdHJpbmdMZW5ndGg7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIHBhZExlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJQXJyYXlzLmZpbGwocmVzdWx0LCAwLCBwYWRMZW5ndGgsIGMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXBhcmF0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcGFyYXRlKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJcmV0dXJuIChsZW4gPD0gc2VnbWVudFNpemUpID8gc3RyaW5nIDogbmV3IFN0cmluZyhzZXBhcmF0ZShzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPD0gc2VnbWVudFNpemUpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA8PSBzZWdtZW50U2l6ZSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc2VwYXJhdGUoY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSkgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJcmV0dXJuIChsZW4gPD0gc2VnbWVudFNpemUpID8gc3RyaW5nIDogc2VwYXJhdGUoc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBsZW4pOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb25zOiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gc2VnbWVudCBzaXplOyBzZWdtZW50IHNpemUgaXMgcG9zaXRpdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gc2VwYXJhdGUoY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgaW50IGxlbikgewotCQlpbnQgcmVzdWx0TGVuID0gbGVuICsgKGxlbiAvIHNlZ21lbnRTaXplKTsKLQkJaWYgKChsZW4gJSBzZWdtZW50U2l6ZSkgPT0gMCkgewotCQkJcmVzdWx0TGVuLS07ICAvLyBubyBzZXBhcmF0b3IgYWZ0ZXIgdGhlIGZpbmFsIHNlZ21lbnQgaWYgbm90aGluZyBmb2xsb3dpbmcgaXQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbcmVzdWx0TGVuXTsKLQkJaW50IGogPSAwOwotCQlpbnQgc2VnQ291bnQgPSAwOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKHNlZ0NvdW50ID09IHNlZ21lbnRTaXplKSB7Ci0JCQkJcmVzdWx0W2orK10gPSBzZXBhcmF0b3I7Ci0JCQkJc2VnQ291bnQgPSAwOwotCQkJfQotCQkJc2VnQ291bnQrKzsKLQkJCXJlc3VsdFtqKytdID0gYzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGggPD0gc2VnbWVudFNpemUpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyBsb25nZXIgdGhhbiBzZWdtZW50IHNpemU7IHNlZ21lbnQgc2l6ZSBpcyBwb3NpdGl2ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2VwYXJhdGVPbl8oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc2VnQ291bnQgPSAwOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKHNlZ0NvdW50ID09IHNlZ21lbnRTaXplKSB7Ci0JCQkJd3JpdGVDaGFyT24oc2VwYXJhdG9yLCB3cml0ZXIpOwotCQkJCXNlZ0NvdW50ID0gMDsKLQkJCX0KLQkJCXNlZ0NvdW50Kys7Ci0JCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbnM6IHN0cmluZyBpcyBsb25nZXIgdGhhbiBzZWdtZW50IHNpemU7IHNlZ21lbnQgc2l6ZSBpcyBwb3NpdGl2ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2VwYXJhdGVPbl8oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzZWdDb3VudCA9IDA7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoc2VnQ291bnQgPT0gc2VnbWVudFNpemUpIHsKLQkJCQlzYi5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCQlzZWdDb3VudCA9IDA7Ci0JCQl9Ci0JCQlzZWdDb3VudCsrOwotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VwYXJhdGUgdGhlIHNlZ21lbnRzIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHNlcGFyYXRvcjo8cHJlPgotCSAqICAgICBzZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyKSA9PiAiMDEtMjMtNDUiCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcGFyYXRlT24oY2hhcltdIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50U2l6ZSwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCA8PSBzZWdtZW50U2l6ZSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb25zOiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gc2VnbWVudCBzaXplOyBzZWdtZW50IHNpemUgaXMgcG9zaXRpdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlcGFyYXRlT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHNlZ0NvdW50ID0gMDsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChzZWdDb3VudCA9PSBzZWdtZW50U2l6ZSkgewotCQkJCXNiLmFwcGVuZChzZXBhcmF0b3IpOwotCQkJCXNlZ0NvdW50ID0gMDsKLQkJCX0KLQkJCXNlZ0NvdW50Kys7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZy9xdW90aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZywgUVVPVEUsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIGEgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gcXVvdGUoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZ3MsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlcikgewotCQlyZXR1cm4gbmV3IFN0cmluZyhkZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlciwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBuZXcgQ2hhclN0cmluZ0RlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBuZXcgQ2hhclN0cmluZ0RlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyU3RyaW5nRGVsaW1pdGVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IHsKLQkJcHJpdmF0ZSBjaGFyIGRlbGltaXRlcjsKLQkJQ2hhclN0cmluZ0RlbGltaXRlcihjaGFyIGRlbGltaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgdGhpcy5kZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApKTsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhkZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCWRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlci5jaGFyQXQoMCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlci50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGRlbGltaXQoSXRlcmFibGU8U3RyaW5nPiBzdHJpbmdzLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpID8KLQkJCQlkZWxpbWl0KHN0cmluZ3MsIGRlbGltaXRlci5jaGFyQXQoMCkpIDoKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IFN0cmluZ1N0cmluZ0RlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGRlbGltaXQoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzLCBTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpID8KLQkJCQlkZWxpbWl0KHN0cmluZ3MsIGRlbGltaXRlci5jaGFyQXQoMCkpIDoKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IFN0cmluZ1N0cmluZ0RlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdTdHJpbmdEZWxpbWl0ZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gewotCQlwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXI7Ci0JCVN0cmluZ1N0cmluZ0RlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCB0aGlzLmRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHF1b3RlKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAncXVvdGUnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IHF1b3RlQ2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIGRlbGltaXRDaGFyQXJyYXlzKHN0cmluZ3MsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZGVsaW1pdChjaGFyW10gc3RyaW5nLCBjaGFyIGRlbGltaXRlcikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCArIDIpOwotCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgZGVsaW1pdGVyLCB3cml0ZXIpOwotCQl3cml0ZUNoYXJPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyIGRlbGltaXRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2RlbGltaXQnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxjaGFyW10+IGRlbGltaXRDaGFyQXJyYXlzKEl0ZXJhYmxlPGNoYXJbXT4gc3RyaW5ncywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBuZXcgQ2hhckNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgdGhlIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2RlbGltaXQnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGRlbGltaXRDaGFyQXJyYXlzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBuZXcgQ2hhckNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyQ2hhckFycmF5RGVsaW1pdGVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IHsKLQkJcHJpdmF0ZSBjaGFyIGRlbGltaXRlcjsKLQkJQ2hhckNoYXJBcnJheURlbGltaXRlcihjaGFyIGRlbGltaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgdGhpcy5kZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZGVsaW1pdChjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCWludCBkZWxpbWl0ZXJMZW5ndGggPSBkZWxpbWl0ZXIubGVuZ3RoOwotCQlpZiAoZGVsaW1pdGVyTGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBkZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyWzBdKTsKLQkJfQotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3N0cmluZ0xlbmd0aCsoMipkZWxpbWl0ZXJMZW5ndGgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShkZWxpbWl0ZXIsIDAsIHJlc3VsdCwgMCwgZGVsaW1pdGVyTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShzdHJpbmcsIDAsIHJlc3VsdCwgZGVsaW1pdGVyTGVuZ3RoLCBzdHJpbmdMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGRlbGltaXRlciwgMCwgcmVzdWx0LCBzdHJpbmdMZW5ndGgrZGVsaW1pdGVyTGVuZ3RoLCBkZWxpbWl0ZXJMZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXJbMF0sIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZVN0cmluZ09uKGRlbGltaXRlciwgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQkJd3JpdGVTdHJpbmdPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXJbMF0sIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXJbMF0sIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChkZWxpbWl0ZXIpOwotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MsIGNoYXJbXSBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBuZXcgQ2hhckFycmF5Q2hhckFycmF5RGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYQotCSAqIGNvcHkgb2YgdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIGEgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MsIGNoYXJbXSBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBuZXcgQ2hhckFycmF5Q2hhckFycmF5RGVsaW1pdGVyKGRlbGltaXRlcikpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENoYXJBcnJheUNoYXJBcnJheURlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiB7Ci0JCXByaXZhdGUgY2hhcltdIGRlbGltaXRlcjsKLQkJQ2hhckFycmF5Q2hhckFycmF5RGVsaW1pdGVyKGNoYXJbXSBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcXVvdGVkOiAiXCJmb29cIiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUXVvdGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHBhcmVudGhldGljYWw6ICIoZm9vKSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fUEFSRU5USEVTSVMsIENMT1NFX1BBUkVOVEhFU0lTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFja2V0ZWQ6ICJbZm9vXSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDS0VULCBDTE9TRV9CUkFDS0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFjZWQ6ICJ7Zm9vfSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2VkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDRSwgQ0xPU0VfQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGNoZXZyb25lZDogIjxmb28+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0NIRVZST04sIENMT1NFX0NIRVZST04pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgYywgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgc3RyaW5nLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuIDwgMikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcudG9DaGFyQXJyYXkoKSwgc3RhcnQsIGVuZCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBxdW90ZWQ6ICJcImZvb1wiIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNRdW90ZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcGFyZW50aGV0aWNhbDogIihmb28pIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNQYXJlbnRoZXRpY2FsKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9QQVJFTlRIRVNJUywgQ0xPU0VfUEFSRU5USEVTSVMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNrZXRlZDogIltmb29dIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFja2V0ZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNLRVQsIENMT1NFX0JSQUNLRVQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGJyYWNlZDogIntmb299Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNCcmFjZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0JSQUNFLCBDTE9TRV9CUkFDRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgY2hldnJvbmVkOiAiPGZvbz4iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0NoZXZyb25lZChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQ0hFVlJPTiwgQ0xPU0VfQ0hFVlJPTik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBjLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRGVsaW1pdGVkKGNoYXJbXSBzdHJpbmcsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuIDwgMikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIHN0YXJ0LCBlbmQsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gcywgY2hhciBzdGFydCwgY2hhciBlbmQsIGludCBsZW4pIHsKLQkJcmV0dXJuIChzWzBdID09IHN0YXJ0KSAmJiAoc1tsZW4gLSAxXSA9PSBlbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmRlbGltaXRpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kZWxpbWl0KFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmRlbGltaXRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5kZWxpbWl0KFN0cmluZyBzdHJpbmcsIGludCBjb3VudCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyh1bmRlbGltaXQoc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgY291bnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJcmV0dXJuIHVuZGVsaW1pdF8oc3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmRlbGltaXRfKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdChjaGFyW10gc3RyaW5nLCBpbnQgY291bnQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQlyZXR1cm4gdW5kZWxpbWl0KHN0cmluZywgbGVuLCBjb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuZGVsaW1pdChjaGFyW10gc3RyaW5nLCBpbnQgbGVuLCBpbnQgY291bnQpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBjb3VudCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXVuZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGNvdW50LCBsZW4sIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgY291bnQgKyBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXVuZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgY291bnQgKyBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgZGVsaW1pdGVyID0gc3RyaW5nWzBdOyAgLy8gdGhlIGZpcnN0IGNoYXIgaXMgdGhlIGRlbGltaXRlcgotCQljaGFyIGMgPSBzdHJpbmdbMF07Ci0JCWNoYXIgbmV4dCA9IHN0cmluZ1sxXTsKLQkJaW50IGkgPSAxOwotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlkbyB7Ci0JCQljID0gbmV4dDsKLQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCQlpKys7Ci0JCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKChuZXh0ICE9IGRlbGltaXRlcikgfHwgKGkgPT0gbGFzdCkpIHsKLQkJCQkJLy8gYW4gZW1iZWRkZWQgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZWxpbWl0ZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpKys7Ci0JCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCX0KLQkJfSB3aGlsZSAoaSAhPSBsYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgY291bnQsIGxlbiwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgc2IpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHN0cmluZyBpcyBhdCBsZWFzdCAzIGNoYXJhY3RlcnMgbG9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kZWxpbWl0T25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIGRlbGltaXRlciA9IHN0cmluZ1swXTsgIC8vIHRoZSBmaXJzdCBjaGFyIGlzIHRoZSBkZWxpbWl0ZXIKLQkJY2hhciBjID0gc3RyaW5nWzBdOwotCQljaGFyIG5leHQgPSBzdHJpbmdbMV07Ci0JCWludCBpID0gMTsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJZG8gewotCQkJYyA9IG5leHQ7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCQlpKys7Ci0JCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJaWYgKChuZXh0ICE9IGRlbGltaXRlcikgfHwgKGkgPT0gbGFzdCkpIHsKLQkJCQkJLy8gYW4gZW1iZWRkZWQgZGVsaW1pdGVyIG11c3QgYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBkZWxpbWl0ZXIKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpKys7Ci0JCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCX0KLQkJfSB3aGlsZSAoaSAhPSBsYXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBsZW4pOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gMjsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdW5kZWxpbWl0T25fKHN0cmluZywgc2IpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHN0cmluZyBpcyBhdCBsZWFzdCAzIGNoYXJhY3RlcnMgbG9uZwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5kZWxpbWl0T25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBkZWxpbWl0ZXIgPSBzdHJpbmdbMF07ICAvLyB0aGUgZmlyc3QgY2hhciBpcyB0aGUgZGVsaW1pdGVyCi0JCWNoYXIgYyA9IHN0cmluZ1swXTsKLQkJY2hhciBuZXh0ID0gc3RyaW5nWzFdOwotCQlpbnQgaSA9IDE7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWRvIHsKLQkJCWMgPSBuZXh0OwotCQkJc2IuYXBwZW5kKGMpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGxlbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92aW5nIGNoYXJhY3RlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZShjaGFyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUZpcnN0T2NjdXJyZW5jZShTdHJpbmcgc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gY2hhcmFjdGVyIG5vdCBmb3VuZAotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXJldHVybiBzdHJpbmcuc3Vic3RyaW5nKDEpOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGFzdCk7Ci0JCX0KLQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpLmNvbmNhdChzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsYXN0XTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMSwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGxhc3QpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBpbmRleCArIDEsIHJlc3VsdCwgaW5kZXgsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsYXN0LCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBpbmRleCwgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHByaW50IHRoZSByZXN1bHQgb24gdGhlIHNwZWNpZmllZCBzdHJlYW0uCi0JICogU3RyaW5nI3JlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZywgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQ2hhckF0SW5kZXhPbihjaGFyW10gc3RyaW5nLCBpbnQgaW5kZXgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlpZiAoaW5kZXggPT0gMCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBmcm9udCBvZiBzdHJpbmcKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDEsIGxhc3QpOwotCQl9IGVsc2UgaWYgKGluZGV4ID09IGxhc3QpIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kIG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgbGFzdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMCwgaW5kZXgpOwotCQkJc2IuYXBwZW5kKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcsIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMSwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBpbmRleCk7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsT2NjdXJyZW5jZXMoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcocmVtb3ZlQWxsT2NjdXJyZW5jZXNfKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGMsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoY2hhcltdIHN0cmluZywgY2hhciBjKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlyZXR1cm4gKGZpcnN0ID09IC0xKSA/IHN0cmluZyA6IHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcsIGMsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXNfKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXdyaXRlQ2hhck9uKGQsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoZCAhPSBjKSB7Ci0JCQkJc2IuYXBwZW5kKGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXJbXSBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZCA9IHN0cmluZ1tpXTsKLQkJCWlmIChkICE9IGMpIHsKLQkJCQlzYi5hcHBlbmQoZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU3BhY2VzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxTcGFjZXNPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxTcGFjZXMoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcwotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHdyaXRlIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBTdHJpbmcjcmVtb3ZlQWxsU3BhY2VzT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbFdoaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhyZW1vdmVBbGxXaGl0ZXNwYWNlXyhzdHJpbmcyLCBmaXJzdCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFN0cmluZyNyZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogcmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nLCBmaXJzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihXcml0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBmaXJzdCwgd3JpdGVyKTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXdyaXRlQ2hhck9uKGMsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogU3RyaW5nI3JlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXByZXNzV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKGNvbXByZXNzV2hpdGVzcGFjZV8oc3RyaW5nMiwgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UgaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogU3RyaW5nI2NvbXByZXNzV2hpdGVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29tcHJlc3NXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogY29tcHJlc3NXaGl0ZXNwYWNlXyhzdHJpbmcsIGZpcnN0KTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb21wcmVzc1doaXRlc3BhY2VfKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyaW5nLmxlbmd0aCk7Ci0JCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQl3cml0ZUNoYXJPbignICcsIHdyaXRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiBTdHJpbmcjY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQlzYi5hcHBlbmQoJyAnKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIFN0cmluZyNjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJYm9vbGVhbiBzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCWlmIChzcGFjZVdyaXR0ZW4pIHsKLQkJCQkJLy8gc2tpcCBzdWJzZXF1ZW50IHdoaXRlc3BhY2UgY2hhcmFjdGVycwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHJlcGxhY2UgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgd2l0aCBhIHNwYWNlCi0JCQkJCXNwYWNlV3JpdHRlbiA9IHRydWU7Ci0JCQkJCXNiLmFwcGVuZCgnICcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5ncy4KLQkgKiBTdHJpbmcjY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoXyhzMSwgczIsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uCi0JICogU3RyaW5nI2NvbW1vblByZWZpeExlbmd0aChTdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpLCBtYXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tb24gcHJlZml4IHNoYXJlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmluZ3M7Ci0JICogYnV0IGxpbWl0IHRoZSBsZW5ndGggdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMiwgaW50IG1heCkgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoXyhzMSwgczIsIE1hdGgubWluKG1heCwgTWF0aC5taW4oczEubGVuZ3RoLCBzMi5sZW5ndGgpKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4gQXNzdW1lIHRoZSBzcGVjaWZpZWQKLQkgKiBtYXhpbXVtIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RocyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aF8oY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJaWYgKHMxW2ldICE9IHMyW2ldKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHVwIHRvICdtYXgnIGFyZSB0aGUgc2FtZQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYXBpdGFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY2FwaXRhbGl6ZV8oY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoCi0JICogaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjYXBpdGFsaXplKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKChzdHJpbmcubGVuZ3RoID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBjYXBpdGFsaXplXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gY2FwaXRhbGl6ZShJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfQ0FQSVRBTElaRVIpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBjYXBpdGFsaXplKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19DQVBJVEFMSVpFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IFNUUklOR19DQVBJVEFMSVpFUiA9IG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZyk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY2FwaXRhbGl6ZScgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPGNoYXJbXT4gY2FwaXRhbGl6ZUNoYXJBcnJheXMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9DQVBJVEFMSVpFUik7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY2FwaXRhbGl6ZScgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gY2FwaXRhbGl6ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9DQVBJVEFMSVpFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IENIQVJfQVJSQVlfQ0FQSVRBTElaRVIgPSBuZXcgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+KCkgewotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShzdHJpbmcpOwotCQl9Ci0JfTsKLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFN0cmluZ0J1ZmZlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogU3RyaW5nI2NhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKiBTdHJpbmcjY2FwaXRhbGl6ZU9uKFdyaXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZV8oY2hhcltdIHN0cmluZykgewotCQlzdHJpbmdbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBpZiBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGNoYXJhY3RlcnMgYXJlIGNhcGl0YWxpemVkLAotCQkvLyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQKLQkJaWYgKChzdHJpbmcubGVuZ3RoID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzFdKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cwotCSAqIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmNhcGl0YWxpemUoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gdW5jYXBpdGFsaXplXyhzdHJpbmcpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGgoKSA+IDEpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMSkpCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVuY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgbG93ZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIFN0cmluZyN1bmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIHVwcGVyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiBTdHJpbmcjdW5jYXBpdGFsaXplT24oV3JpdGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiAjdG9TdHJpbmcoKSBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhICJzdGFuZGFyZCIge0BsaW5rIE9iamVjdCN0b1N0cmluZygpIHRvU3RyaW5nKCl9IHJlc3VsdCBmb3IgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjo8cHJlPgotCSAqICAgICBDbGFzc05hbWVbMDAtRjMtRUUtNDJdKGFkZCdsIGluZm8pCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRUb1N0cmluZ0ZvcihPYmplY3QgbywgT2JqZWN0IGFkZGl0aW9uYWxJbmZvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgInN0YW5kYXJkIiB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCkgdG9TdHJpbmcoKX0gcmVzdWx0IGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgb2JqZWN0OjxwcmU+Ci0JICogICAgIENsYXNzTmFtZVswMC1GMy1FRS00Ml0KLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nRm9yKE9iamVjdCBvKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlidWlsZFNpbXBsZVRvU3RyaW5nT24obywgc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSAic3RhbmRhcmQiIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSByZXN1bHQgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBidWZmZXI6PHByZT4KLQkgKiAgICAgQ2xhc3NOYW1lWzAwLUYzLUVFLTQyXQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBidWlsZFNpbXBsZVRvU3RyaW5nT24oT2JqZWN0IG8sIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShvLmdldENsYXNzKCkpKTsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXNlcGFyYXRlT24oYnVpbGRIYXNoQ29kZShvKSwgJy0nLCAyLCBzYik7Ci0JCXNiLmFwcGVuZCgnXScpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEhhc2hDb2RlKE9iamVjdCBvKSB7Ci0JCS8vIHVzZSBTeXN0ZW0jaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpLCBzaW5jZSBPYmplY3QjaGFzaENvZGUoKSBtYXkgYmUgb3ZlcnJpZGRlbgotCQlyZXR1cm4gemVyb1BhZChJbnRlZ2VyLnRvSGV4U3RyaW5nKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKS50b1VwcGVyQ2FzZSgpLCA4KTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSAic3RhbmRhcmQiIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSByZXN1bHQgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjo8cHJlPgotCSAqICAgICBDbGFzc05hbWVbMDAtRjMtRUUtNDJdCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJ1aWxkU2ltcGxlVG9TdHJpbmdPbihPYmplY3QgbywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShvLmdldENsYXNzKCkpKTsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXNlcGFyYXRlT24oYnVpbGRIYXNoQ29kZShvKSwgJy0nLCAyLCBzYik7Ci0JCXNiLmFwcGVuZCgnXScpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5hbWUgc3VpdGFibGUgZm9yIGEge0BsaW5rIE9iamVjdCN0b1N0cmluZygpIHRvU3RyaW5nKCl9IGltcGxlbWVudGF0aW9uLgotCSAqIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCl9IGlzbid0IHF1aXRlIGdvb2QgZW5vdWdoIGZvciBhbm9ueW1vdXMKLQkgKiBjbGFzc2VzOyBzaW5jZSBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlCi0JICogbmFtZSBvZiB0aGUgYW5vbnltb3VzIGNsYXNzJ3Mgc3VwZXIgY2xhc3MsIHdoaWNoIGlzIGEgYml0IG1vcmUgaGVscGZ1bC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nQ2xhc3NOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmcgc2ltcGxlTmFtZSA9IGphdmFDbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JCXJldHVybiBzaW1wbGVOYW1lLmVxdWFscygiIikgPyAvLyROT04tTkxTLTEkCi0JCQkJYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzcygpKSA6ICAvLyByZWN1cnNlCi0JCQkJc2ltcGxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXI6PHByZT4KLQkgKiAgICAgWyJmb28iLCAiYmFyIiwgImJheiJdCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gU3RyaW5nIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBUW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFwcGVuZChzYiwgbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFQ+KGFycmF5KSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOjxwcmU+Ci0JICogICAgIFsiZm9vIiwgImJhciIsICJiYXoiXQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBhcHBlbmQoU3RyaW5nQnVpbGRlciBzYiwgSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFwcGVuZChzYiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOjxwcmU+Ci0JICogICAgIFsiZm9vIiwgImJhciIsICJiYXoiXQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBhcHBlbmQoU3RyaW5nQnVpbGRlciBzYiwgSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJc2IuYXBwZW5kKCdbJyk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXNiLmFwcGVuZChpdGVyYXRvci5uZXh0KCkpOwotCQkJaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgnXScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5XyhjaGFyW10gcywgaW50IGxlbikgewotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi1udWxsLCBub24tZW1wdHksIGFuZCBkb2VzCi0JICogbm90IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTm90RW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gISBzdHJpbmdJc0VtcHR5KHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbm9uLW51bGwsIG5vbi1lbXB0eSwgYW5kIGRvZXMKLQkgKiBub3QgY29udGFpbiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNOb3RFbXB0eShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAhIHN0cmluZ0lzRW1wdHkoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLgotCSAqIENoZWNrIGZvciA8Y29kZT5udWxsPC9jb2RlPnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbChTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoczEsIHMyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLgotCSAqIENoZWNrIGZvciA8Y29kZT5udWxsPC9jb2RlPnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbChjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gKHMxID09IG51bGwpID8KLQkJCQkoczIgPT0gbnVsbCkgOgotCQkJCSgoczIgIT0gbnVsbCkgJiYgc3RyaW5nc0FyZUVxdWFsXyhzMSwgczIpKTsKLQl9Ci0KLQkvKioKLQkgKiBubyA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbF8oY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJaW50IGxlbiA9IHMxLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSBzMi5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmIChzMVtpXSAhPSBzMltpXSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciA8Y29kZT5udWxsPC9jb2RlPnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIChzMSA9PSBudWxsKSA/Ci0JCQkJKHMyID09IG51bGwpIDoKLQkJCQkoKHMyICE9IG51bGwpICYmIHMxLmVxdWFsc0lnbm9yZUNhc2UoczIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgYXJlIGVxdWFsLCBpZ25vcmluZyBjYXNlLgotCSAqIENoZWNrIGZvciA8Y29kZT5udWxsPC9jb2RlPnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJcmV0dXJuIChzMSA9PSBudWxsKSA/Ci0JCQkJKHMyID09IG51bGwpIDoKLQkJCQkoKHMyICE9IG51bGwpICYmIHN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2VfKHMxLCBzMikpOwotCX0KLQotCS8qKgotCSAqIG5vIDxjb2RlPm51bGw8L2NvZGU+IGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZV8oY2hhcltdIHMxLCBjaGFyW10gczIpIHsKLQkJaW50IGxlbiA9IHMxLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSBzMi5sZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHMxW2ldLCBzMltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsCi0JICogaWdub3JpbmcgY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoY2hhcltdIHN0cmluZywgY2hhcltdIHByZWZpeCkgewotCQlpbnQgcHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aDsKLQkJaWYgKHN0cmluZy5sZW5ndGggPCBwcmVmaXhMZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gcHJlZml4TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKHN0cmluZ1tpXSwgcHJlZml4W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwKLQkgKiBpZ25vcmluZyBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdHJpbmcucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBwcmVmaXgsIDAsIHByZWZpeC5sZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJzIGFyZSBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQHNlZSBqYXZhLmxhbmcuU3RyaW5nI3JlZ2lvbk1hdGNoZXMoYm9vbGVhbiwgaW50LCBTdHJpbmcsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKGNoYXIgYzEsIGNoYXIgYzIpIHsKLQkJLy8gIHNvbWV0aGluZyBhYm91dCB0aGUgR2VvcmdpYW4gYWxwaGFiZXQgcmVxdWlyZXMgdXMgdG8gY2hlY2sgbG93ZXIgY2FzZSBhbHNvCi0JCXJldHVybiAoYzEgPT0gYzIpCi0JCQkJfHwgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCQl8fCAoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMxKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB1cHBlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHVwcGVyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2UoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzVXBwZXJjYXNlXyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNVcHBlcmNhc2VfKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZy5lcXVhbHMoc3RyaW5nLnRvVXBwZXJDYXNlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGxvd2VyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGgoKSA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKHN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbG93ZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogc3RyaW5nSXNMb3dlcmNhc2VfKG5ldyBTdHJpbmcoc3RyaW5nKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0xvd2VyY2FzZV8oU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nLmVxdWFscyhzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgY2FtZWwgY2FzZSB0byBhbGwgY2FwcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gY2FtZWxDYXNlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKiAyKTsKLQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQlzYi5hcHBlbmQoJ18nKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCkgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKG1heExlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG1heExlbmd0aCk7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuICE9IDApICYmIChtYXhMZW5ndGggIT0gMCkpIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSk7Ci0JCQlpZiAoc2IubGVuZ3RoKCkgPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oU3RyaW5nIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJaW50IHdyaXRlckxlbmd0aCA9IDA7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJd3JpdGVDaGFyT24oJ18nLCB3cml0ZXIpOwotCQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSwgd3JpdGVyKTsKLQkJCWlmICgrK3dyaXRlckxlbmd0aCA9PSBtYXhMZW5ndGgpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZXJpZXMgb2YgY2hhcmFjdGVycyBvY2N1ciBhdAotCSAqIGEgImNhbWVsIGNhc2UiIHdvcmsgYnJlYWs6Ci0JICogICAgICIqYWEiIC0+IGZhbHNlCi0JICogICAgICIqQUEiIC0+IGZhbHNlCi0JICogICAgICIqQWEiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJBQUEiIC0+IGZhbHNlCi0JICogICAgICJhYSoiIC0+IGZhbHNlCi0JICogICAgICJBYUEiIC0+IGZhbHNlCi0JICogICAgICJhQWEiIC0+IHRydWUKLQkgKiAgICAgIkFBKiIgLT4gZmFsc2UKLQkgKiAgICAgIkFBYSIgLT4gdHJ1ZQotCSAqIHdoZXJlICcqJyA9PSBhbnkgY2hhcgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FtZWxDYXNlV29yZEJyZWFrXyhjaGFyIHByZXYsIGNoYXIgYywgY2hhciBuZXh0KSB7Ci0JCWlmIChwcmV2ID09IDApIHsJLy8gc3RhcnQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShjKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UocHJldikpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChuZXh0ID09IDApIHsJLy8gZW5kIG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMb3dlckNhc2UobmV4dCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gY2FtZWwgY2FzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJMYXJnZVByb2plY3QiCi0JICogQ2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSh1bmRlcnNjb3JlU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1bmRlcnNjb3JlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHVuZGVyc2NvcmVTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7Ci0JCWNoYXIgYyA9IDA7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlwcmV2ID0gYzsKLQkJCWMgPSB1bmRlcnNjb3JlU3RyaW5nW2ldOwotCQkJaWYgKGMgPT0gJ18nKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoZmlyc3QpIHsKLQkJCQlmaXJzdCA9IGZhbHNlOwotCQkJCXNiLmFwcGVuZChjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoKHByZXYgPT0gJ18nKSA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcudG9DaGFyQXJyYXkoKSwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjYXBpdGFsaXplRmlyc3RMZXR0ZXIgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9IGVsc2UgewotCQkJCXdyaXRlQ2hhck9uKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYyksIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydCB0byBKYXZhIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwgPSAiXCJcIiI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZID0gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTC50b0NoYXJBcnJheSgpOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoU3RyaW5nIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMX0NIQVJfQVJSQVk7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDUpOwotCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQlsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gU1RSSU5HX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIgPSBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxjaGFyW10+IGNvbnZlcnRUb0phdmFDaGFyQXJyYXlMaXRlcmFscyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIpOwotCX0KLQotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ2NvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscycgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gY29udmVydFRvSmF2YUNoYXJBcnJheUxpdGVyYWxzKEl0ZXJhdG9yPGNoYXJbXT4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8Y2hhcltdLCBjaGFyW10+KHN0cmluZ3MsIENIQVJfQVJSQVlfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+IENIQVJfQVJSQVlfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUiA9IG5ldyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4oKSB7Ci0JCXB1YmxpYyBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzdHJpbmcpOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXNiLmFwcGVuZChFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIGxlbmd0aCBjaGVja3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IsIGludCBsZW4pIHsKLQkJc2IuZW5zdXJlQ2FwYWNpdHkoc2IubGVuZ3RoKCkgKyBsZW4gKyA1KTsKLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQlzYi5hcHBlbmQoIlxcYiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQlzYi5hcHBlbmQoIlxcdCIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJc2IuYXBwZW5kKCJcXG4iKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXNiLmFwcGVuZCgiXFxmIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQlzYi5hcHBlbmQoIlxcciIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQlzYi5hcHBlbmQoIlxcXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQlzYi5hcHBlbmQoIlxcJyIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQlzYi5hcHBlbmQoIlxcXFwiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJc2IuYXBwZW5kKGMpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoUVVPVEUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKFN0cmluZyBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl3cml0ZVN0cmluZ09uKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJd3JpdGVTdHJpbmdPbihFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKFFVT1RFLCB3cml0ZXIpOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnXGInOiAgLy8gYmFja3NwYWNlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcYiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1x0JzogIC8vIGhvcml6b250YWwgdGFiCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcdCIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xuJzogIC8vIGxpbmUtZmVlZCBMRgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXG4iLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcZic6ICAvLyBmb3JtLWZlZWQgRkYKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxmIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHInOiAgLy8gY2FycmlhZ2UtcmV0dXJuIENSCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcciIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInOiAgLy8gZG91YmxlLXF1b3RlCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXCIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLS8vCQkJCWNhc2UgJ1wnJzogIC8vIHNpbmdsZS1xdW90ZQotLy8JCQkJCXdyaXRlU3RyaW5nT24oIlxcJyIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXFwnOiAgLy8gYmFja3NsYXNoCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcXFwiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl3cml0ZUNoYXJPbihRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvQ2hhckFycmF5KFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihjaGFyW10gc3RyaW5nLCBjaGFyIGVzY2FwZSwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCQlpZiAoYyA9PSBlc2NhcGUpIHsKLQkJCQkJd3JpdGVyLndyaXRlKGMpOwotCQkJCX0KLQkJCQl3cml0ZXIud3JpdGUoYyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgaW50IG9mZiwgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZywgb2ZmLCBsZW4pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKFN0cmluZyBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDaGFyT24oY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoYyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2NlMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJhZzxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyBiYWcuICovCi0JcHJpdmF0ZSBmaW5hbCBCYWc8RT4gYmFnOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgYmFnIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIGJhZyBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKEJhZzxFPiBiYWcsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAoYmFnID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYmFnID0gYmFnOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBiYWcgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKEJhZzxFPiBiYWcpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGJhZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJhZyA9IGJhZzsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQmFnKCkgewotCQl0aGlzKG5ldyBIYXNoQmFnPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYWcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvLCBjb3VudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmNvdW50KG8pOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuZW50cmllcygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvLCBpbnQgY291bnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8sIGNvdW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZChlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmFkZEFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb250YWlucyhvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb250YWluc0FsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZUFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmV0YWluQWxsKGMpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5zaXplKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy50b0FycmF5KGEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBzdGFjayBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDJhN2U2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4sCi0gKiB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHNlZSBTaW1wbGVCb29sZWFuUmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCb29sZWFuCi0JaW1wbGVtZW50cyBCb29sZWFuUmVmZXJlbmNlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmJvb2xlYW48L2NvZGU+LiAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGluaXRpYWwgdmFsdWUgYW5kIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihib29sZWFuIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIDxjb2RlPmJvb2xlYW48L2NvZGU+Ci0JICogd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGFuZCBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoZmFsc2UsIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKCkgewotCQl0aGlzKGZhbHNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90KGJvb2xlYW4gdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RydWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAhIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc2V0VmFsdWVfKGJvb2xlYW4gdikgewotCQlyZXR1cm4gKHYgPT0gdGhpcy52YWx1ZSkgPyB2IDogdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXRDaGFuZ2VkVmFsdWVfKGJvb2xlYW4gdikgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuICEgdjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmxpcCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gISB0aGlzLnNldENoYW5nZWRWYWx1ZV8oICEgdGhpcy52YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0Tm90KGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSggISB2KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0VHJ1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldEZhbHNlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhpcyBvYmplY3QgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzXyhib29sZWFuIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlICE9IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KGJvb2xlYW4gdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKCAhIHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFRydWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxGYWxzZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMgdG8KLQkgKiA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkKLQkgKiA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlCi0JICogaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VmFsdWUoYm9vbGVhbiB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oICEgdik7Ci0JCQl0aGlzLnNldENoYW5nZWRWYWx1ZV8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0VHJ1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9TZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzKGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNfKGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3QoYm9vbGVhbiB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyggISB2LCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsVHJ1ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXModHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5mYWxzZTwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRmFsc2UobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QKLQkgKiBjaGFuZ2UgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQotCSAqIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGJvb2xlYW4gdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc18oICEgdiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZS4gVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sIHNldCB0aGUKLQkgKiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogY2hhbmdpbmcgdGhlIHZhbHVlLiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwgc2V0IHRoZQotCSAqIHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJCXJldHVybiAoU3luY2hyb25pemVkQm9vbGVhbikgc3VwZXIuY2xvbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy5nZXRWYWx1ZSgpKSArICddJzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEludC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OWFhNDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3luY2hyb25pemVkIGFjY2VzcyB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+LgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHZhbHVlIGlzIHNldCB0byBhIHNwZWNpZmllZCB2YWx1ZSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKiAKLSAqIEBzZWUgU2ltcGxlSW50UmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJbnQKLQlpbXBsZW1lbnRzIEludFJlZmVyZW5jZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5pbnQ8L2NvZGU+LiAqLwotCXByaXZhdGUgaW50IHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KGludCB2YWx1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBpbnRlZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgaW50ZWdlciBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludChpbnQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgaW50ZWdlciB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgemVybwotCSAqIGFuZCB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMoMCwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mIHplcm8uCi0JICogVGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KCkgewotCQl0aGlzKDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbm90RXF1YWwoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNaZXJvKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IDA7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFplcm8oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA+IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID49IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZXNzVGhhbk9yRXF1YWwoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA8PSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbigwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuKDApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW5PckVxdWFsKDApOwotCX0KLQotCXB1YmxpYyBpbnQgYWJzKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBNYXRoLmFicyh0aGlzLnZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbmVnKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiAtdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgYWRkKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgKyB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzdWJ0cmFjdChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIC0gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbXVsdGlwbHkoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAqIHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGRpdmlkZShpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIC8gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgcmVtYWluZGVyKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgJSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCBtaW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gTWF0aC5taW4odGhpcy52YWx1ZSwgdik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG1heChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBNYXRoLm1heCh0aGlzLnZhbHVlLCB2KTsKLQkJfQotCX0KLQotCXB1YmxpYyBkb3VibGUgcG93KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIE1hdGgucG93KHRoaXMudmFsdWUsIHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IHNldFZhbHVlXyhpbnQgdikgewotCQlpbnQgb2xkID0gdGhpcy52YWx1ZTsKLQkJcmV0dXJuIChvbGQgPT0gdikgPyBvbGQgOiB0aGlzLnNldFZhbHVlXyh2LCBvbGQpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgaW50IHNldENoYW5nZWRWYWx1ZV8oaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYsIHRoaXMudmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgaW50IHNldFZhbHVlXyhpbnQgdiwgaW50IG9sZCkgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIHplcm8uIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoMCk7Ci0JfQotCi0JLyoqCi0JICogSW5jcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBpbmNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZSsrOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSB2YWx1ZSBieSBvbmUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBkZWNyZW1lbnQoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy52YWx1ZS0tOwotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgc2V0IGl0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBjb21wYXJlQW5kU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuY29tcGFyZUFuZFN3YXBfKGV4cGVjdGVkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgaW50IGNvbXBhcmVBbmRTd2FwXyhpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBleHBlY3RlZFZhbHVlKSA/IHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKSA6IHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGxvY2tzIG9uIHdoaWxlIHBlcmZvcm1pbmcKLQkgKiBpdHMgb3BlcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE11dGV4KCkgewotCQlyZXR1cm4gdGhpcy5tdXRleDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgIT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbE5vdEVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPT0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byB6ZXJvLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxaZXJvKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHplcm8sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbE5vdEVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPD0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlIDwgdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxMZXNzVGhhbihpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbl8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlID49IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBhIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeQotCSAqIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA+IHYpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIHBvc2l0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHBvc2l0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsUG9zaXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiAoaS5lLiBuZWdhdGl2ZSBvciB6ZXJvKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gcG9zaXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdFBvc2l0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5lZ2F0aXZlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiAoaS5lLiB6ZXJvIG9yIHBvc2l0aXZlKS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gbmVnYXRpdmUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdE5lZ2F0aXZlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1NldFZhbHVlKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwotCQkJcmV0dXJuIHRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gemVybywgdGhlbiBjaGFuZ2UgaXQKLQkgKiBiYWNrIHRvIHplcm8gYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gemVybywKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHplcm8gaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1NldFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IHdhaXRUb1N3YXAoaW50IGV4cGVjdGVkVmFsdWUsIGludCBuZXdWYWx1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVxdWFsXyhleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxFcXVhbF8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSAhPSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyByZW1vdmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEKLQkgKiB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbE5vdEVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxOb3RFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlID09IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSAhPSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHplcm8gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgemVybzsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHplcm8sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxaZXJvKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5vdCB6ZXJvOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+Ci0JICogemVybywgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RaZXJvKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTm90RXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBncmVhdGVyCi0JICogdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW4oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbl8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW5fKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlIDw9IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA+IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA8IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA+PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGxlc3MKLQkgKiB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbihpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbl8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPj0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlIDwgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBsZXNzCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlID4gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlIDw9IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBwb3NpdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IHBvc2l0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgcG9zaXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxQb3NpdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgcG9zaXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBub3QgcG9zaXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBub3QgcG9zaXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RQb3NpdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbmVnYXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBuZWdhdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5lZ2F0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTmVnYXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxMZXNzVGhhbigwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbm90IG5lZ2F0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbm90IG5lZ2F0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbm90IG5lZ2F0aXZlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90TmVnYXRpdmUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcKLQkgKiB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB6ZXJvLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHplcm8KLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gemVybyBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8sIHNldAotCSAqIHRoZSB2YWx1ZSB0byB6ZXJvIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZSgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcKLQkgKiB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlOyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFcXVhbF8oZXhwZWN0ZWRWYWx1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tcGFyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhSZWFkT25seUludFJlZmVyZW5jZSByZWYpIHsKLQkJaW50IHRoaXNWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJaW50IG90aGVyVmFsdWUgPSByZWYuZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh0aGlzVmFsdWUgPCBvdGhlclZhbHVlKSA/IC0xIDogKCh0aGlzVmFsdWUgPT0gb3RoZXJWYWx1ZSkgPyAwIDogMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN5bmNocm9uaXplZEludCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJCXJldHVybiAoU3luY2hyb25pemVkSW50KSBzdXBlci5jbG9uZSgpOwotCQkJfQotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkT2JqZWN0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmMjA0OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGFuIG9iamVjdCBvZiB0eXBlIDxjb2RlPlY8L2NvZGU+LgotICogSXQgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHZhbHVlIGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiBvciBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSwKLSAqIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogCi0gKiBAcGFybSBWIHRoZSB0eXBlIG9mIHRoZSBzeW5jaHJvbml6ZWQgb2JqZWN0J3MgdmFsdWUKLSAqIEBzZWUgU2ltcGxlT2JqZWN0UmVmZXJlbmNlCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPYmplY3Q8Vj4KLQlpbXBsZW1lbnRzIE9iamVjdFJlZmVyZW5jZTxWPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyB2YWx1ZS4gKi8KLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUKLQkgKiBhbmQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdChWIHZhbHVlLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKiBUaGUgc3luY2hyb25pemVkIG9iamVjdCBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdChWIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhlIHN5bmNocm9uaXplZCBvYmplY3QgaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3QoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlRXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0VmFsdWUoKSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZU5vdEVxdWFsKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldFZhbHVlKCksIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdE51bGwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZwotCSAqIHRocmVhZHMgYXJlIG5vdGlmaWVkLiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBWIHNldFZhbHVlXyhWIHYpIHsKLQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwob2xkLCB2KSA/IG9sZCA6IHRoaXMuc2V0VmFsdWVfKHYsIG9sZCk7Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkIGFuZCBuZXcgdmFsdWUgaXMgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBWIHNldENoYW5nZWRWYWx1ZV8oViB2KSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlXyh2LCB0aGlzLnZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQgYW5kIG5ldyB2YWx1ZSBpcyBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIFYgc2V0VmFsdWVfKFYgdiwgViBvbGQpIHsKLQkJdGhpcy52YWx1ZSA9IHY7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgc2V0IGl0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBuZXcgdmFsdWUuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgY29tcGFyZUFuZFN3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuY29tcGFyZUFuZFN3YXBfKGV4cGVjdGVkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgViBjb21wYXJlQW5kU3dhcF8oViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCBleHBlY3RlZFZhbHVlKSA/IHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKSA6IHRoaXMudmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhlIHN5bmNocm9uaXplZCBvYmplY3QgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJcyhWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzXyhWIHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy52YWx1ZSwgdikpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUKLQkgKiB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3RfKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPm51bGw8L2NvZGU+LCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90TnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHdhaXRUb1NldFZhbHVlKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwotCQkJcmV0dXJuIHRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gY2hhbmdlIGl0Ci0JICogYmFjayB0byA8Y29kZT5udWxsPC9jb2RlPiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU2V0TnVsbCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIHdhaXRUb1N3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc18oZXhwZWN0ZWRWYWx1ZSk7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiB0cnVlIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNfKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyByZW1vdmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEKLQkgKiB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzTm90KFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3RfKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90Xyh2KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+bnVsbDwvY29kZT4sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJcyhudWxsLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPgotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UKLQkgKiBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nCi0JICogd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRWYWx1ZShWIHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldENoYW5nZWRWYWx1ZV8odik7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHNvbWV0aGluZwotCSAqIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlCi0JICogZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPjsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4sIHNldAotCSAqIHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXROdWxsKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlCi0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nCi0JICogdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZTsgcmV0dXJuCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1N3YXAoViBleHBlY3RlZFZhbHVlLCBWIG5ld1ZhbHVlLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhleHBlY3RlZFZhbHVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSB2YWx1ZSBmcm9tIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTeW5jaHJvbml6ZWRPYmplY3Q8Vj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3Q8Vj4gY2xvbmUgPSAoU3luY2hyb25pemVkT2JqZWN0PFY+KSBzdXBlci5jbG9uZSgpOwotCQkJCXJldHVybiBjbG9uZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy5nZXRWYWx1ZSgpKSArICddJzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRRdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWJiMzI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVldWV9IGludGVyZmFjZS4KLSAqIFRoaXMgYWxzbyBwcm92aWRlcyBwcm90b2NvbCBmb3Igc3VzcGVuZGluZyBhIHRocmVhZCB1bnRpbCB0aGUKLSAqIHF1ZXVlIGlzIGVtcHR5IG9yIG5vdCBlbXB0eSwgd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRRdWV1ZTxFPgotCWltcGxlbWVudHMgUXVldWU8RT4sIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHF1ZXVlLiAqLwotCXByaXZhdGUgZmluYWwgUXVldWU8RT4gcXVldWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBxdWV1ZSBhbmQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoUXVldWU8RT4gcXVldWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQlpZiAocXVldWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5xdWV1ZSA9IHF1ZXVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHF1ZXVlIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChxdWV1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZShPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhuZXcgU2ltcGxlUXVldWU8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbXB0eSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKCkgewotCQl0aGlzKG5ldyBTaW1wbGVRdWV1ZTxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVldWUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZW5xdWV1ZShFIGVsZW1lbnQpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVucXVldWVfKEUgZWxlbWVudCkgewotCQl0aGlzLnF1ZXVlLmVucXVldWUoZWxlbWVudCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JfQotCi0JcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBFIGRlcXVldWVfKCkgewotCQlFIGVsZW1lbnQgPSB0aGlzLnF1ZXVlLmRlcXVldWUoKTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5xdWV1ZS5wZWVrKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnF1ZXVlLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSdzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsRW1wdHlJc18oYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMucXVldWUuaXNFbXB0eSgpICE9IGVtcHR5KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LAotCSAqIHRoZW4gImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb0VucXVldWUoRSBlbGVtZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSk7Ci0JCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAiZGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvRGVxdWV1ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSk7Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSdzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQKLQkgKiBlbXB0eSBzdGF0dXMgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy5xdWV1ZS5pc0VtcHR5KCkgIT0gZW1wdHkpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy5xdWV1ZS5pc0VtcHR5KCkgPT0gZW1wdHkpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgcXVldWUgaXMgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBlbXB0eSwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHk7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgYWxyZWFkeSBoYXMgc29tZXRoaW5nIG9uIGl0LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LAotCSAqIHRoZW4gImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgcXVldWUgaXMgbm90IGVtcHRpZWQgb3V0Ci0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogImVucXVldWVpbmciIHRoZSBpdGVtLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCi0JICogaXRlbSB3YXMgZW5xdWV1ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBlbXB0eSwgImVucXVldWUiIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb0VucXVldWUoRSBlbGVtZW50LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5lbnF1ZXVlXyhlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAiZGVxdWV1ZSIgYW4gaXRlbSBmcm9tIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSBhbmQgcmV0dXJuIGl0LgotCSAqIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgbm90aGluZyBpcyAiZW5xdWV1ZWQiIG9uIHRvIGl0IGJlZm9yZSB0aGUKLQkgKiB0aW1lLW91dCwgdGhyb3cgYSBubyBzdWNoIGVsZW1lbnQgZXhjZXB0aW9uLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksICJkZXF1ZXVlIiBhbiBpdGVtIGFuZAotCSAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9EZXF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZGVxdWV1ZV8oKTsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgcXVldWUgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqICJEcmFpbiIgYWxsIHRoZSBjdXJyZW50IGl0ZW1zIGZyb20gdGhlIHF1ZXVlIGludG8gc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWluVG8oUXVldWU8RT4gcSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuZHJhaW5Ub18ocSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZHJhaW5Ub18oUXVldWU8RT4gcSkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJd2hpbGUgKCAhIHRoaXMucXVldWUuaXNFbXB0eSgpKSB7Ci0JCQlxLmVucXVldWUodGhpcy5xdWV1ZS5kZXF1ZXVlKCkpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKGNoYW5nZWQpIHsKLQkJCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgcXVldWUgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICdbJyArIHRoaXMucXVldWUudG9TdHJpbmcoKSArICddJzsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDMzZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBTdGFja30gaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogc3RhY2sgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgc3RhY2suICovCi0JcHJpdmF0ZSBmaW5hbCBTdGFjazxFPiBzdGFjazsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHN0YWNrIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaywgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdGFjayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgc3RhY2sgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0YWNrID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVTdGFjazxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBzdGFjayB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVN0YWNrPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGFjayBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwdXNoKEUgZWxlbWVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMucHVzaF8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVzaF8oRSBlbGVtZW50KSB7Ci0JCXRoaXMuc3RhY2sucHVzaChlbGVtZW50KTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwb3AoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMucG9wXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBFIHBvcF8oKSB7Ci0JCUUgbyA9IHRoaXMuc3RhY2sucG9wKCk7Ci0JCXRoaXMubXV0ZXgubm90aWZ5QWxsKCk7Ci0JCXJldHVybiBvOwotCX0KLQotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RhY2sucGVlaygpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGFjay5pc0VtcHR5KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5kZWZpbml0ZSB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sncyBlbXB0eSBzdGF0dXMgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnN0YWNrLmlzRW1wdHkoKSAhPSBlbXB0eSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90RW1wdHkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSwKLQkgKiB0aGVuICJwdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gb24gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRUb1B1c2goRSBlbGVtZW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSk7Ci0JCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGhhcyBzb21ldGhpbmcgb24gaXQsCi0JICogdGhlbiAicG9wIiBhbiBpdGVtIGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb1BvcCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSk7Ci0JCQlyZXR1cm4gdGhpcy5wb3BfKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZAotCSAqIGVtcHR5IHN0YXR1cyB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgc3RhY2sncyBlbXB0eSBzdGF0dXMgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHksIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnN0YWNrLmlzRW1wdHkoKSAhPSBlbXB0eSkgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnN0YWNrLmlzRW1wdHkoKSA9PSBlbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5Ci0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBzdGFjayBpcyBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGVtcHR5LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHN0YWNrIGlzIG5vdCBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBhbHJlYWR5IGhhcyBzb21ldGhpbmcgb24gaXQsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHksCi0JICogdGhlbiAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4gSWYgdGhlIHN0YWNrIGlzIG5vdCBlbXB0aWVkIG91dAotCSAqIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqICJwdXNoaW5nIiB0aGUgaXRlbS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZQotCSAqIGl0ZW0gd2FzIHB1c2hlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGVtcHR5LCAicHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIGFuZAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvUHVzaChFIGVsZW1lbnQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnB1c2hfKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJwb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmV0dXJuIGl0LgotCSAqIElmIHRoZSBzdGFjayBpcyBlbXB0eSBhbmQgbm90aGluZyBpcyAicHVzaGVkIiBvbiB0byBpdCBiZWZvcmUgdGhlCi0JICogdGltZS1vdXQsIHRocm93IGFuIGVtcHR5IHN0YWNrIGV4Y2VwdGlvbi4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4KLQkgKiBJZiB0aGUgc3RhY2sgaXMgbm90IGVtcHR5LCAicG9wIiBhbiBpdGVtIGFuZAotCSAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9Qb3AobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5wb3BfKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplZCBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHN0YWNrIGluIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIHB1YmxpYyBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3RhY2sgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICdbJyArIHRoaXMuc3RhY2sudG9TdHJpbmcoKSArICddJzsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVGhyZWFkTG9jYWxDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNjhmYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tbWFuZCBpbnRlcmZhY2UgYWxsb3dzIHRoZSBjbGllbnQgdG8KLSAqIHNwZWNpZnkgYSBkaWZmZXJlbnQgQ29tbWFuZCBmb3IgZWFjaCB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWw8Q29tbWFuZD4gdGhyZWFkTG9jYWw7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmQgZGVmYXVsdENvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb21tYW5kIGRvZXMgbm90aGluZy4KLQkgKi8KLQlwdWJsaWMgVGhyZWFkTG9jYWxDb21tYW5kKCkgewotCQl0aGlzKENvbW1hbmQuTnVsbC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGhyZWFkTG9jYWxDb21tYW5kKENvbW1hbmQgZGVmYXVsdENvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWZhdWx0Q29tbWFuZCA9IGRlZmF1bHRDb21tYW5kOwotCQl0aGlzLnRocmVhZExvY2FsID0gdGhpcy5idWlsZFRocmVhZExvY2FsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZExvY2FsPENvbW1hbmQ+IGJ1aWxkVGhyZWFkTG9jYWwoKSB7Ci0JCXJldHVybiBuZXcgVGhyZWFkTG9jYWw8Q29tbWFuZD4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLmdldCgpLmV4ZWN1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBnZXQoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IHRoaXMudGhyZWFkTG9jYWwuZ2V0KCk7Ci0JCXJldHVybiAoY29tbWFuZCAhPSBudWxsKSA/IGNvbW1hbmQgOiB0aGlzLmRlZmF1bHRDb21tYW5kOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLnRocmVhZExvY2FsLnNldChjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldCgpLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlNTA2NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvbW1hbmRFeGVjdXRvciBpbnRlcmZhY2UgYWxsb3dzIHRoZSBjbGllbnQgdG8KLSAqIHNwZWNpZnkgYSBkaWZmZXJlbnQgQ29tbWFuZCBFeGVjdXRvciBmb3IgZWFjaCB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciB7Ci0JcHJvdGVjdGVkIGZpbmFsIFRocmVhZExvY2FsPENvbW1hbmRFeGVjdXRvcj4gdGhyZWFkTG9jYWw7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbW1hbmRFeGVjdXRvciBkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgY29tbWFuZCBleGVjdXRvciBzaW1wbHkgZXhlY3V0ZXMgdGhlIGNvbW1hbmQgZGlyZWN0bHkuCi0JICovCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgZGVmYXVsdENvbW1hbmRFeGVjdXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRDb21tYW5kRXhlY3V0b3IgPSBkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yOwotCQl0aGlzLnRocmVhZExvY2FsID0gdGhpcy5idWlsZFRocmVhZExvY2FsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZExvY2FsPENvbW1hbmRFeGVjdXRvcj4gYnVpbGRUaHJlYWRMb2NhbCgpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWRMb2NhbDxDb21tYW5kRXhlY3V0b3I+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5nZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpLmV4ZWN1dGUoY29tbWFuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmRFeGVjdXRvciBnZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNlID0gdGhpcy50aHJlYWRMb2NhbC5nZXQoKTsKLQkJcmV0dXJuIChjZSAhPSBudWxsKSA/IGNlIDogdGhpcy5kZWZhdWx0Q29tbWFuZEV4ZWN1dG9yOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kIGV4ZWN1dG9yIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcy50aHJlYWRMb2NhbC5zZXQoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB0aHJlYWQncyBjb21tYW5kCi0JICogZXhlY3V0b3IuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKS50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzIzOGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFZhcmlvdXMgdXRpbGl0eSBtZXRob2RzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIG9iamVjdCBjb21wYXJpc29uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFyZSBlcXVhbCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuICh2YWx1ZTEgPT0gbnVsbCkgPwotCQkJCSh2YWx1ZTIgPT0gbnVsbCkgOgotCQkJCSgodmFsdWUyICE9IG51bGwpICYmIHZhbHVlMS5lcXVhbHModmFsdWUyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiAodmFsdWUxID09IG51bGwpID8KLQkJCQkodmFsdWUyICE9IG51bGwpIDoKLQkJCQkoKHZhbHVlMiA9PSBudWxsKSB8fCAhIHZhbHVlMS5lcXVhbHModmFsdWUyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN5c3RlbSBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IEpWTSBpcyBTdW4ncyAob3IgT3JhY2xlJ3MpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqdm1Jc1N1bigpIHsKLQkJcmV0dXJuIGp2bUlzKCJTdW4iKSB8fCBqdm1JcygiT3JhY2xlIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgSlZNIGlzIElCTSdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqdm1Jc0lCTSgpIHsKLQkJcmV0dXJuIGp2bUlzKCJJQk0iKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGp2bUlzKFN0cmluZyBqdm1WZW5kb3JOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudmVuZG9yIikuc3RhcnRzV2l0aChqdm1WZW5kb3JOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIE1pY3Jvc29mdCBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvc0lzV2luZG93cygpIHsKLQkJcmV0dXJuIG9zSXMoIldpbmRvd3MiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIExpbnV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvc0lzTGludXgoKSB7Ci0JCXJldHVybiBvc0lzKCJMaW51eCIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb3NJcyhTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTUzNGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMuCi0gKiBUcmFuc2Zvcm0gYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+VDE8L2NvZGU+IHRvIGFuIG9iamVjdCBvZiB0eXBlCi0gKiA8Y29kZT5UMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8VDE+IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lcgotICogQHBhcmFtIDxUMj4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgdHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJhbnNmb3JtZWQgb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDIgdHJhbnNmb3JtKFQxIG8pOwotCi0KLQkvKioKLQkgKiBBICJudWxsIiB0cmFuc2Zvcm1lciB3aWxsIHBlcmZvcm0gbm8gdHJhbnNmb3JtYXRpb24gYXQgYWxsOwotCSAqIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0ICJ1bnRyYW5zZm9ybWVkIi4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsPFMxLCBTMj4gaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUgewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0LCB1bmNoYW5nZWQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBTMiB0cmFuc2Zvcm0oUzEgbykgewotCQkJcmV0dXJuIChTMikgbzsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVHJhbnNmb3JtZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSAiZGlzYWJsZWQiIHRyYW5zZm9ybWVyIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gaXMgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBzaXR1YXRpb25zCi0JICogd2hlcmUgYSB0cmFuc2Zvcm1lciBpcyBvcHRpb25hbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgc2hvdWxkCi0JICogbm90IGJlIHVzZWQuCi0JICovCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8UzEsIFMyPiBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFMxLCBTMj4sIFNlcmlhbGl6YWJsZSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmFuc2Zvcm1lci5EaXNhYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjdkMzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLQotLyoqCi0gKiBUaGlzIGVuY29kZXIgd2lsbCByZXBsYWNlIGFueSBvZiBhIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycyB3aXRoIGFuIFhNTAotICogImNoYXJhY3RlciByZWZlcmVuY2UiOiAnLycgPT4gIiYjeDJmOyIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFN0cmluZ0VuY29kZXIgewotCi0JLyoqIFRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQgaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyW10gY2hhcnM7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlIG9mIHRoZSBoaWdoZXN0IGNoYXJhY3RlciBpbiB0aGUgc2V0IGFib3ZlLiAqLwotCXByaXZhdGUgZmluYWwgY2hhciBtYXhDaGFyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW5jb2RlciB0aGF0IGNvbnZlcnRzIHRoZSBzcGVjaWZpZWQgc2V0IG9mIGNoYXJhY3RlcnMKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlcihjaGFyW10gY2hhcnMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNoYXJzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoZSBhbXBlcnNhbmQgbXVzdCBiZSBpbmNsdWRlZCBzaW5jZSBpdCBpcyB0aGUgZXNjYXBlIGNoYXJhY3RlcgotCQlpZiAoQXJyYXlUb29scy5jb250YWlucyhjaGFycywgJyYnKSkgewotCQkJdGhpcy5jaGFycyA9IGNoYXJzOwotCQl9IGVsc2UgewotCQkJdGhpcy5jaGFycyA9IEFycmF5VG9vbHMuYWRkKGNoYXJzLCAnJicpOwotCQl9Ci0JCXRoaXMubWF4Q2hhciA9IHRoaXMuY2FsY3VsYXRlTWF4SW52YWxpZEZpbGVOYW1lQ2hhcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgY29udmVydGVkCi0JICogaW50byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHNob3J0LWNpcmN1aXQgdGhlCi0JICogc2VhcmNoIGZvciBhIGNoYXJhY3RlciBpbiB0aGUgc2V0LgotCSAqIEBzZWUgI2NoYXJJc1RvQmVFbmNvZGVkKGNoYXIpCi0JICovCi0JcHJpdmF0ZSBjaGFyIGNhbGN1bGF0ZU1heEludmFsaWRGaWxlTmFtZUNoYXIoKSB7Ci0JCWNoYXJbXSBsb2NhbENoYXJzID0gdGhpcy5jaGFyczsKLQkJY2hhciBtYXggPSAwOwotCQlmb3IgKGludCBpID0gbG9jYWxDaGFycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJY2hhciBjID0gbG9jYWxDaGFyc1tpXTsKLQkJCWlmIChtYXggPCBjKSB7Ci0JCQkJbWF4ID0gYzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggYW55IGNoYXJhY3RlcnMgaW4gdGhlIHNldAotCSAqIHJlcGxhY2VkIHdpdGggWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBzKSB7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQkvLyBhbGxvdyBmb3IgYSBmZXcgZW5jb2RlZCBjaGFyYWN0ZXJzCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyAyMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXRoaXMuYXBwZW5kQ2hhcmFjdGVyVG8ocy5jaGFyQXQoaSksIHNiKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBhbnkgWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzCi0JICogcmVwbGFjZWQgYnkgdGhlIGNoYXJhY3RlcnMgdGhlbXNlbHZlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGRlY29kZShTdHJpbmcgcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7Ci0JCVN0cmluZ0J1aWxkZXIgdGVtcCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CS8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCXRoaXMuZGVjb2RlVG8obmV3IFN0cmluZ1JlYWRlcihzKSwgc2IsIHRlbXApOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgdG8gdGhlIHN0cmluZyBidWZmZXIsCi0JICogY29udmVydGluZyBpdCB0byBhbiBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZSBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENoYXJhY3RlclRvKGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAodGhpcy5jaGFySXNUb0JlRW5jb2RlZChjKSkgewotCQkJdGhpcy5hcHBlbmRDaGFyYWN0ZXJSZWZlcmVuY2VUbyhjLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyBvbmUgb2YgdGhlIGNoYXJhY3RlcnMKLQkgKiB0byBiZSBjb252ZXJ0ZWQgdG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGFySXNUb0JlRW5jb2RlZChjaGFyIGMpIHsKLQkJcmV0dXJuIChjIDw9IHRoaXMubWF4Q2hhcikgJiYgQXJyYXlUb29scy5jb250YWlucyh0aGlzLmNoYXJzLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIncyBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZSB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlciAoZS5nLiAnLycgPT4gIiYjeDJmOyIpLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRDaGFyYWN0ZXJSZWZlcmVuY2VUbyhjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCImI3giKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhjLCAxNikpOwotCQlzYi5hcHBlbmQoJzsnKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlVG8oUmVhZGVyIHJlYWRlciwgU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nQnVpbGRlciB0ZW1wKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmRlY29kZVRvXyhyZWFkZXIsIHNiLCB0ZW1wKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVUb18oUmVhZGVyIHJlYWRlciwgU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nQnVpbGRlciB0ZW1wKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IC0xKSB7Ci0JCQlpZiAoYyA9PSAnJicpIHsKLQkJCQl0aGlzLmRlY29kZUNoYXJhY3RlclJlZmVyZW5jZVRvKHJlYWRlciwgc2IsIHRlbXApOwotCQkJfSBlbHNlIHsKLQkJCQlzYi5hcHBlbmQoKGNoYXIpIGMpOwotCQkJfQotCQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZUNoYXJhY3RlclJlZmVyZW5jZVRvKFJlYWRlciByZWFkZXIsIFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZ0J1aWxkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGMgPSByZWFkZXIucmVhZCgpOwotCQl0aGlzLmNoZWNrQ2hhcihjLCAnIycpOwotCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJdGhpcy5jaGVja0NoYXIoYywgJ3gnKTsKLQotCQl0ZW1wLnNldExlbmd0aCgwKTsgIC8vIHJlLXVzZSB0ZW1wCi0JCWMgPSByZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSAnOycpIHsKLQkJCXRoaXMuY2hlY2tFbmRPZlN0cmVhbShjKTsKLQkJCXRlbXAuYXBwZW5kKChjaGFyKSBjKTsKLQkJCWMgPSByZWFkZXIucmVhZCgpOwotCQl9Ci0JCVN0cmluZyBjaGFyVmFsdWUgPSB0ZW1wLnRvU3RyaW5nKCk7Ci0JCWlmIChjaGFyVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBudW1lcmljIHN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2IuYXBwZW5kKChjaGFyKSBJbnRlZ2VyLnBhcnNlSW50KGNoYXJWYWx1ZSwgMTYpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDaGFyKGludCBjLCBpbnQgZXhwZWN0ZWQpIHsKLQkJdGhpcy5jaGVja0VuZE9mU3RyZWFtKGMpOwotCQlpZiAoYyAhPSBleHBlY3RlZCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwZWN0ZWQgJyIgKyAoY2hhcikgZXhwZWN0ZWQgKyAiJywgYnV0IGVuY291bnRlcmVkICciICsgKGNoYXIpIGMgKyAiJyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRW5kT2ZTdHJlYW0oaW50IGMpIHsKLQkJaWYgKGMgPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2QwYzAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlFbnVtZXJhdGlvbjwvY29kZT4gaXMganVzdCB0aGF0LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBlbnVtZXJhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlFbnVtZXJhdGlvbjxFPgotCWltcGxlbWVudHMgRW51bWVyYXRpb248RT4KLXsKLQotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlFbnVtZXJhdGlvbiBJTlNUQU5DRSA9IG5ldyBFbXB0eUVudW1lcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBFbnVtZXJhdGlvbjxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUVudW1lcmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2MDAwYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQW4gPGNvZGU+SXRlcmF0b3JFbnVtZXJhdGlvbjwvY29kZT4gd3JhcHMgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0gc28gdGhhdCBpdCBjYW4gYmUgdHJlYXRlZCBsaWtlIGFuCi0gKiB7QGxpbmsgRW51bWVyYXRpb259LgotICogSG9wZWZ1bGx5IHdlIGRvbid0IGhhdmUgbXVjaCBuZWVkIGZvciB0aGlzLi4uLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBlbnVtZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgSXRlcmF0b3JFbnVtZXJhdGlvbjxFPgotCWltcGxlbWVudHMgRW51bWVyYXRpb248RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbnVtZXJhdGlvbiB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjdlNzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQXJyYXlJdGVyYXRvcgotICogQHNlZSBBcnJheUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlmaW5hbCBFW10gYXJyYXk7Ci0JZmluYWwgaW50IHN0YXJ0OwotCWZpbmFsIGludCBsZW5ndGg7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmFibGUoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZShFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhYmxlKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgobGVuZ3RoIDwgMCkgfHwgKGxlbmd0aCA+IGFycmF5Lmxlbmd0aCAtIHN0YXJ0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoOiAiICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYXJyYXkgPSBhcnJheTsKLQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPih0aGlzLmFycmF5LCB0aGlzLnN0YXJ0LCB0aGlzLmxlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2ViMGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUxpc3RJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYSB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogZm9yIGFuIGFycmF5IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBBcnJheUl0ZXJhYmxlCi0gKiBAc2VlIEFycmF5TGlzdEl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgQXJyYXlJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmFibGUoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBzdGFydCBpbmRleCBhbmQgY29udGludWluZyBmb3IKLQkgKiB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlKEVbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXRoaXMoYXJyYXksIHN0YXJ0LCBhcnJheS5sZW5ndGggLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYWJsZShFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxFPih0aGlzLmFycmF5LCB0aGlzLnN0YXJ0LCB0aGlzLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkY2M3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNoYWluSXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGEgcGx1Z2dhYmxlIHtAbGluayBJdGVyYWJsZX0KLSAqIHRoYXQgbG9vcHMgb3ZlciBhIGNoYWluIG9mIGFyYml0cmFyaWx5IGxpbmtlZCBvYmplY3RzLiBUaGUgY2hhaW4KLSAqIHNob3VsZCBiZSBudWxsLXRlcm1pbmF0ZWQgKGkuZS4gYSBjYWxsIHRvIHRoZSB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9Ci0gKiBtZXRob2Qgc2hvdWxkIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0IGlzIHBhc3NlZCB0aGUgbGFzdAotICogbGluayBvZiB0aGUgY2hhaW4pLgotICogVG8gdXNlLCBzdXBwbHkgYSBzdGFydGluZyBsaW5rIGFuZCBzdXBwbHkgYSB7QGxpbmsgQ2hhaW5JdGVyYXRvci5MaW5rZXJ9IG9yCi0gKiBzdWJjbGFzcyA8Y29kZT5DaGFpbkl0ZXJhYmxlPC9jb2RlPiBhbmQgb3ZlcnJpZGUgdGhlCi0gKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZC4KLSAqIFRoZSBzdGFydGluZyBsaW5rIHdpbGwgYmUgdGhlIGZpcnN0IG9iamVjdCByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvci4KLSAqIElmIHRoZSBzdGFydGluZyBsaW5rIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGUgaXRlcmFibGUgd2lsbCBiZSBlbXB0eS4KLSAqIE5vdGUgdGhpcyBpdGVyYWJsZSBkb2VzIG5vdCBzdXBwb3J0IDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnRzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2hhaW5JdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2hhaW5JdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgc3RhcnRMaW5rOwotCXByaXZhdGUgZmluYWwgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gbGlua2VyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0aW5nIGxpbmsKLQkgKiBhbmQgYSBkZWZhdWx0IGxpbmtlciB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBDaGFpbkl0ZXJhdG9yLkxpbmtlcn0uCi0JICovCi0JcHVibGljIENoYWluSXRlcmFibGUoRSBzdGFydExpbmspIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFydExpbmsgPSBzdGFydExpbms7Ci0JCXRoaXMubGlua2VyID0gdGhpcy5idWlsZERlZmF1bHRMaW5rZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0aW5nIGxpbmsKLQkgKiBhbmQgbGlua2VyLgotCSAqLwotCXB1YmxpYyBDaGFpbkl0ZXJhYmxlKEUgc3RhcnRMaW5rLCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFydExpbmsgPSBzdGFydExpbms7Ci0JCXRoaXMubGlua2VyID0gbGlua2VyOwotCX0KLQotCXByb3RlY3RlZCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiBidWlsZERlZmF1bHRMaW5rZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdExpbmtlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPEU+KHRoaXMuc3RhcnRMaW5rLCB0aGlzLmxpbmtlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXh0IGxpbmsgaW4gdGhlIGNoYWluOyBudWxsIGlmIHRoZXJlIGFyZSBubyBtb3JlIGxpbmtzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4gYWx0ZXJuYXRpdmUgdG8KLQkgKiBidWlsZGluZyBhIHtAbGluayBDaGFpbkl0ZXJhdG9yLkxpbmtlcn0uCi0JICovCi0JcHJvdGVjdGVkIEUgbmV4dExpbmsoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgY3VycmVudExpbmspIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhcnRMaW5rKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IGxpbmtlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdExpbmtlciBpbXBsZW1lbnRzIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IHsKLQkJcHVibGljIEUgbmV4dExpbmsoRSBjdXJyZW50TGluaykgewotCQkJcmV0dXJuIENoYWluSXRlcmFibGUudGhpcy5uZXh0TGluayhjdXJyZW50TGluayk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmEyMWE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogUHVsbCB0b2dldGhlciByZW1vdmVyIHN0YXRlIGFuZCBiZWhhdmlvciBmb3Igc3ViY2xhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvbmVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlmaW5hbCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENsb25lSXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVtb3ZlciA9IHRoaXMuYnVpbGREZWZhdWx0UmVtb3ZlcigpOwotCX0KLQotCXByb3RlY3RlZCBDbG9uZUl0ZXJhYmxlKENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVtb3ZlciA9IHJlbW92ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiBidWlsZERlZmF1bHRSZW1vdmVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRSZW1vdmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgcmVtb3ZhbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lSXRlcmF0b3IuUmVtb3Zlcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbXV0YXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJlbW92ZXIgaW1wbGVtZW50cyBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gewotCQlwdWJsaWMgdm9pZCByZW1vdmUoRSBlbGVtZW50KSB7Ci0JCQlDbG9uZUl0ZXJhYmxlLnRoaXMucmVtb3ZlKGVsZW1lbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThjNDIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBQdWxsIHRvZ2V0aGVyIG11dGF0b3Igc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBzdWJjbGFzc2VzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqIEBzZWUgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JZmluYWwgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBtdXRhdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2xvbmVMaXN0SXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubXV0YXRvciA9IHRoaXMuYnVpbGREZWZhdWx0TXV0YXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBDbG9uZUxpc3RJdGVyYWJsZShDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tdXRhdG9yID0gbXV0YXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBidWlsZERlZmF1bHRNdXRhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRNdXRhdG9yKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgbXV0YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIEF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIGFkZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBlbGVtZW50KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXQgdGhlIHNwZWNpZmllZCBpbmRleCwgc2V0IHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbXV0YXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdE11dGF0b3IgaW1wbGVtZW50cyBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IHsKLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCQlDbG9uZUxpc3RJdGVyYWJsZS50aGlzLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJQ2xvbmVMaXN0SXRlcmFibGUudGhpcy5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkJQ2xvbmVMaXN0SXRlcmFibGUudGhpcy5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDI3MzdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIG9mIHtAbGluayBJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICoge0BsaW5rIEl0ZXJhYmxlfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENvbXBvc2l0ZUl0ZXJhdG9yCi0gKiBAc2VlIENvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlcyA9IGl0ZXJhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShFIG9iamVjdCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUsIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIGNvbWJpbmVkIGl0ZXJhdG9ycwotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFPih0aGlzLml0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVyYXRvciBvZiBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SXRlcmFibGU8PyBleHRlbmRzIEU+LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KHRoaXMuaXRlcmFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oSXRlcmFibGU8PyBleHRlbmRzIEU+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhYmxlcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmNzU2Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlTGlzdEl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhIHtAbGluayBMaXN0SXRlcmFibGV9Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhYmxlfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgTGlzdEl0ZXJhYmxlfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDb21wb3NpdGVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgQ29tcG9zaXRlSXRlcmFibGUKLSAqIEBzZWUgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdDxMaXN0SXRlcmFibGU8RT4+IGl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTxFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+PiBpdGVyYWJsZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZXMgPSBpdGVyYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKEUgb2JqZWN0LCBMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhvYmplY3QsIG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEU+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3RJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+KG9iamVjdCksIGl0ZXJhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0PEU+IGxpc3QsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RT4obGlzdCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTxFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3Q8RT4uLi4gbGlzdHMpIHsKLQkJdGhpcyhuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8TGlzdDxFPiwgTGlzdEl0ZXJhYmxlPEU+PihuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdDxFPj4obGlzdHMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RT4gdHJhbnNmb3JtKExpc3Q8RT4gbGlzdCkgewotCQkJCXJldHVybiBuZXcgTGlzdExpc3RJdGVyYWJsZTxFPihsaXN0KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogY29tYmluZWQgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPih0aGlzLml0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmF0b3JzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPEU+LCBMaXN0SXRlcmF0b3I8RT4+KHRoaXMuaXRlcmFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPEU+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYWJsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGl0ZXJhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmFibGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWQxYzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUl0ZXJhYmxlPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiBNYXliZSBqdXN0IGEgdG91Y2ggYmV0dGVyLXBlcmZvcm1pbmcgdGhhbiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI0VNUFRZX1NFVH0KLSAqIHNpbmNlIHdlIGRvbid0IGNyZWF0ZSBhIG5ldyB7QGxpbmsgSXRlcmF0b3J9IGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcyBjYWxsZWQuCi0gKiAoTm90IHN1cmUgd2h5IHRoZXkgZG8gdGhhdC4uLi4pCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBFbXB0eUl0ZXJhdG9yCi0gKiBAc2VlIEVtcHR5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZSBJTlNUQU5DRSA9IG5ldyBFbXB0eUl0ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUl0ZXJhYmxlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5TGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI2NjEzYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5TGlzdEl0ZXJhYmxlPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiBNYXliZSBqdXN0IGEgdG91Y2ggYmV0dGVyLXBlcmZvcm1pbmcgdGhhbiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI0VNUFRZX0xJU1R9Ci0gKiBzaW5jZSB3ZSBkb24ndCBjcmVhdGUgYSBuZXcge0BsaW5rIEl0ZXJhdG9yfSBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgY2FsbGVkLgotICogKE5vdCBzdXJlIHdoeSB0aGV5IGRvIHRoYXQuLi4uKQotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIEVtcHR5TGlzdEl0ZXJhdG9yCi0gKiBAc2VlIEVtcHR5SXRlcmFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdEl0ZXJhYmxlIElOU1RBTkNFID0gbmV3IEVtcHR5TGlzdEl0ZXJhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxUPiBMaXN0SXRlcmFibGU8VD4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW1wdHlMaXN0SXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9GaWx0ZXJpbmdJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5N2YwZDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfSB0byBkZXRlcm1pbmUgd2hpY2ggZWxlbWVudHMgaW4gdGhlCi0gKiBuZXN0ZWQgaXRlcmFibGUgYXJlIHRvIGJlIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYWJsZTwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHRvIGJlIGZpbHRlcmVkCi0gKiAKLSAqIEBzZWUgRmlsdGVyaW5nSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEU+IGZpbHRlcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYWJsZSBhbmQgYSBkZWZhdWx0IGZpbHRlciB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy5maWx0ZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdEZpbHRlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmFibGUgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcjxFPiBidWlsZERlZmF1bHRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdEZpbHRlcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxFPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCksIHRoaXMuZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotCSAqIHNob3VsZCByZXR1cm4gdGhlIHNwZWNpZmllZCBuZXh0IGVsZW1lbnQgZnJvbSBhIGNhbGwgdG8gdGhlCi0JICoge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBvKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IGZpbHRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcjxFPiB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChFIG8pIHsKLQkJCXJldHVybiBGaWx0ZXJpbmdJdGVyYWJsZS50aGlzLmFjY2VwdChvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9HcmFwaEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxOTEyYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBpcyBzaW1pbGFyIHRvIGEge0BsaW5rIFRyZWVJdGVyYWJsZX0KLSAqIGV4Y2VwdCB0aGF0IGl0IGNhbm5vdCBiZSBhc3N1bWVkIHRoYXQgYWxsIG5vZGVzIGFzc3VtZSBhIHN0cmljdCB0cmVlCi0gKiBzdHJ1Y3R1cmUuIEZvciBpbnN0YW5jZSwgaW4gYSB0cmVlLCBhIG5vZGUgY2Fubm90IGJlIGEgZGVzY2VuZGVudCBvZgotICogaXRzZWxmLCBidXQgYSBncmFwaCBtYXkgaGF2ZSBhIGN5Y2xpY2FsIHN0cnVjdHVyZS4KLSAqIAotICogQSA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogZ3JhcGggb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgbmV4dCBjb2xsZWN0aW9uIG9mIG5vZGVzIGluIHRoZSBncmFwaCwKLSAqIChvciA8ZW0+bmVpZ2hib3JzPC9lbT4pLCBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IKLSAqIGdldHRpbmcgPGVtPmFsbDwvZW0+IG9mIHRoZSBub2RlcyBpbiB0aGUgZ3JhcGguCi0gKiAoZS5nLiBhIG5laWdoYm9yIGNhbiByZXR1cm4gaGlzIG5laWdoYm9ycywgYW5kIHRob3NlIG5laWdoYm9ycwotICogY2FuIHJldHVybiB0aGVpciBuZWlnaGJvcnMsIHdoaWNoIG1pZ2h0IGFsc28gaW5jbHVkZSB0aGUgb3JpZ2luYWwKLSAqIG5laWdoYm9yLCBidXQgeW91IG9ubHkgd2FudCB0byB2aXNpdCB0aGUgb3JpZ2luYWwgbmVpZ2hib3Igb25jZS4pCi0gKiA8cD4KLSAqIElmIGEgbmVpZ2hib3IgaGFzIGFscmVhZHkgYmVlbiB2aXNpdGVkIChkZXRlcm1pbmVkIGJ5IHVzaW5nIAotICoge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0pLCB0aGF0IG5laWdoYm9yIGlzIG5vdCB2aXNpdGVkIGFnYWluLAotICogbm9yIGFyZSB0aGUgbmVpZ2hib3JzIG9mIHRoYXQgb2JqZWN0LgotICogPHA+Ci0gKiBJdCBpcyB1cCB0byB0aGUgdXNlciBvZiB0aGlzIGNsYXNzIHRvIGVuc3VyZSBhIDxlbT5jb21wbGV0ZTwvZW0+IGdyYXBoLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgaW5pdGlhbCBub2RlIG9mIHRoZSBncmFwaCBvciBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBvZiB0aGUgaW5pdGlhbCBjb2xsZWN0aW9uIG9mIGdyYXBoIG5vZGVzCi0gKiA8bGk+IGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGJlaGF2aW9yLCBpZiAKLSAqIGRlc2lyZWQsIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEdyYXBoSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdyYXBoSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHM7Ci0JcHJpdmF0ZSBmaW5hbCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290KSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihyb290KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRSByb290LCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRS4uLiByb290cykgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoRVtdIHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgTXIuIFJvZ2VycyB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnN9LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gdGhpcy5idWlsZERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBtaXN0ZXJSb2dlcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yb290cyA9IHJvb3RzOwotCQl0aGlzLm1pc3RlclJvZ2VycyA9IG1pc3RlclJvZ2VyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gYnVpbGREZWZhdWx0TWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRNaXN0ZXJSb2dlcnMoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxFPih0aGlzLnJvb3RzLCB0aGlzLm1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgbmVpZ2hib3JzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgbmV4dCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yb290cyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBNci4gUm9nZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TWlzdGVyUm9nZXJzIGltcGxlbWVudHMgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8RT4gewotCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5laWdoYm9ycyhFIG5vZGUpIHsKLQkJCXJldHVybiBHcmFwaEl0ZXJhYmxlLnRoaXMubmVpZ2hib3JzKG5vZGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYmFiODIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpc3RJdGVyYWJsZTwvY29kZT4gc2ltcGx5IGV4dGVuZHMge0BsaW5rIEl0ZXJhYmxlfQotICogdG8gcmV0dXJuIGEge0BsaW5rIExpc3RJdGVyYXRvcn0gb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcnMKLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0SXRlcmFibGU8RT4KLQlleHRlbmRzIEl0ZXJhYmxlPEU+Ci17Ci0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvdmVyIGEgc2V0IG9mIGVsZW1lbnRzIG9mIHR5cGUgRS4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0TGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGlzdExpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVhNWQ3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0TGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGlzdExpc3RJdGVyYWJsZTwvY29kZT4gYWRhcHRzIGEge0BsaW5rIExpc3R9Ci0gKiB0byB0aGUge0BsaW5rIExpc3RJdGVyYWJsZX0gaW50ZXJmYWNlLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICovCi1wdWJsaWMgY2xhc3MgTGlzdExpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0PEU+IGxpc3Q7Ci0KLQlwdWJsaWMgTGlzdExpc3RJdGVyYWJsZShMaXN0PEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhYWNjZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhbiBpdGVyYXRvciBvbiBhIGN1cnJlbnQgY29weSBvZiBhCi0gKiBjb2xsZWN0aW9uLCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEEKLSAqIGNvcHkgb2YgdGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMKLSAqIGNhbGxlZC4gQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgY29sbGVjdGlvbiBjYW4gYmUgZGlmZmVyZW50IHdpdGgKLSAqIGVhY2ggY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9IChpLmUuIGl0IGlzICJsaXZlIikuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgPGNvZGU+TGl2ZUNsb25lSXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+TGl2ZUNsb25lSXRlcmFibGU8L2NvZGU+IGRvZXMgbm90Ci0gKiBzdXBwb3J0IHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbjsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90Ci0gKiBoYXZlIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQnV0IGlmIHRoZSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIENsb25lSXRlcmF0b3IuUmVtb3Zlcn0gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHRvIHRoZSA8Y29kZT5SZW1vdmVyPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBpdGVyYWJsZSdzIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9Ci0gKiBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUl0ZXJhdG9yCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIExpdmVDbG9uZUl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAibGl2ZSIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHtAbGluayAjaXRlcmF0b3IoKX0KLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIExpdmVDbG9uZUl0ZXJhYmxlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAibGl2ZSIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIHJlbW92ZXIgd2lsbCBiZSB1c2VkIGJ5IGFueSBnZW5lcmF0ZWQgaXRlcmF0b3JzIHRvCi0JICogcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJc3VwZXIocmVtb3Zlcik7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbiwgdGhpcy5yZW1vdmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDI2NTU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpdmVDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb24gYSBjdXJyZW50Ci0gKiBjb3B5IG9mIGEgbGlzdCwgYWxsb3dpbmcgZm9yIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LiBBCi0gKiBjb3B5IG9mIHRoZSBsaXN0IGlzIGNyZWF0ZWQgZXZlcnkgdGltZSB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzCi0gKiBjYWxsZWQuIEFzIGEgcmVzdWx0LCB0aGUgY29udGVudHMgb2YgdGhlIGxpc3QgY2FuIGJlIGRpZmZlcmVudCB3aXRoCi0gKiBlYWNoIGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfSAoaS5lLiBpdCBpcyAibGl2ZSIpLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgbGlzdCBwYXNzZWQgdG8gdGhlIDxjb2RlPkxpdmVDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHRocmVhZC1zYWZlIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBsaXN0LgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSBhIDxjb2RlPkxpdmVDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGRvZXMgbm90IHN1cHBvcnQgdGhlIG1vZGlmeSBvcGVyYXRpb25zOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LiBCdXQgaWYgdGhlIDxjb2RlPkxpdmVDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3J9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiBtb2RpZnkgb3BlcmF0aW9ucyB0byB0aGUgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgbGlzdCBpdGVyYWJsZSdzIG11dGF0aW9uCi0gKiBtZXRob2RzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIENsb25lTGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqIEBzZWUgTGl2ZUNsb25lSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIExpdmVDbG9uZUxpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3Q8PyBleHRlbmRzIEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIHtAbGluayBMaXN0SXRlcmF0b3J9IG11dGF0aW9uIG9wZXJhdGlvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgaXRlcmFibGUncyBtdXRhdGlvbgotCSAqIG1ldGhvZHMuCi0JICovCi0JcHVibGljIExpdmVDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUgc3BlY2lmaWVkIG11dGF0b3Igd2lsbCBiZSB1c2VkIGJ5IGFueSBnZW5lcmF0ZWQgbGlzdCBpdGVyYXRvcnMgdG8KLQkgKiBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIExpdmVDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIobXV0YXRvcik7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdCwgdGhpcy5tdXRhdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9QZWVrYWJsZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzgxZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlBlZWthYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5QZWVrYWJsZUl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGFuIHtAbGluayBQZWVrYWJsZUl0ZXJhdG9yfSB0aGF0IGFsbG93cyBhCi0gKiB7QGxpbmsgUGVla2FibGVJdGVyYXRvciNwZWVrKCkgcGVla30gYXQgdGhlIG5leHQgZWxlbWVudCB0byBiZSAKLSAqIHJldHVybmVkIGJ5IHtAbGluayBJdGVyYXRvciNuZXh0KCl9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgcGVla2FibGUgaXRlcmF0b3IncyB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfQotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIHtAbGluayBQZWVrYWJsZUl0ZXJhdG9yI3BlZWsoKX0gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBQZWVrYWJsZUl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmFibGUgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUuCi0JICovCi0JcHVibGljIFBlZWthYmxlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPEU+KHRoaXMuaXRlcmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmFhNmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5RdWV1ZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UXVldWVJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGEge0BsaW5rIFF1ZXVlfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBxdWV1ZSdzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFF1ZXVlI2RlcXVldWUoKSBkZXF1ZXVlfWQiIGFzIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yIHJldHVybnMKLSAqIHRoZW0gd2l0aCBjYWxscyB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFF1ZXVlCi0gKiBAc2VlIFF1ZXVlSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgUXVldWVJdGVyYWJsZShRdWV1ZTxFPiBxdWV1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFF1ZXVlSXRlcmF0b3I8RT4odGhpcy5xdWV1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5xdWV1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI4MTBmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGEge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIG9mIHtAbGluayBMaXN0SXRlcmFibGV9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhYmxlfS4gQSByZWFkLW9ubHkgY29tcG9zaXRlIGxpc3QKLSAqIGl0ZXJhYmxlIGlzIG1vcmUgZmxleGlibGUgdGhhbiBhIG5vcm1hbCBjb21wb3NpdGUgbGlzdCBpdGVyYWJsZSB3aGVuIGl0Ci0gKiBjb21lcyB0byB0aGUgZWxlbWVudCB0eXBlcyBvZiB0aGUgbmVzdGVkIGxpc3QgaXRlcmFibGVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yCi0gKiBAc2VlIENvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGVzID0gaXRlcmFibGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlKEUgb2JqZWN0LCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8RT4ob2JqZWN0KSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYWJsZSwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4uLi4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIGNvbWJpbmVkIGxpc3QgaXRlcmF0b3JzCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPih0aGlzLml0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmF0b3JzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4sIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KHRoaXMuaXRlcmFibGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogbGlzdCBpdGVyYXRvciBvZiBsaXN0IGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmFibGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODM5MjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGEgcmVhZC1vbmx5IHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBSZWFkT25seUl0ZXJhdG9yCi0gKiBAc2VlIFJlYWRPbmx5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgdGhlIHJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuaXRlcmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5TGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmZGU0MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5TGlzdEl0ZXJhYmxlPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBMaXN0SXRlcmFibGV9Ci0gKiBhbmQgcmV0dXJucyBhIHJlYWQtb25seSB7QGxpbmsgTGlzdEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBSZWFkT25seUxpc3RJdGVyYXRvcgotICogQHNlZSBSZWFkT25seUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB0aGUgcmV0dXJucyBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0SXRlcmFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRlYTNhNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmFibGU8L2NvZGU+IHJldHVybnMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogdGhhdCBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayBJdGVyYXRvciNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayBJdGVyYXRvciNoYXNOZXh0KCl9LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYWJsZTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIHtAbGluayBJdGVyYWJsZX0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b24oT2JqZWN0KX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTaW5nbGVFbGVtZW50SXRlcmF0b3IKLSAqIEBzZWUgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYWJsZShFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHRoaXMuZWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmUyMTAwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8L2NvZGU+IHJldHVybnMgYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfQotICogdGhhdCBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dCgpfSwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI2hhc05leHQoKX0uIExpa2V3aXNlLCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLSAqIHRvIGEgY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI2hhc1ByZXZpb3VzKCl9IHVudGlsIGEgY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI25leHQoKX0sCi0gKiBhdCB3aGljaCBwb2ludCBhIGNhbGwgdG8ge0BsaW5rIExpc3RJdGVyYXRvciNwcmV2aW91cygpfSB3aWxsIHJldHVybiB0aGUKLSAqIHNpbmdsZSBlbGVtZW50LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgSXRlcmFibGV9IHJldHVybmVkIGJ5OgotICogCXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2luZ2xldG9uTGlzdChPYmplY3QpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KHRoaXMuZWxlbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiZWViZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIGEgInNuYXBzaG90IiBvZiBhCi0gKiBjb2xsZWN0aW9uLCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEEKLSAqIGNvcHkgb2YgdGhlIGNvbGxlY3Rpb24gaXMgY3JlYXRlZCB3aGVuIHRoZSBpdGVyYWJsZSBpcyBjb25zdHJ1Y3RlZC4KLSAqIEFzIGEgcmVzdWx0LCB0aGUgY29udGVudHMgb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZSB0aGUgc2FtZSB3aXRoCi0gKiBldmVyeSBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0uCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHBhc3NlZCB0byB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSBhIDxjb2RlPlNuYXBzaG90Q2xvbmVJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPlNuYXBzaG90Q2xvbmVJdGVyYWJsZTwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYSB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPlJlbW92ZXI8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIDxwPgotICogVGhpcyBpdGVyYWJsZSBpcyB1c2VmdWwgZm9yIG11bHRpcGxlIHBhc3NlcyBvdmVyIGEgY29sbGVjdGlvbiB0aGF0IHNob3VsZCBub3QKLSAqIGJlIGNoYW5nZWQgKGUuZy4gYnkgYW5vdGhlciB0aHJlYWQpIGJldHdlZW4gcGFzc2VzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVJdGVyYXRvcgotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICogQHNlZSBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lSXRlcmFibGU8RT4KLQlleHRlbmRzIENsb25lSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGFycmF5OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFycmF5ID0gQXJyYXlUb29scy5hcnJheShpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgInNuYXBzaG90IiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIHJlbW92ZXIgd2lsbCBiZSB1c2VkIGJ5IGFueSBnZW5lcmF0ZWQgaXRlcmF0b3JzIHRvCi0JICogcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJc3VwZXIocmVtb3Zlcik7Ci0JCXRoaXMuYXJyYXkgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmFycmF5ID0gY29sbGVjdGlvbi50b0FycmF5KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgInNuYXBzaG90IiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJc3VwZXIocmVtb3Zlcik7Ci0JCXRoaXMuYXJyYXkgPSBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ2xvbmVJdGVyYXRvcjxFPih0aGlzLnJlbW92ZXIsIHRoaXMuYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25lIGl0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb3ZpZGUgYWNjZXNzIHRvICJpbnRlcm5hbCIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsQ2xvbmVJdGVyYXRvcjxFPiBleHRlbmRzIENsb25lSXRlcmF0b3I8RT4gewotCQlwcm90ZWN0ZWQgTG9jYWxDbG9uZUl0ZXJhdG9yKFJlbW92ZXI8RT4gcmVtb3ZlciwgT2JqZWN0W10gYXJyYXkpIHsKLQkJCXN1cGVyKHJlbW92ZXIsIGFycmF5KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNDJhYjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+IHJldHVybnMgYSBsaXN0IGl0ZXJhdG9yIG9uIGEKLSAqICJzbmFwc2hvdCIgb2YgYSBsaXN0LCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiBBIGNvcHkgb2YgdGhlIGxpc3QgaXMgY3JlYXRlZCB3aGVuIHRoZSBsaXN0IGl0ZXJhYmxlIGlzIGNvbnN0cnVjdGVkLgotICogQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCB3aWxsIGJlIHRoZSBzYW1lIHdpdGgKLSAqIGV2ZXJ5IGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfSwgZXZlbiBpZiB0aGUgb3JpZ2luYWwgbGlzdCBpcyBtb2RpZmllZCB2aWEKLSAqIHRoZSBsaXN0IGl0ZXJhdG9yJ3MgbXV0YXRpb24gbWV0aG9kcy4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGxpc3QgcGFzc2VkIHRvIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGxpc3QuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+U25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBMaXN0SXRlcmF0b3J9IG11dGF0aW9uIG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIHtAbGluayBMaXN0SXRlcmF0b3J9IG11dGF0aW9uIG9wZXJhdGlvbnMgdG8gdGhlIDxjb2RlPk11dGF0b3I8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGxpc3QgaXRlcmFibGUncyBtdXRhdGlvbgotICogbWV0aG9kcy4KLSAqIDxwPgotICogVGhpcyBsaXN0IGl0ZXJhYmxlIGlzIHVzZWZ1bCBmb3IgbXVsdGlwbGUgcGFzc2VzIG92ZXIgYSBsaXN0IHRoYXQgc2hvdWxkIG5vdAotICogYmUgY2hhbmdlZCAoZS5nLiBieSBhbm90aGVyIHRocmVhZCkgYmV0d2VlbiBwYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGFycmF5OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbW9kaWZ5IG9wZXJhdGlvbnMgd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgbGlzdCBpdGVyYWJsZSdzIG1vZGlmeQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUgc3BlY2lmaWVkIG11dGF0b3Igd2lsbCBiZSB1c2VkIGJ5IGFueSBnZW5lcmF0ZWQgbGlzdCBpdGVyYXRvcnMgdG8KLQkgKiBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QuCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXN1cGVyKG11dGF0b3IpOwotCQl0aGlzLmFycmF5ID0gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ2xvbmVMaXN0SXRlcmF0b3I8RT4odGhpcy5tdXRhdG9yLCB0aGlzLmFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBBcnJheXMudG9TdHJpbmcodGhpcy5hcnJheSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uZSBpdGVyYXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwcm92aWRlIGFjY2VzcyB0byAiaW50ZXJuYWwiIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBMb2NhbENsb25lTGlzdEl0ZXJhdG9yPEU+IGV4dGVuZHMgQ2xvbmVMaXN0SXRlcmF0b3I8RT4gewotCQlwcm90ZWN0ZWQgTG9jYWxDbG9uZUxpc3RJdGVyYXRvcihNdXRhdG9yPEU+IG11dGF0b3IsIE9iamVjdFtdIGFycmF5KSB7Ci0JCQlzdXBlcihtdXRhdG9yLCBhcnJheSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3RhY2tJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFmZTNmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3RhY2tJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlN0YWNrSXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIGZvciBhIHtAbGluayBTdGFja30gb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGUgc3RhY2sncyBlbGVtZW50cwotICogYXJlIHtAbGluayBTdGFjayNwb3AoKSAicG9wcGVkIn0gYXMgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucwotICogdGhlbSB3aXRoIGNhbGxzIHRvIHtAbGluayBJdGVyYXRvciNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU3RhY2sKLSAqIEBzZWUgU3RhY2tJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU3RhY2tJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFN0YWNrPEU+IHN0YWNrOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHN0YWNrLgotCSAqLwotCXB1YmxpYyBTdGFja0l0ZXJhYmxlKFN0YWNrPEU+IHN0YWNrKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3RhY2tJdGVyYXRvcjxFPih0aGlzLnN0YWNrKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YWNrKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxMDhkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3ViSXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdWJJdGVyYXRvcldyYXBwZXI7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gPGVtPkFzc3VtZTwvZW0+IHRoZSB3cmFwcGVkCi0gKiBpdGVyYWJsZSBjb250YWlucyBvbmx5IGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdWJJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1Ykl0ZXJhYmxlV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPEUxPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIFN1Ykl0ZXJhYmxlV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3ViTGlzdEl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEzY2UwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIEFzc3VtZSB0aGUgd3JhcHBlZAotICogaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIAotICogQHBhcmFtIDxFMT4gaW5wdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgd3JhcHBlZCBsaXN0IGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1Ykxpc3RJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdDxFMT4gbGlzdCkgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEUxPihsaXN0KSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWU1ZTFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckl0ZXJhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGVyZQotICogaXMgbm8gd2F5IHRvIGFkZCBpbnZhbGlkIGVsZW1lbnRzIHRvIHRoZSBpdGVyYWJsZS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVySXRlcmFibGVXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8RT4gaXRlcmFibGU7Ci0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBTdXBlckl0ZXJhYmxlV3JhcHBlcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJLy8gdGhpcyBzaG91bGQgYmUgYSBzYWZlIGNhc3QgLSB0aGUgaXRlcmF0b3Igd2lsbCBvbmx5IGV2ZXIKLQkJLy8gcmV0dXJuIEUgKG9yIGEgc3ViLXR5cGUpIGZyb20gI25leHQoKQotCQl0aGlzLml0ZXJhYmxlID0gKEl0ZXJhYmxlPEU+KSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNWZhMjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgPGNvZGU+RTwvY29kZT4sCi0gKiBjb252ZXJ0aW5nIGl0IGludG8gYSBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uCi0gKiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlIHJlc3VsdGluZyBsaXN0IGl0ZXJhYmxlJ3MgbGlzdAotICogaXRlcmF0b3IgZGlzYWJsZXMgdGhlIG1ldGhvZHMgdGhhdCB3b3VsZCBwdXQgaW52YWxpZCBlbGVtZW50cyBpbiB0aGUgbGlzdAotICogaXRlcmF0b3IncyBiYWNraW5nIGxpc3QgKGkuZS4ge0BsaW5rIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlciNzZXQoT2JqZWN0KX0KLSAqIGFuZCB7QGxpbmsgU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyI2FkZChPYmplY3QpfSkuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3JzCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdXBlckxpc3RJdGVyYXRvcldyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlOwotCi0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBFPiBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdDxUPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8VD4obGlzdCkpOwotCX0KLQotCXB1YmxpYyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXI8RT4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRjMTVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpLCB0aGlzLnRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUxIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBvKSB7Ci0JCQlyZXR1cm4gVHJhbnNmb3JtYXRpb25JdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZDA1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyBlbGVtZW50cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICoge0BsaW5rIFRyYW5zZm9ybWVyfSBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcgotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdAotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3Q8RTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QgaXRlcmFibGUKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCksIHRoaXMudHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgbykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBsaW5rZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEUxLCBFMj4gewotCQlwdWJsaWMgRTIgdHJhbnNmb3JtKEUxIG8pIHsKLQkJCXJldHVybiBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNlMWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYWJsZTwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmFibGV9IG9mIHRoZSBzZXQgb2Ygcm9vdHMKLSAqIDxsaT4gYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFRyZWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzOwotCXByaXZhdGUgZmluYWwgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzCi0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFW10gcm9vdHMsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IG1pZHdpZmUgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taWR3aWZlID0gdGhpcy5idWlsZERlZmF1bHRNaWR3aWZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cywgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IGJ1aWxkRGVmYXVsdE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pZHdpZmUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG5leHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdHMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbWlkd2lmZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdE1pZHdpZmUgaW1wbGVtZW50cyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBub2RlKSB7Ci0JCQlyZXR1cm4gVHJlZUl0ZXJhYmxlLnRoaXMuY2hpbGRyZW4obm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBlMjc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlmaW5hbCBFW10gYXJyYXk7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JaW50IGN1cnNvcjsJCS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbWF4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgobGVuZ3RoIDwgMCkgfHwgKGxlbmd0aCA+IGFycmF5Lmxlbmd0aCAtIHN0YXJ0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoOiAiICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYXJyYXkgPSBhcnJheTsKLQkJdGhpcy5jdXJzb3IgPSBzdGFydDsKLQkJdGhpcy5tYXggPSBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgIT0gdGhpcy5tYXg7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVt0aGlzLmN1cnNvcisrXTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGNmZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhlIG5hbWUgbWlnaHQgYmUgYSBiaXQgY29uZnVzaW5nOgotICogVGhpcyBpcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4ge0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciBJdGVyYXRvcn0gZm9yIGFuCi0gKiB7QGxpbmsgamF2YS51dGlsLkFycmF5TGlzdCBBcnJheUxpc3R9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhdG9yPEU+Ci0JZXh0ZW5kcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIGludCBtaW47Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQkJdGhpcy5taW4gPSBzdGFydDsKLQl9Ci0JCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvcjsKLQl9Ci0JCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgLSAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yICE9IHRoaXMubWluOwotCX0KLQkKLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbLS10aGlzLmN1cnNvcl07Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjY3MTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhdG9yfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBMaW5rZXJ9IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgRSBuZXh0TGluazsKLQlwcml2YXRlIGZpbmFsIExpbmtlcjxFPiBsaW5rZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBhIGRpc2FibGVkIGxpbmtlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTGlua2VyfS4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaykgewotCQl0aGlzKHN0YXJ0TGluaywgTGlua2VyLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmF0b3IoRSBzdGFydExpbmssIExpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXh0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dExpbmsgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5uZXh0TGluayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0TGluazsKLQkJdGhpcy5uZXh0TGluayA9IHRoaXMubmV4dExpbmsodGhpcy5uZXh0TGluayk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIEUgbmV4dExpbmsoRSBjdXJyZW50TGluaykgewotCQlyZXR1cm4gdGhpcy5saW5rZXIubmV4dExpbmsoY3VycmVudExpbmspOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmV4dExpbmspOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2hhaW5JdGVyYXRvcn0gdG8gbGluawotCSAqIHRoZSBlbGVtZW50cyBpbiB0aGUgY2hhaW4uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaW5rZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JCSAqLwotCQlUIG5leHRMaW5rKFQgY3VycmVudExpbmspOwotCi0KLQkJZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIExpbmtlcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBDaGFpbkl0ZXJhdG9yLm5leHRMaW5rKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2hhaW5JdGVyYXRvci5MaW5rZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTMxZGRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgY29sbGVjdGlvbiwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc3luY2hyb25pemVkIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIFJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIHtAbGluayBSZW1vdmVyfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGUKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yOwotCXByaXZhdGUgRSBjdXJyZW50OwotCXByaXZhdGUgZmluYWwgUmVtb3ZlcjxFPiByZW1vdmVyOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxvd2VkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhjb2xsZWN0aW9uLCBSZW1vdmVyLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKEVbXSBhcnJheSkgewotCQl0aGlzKGFycmF5LCBSZW1vdmVyLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHJlbW92ZXIgdG8gcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIFJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQl0aGlzKHJlbW92ZXIsIGNvbGxlY3Rpb24udG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgcmVtb3ZlciB0byByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZQotCSAqIG9yaWdpbmFsIGFycmF5LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKEVbXSBhcnJheSwgUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXRoaXMocmVtb3ZlciwgYXJyYXkuY2xvbmUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgY29uc3RydWN0b3IgdXNlZCBieSBzdWJjbGFzc2VzLgotCSAqIFN3YXAgb3JkZXIgb2YgYXJndW1lbnRzIHRvIHByZXZlbnQgY29sbGlzaW9uIHdpdGggb3RoZXIgY29uc3RydWN0b3IuCi0JICogVGhlIHBhc3NlZCBpbiBhcnJheSB3aWxsICpub3QqIGJlIGNsb25lZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYXRvcihSZW1vdmVyPEU+IHJlbW92ZXIsIE9iamVjdC4uLiBhcnJheSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihhcnJheSk7Ci0JCXRoaXMuY3VycmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlciA9IHJlbW92ZXI7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5jdXJyZW50ID0gdGhpcy5uZXN0ZWROZXh0KCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAoICEgdGhpcy5yZW1vdmVBbGxvd2VkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmUodGhpcy5jdXJyZW50KTsKLQkJdGhpcy5yZW1vdmVBbGxvd2VkID0gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gcGFzc2VkIGluIGR1cmluZyBjb25zdHJ1Y3Rpb24gaGVsZCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5ICg8Y29kZT5PYmplY3RbXTwvY29kZT4pLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIG5lc3RlZE5leHQoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBSZW1vdmVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoRSBlKSB7Ci0JCXRoaXMucmVtb3Zlci5yZW1vdmUoZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDbG9uZUl0ZXJhdG9yfSB0byByZW1vdmUKLQkgKiBlbGVtZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uOyBzaW5jZSB0aGUgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBSZW1vdmVyPFQ+IHsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZShUIGVsZW1lbnQpOwotCi0KLQkJZmluYWwgY2xhc3MgUmVhZE9ubHk8Uz4gaW1wbGVtZW50cyBSZW1vdmVyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlbW92ZXIgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gUmVtb3ZlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDbG9uZUl0ZXJhdG9yLlJlbW92ZXIuUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTM2YTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGxpc3QsCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBsaXN0IChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfS4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgYSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZQotICogYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LiBCdXQgaWYgdGhlIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBNdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnMgdG8gdGhlIHtAbGluayBNdXRhdG9yfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBtb2RpZmljYXRpb24gbWV0aG9kcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxPYmplY3Q+IGxpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGludCBjdXJzb3I7Ci0JcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGZpbmFsIE11dGF0b3I8RT4gbXV0YXRvcjsKLQotCXByaXZhdGUgZW51bSBTdGF0ZSB7Ci0JCVVOS05PV04sCi0JCVBSRVZJT1VTLAotCQlORVhUCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlbS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QsIE11dGF0b3IuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGVtLgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihFW10gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgbGlzdCBtdXRhdG9yIHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXRoaXMobXV0YXRvciwgbGlzdC50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgbGlzdCBtdXRhdG9yIHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJdGhpcyhtdXRhdG9yLCBhcnJheS5jbG9uZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHN1YmNsYXNzZXMuCi0JICogU3dhcCBvcmRlciBvZiBhcmd1bWVudHMgdG8gcHJldmVudCBjb2xsaXNpb24gd2l0aCBvdGhlciBjb25zdHJ1Y3Rvci4KLQkgKiBUaGUgcGFzc2VkIGluIGFycmF5IHdpbGwgKm5vdCogYmUgY2xvbmVkLgotCSAqLwotCXByb3RlY3RlZCBDbG9uZUxpc3RJdGVyYXRvcihNdXRhdG9yPEU+IG11dGF0b3IsIE9iamVjdC4uLiBhcnJheSkgewotCQlzdXBlcigpOwotCQkvLyBidWlsZCBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGtlZXAgaXQgaW4gc3luY2ggd2l0aCBvcmlnaW5hbCAoaWYgdGhlIG11dGF0b3IgYWxsb3dzIGNoYW5nZXMpCi0JCS8vIHRoYXQgd2F5IHRoZSBuZXN0ZWQgbGlzdCBpdGVyYXRvciB3aWxsIG1haW50YWluIHNvbWUgb2Ygb3VyIHN0YXRlCi0JCXRoaXMubGlzdEl0ZXJhdG9yID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYXJyYXkpLmxpc3RJdGVyYXRvcigpOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLmN1cnNvciA9IDA7Ci0JCXRoaXMuc3RhdGUgPSBTdGF0ZS5VTktOT1dOOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0SXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBpbmRleAotCQlFIG5leHQgPSB0aGlzLm5lc3RlZE5leHQoKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLk5FWFQ7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gU3RhdGUuUFJFVklPVVMpIHsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY3Vyc29yLS07Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgcHJldmlvdXMgPSB0aGlzLm5lc3RlZFByZXZpb3VzKCk7Ci0JCXRoaXMuY3Vyc29yLS07Ci0JCXRoaXMuc3RhdGUgPSBTdGF0ZS5QUkVWSU9VUzsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5hZGQobyk7Ci0JCXRoaXMuYWRkKHRoaXMuY3Vyc29yLCBvKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KG8pOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBTdGF0ZS5QUkVWSU9VUykgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IsIG8pOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IgLSAxLCBvKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4sCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKDxjb2RlPk9iamVjdFtdPC9jb2RlPikuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkUHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBFIG8pIHsKLQkJdGhpcy5tdXRhdG9yLmFkZChpbmRleCwgbyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRoaXMubXV0YXRvci5yZW1vdmUoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3Iuc2V0KGluZGV4LCBvKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3J9IHRvIHJlbW92ZQotCSAqIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGxpc3Q7IHNpbmNlIHRoZSBsaXN0IGl0ZXJhdG9yCi0JICogZG9lcyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTXV0YXRvcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgYWRkKGludCBpbmRleCwgVCBvKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIHNwZWNpZmllZCBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHNldChpbnQgaW5kZXgsIFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBSZWFkT25seTxTPiBpbXBsZW1lbnRzIE11dGF0b3I8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTXV0YXRvciBJTlNUQU5DRSA9IG5ldyBSZWFkT25seSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNdXRhdG9yPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgUmVhZE9ubHkoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIGFkZCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHNldCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvci5SZWFkT25seSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhZDc2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgY29sbGVjdGlvbgotICogb2Yge0BsaW5rIEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgSXRlcmF0b3J9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsYXN0SXRlcmF0b3JUb1JldHVybk5leHQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgYWxsIHRoZSBlbGVtZW50cyBoZWxkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SXRlcmFibGU8PyBleHRlbmRzIEU+LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKG9iamVjdCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmF0b3IsIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBzZXQgJ2xhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvcjsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID09IG51bGwpIHsKLQkJCS8vIENvbXBvc2l0ZUl0ZXJhdG9yI25leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dC5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjY3VycmVudEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayBJdGVyYXRvciNoYXNOZXh0KCl9Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQ3VycmVudEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKCggISB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExMTQ1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgbGlzdAotICogb2Yge0BsaW5rIExpc3RJdGVyYXRvcn1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IG5leHRJdGVyYXRvcjsKLQlwcml2YXRlIGludCBuZXh0SW5kZXg7Ci0gCS8qKgotIAkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiAibmV4dCIgd2FzIGxhc3QgcmV0dXJuZWQ7Ci0gCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiAicHJldmlvdXMiIHdhcyBsYXN0IHJldHVybmVkOwotIAkgKiB0aGlzIGRldGVybWluZXMgdGhlIGVmZmVjdCBvZiB7QGxpbmsgI3JlbW92ZSgpfSBvbiB7QGxpbmsgI25leHRJbmRleH0KLSAJICovCi0JcHJpdmF0ZSBib29sZWFuIG5leHRSZXR1cm5lZDsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjxFPiBsYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIExpc3Q8RT4+IGxpc3RzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdDxFPiwgTGlzdEl0ZXJhdG9yPEU+PihsaXN0cy5saXN0SXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gdHJhbnNmb3JtKExpc3Q8RT4gbGlzdCkgewotCQkJCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0SXRlcmFibGU8RT4sIExpc3RJdGVyYXRvcjxFPj4obGlzdEl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPEU+IGxpc3QpIHsKLQkJCQkJcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3Q8RT4gbGlzdCkgewotCQl0aGlzKG9iamVjdCwgbGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmFibGU8RT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PEU+Li4uIGxpc3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChsaXN0cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+Li4uIGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPEU+PihsaXN0SXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXRoaXMubmV4dEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSB0cnVlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQuc2V0KGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgJ25leHRJdGVyYXRvcicgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmICduZXh0SXRlcmF0b3InIGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2ZTJlMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMjM3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUxpc3RJdGVyYXRvciBJTlNUQU5DRSA9IG5ldyBFbXB0eUxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5TGlzdEl0ZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU5ZDM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMTc2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYXRvciBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgZmlsdGVyZWQgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiB7QGxpbmsgI2hhc05leHQoKX0gbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgZmlsdGVyZWQgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSBmaWx0ZXJlZAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEU+IGZpbHRlcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMoaXRlcmF0b3IsIEZpbHRlci5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgdmFsaWQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCBuZXh0IGlzIHNldCB0byA8Y29kZT5FTkQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpICYmICh0aGlzLmRvbmUpKSB7Ci0JCQlFIHRlbXAgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0aGlzLmFjY2VwdCh0ZW1wKSkgewotCQkJCS8vIGFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3Qgd2FzIGFjY2VwdGVkIGl0IGlzIG9mIHR5cGUgRQotCQkJCXRoaXMubmV4dCA9IHRlbXA7Ci0JCQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB7QGxpbmsgRmlsdGVyaW5nSXRlcmF0b3J9Ci0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUwZjE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gaXMgc2ltaWxhciB0byBhIHtAbGluayBUcmVlSXRlcmF0b3J9Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiBGb3IgaW5zdGFuY2UsIGluIGEgdHJlZSwgYSBub2RlIGNhbm5vdCBiZSBhIGRlc2NlbmRlbnQgb2YKLSAqIGl0c2VsZiwgYnV0IGEgZ3JhcGggbWF5IGhhdmUgYSBjeWNsaWNhbCBzdHJ1Y3R1cmUuCi0gKiAKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIGdyYXBoIG9mIG9iamVjdHMsIHdoZXJlIHRoZSBvYmplY3RzJyBwcm90b2NvbChzKSBwcm92aWRlcwotICogYSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIG5leHQgY29sbGVjdGlvbiBvZiBub2RlcyBpbiB0aGUgZ3JhcGgsCi0gKiAob3IgPGVtPm5laWdoYm9yczwvZW0+KSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yCi0gKiBnZXR0aW5nIDxlbT5hbGw8L2VtPiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIHtAbGluayAjZXF1YWxzKE9iamVjdCl9KSwgdGhhdCBuZWlnaGJvciBpcyBub3QgdmlzaXRlZCBhZ2FpbiwKLSAqIG5vciBhcmUgdGhlIG5laWdoYm9ycyBvZiB0aGF0IG9iamVjdC4KLSAqIDxwPgotICogSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBjbGFzcyB0byBlbnN1cmUgYSA8ZW0+Y29tcGxldGU8L2VtPiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogb3ZlciBhbiBpbml0aWFsIGNvbGxlY3Rpb24gb2YgZ3JhcGggbm9kZXMKLSAqIDxsaT4gYSB7QGxpbmsgTWlzdGVyUm9nZXJzfSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIHtAbGluayAjcmVtb3ZlKCl9IGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgYmVoYXZpb3IsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQlwcml2YXRlIGZpbmFsIEhhc2hTZXQ8RT4gdmlzaXRlZE5laWdoYm9ycyA9IG5ldyBIYXNoU2V0PEU+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzOwotCQotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQkKLQlwcml2YXRlIEUgbmV4dE5laWdoYm9yOwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFLi4uIHJvb3RzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+bmVpZ2hib3JzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaXN0ZXJSb2dlcnM8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pc3RlclJvZ2Vycy5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290LCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihyb290KSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRVtdIHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMocm9vdHMuaXRlcmF0b3IoKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzIGFuZCBNci4gUm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQl0aGlzLm1pc3RlclJvZ2VycyA9IG1pc3RlclJvZ2VyczsKLQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IG5laWdoYm9yIHdpdGggdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgY3VycmVudCBpdGVyYXRvci4KLQkgKiBJZiB0aGUgY3VycmVudCBpdGVyYXRvciBoYXMgbm9uZSwgbG9hZCB0aGUgbmV4dCBpdGVyYXRvci4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSwgdGhlIHtAbGluayAjZG9uZX0gZmxhZyBpcyBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0TmVpZ2hib3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpIHsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHRQb3NzaWJsZU5laWdoYm9yID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMudmlzaXRlZE5laWdoYm9ycy5jb250YWlucyhuZXh0UG9zc2libGVOZWlnaGJvcikpIHsKLQkJCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0TmVpZ2hib3IgPSBuZXh0UG9zc2libGVOZWlnaGJvcjsKLQkJCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMuYWRkKG5leHRQb3NzaWJsZU5laWdoYm9yKTsKLQkJCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5uZWlnaGJvcnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7ICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpICYmIHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgbmV4dCA9IHRoaXMubmV4dE5laWdoYm9yOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pc3RlclJvZ2Vycy5uZWlnaGJvcnMobmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgR3JhcGhJdGVyYXRvcn0gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiBhIG5vZGUgaW4gdGhlIGdyYXBoLgotCSAqICJUaGVzZSBhcmUgdGhlIHBlb3BsZSBpbiB5b3VyIG5laWdoYm9yaG9vZC4uLiIKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pc3RlclJvZ2VyczxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBuZWlnaGJvcnMoVCBuZXh0KTsKLQkJCi0JCQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlzdGVyUm9nZXJzPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBNci4gUm9nZXJzIHVzZWQgd2hlbiB0aGUge0BsaW5rIEdyYXBoSXRlcmF0b3IjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuLiAqLwotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaXN0ZXJSb2dlcnMgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlzdGVyUm9nZXJzPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIEl0ZXJhdG9yPFM+IG5laWdoYm9ycyhTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIEdyYXBoSXRlcmF0b3IubmVpZ2hib3JzKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnMuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFmNjI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIGFsbG93cyBhIHtAbGluayAjcGVlaygpfSBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgcGVla2FibGUgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIHByZS1sb2FkZWQgZm9yIHRoZSB7QGxpbmsgI3BlZWsoKX0gbWV0aG9kLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgcGVla2FibGUgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICoge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUGVla2FibGVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUuCi0JICovCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcGVla2FibGUgaXRlcmF0b3IgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHJldHVybmVkIGJ5IHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0JICoge0BsaW5rICNuZXh0KCl9IG1ldGhvZCwgd2l0aG91dCBhZHZhbmNpbmcgcGFzdCBpdC4KLQkgKi8KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHQ7Ci0JfQotCi0JLyoqCi0JICogQmVjYXVzZSB3ZSBuZWVkIHRvIHByZS1sb2FkIHRoZSBuZXh0IGVsZW1lbnQKLQkgKiB0byBiZSByZXR1cm5lZCwgd2UgY2Fubm90IHN1cHBvcnQgdGhlIHtAbGluayAjcmVtb3ZlKCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCB7QGxpbmsgI25leHR9IGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGFuZCB7QGxpbmsgI2RvbmV9IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHQoKSB7Ci0JCWlmICh0aGlzLml0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm5leHQgPSBudWxsOwotCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1F1ZXVlSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9RdWV1ZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTQ2MjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1F1ZXVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5RdWV1ZUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYSB7QGxpbmsgUXVldWV9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHF1ZXVlJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgUXVldWUjZGVxdWV1ZSgpIGRlcXVldWV9ZCIgYXMgdGhlIGl0ZXJhdG9yIHJldHVybnMgdGhlbSB3aXRoCi0gKiBjYWxscyB0byB7QGxpbmsgI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUXVldWUKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5RdWV1ZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgUXVldWU8RT4gcXVldWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBxdWV1ZS4KLQkgKi8KLQlwdWJsaWMgUXVldWVJdGVyYXRvcihRdWV1ZTxFPiBxdWV1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5xdWV1ZS5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMucXVldWUuZGVxdWV1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5xdWV1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjU3ODg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgbGlzdAotICogb2Yge0BsaW5rIExpc3RJdGVyYXRvcn1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmF0b3J9LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmF0b3IgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSBsaXN0IGl0ZXJhdG9yIHdoZW4gaXQKLSAqIGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZSBuZXN0ZWQgaXRlcmF0b3JzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXh0SXRlcmF0b3I7Ci0JcHJpdmF0ZSBpbnQgbmV4dEluZGV4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgTGlzdDw/IGV4dGVuZHMgRT4+IGxpc3RzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdDw/IGV4dGVuZHMgRT4sIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGxpc3RzLmxpc3RJdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gdHJhbnNmb3JtKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJCQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+LCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PihsaXN0SXRlcmFibGVzLml0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJCQkJcmV0dXJuIGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZgotCSAqIGxpc3QgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9ycyA9IGl0ZXJhdG9yczsKLQkJdGhpcy5uZXh0SW5kZXggPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKG9iamVjdCwgbGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKG9iamVjdCwgbGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhdG9yLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+Li4uIGxpc3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChsaXN0cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBsaXN0SXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGxpc3RJdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGl0ZXJhdG9ycykpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLm5leHQoKTsKLQkKLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIGluY3JlbWVudCAnbmV4dEluZGV4JwotCQl0aGlzLm5leHRJbmRleCsrOwotCQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5wcmV2aW91cygpOwotCQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gZGVjcmVtZW50ICduZXh0SW5kZXgnCi0JCXRoaXMubmV4dEluZGV4LS07Ci0JCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggIC0gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCS8vIHRoZSBsaXN0IGl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjbmV4dEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayAjaGFzTmV4dCgpfQotCSAqIG9yIHRoZSBmaW5hbCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZE5leHRJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKSkgJiYgdGhpcy5pdGVyYXRvcnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvYWQge0BsaW5rICNuZXh0SXRlcmF0b3J9IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQge0BsaW5rICNoYXNQcmV2aW91cygpfQotCSAqIG9yIHRoZSBmaXJzdCBpdGVyYXRvciBpZiBhbGwgdGhlIGVsZW1lbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHJldHJpZXZlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFByZXZpb3VzSXRlcmF0b3IoKSB7Ci0JCXRoaXMuY2hlY2tOZXh0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKCggISB0aGlzLm5leHRJdGVyYXRvci5oYXNQcmV2aW91cygpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNQcmV2aW91cygpKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB7QGxpbmsgI25leHRJdGVyYXRvcn0gaXMgbnVsbCwgbG9hZCBpdCB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0SXRlcmF0b3IoKSB7Ci0JCWlmICh0aGlzLm5leHRJdGVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5leHRJdGVyYXRvciA9IHRoaXMuaXRlcmF0b3JzLm5leHQoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjczZDNkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0KLSAqIGFuZCByZW1vdmVzIHN1cHBvcnQgZm9yIHtAbGluayAjcmVtb3ZlKCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXRoaXMoYy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBkaXNhbGxvdyByZW1vdmVzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzA5MTMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gYW5kIHJlbW92ZXMgc3VwcG9ydCBmb3I6PHVsPgotICogPGxpPntAbGluayAjcmVtb3ZlKCl9Ci0gKiAJPGxpPntAbGluayAjc2V0KE9iamVjdCl9Ci0gKiAJPGxpPntAbGluayAjYWRkKE9iamVjdCl9Ci0gKiA8L3VsPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3I7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBsaXN0IHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcywgc2V0cywgYW5kIGFkZHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvciB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMsIHNldHMsIGFuZCBhZGRzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIG8pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1Jlc3VsdFNldEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjZjhjOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5SZXN1bHRTZXRJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW4gU1FMIHtAbGluayBSZXN1bHRTZXR9Ci0gKiBhbmQgdHJhbnNmb3JtcyBpdHMgcm93cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZQotICoge0BsaW5rICNidWlsZE5leHQoUmVzdWx0U2V0KX0gdG8gYnVpbGQgdGhlIGV4cGVjdGVkIG9iamVjdCBmcm9tCi0gKiB0aGUgY3VycmVudCByb3cgb2YgdGhlIHJlc3VsdCBzZXQuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gYSB7QGxpbmsgUmVzdWx0U2V0fQotICogPGxpPiBhbiB7QGxpbmsgQWRhcHRlcn0gdGhhdCBjb252ZXJ0cyBhIHJvdyBpbiB0aGUge0BsaW5rIFJlc3VsdFNldH0KLSAqIGludG8gdGhlIGRlc2lyZWQgb2JqZWN0Ci0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+UmVzdWx0U2V0SXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjYnVpbGROZXh0KFJlc3VsdFNldCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgamF2YS5zcWwuUmVzdWx0U2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXN1bHRTZXRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFJlc3VsdFNldCByZXN1bHRTZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBBZGFwdGVyPEU+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBFIG5leHQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIG9iamVjdHMgcHJvZHVjZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXRJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0LCBBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXN1bHRTZXQgPSByZXN1bHRTZXQ7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCQl0aGlzLm5leHQgPSB0aGlzLmJ1aWxkTmV4dCgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIHJlc3VsdCBzZXQgdGhhdCByZXR1cm5zCi0JICogdGhlIGZpcnN0IG9iamVjdCBpbiBlYWNoIHJvdyBvZiB0aGUgcmVzdWx0IHNldC4KLQkgKi8KLQlwdWJsaWMgUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgewotCQl0aGlzKHJlc3VsdFNldCwgQWRhcHRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBuZXh0IG9iamVjdCBmb3IgdGhlIGl0ZXJhdG9yIHRvIHJldHVybi4KLQkgKiBDbG9zZSB0aGUgcmVzdWx0IHNldCB3aGVuIHdlIHJlYWNoIHRoZSBlbmQuCi0JICovCi0JcHJpdmF0ZSBFIGJ1aWxkTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCWlmICh0aGlzLnJlc3VsdFNldC5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5leHQodGhpcy5yZXN1bHRTZXQpOwotCQkJfQotCQkJdGhpcy5yZXN1bHRTZXQuY2xvc2UoKTsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoU1FMRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb3cKLQkgKiBvZiB0aGUgcmVzdWx0IHNldC4gQW55IHtAbGluayBTUUxFeGNlcHRpb259cyB3aWxsCi0JICogYmUgY2F1Z2h0IGFuZCB3cmFwcGVkIGluIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259LgotCSAqLwotCXByb3RlY3RlZCBFIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmJ1aWxkTmV4dChycyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSB0ZW1wID0gdGhpcy5uZXh0OwotCQl0aGlzLm5leHQgPSB0aGlzLmJ1aWxkTmV4dCgpOwotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucmVzdWx0U2V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZWQgYnkge0BsaW5rIFJlc3VsdFNldEl0ZXJhdG9yfSB0byBjb252ZXJ0IGEKLQkgKiB7QGxpbmsgUmVzdWx0U2V0fSdzIGN1cnJlbnQgcm93IGludG8gdGhlIG5leHQgb2JqZWN0Ci0JICogdG8gYmUgcmV0dXJuZWQgYnkgdGhlIHtAbGluayBJdGVyYXRvcn0uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyPFQ+IHsKLQotCQkvKioKLQkJICogUmV0dXJuIGFuIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXN1bHQgc2V0J3MKLQkJICogImN1cnJlbnQiIHJvdy4gQW55IHtAbGluayBTUUxFeGNlcHRpb259cyB3aWxsCi0JCSAqIGJlIGNhdWdodCBhbmQgd3JhcHBlZCBpbiBhIHtAbGluayBSdW50aW1lRXhjZXB0aW9ufS4KLQkJICogQHNlZSBqYXZhLnNxbC5SZXN1bHRTZXQKLQkJICovCi0JCVQgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbjsKLQotCi0JCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4gaW1wbGVtZW50cyBBZGFwdGVyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBBZGFwdGVyPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gcmV0dXJuIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIGN1cnJlbnQgcm93IG9mIHRoZSByZXN1bHQgc2V0Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBTIGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJCS8vIHJlc3VsdCBzZXQgY29sdW1ucyBhcmUgaW5kZXhlZCBzdGFydGluZyB3aXRoIDEKLQkJCQlyZXR1cm4gKFMpIHJzLmdldE9iamVjdCgxKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXIuRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JldmVyc2VJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JldmVyc2VJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhiZmI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXZlcnNlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UmV2ZXJzZUl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyIHtAbGluayBJdGVyYXRvcn0gYW5kIHJldHVybnMKLSAqIGl0cyBlbGVtZW50cyBpbiB0aGUgcmV2ZXJzZSBvcmRlciBpbiB3aGljaCB0aGUgd3JhcHBlZCB7QGxpbmsgSXRlcmF0b3J9Ci0gKiByZXR1cm5zIHRoZSBlbGVtZW50cy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQkvKioKLQkgKiBUaGUgZWxlbWVudHMgaW4gdGhpcyBpdGVyYXRvciBhcmUgYWxyZWFkeSByZXZlcnNlZC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJdGhpcyhDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmF0b3I8RT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXRoaXMoQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KGl0ZXJhdG9yLCBzaXplKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmV2ZXJzZSBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmV2ZXJzZUl0ZXJhdG9yKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmV2ZXJzZSBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUmV2ZXJzZUl0ZXJhdG9yKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQl0aGlzKENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSwgc2l6ZSkpOwotCX0KLQotCXByaXZhdGUgUmV2ZXJzZUl0ZXJhdG9yKEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gcmV2ZXJzZUxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE3NDNkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rICNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayAjaGFzTmV4dCgpfS4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3J9IHJldHVybmVkIGJ5OgotICogCXtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjc2luZ2xldG9uKE9iamVjdCBlbGVtZW50KX08Y29kZT4uaXRlcmF0b3IoKTwvY29kZT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZG9uZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZG9uZSA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjNjZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rICNoYXNOZXh0KCl9LiBMaWtld2lzZSwgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0gKiB0byBhIGNhbGwgdG8ge0BsaW5rICNoYXNQcmV2aW91cygpfSB1bnRpbCBhIGNhbGwgdG8ge0BsaW5rICNuZXh0KCl9LAotICogYXQgd2hpY2ggcG9pbnQgYSBjYWxsIHRvIHtAbGluayAjcHJldmlvdXMoKX0gd2lsbCByZXR1cm4gdGhlCi0gKiBzaW5nbGUgZWxlbWVudC4KLSAqIDxwPgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b25MaXN0KE9iamVjdCBlbGVtZW50KX08Y29kZT4ubGlzdEl0ZXJhdG9yKCk8L2NvZGU+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQlwcml2YXRlIGJvb2xlYW4gaGFzTmV4dDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoRSBlbGVtZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuaGFzTmV4dCA9IHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5oYXNOZXh0KSB7Ci0JCQl0aGlzLmhhc05leHQgPSBmYWxzZTsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnQ7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05leHQ7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05leHQgPyAtMSA6IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbGVtZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3RhY2tJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODEwNmQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpIHBvcH1wZWQiIGFzIHRoZSBpdGVyYXRvciByZXR1cm5zIHRoZW0gd2l0aAotICogY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIFN0YWNrCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3RhY2tJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgU3RhY2tJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFN0YWNrPEU+IHN0YWNrOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3RhY2suCi0JICovCi0JcHVibGljIFN0YWNrSXRlcmF0b3IoU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuc3RhY2suaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLnN0YWNrLnBvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFjayk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmN2IzNDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhbgotICogaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUgd3JhcHBlZAotICogaXRlcmF0b3IgcmV0dXJucyBvbmx5IGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgaXRlcmF0b3IKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1Ykl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEUxPiBpdGVyYXRvcjsKLQotCi0JcHVibGljIFN1Ykl0ZXJhdG9yV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3ViSXRlcmF0b3JXcmFwcGVyKEl0ZXJhdG9yPEUxPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQlyZXR1cm4gKEUyKSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0OTI2My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIEFzc3VtZSB0aGUgd3JhcHBlZAotICogbGlzdCBpdGVyYXRvciByZXR1cm5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgd3JhcHBlZCBsaXN0IGl0ZXJhdG9yCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxFMT4gbGlzdEl0ZXJhdG9yOwotCi0KLQlwdWJsaWMgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhdG9yPEUxPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCXJldHVybiAoRTIpIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRTIgcHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRTIpIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUyIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFMiBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDE5YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LCBjb252ZXJ0aW5nCi0gKiBpdCBpbnRvIGFuIGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEKLSAqIHByb2JsZW0gc2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIGFkZCBpbnZhbGlkIGVsZW1lbnRzIHRvIHRoZSBpdGVyYXRvcidzCi0gKiBiYWNraW5nIGNvbGxlY3Rpb24uIChOb3RlIHRoZSBsYWNrIG9mIGNvbXBpbGVyIHdhcm5pbmdzLCBzdXBwcmVzc2VkIG9yCi0gKiBvdGhlcndpc2UuKQotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVySXRlcmF0b3JXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0KLQlwdWJsaWMgU3VwZXJJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVySXRlcmF0b3JXcmFwcGVyKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjc3M2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgPGNvZGU+RTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50byBhCi0gKiBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoaXMgc2hvdWxkbid0IGJlIGEgcHJvYmxlbSBzaW5jZSB0aGUKLSAqIHJlc3VsdGluZyBsaXN0IGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMKLSAqIGluIHRoZSBpdGVyYXRvcidzIGJhY2tpbmcgbGlzdCAoaS5lLiB7QGxpbmsgI3NldChPYmplY3QpfSBhbmQge0BsaW5rICNhZGQoT2JqZWN0KX0pLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmF0b3I7Ci0KLQotCXB1YmxpYyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUpIHsKLQkJdGhpcyhsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZWY3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIGFuZCBzeW5jaHJvbml6ZSBhbGwgaXRzIG1ldGhvZHMgc28gaXQgY2FuIGJlIHNhZmVseSBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIHRocmVhZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTYzODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3IgYW5kIHN5bmNocm9uaXplIGFsbCBpdHMgbWV0aG9kcyBzbyBpdCBjYW4gYmUgc2FmZWx5IHNoYXJlZAotICogYW1vbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUsIE9iamVjdCBtdXRleCkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgbmV4dEluZGV4KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRSBwcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoRSBlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZhYTQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJlc3VsdHMgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gVG8gdXNlLCBzdXBwbHkgYSAKLSAqIHtAbGluayBUcmFuc2Zvcm1lcn0gb3Igc3ViY2xhc3MgPGNvZGU+VHJhbnNmb3JtYXRpb25JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBpdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBpdGVyYXRvcikgewotCQl0aGlzKGl0ZXJhdG9yLCBUcmFuc2Zvcm1lci5EaXNhYmxlZC48RTEsIEUyPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3IsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuaXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oRTEgbmV4dCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ1NWNkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYXRvcn0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByZXN1bHRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhlIG1ldGhvZHMge0BsaW5rICNzZXQoT2JqZWN0KX0gYW5kIHtAbGluayAjYWRkKE9iamVjdCl9Ci0gKiBhcmUgbGVmdCB1bnN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdAotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBsaXN0SXRlcmF0b3IpIHsKLQkJdGhpcyhsaXN0SXRlcmF0b3IsIFRyYW5zZm9ybWVyLkRpc2FibGVkLjxFMSwgRTI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0Ci0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYXRvciwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5saXN0SXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUyIHByZXZpb3VzKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oRTEgbmV4dCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTAzYWY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogdHJlZSBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gKiBub2RlIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvciBnZXR0aW5nIGFsbCB0aGUKLSAqIGRlc2NlbmRhbnRzIChjaGlsZHJlbiwgZ3JhbmRjaGlsZHJlbiwgZXRjLikgb2YgdGhlIGdpdmVuIG5vZGUuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHRyZWUgb3IsIGlmIHRoZSB0cmVlIGhhcwotICogbXVsdGlwbGUgcm9vdHMsIGFuIHtAbGluayBJdGVyYXRvcn0gb3ZlciB0aGUgc2V0IG9mIHJvb3RzCi0gKiA8bGk+IGEge0BsaW5rIE1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuCi0gKiBvZiBlYWNoIGNoaWxkCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmVlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBNaWR3aWZlPEU+IG1pZHdpZmU7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlkd2lmZS5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pZHdpZmUuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFIHJvb3QsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEVbXSByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gcm9vdHM7Ci0JCS8vIHVzZSBhIExpbmtlZExpc3Qgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIG9mZiB0aGUgZnJvbnQgYW5kIGFkZGluZyB0byB0aGUgZW5kCi0JCXRoaXMuaXRlcmF0b3JzID0gbmV3IExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PigpOwotCQl0aGlzLm1pZHdpZmUgPSBtaWR3aWZlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yIDogdGhpcy5pdGVyYXRvcnMpIHsKLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJbnRlcm5hbCgpOwotCX0KLQotCS8qKgotCSAqIEZldGNoIHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV4dCBub2RlIGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBFIG5leHRJbnRlcm5hbCgpIHsKLQkJRSBuZXh0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5jaGlsZHJlbihuZXh0KSk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pZHdpZmUuY2hpbGRyZW4obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgVHJlZUl0ZXJhdG9yfSB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaWR3aWZlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIG1pZHdpZmUgdXNlZCB3aGVuIHRoZSB7QGxpbmsgVHJlZUl0ZXJhdG9yI2NoaWxkcmVuKE9iamVjdCl9Ci0JCSAqIG1ldGhvZCBpcyBvdmVycmlkZGVuLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBNaWR3aWZlPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pZHdpZmUgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIFRyZWVJdGVyYXRvci5jaGlsZHJlbihPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODBiZWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFJlYXNvbmFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbH0gcHJvdG9jb2wKLSAqIHdpdGggbnVtZXJvdXMgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqIAotICogQHNlZSBDaGFuZ2VTdXBwb3J0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBNb2RlbAotewotCS8qKgotCSAqIERlbGVnYXRlIHN0YXRlL3Byb3BlcnR5L2NvbGxlY3Rpb24vbGlzdC90cmVlIGNoYW5nZSBzdXBwb3J0IHRvIHRoaXMKLQkgKiBoZWxwZXIgb2JqZWN0LiBUaGUgY2hhbmdlIHN1cHBvcnQgb2JqZWN0IGlzIDxlbT5sYXppbHktaW5pdGlhbGl6ZWQ8L2VtPjsKLQkgKiBzbyBpdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBtZXRob2Qge0BsaW5rICNnZXRDaGFuZ2VTdXBwb3J0KCl9Ci0JICogd2lsbCBpbml0aWFsaXplIHRoaXMgZmllbGQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2UgaW5zdGFudGlhdGUgdGhpcyB3aGVuIHdlIGZpcmUgZXZlbnRzLCBldmVuIHdoZW4KLQkgKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzICh3aGljaCBpcyBiZSBpbXBsaWVkIGlmIHRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4pLgotCSAqIFRoaXMgYWxsb3dzIHRoZSBjaGFuZ2Ugc3VwcG9ydCB0byBoYXZlIGJlaGF2aW9yIHRpZWQgdG8gZXZlbnRzIGV2ZW4gd2hlbgotCSAqIHdlIGhhdmUgbm8gbGlzdGVuZXJzLgotCSAqIAotCSAqIEBzZWUgQXNwZWN0Q2hhbmdlU3VwcG9ydCNhc3BlY3RDaGFuZ2VkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWNjZXNzb3Igd2lsbCBidWlsZCB0aGUgY2hhbmdlIHN1cHBvcnQgd2hlbiByZXF1aXJlZC4KLQkgKiBUaGlzIG9ubHkgaGVscHMgcmVkdWNlIHRoZSBmb290cHJpbnQgb2YgYSBtb2RlbCB0aGF0IG5laXRoZXIgaGFzIGFueQotCSAqIGxpc3RlbmVycyBhZGRlZCB0byBpdCBub3IgZXZlciBjaGFuZ2VzIChmaXJlcyBhbnkgZXZlbnRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJaWYgKHRoaXMuY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSB0aGlzLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoYW5nZVN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byB0d2VhayB0aGUgY2hhbmdlIHN1cHBvcnQgdXNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2hhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsaWVkIDxjb2RlPm51bGw8L2NvZGU+ICJvbGQiIHZhbHVlLgotCSAqIEBzZWUgI2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbUFkZGVkKFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcsIENvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9Db2xsZWN0aW9uKGl0ZW0sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oT2JqZWN0W10sIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbiwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oaXRlbSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJDb2xsZWN0aW9uKENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmFibGUsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhYmxlPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmF0b3IsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgaW50LCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtQWRkZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nLCBpbnQsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcsIGludCwgTGlzdCwgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IG5ld0l0ZW1zLCBMaXN0PEU+IHJlcGxhY2VkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlcGxhY2VkKFN0cmluZywgaW50LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNNb3ZlZChTdHJpbmcsIGludCwgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxFPiBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtTW92ZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUxpc3RDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtVG9MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvTGlzdChPYmplY3QsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoaW50LCBPYmplY3RbXSwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KGludCwgSXRlcmF0b3IsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbiwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tTGlzdChpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21MaXN0KE9iamVjdCBpdGVtLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbUZyb21MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlUmFuZ2VGcm9tTGlzdChpbnQsIGludCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVSYW5nZUZyb21MaXN0KGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVSYW5nZUZyb21MaXN0KGJlZ2luSW5kZXgsIGVuZEluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KGludCwgaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb248Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzZXRJdGVtSW5MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBFIHNldEl0ZW1Jbkxpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtSW5MaXN0KGluZGV4LCBpdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlcGxhY2VJdGVtSW5MaXN0KE9iamVjdCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBpbnQgcmVwbGFjZUl0ZW1Jbkxpc3QoRSBvbGRJdGVtLCBFIG5ld0l0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXBsYWNlSXRlbUluTGlzdChvbGRJdGVtLCBuZXdJdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3NldEl0ZW1zSW5MaXN0KGludCwgT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc2V0SXRlbXNJbkxpc3QoaW50LCBMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1zSW5MaXN0KGludCwgaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1zSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5tb3ZlSXRlbXNJbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1Jbkxpc3QoaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1Jbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNtb3ZlSXRlbUluTGlzdChpbnQsIE9iamVjdCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJMaXN0KExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckxpc3QoTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChMaXN0PD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc3luY2hyb25pemVMaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnN5bmNocm9uaXplTGlzdChuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChJdGVyYXRvciwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyB0cmVlIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVBZGRlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVOb2RlUmVtb3ZlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVRyZWVDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlVHJlZUNoYW5nZWQoU3RyaW5nLCBDb2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiA8ZW0+RG8gbm90PC9lbT4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmlyZSBhIGNoYW5nZSBub3RpZmljYXRpb24sCi0JICoge0BsaW5rIENoYW5nZVN1cHBvcnR9IGFscmVhZHkgZG9lcyB0aGF0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVFcXVhbChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxlbT5EbyBub3Q8L2VtPiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiwKLQkgKiB7QGxpbmsgQ2hhbmdlU3VwcG9ydH0gYWxyZWFkeSBkb2VzIHRoYXQuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFmdGVyIGZpcmluZyB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhpcyBtZXRob2QKLQkgKiB0byBkZWNpZGUgaWYgc29tZSBvdGhlciwgcmVsYXRlZCwgcGllY2Ugb2Ygc3RhdGUgbmVlZHMgdG8gYmUgc3luY2hyb25pemVkCi0JICogd2l0aCB0aGUgc3RhdGUgdGhhdCBqdXN0IGNoYW5nZWQuCi0JICogCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3ZhbHVlc0FyZURpZmZlcmVudChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsdGhvdWdoIGNsb25pbmcgbW9kZWxzIGlzIHVzdWFsbHkgbm90IGEgR29vZCBJZGVhLAotCSAqIHdlIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGl0IHByb3Blcmx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2RlbCBjbG9uZSA9IChBYnN0cmFjdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQljbG9uZS5jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIGUuZy4gPGNvZGU+IkNsYXNzTmFtZVswMC1GMy1FRS00Ml0oYWRkJ2wgaW5mbykiPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHVibGljIHNvIG9uZSBtb2RlbCBjYW4gY2FsbCBhIG5lc3RlZCBhYnN0cmFjdCBtb2RlbCdzCi0JICogPGNvZGU+I3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nQnVpbGRlciBzYikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGhlbHBmdWwKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9Bc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9Bc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OGY0NDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQXNwZWN0Q2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyB3aWxsIG5vdGlmeSBsaXN0ZW5lcnMgd2hlbmV2ZXIgb25lIG9mIHRoZSBzb3VyY2UncwotICogYXNwZWN0cyBoYXMgY2hhbmdlZC4gT25seSB0aGUgYXNwZWN0IG5hbWUgaXMgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lcjsgbm8KLSAqIGV2ZW50IGlzIGdlbmVyYXRlZC4gVGhpcyBhbGxvd3MgdGhlIGxpc3RlbmVycyB0byBkZWxlZ2F0ZSB0byB0aGUgY2hhbmdlCi0gKiBzdXBwb3J0IG9iamVjdCB2ZXJpZmljYXRpb24gdGhhdCBhbiBhc3BlY3QgYXMgYWN0dWFsbHkgY2hhbmdlZC4gVGhpcyBpcwotICogdXNlZnVsIGZvciBzaW1wbGUgdGhpbmdzIGxpa2Ugc2V0dGluZyBkaXJ0eSBmbGFncywgYmxhbmtldCB2YWxpZGF0aW9uLCBhbmQKLSAqIGJsYW5rZXQgc3ljaHJvbml6YXRpb247IGkuZS4gdGhpbmdzIHRoYXQgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbiB0aGUgPGVtPm5hbWU8L2VtPgotICogb2YgdGhlIGFzcGVjdCB0aGF0IGNoYW5nZWQgYnV0IG5vdCBzbyBtdWNoIDxlbT5ob3c8L2VtPiB0aGUgYXNwZWN0IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3BlY3RDaGFuZ2VTdXBwb3J0Ci0JZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0ZW5lcj4gTElTVEVORVJfQ0xBU1MgPSBMaXN0ZW5lci5jbGFzczsKLQotCi0JcHVibGljIEFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlLCBMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzKHNvdXJjZSk7Ci0JCXRoaXMuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBBc3BlY3RDaGFuZ2VTdXBwb3J0KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJSXRlcmFibGU8TGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWxpc3RlbmVyLmFzcGVjdENoYW5nZWQoYXNwZWN0TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKExJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihMSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8TGlzdGVuZXI+IGdldExpc3RlbmVycygpIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdCgpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGdldExpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KExJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW50ZXJmYWNlICoqKioqKioqKioKLQotCS8qKgotCSAqIExpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCBvZiBhbnkgYXNwZWN0IGNoYW5nZXMuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JCS8qKgotCQkgKiBUaGUgc3BlY2lmaWVkIGFzcGVjdCBjaGFuZ2VkLgotCQkgKi8KLQkJdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKTsKLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbVJlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8obGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8obGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IHJlcGxhY2VkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtUmVwbGFjZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQlzdXBlci5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc01vdmVkXyhsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQlzdXBlci5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQlzdXBlci5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQlzdXBlci5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUpIHsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKHRyZWVOYW1lKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHRyZWVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0JCXN1cGVyLmZpcmVUcmVlQ2hhbmdlZCh0cmVlTmFtZSwgbm9kZXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRiOTUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFN1cHBvcnQgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYnkgaW1wbGVtZW50b3JzIG9mIHRoZSB7QGxpbmsgTW9kZWx9IGludGVyZmFjZS4KLSAqIEl0IHByb3ZpZGVzIGZvciBzdGF0ZSwgcHJvcGVydHksIGNvbGxlY3Rpb24sIGxpc3QsIGFuZCB0cmVlIGNoYW5nZSBub3RpZmljYXRpb25zIHRvCi0gKiBsaXN0ZW5lcnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkIxOjwvc3Ryb25nPiBUaGVyZSBpcyBsb3RzIG9mIGNvcHktbi1wYXN0ZSBjb2RlIGluIHRoaXMgY2xhc3MuIE5lYXJseSBhbGwgb2YgdGhpcyBkdXBsaWNhdGlvbgotICogaXMgYW4gZWZmb3J0IHRvIHByZXZlbnQgdGhlIHVubmVjZXNzYXJ5IGNyZWF0aW9uIG9mIG5ldyBvYmplY3RzICh0eXBpY2FsbHkgZXZlbnQKLSAqIG9iamVjdHMpLiBTaW5jZSBtYW55IGV2ZW50cyBhcmUgZmlyZWQgd2hlbiB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzLCB3ZSBwb3N0cG9uZQotICogdGhlIGNyZWF0aW9uIG9mIGV2ZW50IG9iamVjdHMgdW50aWwgd2Uga25vdyB3ZSBoYXZlIGludGVyZXN0ZWQgbGlzdGVuZXJzLgotICogTW9zdCBtZXRob2RzIGhhdmUgdGhlICJub24tZHVwbGljYXRlZCIgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGJvZHkgY29tbWVudGVkCi0gKiBvdXQgYXQgdGhlIHRvcCBvZiB0aGUgY3VycmVudCBtZXRob2QgYm9keS4KLSAqIFRoZSBob3BlIHdhcyB0aGF0IHRoaXMgY2xhc3Mgd291bGQgcHJvdmUgdG8gYmUgZmFpcmx5IHN0YXRpYyBhbmQgdGhlIGR1cGxpY2F0ZWQKLSAqIGNvZGUgd291bGQgbm90IHByb3ZlIG9uZXJvdXM7IGJ1dCB0aGF0IGhhcyBub3QgcHJvdmVuIHRvIGJlCi0gKiB0aGUgY2FzZSwgYXMgd2UgaGF2ZSBhZGRlZCBzdXBwb3J0IGZvciAic3RhdGUiIGNoYW5nZXMsICJkaXJ0eSIgbm90aWZpY2F0aW9uLAotICogYW5kIGN1c3RvbSAibm90aWZpZXJzIiwgd2l0aCBtb3JlIHRvIGNvbWUsIEknbSBzdXJlLi4uLiAgfmJqdgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMjo8L3N0cm9uZz4gVGhpcyBjbGFzcyB3aWxsIGNoZWNrIHRvIHNlZSBpZiwgZHVyaW5nIHRoZSBmaXJpbmcgb2YgZXZlbnRzLCBhIGxpc3RlbmVyCi0gKiBvbiB0aGUgb3JpZ2luYWwsIGNsb25lZCwgbGlzdCBvZiBsaXN0ZW5lcnMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYXN0ZXIKLSAqIGxpc3Qgb2YgbGlzdGVuZXJzIDxlbT5iZWZvcmU8L2VtPiBpdCBpcyBub3RpZmllZC4gSWYgdGhlIGxpc3RlbmVyIGhhcyBiZWVuIHJlbW92ZWQKLSAqICJjb25jdXJyZW50bHkiIGl0IHdpbGwgPGVtPm5vdDwvZW0+IGJlIG5vdGlmaWVkLgotICogPHA+Ci0gKiA8c3Ryb25nPk5CMzo8L3N0cm9uZz4gQW55IGxpc3RlbmVyIHRoYXQgaXMgYWRkZWQgZHVyaW5nIHRoZSBmaXJpbmcgb2YgZXZlbnRzIHdpbGwgPGVtPm5vdDwvZW0+IGJlCi0gKiBhbHNvIG5vdGlmaWVkLiBUaGlzIGlzIGEgYml0IGluY29uc2lzdGVudCB3aXRoIE5CMiwgYnV0IHNlZW1zIHJlYXNvbmFibGUKLSAqIHNpbmNlIGFueSBhZGRlZCBsaXN0ZW5lciBzaG91bGQgYWxyZWFkeSBiZSBpbiBzeW5jaCB3aXRoIHRoZSBtb2RlbC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjQ6PC9zdHJvbmc+IFRoaXMgY2xhc3MgaXMgc2VyaWFsaXphYmxlLCBidXQgaXQgd2lsbCBvbmx5IHdyaXRlIG91dCBsaXN0ZW5lcnMgdGhhdAotICogYXJlIGFsc28gc2VyaWFsaXphYmxlIHdoaWxlIHNpbGVudGx5IGxlYXZpbmcgYmVoaW5kIGxpc3RlbmVycyB0aGF0IGFyZSBub3QuCi0gKiAKLSAqIEBzZWUgTW9kZWwKLSAqIEBzZWUgQWJzdHJhY3RNb2RlbAotICovCi1wdWJsaWMgY2xhc3MgQ2hhbmdlU3VwcG9ydAotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgcHJvdmlkZWQgYXMgdGhlICJzb3VyY2UiIGZvciBhbnkgZ2VuZXJhdGVkIGV2ZW50cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgc291cmNlOwotCi0JLyoqIEFzc29jaWF0ZSBhc3BlY3QgbmFtZXMgdG8gY2xhc3Mtc3BlY2lmaWMgbGlzdGVuZXIgbGlzdHMuICovCi0JcHJpdmF0ZSBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPD8+W10gYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMgPSBFTVBUWV9BU1BFQ1RfTElTVEVORVJfTElTVF9QQUlSX0FSUkFZOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPD8+W10gRU1QVFlfQVNQRUNUX0xJU1RFTkVSX0xJU1RfUEFJUl9BUlJBWSA9IG5ldyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyWzBdOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IHN1cHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgc291cmNlIG9mIGNoYW5nZSBldmVudHMuCi0JICogVGhlIHNvdXJjZSBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kCi0JICogY2FycnlpbmcgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBOZWl0aGVyIHRoZSBhc3BlY3QgbmFtZSBub3IgdGhlIGxpc3RlbmVyIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCWlmIChhc3BlY3RMaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMsIG5ldyBTaW1wbGVBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhc3BlY3RMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycywgbmV3IE51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+KGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCBmb3IgYWxsIHRoZQotCSAqIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYW5kIGNhcnJ5aW5nIHRoZSBzcGVjaWZpZWQgYXNwZWN0IG5hbWUuCi0JICogTmVpdGhlciB0aGUgYXNwZWN0IG5hbWUgbm9yIHRoZSBsaXN0ZW5lciBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGFzcGVjdExpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlpZiAoYXNwZWN0TGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVucmVnaXN0ZXJlZCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWFzcGVjdExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOyAgLy8gbGVhdmUgdGhlIHBhaXIsIGV2ZW4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgZW1wdHk/Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciBhbGwgdGhlIGV2ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJaWYgKGxpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bnJlZ2lzdGVyZWQgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsgIC8vIGxlYXZlIHRoZSBwYWlyLCBldmVuIGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIGVtcHR5PwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcyBhbmQgYXNwZWN0IG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBsaXN0ZW5lciBsaXN0IGlzIG5vdCBwcmVzZW50LgotCSAqIFRoZSBhc3BlY3QgbmFtZSBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gTGlzdGVuZXJMaXN0PEw+IGdldExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkvLyBwdXQgaW4gYSBudWxsIGNoZWNrIHRvIHNpbXBsaWZ5IGNhbGxpbmcgY29kZQotCQlpZiAoYXNwZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3RfKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdGVuZXIgbGlzdCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gTGlzdGVuZXJMaXN0PEw+IGdldExpc3RlbmVyTGlzdChDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdF8obGlzdGVuZXJDbGFzcywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0ZW5lciBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzIGFuZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgbm90IHByZXNlbnQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IExpc3RlbmVyTGlzdDxMPiBnZXRMaXN0ZW5lckxpc3RfKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCWZvciAoQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjw/PiBwYWlyIDogdGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycykgewotCQkJaWYgKHBhaXIubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKSkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gKExpc3RlbmVyTGlzdDxMPikgcGFpci5saXN0ZW5lckxpc3Q7Ci0JCQkJcmV0dXJuIGFzcGVjdExpc3RlbmVyTGlzdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcwotCSAqIGFuZCBhc3BlY3QgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCWlmICgoYXNwZWN0TGlzdGVuZXJMaXN0ICE9IG51bGwpICYmICEgYXNwZWN0TGlzdGVuZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaGFzQW55Q2hhbmdlTGlzdGVuZXJzKCk7ICAvLyBjaGVjayBmb3IgYW55IGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lcnMKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzCi0JICogYW5kIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcyk7Ci0JCWlmICgoYXNwZWN0TGlzdGVuZXJMaXN0ICE9IG51bGwpICYmICEgYXNwZWN0TGlzdGVuZXJMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gY2hlY2sgZm9yIGFueSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXJzICh1bmxlc3MgdGhhdCdzIHdoYXQgd2UncmUgYWxyZWFkeSBkb2luZykKLQkJcmV0dXJuIChsaXN0ZW5lckNsYXNzID09IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKSA/IGZhbHNlIDogdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhbCBwdXJwb3NlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgdGhhdCBhZGQgb3RoZXIgdHlwZXMgb2YgbGlzdGVuZXJzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZAotCSAqIHRvIHJldHVybiB0aGUgZXh0ZW5zaW9uIHRvIENoYW5nZUxpc3RlbmVyIHRoYXQgYWxzbyBleHRlbmRzIHdoYXRldmVyIG5ldwotCSAqIGxpc3RlbmVyIHR5cGVzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgQ2hhbmdlTGlzdGVuZXI+IENsYXNzPEw+IGdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSB7Ci0JCS8vIG5vdCBzdXJlIHdoeSBJIG5lZWQgdG8gY2FzdCBoZXJlLi4uCi0JCXJldHVybiAoQ2xhc3M8TD4pIENIQU5HRV9MSVNURU5FUl9DTEFTUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENoYW5nZUxpc3RlbmVyPiBDSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGV2ZW50cywKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBhc3BlY3QgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBldmVudC4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcih0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lci4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcih0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVycyB0aGF0IHdpbGwgYmUKLQkgKiBub3RpZmllZCBvZiBhbnkgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyh0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q2hhbmdlTGlzdGVuZXI+IGdldENoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KENIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gZ2V0Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlMaXN0ZW5lckxpc3Q8Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLCBsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBnZXRTdGF0ZUNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBnZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJTGlzdGVuZXJMaXN0PFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIHRoZSBzcGVjaWZpZWQgc3RhdGUgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1N0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGdlbmVyaWMgc3RhdGUgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIHN0YXRlIGNoYW5nZQotCSAqIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotLy8JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZChuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSkpOwotCQlTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1N0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBTdGF0ZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lckxpc3QocHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgY2hhbmdlIGV2ZW50IHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgc3BlY2lmaWVkIGV2ZW50J3Mgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQoZXZlbnQuZ2V0T2xkVmFsdWUoKSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSkpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQncyBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgdGhlIHNhbWU7Ci0JICogdGhpcyBpbmNsdWRlcyB3aGVuIGJvdGggdmFsdWVzIGFyZSBudWxsLiBVc2UgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQKLQkgKiBmb3IgZ2VuZXJhbCBwdXJwb3NlIG5vdGlmaWNhdGlvbiBvZiBjaGFuZ2VzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpKTsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhbiA8Y29kZT5pbnQ8L2NvZGU+IGJvdW5kIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogTm8gZXZlbnQgaXMgZmlyZWQgaWYgdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGVxdWFsLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIG1lcmVseSBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBtb3JlIGdlbmVyYWwgbWV0aG9kCi0JICoge0BsaW5rICNmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpfS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZXF1YWwuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50LgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbWVyZWx5IGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIG1vcmUgZ2VuZXJhbCBtZXRob2QKLQkgKiB7QGxpbmsgI2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotLy8JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJaWYgKG9sZFZhbHVlICE9IG5ld1ZhbHVlKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhwcm9wZXJ0eU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBnZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBldmVudCBoYXMgYW55IGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgY29udGFpbnMgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYWRkZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcykpOwotCQlpZiAoICEgYWRkZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAnYWRkZWRJdGVtcycgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBhZGRlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25BZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oYWRkZWRJdGVtKSk7Ci0KLQkJQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGV2ZW50IGhhcyBhbnkgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgY29udGFpbnMgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVtb3ZlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpKTsKLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ3JlbW92ZWRJdGVtcycgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24ocmVtb3ZlZEl0ZW0pKTsKLQotCQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKSk7Ci0KLQkJQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLS8vCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbikpOwotCi0JCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNhZGQoT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtVG9Db2xsZWN0aW9uKEUgaXRlbSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uYWRkKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ldyBBcnJheUl0ZXJhdG9yPEU+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gaXRlbXMuaGFzTmV4dCgpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbl8oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlDb2xsZWN0aW9uPEU+IGFkZGVkSXRlbXMgPSBudWxsOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlFIGl0ZW0gPSBpdGVtcy5uZXh0KCk7Ci0JCQlpZiAoY29sbGVjdGlvbi5hZGQoaXRlbSkpIHsKLQkJCQlpZiAoYWRkZWRJdGVtcyA9PSBudWxsKSB7Ci0JCQkJCWFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCQkJfQotCQkJCWFkZGVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZEl0ZW1zICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QgaXRlbSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24ucmVtb3ZlKGl0ZW0pKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgaXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgKCAhIGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKCAhIGl0ZW1zLmlzRW1wdHkoKSkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gaXRlbXMuaGFzTmV4dCgpCi0JCQkJJiYgKCAhIGNvbGxlY3Rpb24uaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbl8oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJSGFzaEJhZzw/PiByZW1vdmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCXJlbW92ZWRJdGVtcy5yZXRhaW5BbGwoY29sbGVjdGlvbik7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHJlbW92ZWRJdGVtcyk7Ci0KLQkJaWYgKCAhIHJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbl8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJSGFzaEJhZzw/PiByZXRhaW5lZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbGxlY3Rpb24pOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKHJldGFpbmVkSXRlbXMpOwotCQlib29sZWFuIGNoYW5nZWQgPSBjb2xsZWN0aW9uLnJldGFpbkFsbChyZXRhaW5lZEl0ZW1zKTsKLQotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZW50aXJlIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb25fKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGNvbGxlY3Rpb24sCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2YgcmVtb3ZlcyBhbmQgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAobmV3Q29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbl8obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihJdGVyYWJsZTxFPiBuZXdDb2xsZWN0aW9uLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbi5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmICggISBuZXdDb2xsZWN0aW9uLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbl8oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uXyhDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uPEU+IHJlbW92ZUl0ZW1zID0gbmV3IEhhc2hCYWc8RT4oY29sbGVjdGlvbik7Ci0JCXJlbW92ZUl0ZW1zLnJlbW92ZUFsbChuZXdDb2xsZWN0aW9uKTsKLQkJY2hhbmdlZCB8PSB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlSXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQotCQlDb2xsZWN0aW9uPEU+IGFkZEl0ZW1zID0gbmV3IEhhc2hCYWc8RT4obmV3Q29sbGVjdGlvbik7Ci0JCWFkZEl0ZW1zLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKLQkJY2hhbmdlZCB8PSB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGFkZEl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlTGlzdGVuZXI+IExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4gVGhlIGxpc3RlbmVyCi0JICogd2lsbCBiZSBub3RpZmllZCBvbmx5IGZvciBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVtb3ZlTGlzdGVuZXIoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8TGlzdENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0Q2hhbmdlTGlzdGVuZXJMaXN0KFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJMaXN0KGxpc3ROYW1lKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgYWRkZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBjb250YWlucyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBhZGRlZEl0ZW1zKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKSk7Ci0JCWlmICggISBhZGRlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8obGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAnYWRkZWRJdGVtcycgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJTGlzdEFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhZGRlZEl0ZW0pKTsKLQotCQlMaXN0QWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVtb3ZlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBjb250YWlucyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZW1vdmVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcykpOwotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ3JlbW92ZWRJdGVtcycgaXMgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUxpc3RSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0vLwkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZW1vdmVkSXRlbSkpOwotCi0JCUxpc3RSZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHJlcGxhY2VkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSAmJiB0aGlzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGV2ZW50LmdldE5ld0l0ZW1zKCksIGV2ZW50LmdldE9sZEl0ZW1zKCkpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBjb250YWlucyBuZXcgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHJlcGxhY2VkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKSk7Ci0JCWlmICgoICEgbmV3SXRlbXMuaXNFbXB0eSgpKSAmJiB0aGlzLmVsZW1lbnRzQXJlRGlmZmVyZW50KG5ld0l0ZW1zLCBvbGRJdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAnbmV3SXRlbXMnIGlzIG5vdCBlbXB0eSBhbmQgdW5lcXVhbCB0byAnb2xkSXRlbXMnCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVwbGFjZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0JCUxpc3RSZXBsYWNlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIG9sZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGl0ZW0gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IG9sZEl0ZW0pIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3SXRlbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2xkSXRlbSkpOwotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobmV3SXRlbSwgb2xkSXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IGl0ZW1zIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbVJlcGxhY2VkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCUxpc3RSZXBsYWNlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IG1vdmVkIGl0ZW1zLgotCSAqLwotCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLgotCS8vIGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRUYXJnZXRJbmRleCgpICE9IGV2ZW50LmdldFNvdXJjZUluZGV4KCkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGluZGljYXRlcyBhIG1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IG1vdmVkIGl0ZW1zLgotCSAqLwotCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLgotCS8vIGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RNb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCkpOwotCQlpZiAodGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBpbmRpY2VzIGluZGljYXRlIGEgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCUxpc3RNb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdE1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IG1vdmVkIGl0ZW1zLgotCSAqLwotCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLgotCS8vIGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJaWYgKHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLmZpcmVJdGVtTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBpbmRpY2F0ZSBhIG1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbU1vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0vLwkJdGhpcy5maXJlTGlzdENsZWFyZWQobmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSkpOwotCi0JCUxpc3RDbGVhckV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDbGVhckV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0vLwkJdGhpcy5maXJlTGlzdENoYW5nZWQobmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUpKTsKLQotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgbGlzdCk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGxpc3QpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50LgotCSAqIEBzZWUgTGlzdCNhZGQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIChpLmUuICd0cnVlJykuCi0JICogQHNlZSBMaXN0I2FkZChPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1Ub0xpc3QoRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5hZGQoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgbGlzdC5zaXplKCkgLSAxLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vIExpc3QjYWRkKE9iamVjdCkgc2hvdWxkIGFsd2F5cyByZXR1cm4gJ3RydWUnLCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKGludCwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8oaW5kZXgsIEFycmF5cy5hc0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKGluZGV4LCB0aGlzLmNvbnZlcnRUb0xpc3QoaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmFkZEFsbChpbmRleCwgaXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoICEgaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlBcnJheUxpc3Q8RT4gYWRkZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZW1zKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGluZGV4LCBhZGRlZEl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8oQXJyYXlzLmFzTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKGludCwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMuYWRkSXRlbXNUb0xpc3RfKHRoaXMuY29udmVydFRvTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8PyBleHRlbmRzIEU+IGNvbnZlcnRUb0xpc3QoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0PD8+KSA/IChMaXN0PD8gZXh0ZW5kcyBFPikgY29sbGVjdGlvbiA6IG5ldyBBcnJheUxpc3Q8RT4oY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3RfKExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpbnQgaW5kZXggPSBsaXN0LnNpemUoKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsgIC8vICAnaXRlbXMnIHNob3VsZCBub3QgYmUgZW1wdHksIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdF8oaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdF8oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlBcnJheUxpc3Q8RT4gYWRkZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZW1zKTsKLQkJaW50IGluZGV4ID0gbGlzdC5zaXplKCk7Ci0JCWlmIChsaXN0LmFkZEFsbChhZGRlZEl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW0uCi0JICogQHNlZSBMaXN0I3JlbW92ZShpbnQpCi0JICovCi0JcHVibGljIDxFPiBFIHJlbW92ZUl0ZW1Gcm9tTGlzdChpbnQgaW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUUgaXRlbSA9IGxpc3QucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtKTsKLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0IGl0ZW0sIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWludCBpbmRleCA9IGxpc3QuaW5kZXhPZihpdGVtKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdChpbnQgaW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZVJhbmdlRnJvbUxpc3QoaW5kZXgsIGxpc3Quc2l6ZSgpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gcmVtb3ZlSXRlbXNGcm9tTGlzdChpbnQgaW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZVJhbmdlRnJvbUxpc3QoaW5kZXgsIGluZGV4ICsgbGVuZ3RoLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LiBUaGUgYmVnaW4gaW5kZXgKLQkgKiBpcyBpbmNsdXNpdmUsIHdoaWxlIHRoZSBlbmQgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIFJldHVybiB0aGUgcmVtb3ZlZCBpdGVtcy4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlKGludCkKLQkgKiBAc2VlIExpc3Qjc3ViTGlzdChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gcmVtb3ZlUmFuZ2VGcm9tTGlzdChpbnQgYmVnaW5JbmRleCwgaW50IGVuZEluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoYmVnaW5JbmRleCA9PSBlbmRJbmRleCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlbW92ZVJhbmdlRnJvbUxpc3RfKGJlZ2luSW5kZXgsIGVuZEluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gcmVtb3ZlUmFuZ2VGcm9tTGlzdF8oaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKLQkJTGlzdDxFPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlzdWJMaXN0LmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChsaXN0TmFtZSwgYmVnaW5JbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiAoICEgbGlzdC5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0XyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb248Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmICggISBsaXN0LmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMuaGFzTmV4dCgpKQotCQkJCSYmICggISBsaXN0LmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdF8oSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQljaGFuZ2VkIHw9IHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGl0ZW1zLm5leHQoKSwgbGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoT2JqZWN0W10gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0XyhsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3RfKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdF8oaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGU8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgaXRlbXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdF8oaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdF8oSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUhhc2hCYWc8Pz4gcmV0YWluZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJSGFzaEJhZzw/PiByZW1vdmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihsaXN0KTsKLQkJcmVtb3ZlZEl0ZW1zLnJlbW92ZUFsbChyZXRhaW5lZEl0ZW1zKTsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChyZW1vdmVkSXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBpdGVtIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtLgotCSAqIEBzZWUgTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBFIHNldEl0ZW1Jbkxpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUUgb2xkSXRlbSA9IGxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSwgb2xkSXRlbSk7Ci0JCXJldHVybiBvbGRJdGVtOwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBpdGVtCi0JICogaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSByZXBsYWNlZCBpdGVtLgotCSAqIFJldHVybiAtMSBpZiB0aGUgaXRlbSB3YXMgbm90IGZvdW5kIGluIHRoZSBsaXN0LgotCSAqIEBzZWUgTGlzdCNzZXQoaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBpbnQgcmVwbGFjZUl0ZW1Jbkxpc3QoRSBvbGRJdGVtLCBFIG5ld0l0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKG9sZEl0ZW0pOwotCQlpZiAoKGluZGV4ICE9IC0xKSAmJiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRJdGVtLCBuZXdJdGVtKSkgewotCQkJbGlzdC5zZXQoaW5kZXgsIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbXMuCi0JICogQHNlZSBMaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChpdGVtcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNldEl0ZW1zSW5MaXN0XyhpbmRleCwgQXJyYXlzLmFzTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgcmVwbGFjZWQgaXRlbXMuCi0JICogQHNlZSBMaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNldEl0ZW1zSW5MaXN0XyhpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdF8oaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJTGlzdDxFPiBzdWJMaXN0ID0gbGlzdC5zdWJMaXN0KGluZGV4LCBpbmRleCArIGl0ZW1zLnNpemUoKSk7Ci0JCUxpc3Q8RT4gb2xkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHN1Ykxpc3QpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQlFIG5ld0l0ZW0gPSBpdGVtcy5nZXQoaSk7Ci0JCQlFIG9sZEl0ZW0gPSBzdWJMaXN0LnNldChpLCBuZXdJdGVtKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXggKyBpLCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCQlyZXR1cm4gb2xkSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBtb3ZlSXRlbXNJbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICgodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHx8IChsZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBpdCdzIHVubGlrZWx5IGJ1dCBwb3NzaWJsZSB0aGUgbGlzdCBpcyB1bmNoYW5nZWQgYnkgdGhlIG1vdmUuLi4gKGUuZy4gYW55IG1vdmVzIHdpdGhpbiBbImZvbyIsICJmb28iLCAiZm9vIl0uLi4pCi0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIGxpc3QuaW5kZXhPZihpdGVtKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYW4gaXRlbSBpbiB0aGUgc3BlY2lmaWVkIGxpc3QgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIG1vdmVJdGVtSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChsaXN0LmdldCh0YXJnZXRJbmRleCksIGxpc3QuZ2V0KHNvdXJjZUluZGV4KSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZW50aXJlIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjbGVhckxpc3QoTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBsaXN0LmlzRW1wdHkoKSkgJiYgdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyTGlzdF8oTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJbGlzdC5jbGVhcigpOwotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuZXcgbGlzdCwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiBzZXRzLCByZW1vdmVzLCBhbmQvb3IgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoTGlzdDxFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAobmV3TGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdF8obmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplTGlzdF8obmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuZXcgbGlzdCwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiBzZXRzLCByZW1vdmVzLCBhbmQvb3IgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmFibGU8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplTGlzdChuZXdMaXN0Lml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGxpc3QsCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2Ygc2V0cywgcmVtb3ZlcywgYW5kL29yIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoICEgbmV3TGlzdC5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdF8obmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplTGlzdF8oQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3TGlzdCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVMaXN0XyhMaXN0PD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IG9sZExpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpbnQgbmV3U2l6ZSA9IG5ld0xpc3Quc2l6ZSgpOwotCQlpbnQgb2xkU2l6ZSA9IG9sZExpc3Quc2l6ZSgpOwotCi0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQkvLyBUT0RPIGNoZWNrIGZvciBSYW5kb21BY2Nlc3MKLQkJaW50IG1pbiA9IE1hdGgubWluKG5ld1NpemUsIG9sZFNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlFIG5ld0l0ZW0gPSBuZXdMaXN0LmdldChpKTsKLQkJCUUgb2xkSXRlbSA9IG9sZExpc3Quc2V0KGksIG5ld0l0ZW0pOwotCQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld0l0ZW0sIG9sZEl0ZW0pKSB7Ci0JCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaSwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobmV3U2l6ZSA9PSBvbGRTaXplKSB7Ci0JCQlyZXR1cm4gY2hhbmdlZDsKLQkJfQotCi0JCWlmIChuZXdTaXplIDwgb2xkU2l6ZSkgewotCQkJdGhpcy5yZW1vdmVSYW5nZUZyb21MaXN0XyhuZXdTaXplLCBvbGRTaXplLCBvbGRMaXN0LCBsaXN0TmFtZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCS8vIG5ld1NpemUgPiBvbGRTaXplCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3RfKG5ld0xpc3Quc3ViTGlzdChvbGRTaXplLCBuZXdTaXplKSwgb2xkTGlzdCwgbGlzdE5hbWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCB0cmVlLiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgdHJlZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHRyZWUgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgdHJlZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxUcmVlQ2hhbmdlTGlzdGVuZXI+IGdldFRyZWVDaGFuZ2VMaXN0ZW5lckxpc3QoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBnZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lckxpc3QodHJlZU5hbWUpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1RyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLS8vCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQkJVHJlZUFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVBZGRFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUFkZEV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotLy8JCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKSk7Ci0KLQkJVHJlZVJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChTdHJpbmcgdHJlZU5hbWUpIHsKLS8vCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKSk7Ci0KLQkJVHJlZUNsZWFyRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNsZWFyRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHRyZWVOYW1lID0gZXZlbnQuZ2V0VHJlZU5hbWUoKTsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0vLwkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKSk7Ci0KLQkJVHJlZUNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8VHJlZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgbm9kZXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gYXR0cmlidXRlIHZhbHVlIGhhcyBjaGFuZ2VkLgotCSAqIEBzZWUgVG9vbHMjdmFsdWVzQXJlRXF1YWwoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodmFsdWUxLCB2YWx1ZTIpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogQHNlZSBUb29scyN2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVzQXJlRGlmZmVyZW50KE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb2xsZWN0aW9uVG9vbHMjZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZSwgSXRlcmFibGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29sbGVjdGlvblRvb2xzI2VsZW1lbnRzQXJlRGlmZmVyZW50KEl0ZXJhYmxlLCBJdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFBhaXIgYSBwb3NzaWJseSA8Y29kZT5udWxsPC9jb2RlPiBhc3BlY3QgbmFtZSB3aXRoIGl0cyBhc3NvY2lhdGVkCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotCXsKLQkJZmluYWwgTGlzdGVuZXJMaXN0PEw+IGxpc3RlbmVyTGlzdDsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TD4obGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lclR5cGUoKSA9PSBsaXN0ZW5lckNsYXNzOwotCQl9Ci0KLQkJYm9vbGVhbiBtYXRjaGVzKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldEFzcGVjdE5hbWUoKSk7Ci0JCX0KLQotCQlhYnN0cmFjdCBTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFBhaXIgYSBub24tPGNvZGU+bnVsbDwvY29kZT4gYXNwZWN0IG5hbWUgd2l0aCBpdHMgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICovCi0Jc3RhdGljIGNsYXNzIFNpbXBsZUFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JCWV4dGVuZHMgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPgotCXsKLQkJZmluYWwgU3RyaW5nIGFzcGVjdE5hbWU7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJU2ltcGxlQXNwZWN0TGlzdGVuZXJMaXN0UGFpcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQkJc3VwZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQkJaWYgKGFzcGVjdE5hbWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5hc3BlY3ROYW1lID0gYXNwZWN0TmFtZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIEBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKSBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuYXNwZWN0TmFtZS5lcXVhbHMoYXNwZWN0TmFtZSkKLQkJCQkJJiYgc3VwZXIubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmFzcGVjdE5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWlyIGEgPGNvZGU+bnVsbDwvY29kZT4gYXNwZWN0IG5hbWUgd2l0aCBpdHMgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICovCi0Jc3RhdGljIGNsYXNzIE51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCQlleHRlbmRzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4KLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCU51bGxBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJCXN1cGVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gKGFzcGVjdE5hbWUgPT0gbnVsbCkKLQkJCQkJJiYgc3VwZXIubWF0Y2hlcyhsaXN0ZW5lckNsYXNzLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlTdHJpbmcgZ2V0QXNwZWN0TmFtZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjEzYTY3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2hhbmdlIHN1cHBvcnQgY2xhc3MgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHN0YW5kYXJkCi0gKiBjaGFuZ2Ugc3VwcG9ydCBpbiBzZXZlcmFsIHdheXM6PHVsPgotICogPGxpPkFsbCBldmVudHMgZmlyZWQgYnkgdGhlIHNvdXJjZSBtdXN0IHNwZWNpZnkgdGhlIHNpbmdsZSBhc3BlY3QuCi0gKiA8bGk+TGlzdGVuZXJzIGFyZSByZXF1aXJlZCB0byBiZSBlaXRoZXIgImdlbmVyYWwgcHVycG9zZSIgbGlzdGVuZXJzIG9yCi0gKiAJICAgIGxpc3RlbmVycyBvZiB0aGUgc2luZ2xlIGFzcGVjdC4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0Ci0JZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3M7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3MsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKCAhIHZhbGlkTGlzdGVuZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNoYW5nZSBzdXBwb3J0J3MgY2hhbmdlIGxpc3RlbmVyIGNsYXNzICgiICsgdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkuZ2V0TmFtZSgpICsgLy8kTk9OLU5MUy0xJAotCQkJCQkiKSBkb2VzIG5vdCBleHRlbmQgdGhlIHZhbGlkIGxpc3RlbmVyIGNsYXNzOiAiICsgdmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcyA9IHZhbGlkTGlzdGVuZXJDbGFzczsKLQkJdGhpcy52YWxpZEFzcGVjdE5hbWUgPSB2YWxpZEFzcGVjdE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYnVpbGRVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBsaXN0ZW5lciB0eXBlIFwiIiArIHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJKyAiXCIgYW5kIHRoZSBhc3BlY3QgXCIiICsgdGhpcy52YWxpZEFzcGVjdE5hbWUgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgY2FuIGJlIGVpdGhlciBhbiBpbnN0YW5jZSBvZiB0aGUgdmFsaWQgbGlzdGVuZXIgY2xhc3Mgb3IKLQkgKiB0aGUgImdlbmVyYWwtcHVycG9zZSIgY2hhbmdlIGxpc3RlbmVyIGNsYXNzICh3aGljaCBzaG91bGQgZXh0ZW5kIHRoZQotCSAqIHRoZSB2YWxpZCBsaXN0ZW5lciBjbGFzcykuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCWlmICgobGlzdGVuZXJDbGFzcyAhPSB0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKSkgJiYgKGxpc3RlbmVyQ2xhc3MgIT0gdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBsaXN0ZW5lciB0eXBlIFwiIiArIHRoaXMudmFsaWRMaXN0ZW5lckNsYXNzLmdldE5hbWUoKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlwiIDogXCIiICsgbGlzdGVuZXJDbGFzcy5nZXROYW1lKCkgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2soQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCWlmICggISBhc3BlY3ROYW1lLmVxdWFscyh0aGlzLnZhbGlkQXNwZWN0TmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGlzIE1vZGVsIHN1cHBvcnRzIG9ubHkgY2hhbmdlcyBmb3IgdGhlIGFzcGVjdCBcIiIgKyB0aGlzLnZhbGlkQXNwZWN0TmFtZSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlwiIDogXCIiICsgYXNwZWN0TmFtZSArICciJyAvLyROT04tTkxTLTEkCi0JCQkJKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBMIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXN1cGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcyk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY2hlY2soUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCByZXBsYWNlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lLCBMaXN0PD8+IGxpc3QpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZVRyZWVDbGVhcmVkKHRyZWVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCQlzdXBlci5maXJlVHJlZUNoYW5nZWQodHJlZU5hbWUsIG5vZGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxNmVhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCi0JcHVibGljIEFXVENoYW5nZUxpc3RlbmVyV3JhcHBlcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVwbGFjZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDbGVhcmVkUnVubmFibGUoZmluYWwgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSBhZGRlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShmaW5hbCBUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZF8oU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2xlYXJlZF8oTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBsaXN0Q2hhbmdlZF8oTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZUFkZGVkXyhUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YWY1MmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DaGFuZ2VkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgaXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBpdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZF8oQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZF8oQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ3N2Y0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBsaXN0IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDZiZDhiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0KLQlwdWJsaWMgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWNmMmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnN0YXRlQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYwNDY5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYWFkODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIGZvciAibGF6aWx5IiBhZGRpbmcgbGlzdGVuZXJzCi0gKiB0byBhbiB1bmRlcmx5aW5nIG1vZGVsIGFzIG5lY2Vzc2FyeS4gU3ViY2xhc3NlcyB3aWxsIG5lZWQgdG8gZW5nYWdlIGFuZAotICogZGlzZWdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGNvbGxlY3Rpb24gY2hhbmdlCi0gKiBldmVudHMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0uCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZU1vZGVsKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZU1vZGVsKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGNvbGxlY3Rpb25OYW1lLmVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcik7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZS5lcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEVuZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbCgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTgyYTUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBmb3IgImxhemlseSIgYWRkaW5nIGxpc3RlbmVycwotICogdG8gYW4gdW5kZXJseWluZyBtb2RlbCBhcyBuZWNlc3NhcnkuIFN1YmNsYXNzZXMgd2lsbCBuZWVkIHRvIGVuZ2FnZSBhbmQKLSAqIGRpc2VnYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBsaXN0IGNoYW5nZQotICogZXZlbnRzLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAobGlzdE5hbWUuZXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgY29sbGVjdGlvbiB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2MjQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgcHJvcGVydHkgY2hhbmdlCi0gKiBldmVudHMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IHZhbHVlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIGFueSBwcm9wZXJ0eSB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlTW9kZWwoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZGRlMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2VuZ2FnZU1vZGVsXygpfTxwPgotICogICAgIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgYWRhcHRlZCBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWxfKCl9PHA+Ci0gKiAgICAgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFkYXB0ZWQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjcHJvcGVydHlDaGFuZ2VkKCl9IHdoZW5ldmVyIHRoZSBjYWxjdWxhdGVkCi0gKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY2hhbmdlcyAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgc3ViY2xhc3MpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgdmFsdWUgc28gd2UgY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbgotCSAqIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCB3ZSBtYXkKLQkgKiBub3QgYWJsZSB0byBkZXJpdmUgdGhlICJvbGQgdmFsdWUiIGZyb20gYW55IGZpcmVkIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgViB2YWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2FjaGVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCBhbmQgYnVpbGQgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmVuZ2FnZU1vZGVsXygpOwotCQkvLyBzeW5jaCBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLAotCQkvLyBzaW5jZSB0aGUgbW9kZWwncyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsXygpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotCSAqIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgYnVpbGRWYWx1ZSgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsIGFuZCBjbGVhciB0aGUgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlTW9kZWxfKCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbW9kZWwKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpOwotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgY2hhbmdlZCBpbiBzb21lIGZhc2hpb24uCi0JICogUmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBub3RpZnkgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoKSB7Ci0JCU9iamVjdCBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc2NzZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogU3ViY2xhc3NlcyBuZWVkIG9ubHkgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqIAotICogI3ZhbHVlKCkKLSAqCSAgICByZXR1cm4gdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGUKLSAqIAotICogI3NldFZhbHVlKE9iamVjdCkKLSAqICAgICBzZXQgdGhlIHVzZXItZGV0ZXJtaW5lZCAidmFsdWUiIG9mIHRoZSBub2RlLAotICogICAgIGkuZS4gdGhlIG9iamVjdCAid3JhcHBlZCIgYnkgdGhlIG5vZGU7Ci0gKiAgICAgdHlwaWNhbGx5IG9ubHkgb3ZlcnJpZGRlbiBmb3Igbm9kZXMgd2l0aCAicHJpbWl0aXZlIiB2YWx1ZXMKLSAqIAotICogI3BhcmVudCgpCi0gKiAgICAgcmV0dXJuIHRoZSBwYXJlbnQgb2YgdGhlIG5vZGUsIHdoaWNoIHNob3VsZCBiZSBhbm90aGVyCi0gKiAgICAgVHJlZU5vZGVWYWx1ZU1vZGVsCi0gKiAKLSAqICNjaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSBMaXN0VmFsdWVNb2RlbCBmb3IgdGhlIG5vZGUncyBjaGlsZHJlbgotICogCi0gKiAjZW5nYWdlVmFsdWUoKSBhbmQgI2Rpc2VuZ2FnZVZhbHVlKCkKLSAqICAgICBvdmVycmlkZSB0aGVzZSBtZXRob2RzIHRvIGxpc3RlbiB0byB0aGUgbm9kZSdzIHZhbHVlIGlmCi0gKiAgICAgaXQgY2FuIGNoYW5nZSBpbiBhIHdheSB0aGF0IHNob3VsZCBiZSByZWZsZWN0ZWQgaW4gdGhlIHRyZWUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCS8vIHRoaXMgbW9kZWwgZmlyZXMgKmJvdGgqICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiIGFuZCAic3RhdGUgY2hhbmdlIiBldmVudHMuLi4KLS8vCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBiZSBhZGRpbmcgYm90aCAic3RhdGUgY2hhbmdlIiBhbmQgInZhbHVlIHByb3BlcnR5IGNoYW5nZSIKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgbm9kZSdzIHZhbHVlJ3Mgc3RhdGUuIElmIHRoZSBzdGF0ZSBvZiB0aGUgbm9kZSBjaGFuZ2VzCi0JICogaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSB0cmVlLCBmaXJlIGEgInN0YXRlIGNoYW5nZSIgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlVmFsdWUoKTsKLQotCS8qKgotCSAqIEBzZWUgI2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUncyB2YWx1ZS4KLQkgKiBAc2VlICNlbmdhZ2VWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlVmFsdWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCgpIHsKLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHBhdGggPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5iYWNrUGF0aCgpKTsKLQkJcmV0dXJuIHBhdGgudG9BcnJheShuZXcgVHJlZU5vZGVWYWx1ZU1vZGVsW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgY2xpbWJzIHVwIHRoZSBub2RlJ3MgcGF0aCwKLQkgKiBzdGFydGluZyB3aXRoLCBhbmQgaW5jbHVkaW5nLCB0aGUgbm9kZQotCSAqIGFuZCB1cCB0bywgYW5kIGluY2x1ZGluZywgdGhlIHJvb3Qgbm9kZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBiYWNrUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4odGhpcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5leHRMaW5rKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5wYXJlbnQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZDaGlsZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQpIHsKLQkJTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5Nb2RlbCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChjaGlsZHJlbi5nZXQoaSkgPT0gY2hpbGQpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNMZWFmKCkgewotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogV2UgaW1wbGVtZW50ICNlcXVhbHMoT2JqZWN0KSBzbyB0aGF0IFRyZWVQYXRocyBjb250YWluaW5nIHRoZXNlIG5vZGVzCi0JICogd2lsbCByZXNvbHZlIHByb3Blcmx5IHdoZW4gdGhlIG5vZGVzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLiBUaGlzIGlzCi0JICogbmVjZXNzYXJ5IGJlY2F1c2Ugbm9kZXMgYXJlIGRyb3BwZWQgYW5kIHJlYnVpbHQgd2lsbHktbmlsbHkgd2hlbiBkZWFsaW5nCi0JICogd2l0aCBhIHNvcnRlZCBsaXN0IG9mIGNoaWxkcmVuOyBhbmQgdGhpcyBhbGxvd3MgdXMgdG8gc2F2ZSBhbmQgcmVzdG9yZQotCSAqIGEgdHJlZSdzIGV4cGFuZGVkIHBhdGhzLiBUaGUgbm9kZXMgaW4gdGhlIGV4cGFuZGVkIHBhdGhzIHRoYXQgYXJlCi0JICogc2F2ZWQgYmVmb3JlIGFueSBtb2RpZmljYXRpb24gKGUuZy4gcmVuYW1pbmcgYSBub2RlKSB3aWxsIGJlIGRpZmZlcmVudAotCSAqIGZyb20gdGhlIG5vZGVzIGluIHRoZSB0cmVlJ3MgcGF0aHMgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiwgaWYgdGhlIG1vZGlmaWNhdGlvbgotCSAqIHJlc3VsdHMgaW4gYSBwb3NzaWJsZSBjaGFuZ2UgaW4gdGhlIG5vZGUgc29ydCBvcmRlci4gIH5ianYKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChvLmdldENsYXNzKCkgIT0gdGhpcy5nZXRDbGFzcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG90aGVyID0gKEFic3RyYWN0VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBvOwotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhvdGhlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMTc5MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBleHRlbnNpb24gb2Yge0BsaW5rIEFic3RyYWN0TW9kZWx9IHByb3ZpZGVzIGEgYmFzZSBmb3IgYWRkaW5nIAotICogY2hhbmdlIGxpc3RlbmVycyAocHJvcGVydHkgY2hhbmdlLCBjb2xsZWN0aW9uIGNoYW5nZSwgbGlzdCBjaGFuZ2UsIHRyZWUgY2hhbmdlKQotICogdG8gYSBzdWJqZWN0IGFuZCBjb252ZXJ0aW5nIHRoZSBzdWJqZWN0J3MgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBhIHNpbmdsZQotICogc2V0IG9mIGNoYW5nZSBub3RpZmljYXRpb25zIGZvciBhIGNvbW1vbiBhc3BlY3QgKGUuZy4gPGNvZGU+VkFMVUU8L2NvZGU+KS4KLSAqIDxwPgotICogVGhlIGFkYXB0ZXIgd2lsbCBvbmx5IGxpc3RlbiB0byB0aGUgc3ViamVjdCAoYW5kIHN1YmplY3QgaG9sZGVyKSB3aGVuIHRoZQotICogYWRhcHRlciBpdHNlbGYgYWN0dWFsbHkgaGFzIGxpc3RlbmVycy4gVGhpcyB3aWxsIGFsbG93IHRoZSBhZGFwdGVyIHRvIGJlCi0gKiBnYXJiYWdlIGNvbGxlY3RlZCB3aGVuIGFwcHJvcHJpYXRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RBZGFwdGVyPFM+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0JLyoqCi0JICogVGhlIHN1YmplY3QgdGhhdCBob2xkcyB0aGUgYXNwZWN0IGFuZCBmaXJlcwotCSAqIGNoYW5nZSBub3RpZmljYXRpb24gd2hlbiB0aGUgYXNwZWN0IGNoYW5nZXMuCi0JICogV2UgbmVlZCB0byBob2xkIG9uIHRvIHRoaXMgZGlyZWN0bHkgc28gd2UgY2FuCi0JICogZGlzZW5nYWdlIGl0IHdoZW4gaXQgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUyBzdWJqZWN0OwotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCB0aGF0IGhvbGRzIHRoZSBzdWJqZWN0Ci0JICogdGhhdCBob2xkcyB0aGUgYXNwZWN0IGFuZCBwcm92aWRlcyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGFzcGVjdCBhZGFwdGVycwotCSAqIHRoYXQgaGF2ZSB0aGUgc2FtZSBzdWJqZWN0IGFuZCB0aGF0IHN1YmplY3QgY2FuIGNoYW5nZS4KLQkgKiBBbGwgdGhlIGFzcGVjdCBhZGFwdGVycyBzaG91bGQgc2hhcmUgdGhlIHNhbWUgc3ViamVjdCBob2xkZXIuCi0JICogRm9yIG5vdywgdGhpcyBpcyBjYW4gb25seSBiZSBzZXQgdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIGlzCi0JICogaW1tdXRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGtlZXBzIHVzIGluIHN5bmNoIHdpdGggdGhlIHN1YmplY3QgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdEFkYXB0ZXIoUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN1YmplY3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gc3ViamVjdEhvbGRlcjsKLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHRoZSBzdWJqZWN0IGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byBpdAotCQkvLyB0aGlzIHdpbGwgdHlwaWNhbGx5IHJlc3VsdCBpbiBvdXIgdmFsdWUgYmVpbmcgbnVsbAotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuZ2V0TGlzdGVuZXJDbGFzcygpLCB0aGlzLmdldExpc3RlbmVyQXNwZWN0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBob2xkZXIncyB2YWx1ZSBoYXMgY2hhbmdlZCwga2VlcCBvdXIgc3ViamVjdCBpbiBzeW5jaC4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuc3ViamVjdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN1YmplY3QgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBoYXMgY2hhbmdlZC4gTm90aWZ5IGxpc3RlbmVycyB0aGF0IHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc3ViamVjdENoYW5nZWQoKSB7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSB0aGlzLmhhc0xpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3QoKTsKLQkJfQotCQl0aGlzLnN1YmplY3QgPSB0aGlzLnN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VTdWJqZWN0KCk7Ci0JCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2VkKG9sZFZhbHVlLCB0aGlzLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3BlY3QncyBjdXJyZW50IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3Mgb2YgbGlzdGVuZXIgdGhhdCBpcyBpbnRlcmVzdGVkIGluIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXNwZWN0IGFkYXB0ZXIncyBhc3BlY3QgKGUuZy4gVkFMVUUpLgotCSAqIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3Mgc2luZ2xlIGFzcGVjdCwgbm90IHRoZQotCSAqIG5hbWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QgdGhlIGFzcGVjdCBhZGFwdGVyIGlzIGFkYXB0aW5nLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIGFzcGVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gYWRkIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJLy8gY2hlY2sgZm9yIG5vdGhpbmcgdG8gbGlzdGVuIHRvCi0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSByZW1vdmUgb3VyIGxpc3RlbmVyLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHN1YmplY3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnN1YmplY3QgPSB0aGlzLnN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBzdWJqZWN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXRzIGhvbGRlcgotCQl0aGlzLnN1YmplY3QgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5lbmdhZ2VTdWJqZWN0SG9sZGVyKCk7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVscygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsb2NhbCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgY2hhbmdlIHN1cHBvcnQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBhc3BlY3QgYWRhcHRlcidzCi0JICogbW9kZWxzICh0aGUgc3ViamVjdCBob2xkZXIgYW5kIHRoZSBzdWJqZWN0IGl0c2VsZikgd2hlbiB0aGUgZmlyc3QKLQkgKiByZWxldmFudCBsaXN0ZW5lciBpcyBhZGRlZC4KLQkgKiBDb252ZXJzZWx5LCBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncyBtb2RlbHMgd2hlbiB0aGUKLQkgKiBsYXN0IHJlbGV2YW50IGxpc3RlbmVyIGlzIHJlbW92ZWQuCi0JICogQSByZWxldmFudCBsaXN0ZW5lciBpcyBhIGxpc3RlbmVyIG9mIHRoZSByZWxldmFudCB0eXBlIGFuZCBhc3BlY3Qgb3IgYQotCSAqIGdlbmVyYWwtcHVycG9zZSBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDaGFuZ2VTdXBwb3J0IGV4dGVuZHMgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBMb2NhbENoYW5nZVN1cHBvcnQoQXNwZWN0QWRhcHRlcjxTPiBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2YWxpZExpc3RlbmVyQ2xhc3MsIFN0cmluZyB2YWxpZEFzcGVjdE5hbWUpIHsKLQkJCXN1cGVyKHNvdXJjZSwgdmFsaWRMaXN0ZW5lckNsYXNzLCB2YWxpZEFzcGVjdE5hbWUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNOb0xpc3RlbmVycyh0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcywgdGhpcy52YWxpZEFzcGVjdE5hbWUpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIFQgbGlzdGVuZXIpIHsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJCUFzcGVjdEFkYXB0ZXIudGhpcy5kaXNlbmdhZ2VNb2RlbHMoKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgVCBsaXN0ZW5lcikgewotCQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJCUFzcGVjdEFkYXB0ZXIudGhpcy5kaXNlbmdhZ2VNb2RlbHMoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdmMzE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHtAbGluayBBc3BlY3RBZGFwdGVyfSBwcm92aWRlcyBiYXNpYyBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFU30gY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNnZXRJdGVyYWJsZSgpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZQotICogICAgIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdDsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmIGVpdGhlcgotICogICAgIHtAbGluayAjaXRlcmF0b3JfKCl9IG9yIHtAbGluayAjaXRlcmF0b3IoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI3NpemVfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNzaXplKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcl8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlCi0gKiAgICAgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0IGlmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbXBsZW1lbnQge0BsaW5rICNnZXRJdGVyYWJsZSgpfTsKLSAqICAgICBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcigpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2l6ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgemVybyB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjY29sbGVjdGlvbkNoYW5nZWQoKX0KLSAqIHdoZW5ldmVyIHRoZSBhc3BlY3QgaGFzIGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFkYXB0ZXIgZm9yIGFuIGFzcGVjdCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLml0ZXJhdG9yXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2l0ZXJhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8RT4gaXRlcmF0b3JfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjaXRlcmF0b3JfKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlcmFibGUoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gMCA6IHRoaXMuc2l6ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3NpemUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbjxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgbmV3Q29sbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFPiBidWlsZFZhbHVlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDM2YTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgbGlzdCBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNMSVNUX1ZBTFVFU30gbGlzdC4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNnZXRMaXN0SXRlcmFibGUoKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYSBsaXN0IGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlCi0gKiAgICAgc3ViamVjdCdzIGxpc3QgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYgZWl0aGVyCi0gKiAgICAge0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9IG9yIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNnZXQoaW50KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjdG9BcnJheV8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI3RvQXJyYXkoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcl8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9uIHRoZSBzdWJqZWN0J3MgbGlzdAotICogICAgIGFzcGVjdCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0TGlzdEl0ZXJhYmxlKCl9OwotICogICAgIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjbGlzdEl0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3IoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2l6ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgemVybyB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3RvQXJyYXkoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjbGlzdENoYW5nZWQoKX0KLSAqIHdoZW5ldmVyIHRoZSBhc3BlY3QgaGFzIGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIGFkYXB0ZXIgZm9yIGFuIGFzcGVjdCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBFbXB0eUxpc3RJdGVyYXRvci48RT5pbnN0YW5jZSgpIDogdGhpcy5saXN0SXRlcmF0b3JfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjbGlzdEl0ZXJhdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjbGlzdEl0ZXJhdG9yXygpCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQodGhpcy5saXN0SXRlcmF0b3IoKSwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdCA9PSBudWxsID8gMCA6IHRoaXMuc2l6ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3NpemUoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0ID09IG51bGwgPyBFTVBUWV9BUlJBWSA6IHRoaXMudG9BcnJheV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjdG9BcnJheSgpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIHRvQXJyYXlfKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8RT4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVMaXN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTGlzdDxFPiBuZXdMaXN0ID0gKExpc3Q8RT4pIG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgbmV3TGlzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkVmFsdWVMaXN0KCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PEU+IGJ1aWxkVmFsdWVMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkVmFsdWVMaXN0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODAxNTNhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGFuICJhc3BlY3QiIChhcyBkZWZpbmVkIGJ5IHN1YmNsYXNzZXMpIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjVkFMVUV9IHByb3BlcnR5LgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWVfKCl9PHA+Ci0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLSAqICAgICBzdWJqZWN0J3MgYXNwZWN0IChvciAidmlydHVhbCIgYXNwZWN0KTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZQotICogICAgIG92ZXJyaWRkZW4gaWYge0BsaW5rICNidWlsZFZhbHVlKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZV8oT2JqZWN0KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgY2xpZW50IGNvZGUgbmVlZHMgdG8gPGVtPnNldDwvZW0+IHRoZSB2YWx1ZSBvZgotICogICAgIHRoZSBzdWJqZWN0J3MgYXNwZWN0OyBvZnRlbnRpbWVzLCB0aG91Z2gsIHRoZSBjbGllbnQgY29kZSAoZS5nLiBVSSkKLSAqICAgICB3aWxsIG5lZWQgb25seSB0byA8ZW0+Z2V0PC9lbT4gdGhlIHZhbHVlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gKiAgICAgb3ZlcnJpZGRlbiBpZiB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSB3aGVuCi0gKiAgICAgdGhlIHN1YmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gaXMgdW5hY2NlcHRhYmxlCi0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgc29tZXRoaW5nIG11c3QgYmUgZG9uZSB3aGVuIHRoZSBzdWJqZWN0Ci0gKiAgICAgaXMgPGNvZGU+bnVsbDwvY29kZT4gKGUuZy4gdGhyb3cgYW4gZXhjZXB0aW9uKQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoKX0KLSAqIHdoZW5ldmVyIHRoZSBhc3BlY3QgaGFzIGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFMsIFY+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBhc3BlY3Qgc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICogV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIHZhbHVlIG1heSBiZSBjYWxjdWxhdGVkIGFuZCBtYXkKLQkgKiBub3QgYmUgaW4gdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBmaXJlZCBieSB0aGUgc3ViamVjdCwKLQkgKiBlc3BlY2lhbGx5IHdoZW4gZGVhbGluZyB3aXRoIG11bHRpcGxlIGFzcGVjdHMuCi0JICovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFkYXB0ZXIgZm9yIGFuIGFzcGVjdCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCS8vIG91ciB2YWx1ZSBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3NldFZhbHVlKE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFYgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdCgpIHsKLQkJc3VwZXIuZW5nYWdlU3ViamVjdCgpOwotCQkvLyBzeW5jaCBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0KCkgewotCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCS8vIGNsZWFyIG91dCBvdXIgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdAotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3BlY3QncyB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBzdWJqZWN0IG1heSBiZSBudWxsLgotCSAqLwotCXByb3RlY3RlZCBWIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRWYWx1ZV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjYnVpbGRWYWx1ZSgpCi0JICovCi0JcHJvdGVjdGVkIFYgYnVpbGRWYWx1ZV8oKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgd2hlbmV2ZXIgdGhlIHN1YmplY3QncyBhc3BlY3QKLQkgKiBoYXMgY2hhbmdlZDsgbGlzdGVuZXJzIHdpbGwgYmUgbm90aWZpZWQgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoKSB7Ci0JCVYgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2VkKG9sZCwgdGhpcy52YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg5OTkxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHtAbGluayBBc3BlY3RBZGFwdGVyfSBwcm92aWRlcyBiYXNpYyB0cmVlIGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI05PREVTfSB0cmVlLgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VTdWJqZWN0XygpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI25vZGVzXygpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiBhbiBpdGVyYXRvcgotICogICAgIG9uIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjbm9kZXMoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI25vZGVzKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgaXRlcmF0b3Igd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8L3VsPgotICogVG8gbm90aWZ5IGxpc3RlbmVycywgc3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI3RyZWVDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyZWVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZXMgb2YgdGhlIHN1YmplY3QncyB0cmVlIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8RT4gbm9kZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpIDogdGhpcy5ub2Rlc18oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNub2RlcygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IG5vZGVzXygpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gVHJlZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTk9ERVM7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKE5PREVTKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ29sbGVjdGlvbjxFPiBuZXdOb2RlcyA9IChDb2xsZWN0aW9uPEU+KSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTk9ERVMsIG5ld05vZGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2hhbmdlZCgpIHsKLQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTk9ERVMsIHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLm5vZGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDE5MWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBpcyB1c2VkIHRvIGhvbGQgYSB0ZW1wb3JhcnkgY29weSBvZiB0aGUgdmFsdWUKLSAqIGluIGFub3RoZXIgcHJvcGVydHkgdmFsdWUgbW9kZWwgKHRoZSAid3JhcHBlZCIgdmFsdWUgaG9sZGVyKS4gVGhlIGFwcGxpY2F0aW9uCi0gKiBjYW4gbW9kaWZ5IHRoaXMgdGVtcG9yYXJ5IGNvcHksIGFkIG5hdXNlYW07IGJ1dCB0aGUgdGVtcG9yYXJ5IGNvcHkgaXMgb25seQotICogcGFzc2VkIHRocm91Z2ggdG8gdGhlICJ3cmFwcGVkIiB2YWx1ZSBob2xkZXIgd2hlbiB0aGUgdHJpZ2dlciAiYWNjZXB0cyIgdGhlCi0gKiBidWZmZXJlZCB2YWx1ZS4gQWx0ZXJuYXRpdmVseSwgdGhlIGFwcGxpY2F0aW9uIGNhbiAicmVzZXQiIHRoZSBidWZmZXJlZCB2YWx1ZQotICogdG8gdGhlIG9yaWdpbmFsLCAid3JhcHBlZCIgdmFsdWUuCi0gKiA8cD4KLSAqIFRoZSB0cmlnZ2VyIGlzIGFub3RoZXIge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBob2xkcyBhIHtAbGluayBCb29sZWFufQotICogYW5kIHRoZSBhcHBsaWNhdGlvbiBjaGFuZ2VzIHRoZSB0cmlnZ2VyJ3MgdmFsdWUgdG8gdHJ1ZSBvbiAiYWNjZXB0IiwgZmFsc2Ugb24gInJlc2V0Ii4KLSAqIFR5cGljYWxseSwgaW4gYSBkaWFsb2c6PHVsPgotICogPGxpPnByZXNzaW5nIHRoZSAiT0siIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYW4gImFjY2VwdCIgYW5kIGNsb3NlIHRoZSBkaWFsb2cKLSAqIDxsaT5wcmVzc2luZyB0aGUgIkNhbmNlbCIgYnV0dG9uIHdpbGwgc2ltcGx5IGNsb3NlIHRoZSBkaWFsb2csCi0gKiAgIGRyb3BwaW5nIHRoZSAiYnVmZmVyZWQiIHZhbHVlcyBpbnRvIHRoZSBiaXQgYnVja2V0Ci0gKiA8bGk+cHJlc3NpbmcgdGhlICJBcHBseSIgYnV0dG9uIHdpbGwgdHJpZ2dlciBhbiAiYWNjZXB0IiBhbmQgbGVhdmUgdGhlIGRpYWxvZyBvcGVuCi0gKiA8bGk+cHJlc3NpbmcgdGhlICJSZXN0b3JlIiBidXR0b24gd2lsbCB0cmlnZ2VyIGEgInJlc2V0IiBhbmQgbGVhdmUgdGhlIGRpYWxvZyBvcGVuCi0gKiA8L3VsPgotICogPHA+Ci0gKiBBIG51bWJlciBvZiBidWZmZXJlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMgY2FuIHdyYXAgYW5vdGhlciBzZXQgb2YKLSAqIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVycyB0aGF0IGFkYXB0IHRoZSB2YXJpb3VzIGFzcGVjdHMgb2YgYSBzaW5nbGUKLSAqIGRvbWFpbiBtb2RlbC4gQWxsIHRoZSBidWZmZXJkIHByb3BlcnR5IHZhbHVlIG1vZGVscyBjYW4gYmUgaG9va2VkIHRvIHRoZQotICogc2FtZSB0cmlnZ2VyLCBhbmQgdGhhdCB0cmlnZ2VyIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGFwcGxpY2F0aW9uLCB0eXBpY2FsbHkKLSAqIHZpYSB0aGUgT0sgYnV0dG9uIGluIGEgZGlhbG9nLgotICogCi0gKiBAc2VlIFByb3BlcnR5QXNwZWN0QWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQotCS8qKgotCSAqIFdlIGNhY2hlIHRoZSB2YWx1ZSBoZXJlIHVudGlsIGl0IGlzIGFjY2VwdGVkIGFuZCBwYXNzZWQKLQkgKiB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWZmZXJlZFZhbHVlOwotCi0JLyoqCi0JICogVGhpcyBpcyBzZXQgdG8gdHJ1ZSB3aGVuIHdlIGFyZSAiYWNjZXB0aW5nIiB0aGUgYnVmZmVyZWQgdmFsdWUKLQkgKiBhbmQgcGFzc2luZyBpdCB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4gVGhpcyBhbGxvd3MKLQkgKiB1cyB0byBpZ25vcmUgdGhlIHByb3BlcnR5IGNoYW5nZSBldmVudCBmaXJlZCBieSB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlci4KLQkgKiAoV2UgY2FuJ3Qgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLCBiZWNhdXNlCi0JICogaWYgd2UgYXJlIHRoZSBvbmx5IGxpc3RlbmVyIHRoYXQgY291bGQgImRlYWN0aXZhdGUiIHRoZSB3cmFwcGVkCi0JICogdmFsdWUgaG9sZGVyLikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHRpbmc7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSB0cmlnZ2VyIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogc2hvdWxkIGJlIGFjY2VwdGVkIG9yIHJlc2V0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdHJpZ2dlckhvbGRlcjsKLQotCS8qKiBUaGlzIGxpc3RlbnMgdG8gdGhlIHRyaWdnZXIgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRyaWdnZXJDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBvdXIgYnVmZmVyZWQgdmFsdWUgaGFzIGJlZW4gYXNzaWduZWQKLQkgKiBhIHZhbHVlIGFuZCBpcyBwb3NzaWJseSBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWZmZXJpbmc7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJ1ZmZlcmVkIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRyaWdnZXIgaG9sZGVyLgotCSAqLwotCXB1YmxpYyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdHJpZ2dlckhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCWlmICh0cmlnZ2VySG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudHJpZ2dlckhvbGRlciA9IHRyaWdnZXJIb2xkZXI7Ci0JCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCXRoaXMuYWNjZXB0aW5nID0gZmFsc2U7Ci0JCXRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFRyaWdnZXJDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRyaWdnZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMudHJpZ2dlckNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpZ2dlciBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgd2UgYXJlIGN1cnJlbnRseSAiYnVmZmVyaW5nIiBhIHZhbHVlLCByZXR1cm4gdGhhdDsKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgd3JhcHBlZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVmZmVyaW5nID8gdGhpcy5idWZmZXJlZFZhbHVlIDogdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEFzc2lnbiB0aGUgbmV3IHZhbHVlIHRvIG91ciAiYnVmZmVyZWQiIHZhbHVlLgotCSAqIEl0IHdpbGwgYmUgcHVzaGVkIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlcgotCSAqIHdoZW4gdGhlIHRyaWdnZXIgaXMgImFjY2VwdGVkIi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlcmluZykgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwodmFsdWUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgc2V0IGJhY2sgdG8gdGhlIG9yaWdpbmFsIHZhbHVlCi0JCQkJdGhpcy5yZXNldCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB0aGUgYnVmZmVyZWQgdmFsdWUgaXMgYmVpbmcgY2hhbmdlZAotCQkJCU9iamVjdCBvbGQgPSB0aGlzLmJ1ZmZlcmVkVmFsdWU7Ci0JCQkJdGhpcy5idWZmZXJlZFZhbHVlID0gdmFsdWU7Ci0JCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKSB7Ci0JCQkJLy8gdGhlIGJ1ZmZlcmVkIHZhbHVlIGlzIGJlaW5nIHNldCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgb3JpZ2luYWwgdmFsdWUgLSBpZ25vcmUKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhlIGJ1ZmZlcmVkIHZhbHVlIGlzIGJlaW5nIHNldCBmb3IgdGhlIGZpcnN0IHRpbWUKLQkJCQlPYmplY3Qgb2xkID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IHZhbHVlOwotCQkJCXRoaXMuYnVmZmVyaW5nID0gdHJ1ZTsKLQkJCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgZXh0ZW5zaW9ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBleHRlbmQgdG8gZW5nYWdlIHRoZSB0cmlnZ2VyIGhvbGRlciBhbHNvCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMudHJpZ2dlckhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogZXh0ZW5kIHRvIGRpc2VuZ2FnZSB0aGUgdHJpZ2dlciBob2xkZXIgYWxzbwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnRyaWdnZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy50cmlnZ2VyQ2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgY3VycmVudGx5ICJhY2NlcHRpbmciIHRoZSB2YWx1ZSAoaS5lIHBhc3NpbmcgaXQgb24gdG8gdGhlCi0JICogIndyYXBwZWQiIG1vZGVsKSwgaWdub3JlIGNoYW5nZSBub3RpZmljYXRpb25zLCBzaW5jZSB3ZSBjYXVzZWQKLQkgKiB0aGVtIGFuZCBvdXIgb3duIGxpc3RlbmVycyBhcmUgYWxyZWFkeSBhd2FyZSBvZiB0aGUgY2hhbmdlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmFjY2VwdGluZykgewotCQkJdGhpcy52YWx1ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBjaGVjayB3aGV0aGVyIHRoZSAid3JhcHBlZCIgdmFsdWUgaGFzCi0JICogY2hhbmdlZCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgImJ1ZmZlcmVkIiB2YWx1ZS4gSWYgaXQgaGFzLCBzdG9wICJidWZmZXJpbmciOwotCSAqIGlmIG5vdCwgZG8gbm90aGluZy4KLQkgKiBJZiB3ZSBkbyBub3QgeWV0IGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlLCBzaW1wbHkgcHJvcGFnYXRlIHRoZQotCSAqIGNoYW5nZSBub3RpZmljYXRpb24gd2l0aCB0aGUgYnVmZmVyZWQgbW9kZWwgYXMgdGhlIHNvdXJjZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWRfKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuYnVmZmVyaW5nKSB7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbChldmVudC5nZXROZXdWYWx1ZSgpLCB0aGlzLmJ1ZmZlcmVkVmFsdWUpKSB7Ci0JCQkJLy8gdGhlIGJ1ZmZlcmVkIHZhbHVlIGlzIGJlaW5nIHNldCBiYWNrIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQotCQkJCXRoaXMucmVzZXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5oYW5kbGVDaGFuZ2VDb25mbGljdChldmVudCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgaWYgd2UgaGF2ZSBhICJidWZmZXJlZCIgdmFsdWUgYW5kIHRoZSAid3JhcHBlZCIgdmFsdWUgY2hhbmdlcywKLQkgKiB3ZSBzaW1wbHkgaWdub3JlIHRoZSBuZXcgIndyYXBwZWQiIHZhbHVlIGFuZCBzaW1wbHkgb3ZlcmxheSBpdCB3aXRoIHRoZQotCSAqICJidWZmZXJlZCIgdmFsdWUgaWYgaXQgaXMgImFjY2VwdGVkIi4gKCJMYXN0IE9uZSBJbiBXaW5zIiBjb25jdXJyZW5jeSBtb2RlbCkKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjaGFuZ2UgdGhhdCBiZWhhdmlvciB3aXRoIGEKLQkgKiBkaWZmZXJlbnQgY29uY3VycmVuY3kgbW9kZWwuIEZvciBleGFtcGxlLCB5b3UgY291bGQgZHJvcCB0aGUgImJ1ZmZlcmVkIiB2YWx1ZQotCSAqIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIG5ldyAid3JhcHBlZCIgdmFsdWUsIG9yIHlvdSBjb3VsZCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VDb25mbGljdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogVGhlIHRyaWdnZXIgY2hhbmdlZDo8dWw+Ci0JICogPGxpPklmIGl0IGlzIG5vdyB0cnVlLCAiYWNjZXB0IiB0aGUgYnVmZmVyZWQgdmFsdWUgYW5kIHB1c2gKLQkgKiBpdCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuCi0JICogPGxpPklmIGl0IGlzIG5vdyBmYWxzZSwgInJlc2V0IiB0aGUgYnVmZmVyZWQgdmFsdWUgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJpZ2dlckNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBpZiBub3RoaW5nIGhhcyBiZWVuICJidWZmZXJlZCIsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmc6Ci0JCS8vIG5vdGhpbmcgbmVlZHMgdG8gYmUgcGFzc2VkIHRocm91Z2g7IG5vdGhpbmcgbmVlZHMgdG8gYmUgcmVzZXQ7Ci0JCWlmICh0aGlzLmJ1ZmZlcmluZykgewotCQkJaWYgKCgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQl0aGlzLmFjY2VwdCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY2NlcHQoKSB7Ci0JCS8vIHNldCB0aGUgYWNjZXB0aW5nIGZsYWcgc28gd2UgaWdub3JlIGFueSBldmVudHMKLQkJLy8gZmlyZWQgYnkgdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyCi0JCXRoaXMuYWNjZXB0aW5nID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLmJ1ZmZlcmVkVmFsdWUpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5idWZmZXJlZFZhbHVlID0gbnVsbDsKLQkJCXRoaXMuYnVmZmVyaW5nID0gZmFsc2U7Ci0JCQkvLyBjbGVhciB0aGUgZmxhZyBvbmNlIHRoZSAiYWNjZXB0IiBpcyBjb21wbGV0ZQotCQkJdGhpcy5hY2NlcHRpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewotCQkvLyBub3RpZnkgb3VyIGxpc3RlbmVycyB0aGF0IG91ciB2YWx1ZSBoYXMgYmVlbiByZXNldAotCQlPYmplY3Qgb2xkID0gdGhpcy5idWZmZXJlZFZhbHVlOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBidWZmZXJlZCBtb2RlbCBpcyBjdXJyZW50bHkgImJ1ZmZlcmluZyIKLQkgKiBhIHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQnVmZmVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5idWZmZXJpbmc7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8VD59LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogPGNvZGU+VHJpZ2dlcjwvY29kZT4gaXMgYSBzcGVjaWFsIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgb25seSBtYWludGFpbnMgaXRzCi0JICogdmFsdWUgKG9mIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPikgZHVyaW5nIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGNhdXNlZCBieQotCSAqIHtAbGluayAjc2V0VmFsdWUoVCl9LiBJbiBvdGhlciB3b3JkcywgYSA8Y29kZT5UcmlnZ2VyPC9jb2RlPgotCSAqIG9ubHkgaGFzIGEgdmFsaWQgdmFsdWUgd2hlbiBpdCBpcyBiZWluZyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUcmlnZ2VyIGV4dGVuZHMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3QgYSB0cmlnZ2VyIHdpdGggYSBudWxsIHZhbHVlLgotCQkgKi8KLQkJcHVibGljIFRyaWdnZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCS8qKgotCQkgKiBFeHRlbmQgc28gdGhhdCB0aGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZwotCQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRyaWdnZXJlZCBieSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQkJaWYgKHRoaXMudmFsdWUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZXRob2QgVHJpZ2dlci5nZXRWYWx1ZSgpIG1heSBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogRXh0ZW5kIHRvIHJlc2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5udWxsPC9jb2RlPiBvbmNlIGFsbCB0aGUKLQkJICogbGlzdGVuZXJzIGhhdmUgYmVlbiBub3RpZmllZC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCQkvKioKLQkJICogU2V0IHRoZSB0cmlnZ2VyJ3MgdmFsdWU6PHVsPgotCQkgKiAJPGxpPjxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyAiYWNjZXB0IgotCQkgKiAJPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpbmRpY2F0ZXMgInJlc2V0IgotCQkgKiA8L3VsPgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgewotCQkJdGhpcy5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YodmFsdWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHRyaWdnZXIncyB2YWx1ZTo8dWw+Ci0JCSAqIAk8bGk+PGNvZGU+dHJ1ZTwvY29kZT4gaW5kaWNhdGVzICJhY2NlcHQiCi0JCSAqIAk8bGk+PGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcyAicmVzZXQiCi0JCSAqIDwvdWw+Ci0JCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFjY2VwdCB0aGUgdHJpZ2dlciAoaS5lLiBzZXQgaXRzIHZhbHVlIHRvIDxjb2RlPnRydWU8L2NvZGU+KS4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFjY2VwdCgpIHsKLQkJCXRoaXMuc2V0VmFsdWUodHJ1ZSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHRyaWdnZXIgaGFzIGJlZW4gYWNjZXB0ZWQKLQkJICogKGkuZS4gaXRzIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIDxjb2RlPnRydWU8L2NvZGU+KS4KLQkJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzQWNjZXB0ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXNldCB0aGUgdHJpZ2dlciAoaS5lLiBzZXQgaXRzIHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJCXRoaXMuc2V0VmFsdWUoZmFsc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0cmlnZ2VyIGhhcyBiZWVuIHJlc2V0Ci0JCSAqIChpLmUuIGl0cyB2YWx1ZSB3YXMgY2hhbmdlZCB0byA8Y29kZT5mYWxzZTwvY29kZT4pLgotCQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNSZXNldCgpIHsKLQkJCXJldHVybiAhIHRoaXMuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyZTY4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+Q2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLSAqIHRvIHRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfS4KLSAqIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBpcyBjYWxjdWxhdGVkIGFuZCBjYWNoZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBldmVyeQotICogdGltZSB0aGUgd3JhcHBlZCB2YWx1ZSBjaGFuZ2VzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUgb2xkIHZhbHVlCi0gKiBwYXNzZWQgaW4gdG8ge0BsaW5rICN2YWx1ZUNoYW5nZWQob3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQpfQotICogY2FuIG5vIGxvbmdlciBiZSAidHJhbnNmb3JtZWQiIGJlY2F1c2UgaXRzIHN0YXRlIGlzIG5vIGxvbmdlciB2YWxpZC4KLSAqIFRoaXMgY2FjaGluZyBjYW4gYWxzbyBpbXByb3ZlIHRpbWUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPkNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gY2FuCi0gKiBlaXRoZXIgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yLAotICogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gbnVsbCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZQotICogaXMgbnVsbCwgb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0uCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotewotCS8qKgotCSAqIENhY2hlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBzbyB0aGF0IGR1cmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uCi0JICogd2UgZG8gbm90IGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBvbGQgdmFsdWUuIFRoZSBvbGQgdmFsdWUgY291bGQgbm8gbG9uZ2VyIGJlIHZhbGlkIGluCi0JICogdGhlIG1vZGVsOyBhcyBhIHJlc3VsdCwgdHJhbnNmb3JtaW5nIGl0IHdvdWxkIG5vdCBiZSB2YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgY2FjaGVkVmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0gb3Ige0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVDE+IHZhbHVlSG9sZGVyLCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycywgY2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IG51bGw7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUsIGNhY2hpbmcgaXQgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKiBBIGJpdCBvZiBhIHNpZGUtZWZmZWN0LCBidXQgaXQgc2VlbXMgcmVhc29uYWJsZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtTmV3KFQxIHZhbHVlKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBzdXBlci50cmFuc2Zvcm1OZXcodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBObyBuZWVkIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUsCi0JICogd2hpY2ggaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlZFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NjAzNjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+Q2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Y29kZT4gYXVnbWVudHMgdGhlCi0gKiBiZWhhdmlvciBvZiBhIHtAbGluayBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBieSBjYWNoaW5nCi0gKiB0aGUgdHJhbnNmb3JtZWQgdmFsdWUuCi0gKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgaXMgY2FsY3VsYXRlZCBhbmQgY2FjaGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZXZlcnkKLSAqIHRpbWUgdGhlIHdyYXBwZWQgdmFsdWUgY2hhbmdlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIG9sZCB2YWx1ZQotICogcGFzc2VkIGluIHRvIHtAbGluayAjdmFsdWVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotewotCS8qKgotCSAqIENhY2hlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBzbyB0aGF0IGR1cmluZyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgbm90aWZpY2F0aW9uCi0JICogd2UgZG8gbm90IGhhdmUgdG8gdHJhbnNmb3JtIHRoZSBvbGQgdmFsdWUuIFRoZSBvbGQgdmFsdWUgY291bGQgbm8gbG9uZ2VyIGJlIHZhbGlkIGluCi0JICogdGhlIG1vZGVsOyBhcyBhIHJlc3VsdCwgdHJhbnNmb3JtaW5nIGl0IHdvdWxkIG5vdCBiZSB2YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgY2FjaGVkVmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBhbmQge0BsaW5rIHJldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBiaWRpIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4gdmFsdWVIb2xkZXIsIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGhhdmUgbGlzdGVuZXJzLCB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBubyBtb3JlIGxpc3RlbmVycywgY2xlYXIgdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jYWNoZWRWYWx1ZSA9IG51bGw7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG5lc3RlZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUsIGNhY2hpbmcgaXQgYmVmb3JlIHJldHVybmluZyBpdC4KLQkgKiBBIGJpdCBvZiBhIHNpZGUtZWZmZWN0LCBidXQgaXQgc2VlbXMgcmVhc29uYWJsZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtTmV3KFQxIHZhbHVlKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBzdXBlci50cmFuc2Zvcm1OZXcodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBObyBuZWVkIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLCBzaW1wbHkgcmV0dXJuIHRoZSBjYWNoZWQgdmFsdWUsCi0JICogd2hpY2ggaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlZFZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2hhbmdlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2hhbmdlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQ4ZGRkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlNpbXBsZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBtb2RlbAotICogPC91bD4KLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMKLSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpOjx1bD4KLSAqIDxsaT57QGxpbmsgI21vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNidWlsZENoYW5nZUxpc3RlbmVyKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2hhbmdlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RlbCBtb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLmNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2hhbmdlIGxpc3RlbmVyIGNvbW1hbmQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBtb2RlbCBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWEwY2Y5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2Yge0BsaW5rIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcn0gcHJvdmlkZXMKLSAqIGJhc2ljIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGEgc2V0IG9mIG9uZSBvciBtb3JlIGNvbGxlY3Rpb25zIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjVkFMVUVTfSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNnZXRJdGVyYWJsZSgpfQotICogPGxpPntAbGluayAjc2l6ZV8oKX0KLSAqIDxsaT57QGxpbmsgI2l0ZXJhdG9yXygpfQotICogPGxpPntAbGluayAjaXRlcmF0b3IoKX0KLSAqIDxsaT57QGxpbmsgI3NpemUoKX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UywgRT4KLXsKLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb25zIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9DT0xMRUNUSU9OX05BTUVTID0gbmV3IFN0cmluZ1swXTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gYXNwZWN0cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0cmluZ1tdIHtjb2xsZWN0aW9uTmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpLCBjb2xsZWN0aW9uTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgY29sbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgY29sbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb25OYW1lcykgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIGNvbGxlY3Rpb25OYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbY29sbGVjdGlvbk5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciBhbiAidW5jaGFuZ2luZyIgY29sbGVjdGlvbiBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgY29sbGVjdGlvbiBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfQ09MTEVDVElPTl9OQU1FUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFUyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29sbGVjdGlvbk5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudC5jbG9uZSh0aGlzLCBWQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcywgVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjM2Q4YjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogVG8gbWFpbnRhaW4gYSByZWFzb25hYmx5IGNvbnNpc3RlbnQgYXBwZWFyYW5jZSB0byBjbGllbnQgY29kZSwgd2UKLSAqIGtlZXAgYW4gaW50ZXJuYWwgbGlzdCBzb21ld2hhdCBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGNvbGxlY3Rpb24gd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuIHtAbGluayAjc2l6ZSgpfSwge0BsaW5rICNnZXQoaW50KX0pIHdpbGwgYmUgdW5wcmVkaWN0YWJsZSB3aGVuZXZlcgotICogd2UgZG8gbm90IGhhdmUgYW55IGxpc3RlbmVycy4gVGhpcyBzaG91bGQgbm90IGJlIHRvbyBwYWluZnVsIHNpbmNlLAotICogbW9zdCBsaWtlbHksIGNsaWVudHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBsaXN0LCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24sIGJ1dCBrZWVwcyB0aGVtIGluIG9yZGVyLgotCSAqLwotCS8vIHdlIGRlY2xhcmUgdGhpcyBhbiBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjY2xvbmUoKSBhbmQgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb2xsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IGNvbGxlY3Rpb25Ib2xkZXI7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KGNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIGxpc3QgYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBsaXN0IGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0KTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5idWlsZExpc3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBsaXN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyCi0JCXRoaXMubGlzdC5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJLy8gaWYgdGhlIG5ldyBjb2xsZWN0aW9uIGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWludCBzaXplID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMCkgewotCQkJdGhpcy5idWlsZExpc3Qoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZExpc3QoaW50IHNpemUpIHsKLQkJdGhpcy5saXN0LmVuc3VyZUNhcGFjaXR5KHNpemUpOwotCQlmb3IgKEUgZWFjaCA6IHRoaXMuY29sbGVjdGlvbkhvbGRlcikgewotCQkJdGhpcy5saXN0LmFkZChlYWNoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkSXRlbXNUb0xpc3QodGhpcy5pbmRleFRvQWRkSXRlbXMoKSwgdGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgaW50IGluZGV4VG9BZGRJdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckxpc3QodGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCBsaXN0IHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzaXplID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkgewotCQkJaWYgKHRoaXMubGlzdC5pc0VtcHR5KCkpIHsKLQkJCQkvLyBubyBjaGFuZ2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jbGVhckxpc3QodGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5saXN0LmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRMaXN0KHNpemUpOwotCQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIDAsIHRoaXMubGlzdCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc3luY2hyb25pemVMaXN0KHRoaXMuYnVpbGRTeW5jTGlzdCgpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYnVpbGRTeW5jTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbkhvbGRlcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZDE4YjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBjb2xsZWN0aW9uIHZhbHVlCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBtaWdodCB3YW50IHRvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcwotICogdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSAoYnkgbm90IHJlY2FsY3VsYXRpbmcgdGhlIHZhbHVlLCBpZiBwb3NzaWJsZSk6PHVsPgotICogPGxpPntAbGluayAjaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbk1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbk1vZGVsID0gY29sbGVjdGlvbk1vZGVsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbk1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTFkY2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGFub3RoZXIgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IGNvbGxlY3Rpb25Ib2xkZXI7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlZGM1ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGFkYXB0cyBhCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGhvbGRpbmcgYm9vbGVhbiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXMKLSAqIHRvIGEgc2luZ2xlIGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0uIFRoZSBjb21wb3NpdGUgdmFsdWUgaXMKLSAqIGRldGVybWluZWQgYnkgdGhlIHtAbGluayBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLkFkYXB0ZXJ9IHByb3ZpZGVkCi0gKiBhdCBjb25zdHJ1Y3Rpb24uIFR5cGljYWxseSB0aGUgY29tcG9zaXRlIHdpbGwgYmUgZWl0aGVyIGFuIEFORCBvciBhbiBPUiBvZgotICogYWxsIHRoZSBib29sZWFuIHZhbHVlcy4KLSAqIDxwPgotICogSWYgdGhlcmUgYXJlIDxlbT5ubzwvZW0+IGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zLCB0aGUgY29tcG9zaXRlCi0gKiB3aWxsIHJldHVybiBpdHMgZGVmYXVsdCB2YWx1ZTsgd2hpY2gsIGJ5IGRlZmF1bHQsIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBOb25lIG9mIHRoZSB3cmFwcGVkIGJvb2xlYW4gbW9kZWxzIGNhbiByZXR1cm4gYQotICogPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4gVGhlIGFzc3VtcHRpb24KLSAqIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkIGJvb2xlYW4gbW9kZWxzIGFyZSBjb25maWd1cmVkIHdpdGggImRlZmF1bHQiIHZhbHVlcwotICogdGhhdCBkZXRlcm1pbmUgdGhlIG1vZGVsJ3MgdmFsdWUgKFRSVUUgb3IgRkFMU0UpIHdoZW4gPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsCi0JZXh0ZW5kcyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4KLXsKLQkvKioKLQkgKiBDYWxjdWxhdGlvbiBvZiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBkZWxlZ2F0ZWQgdG8gdGhpcyBhZGFwdGVyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBBZGFwdGVyIGFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgY29tcG9zaXRlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWw7Ci0JICogZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBtb2RlbCBpcyBlbXB0eS4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGRlZmF1bHRWYWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBBTkQgZmFjdG9yeSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFORF9BREFQVEVSLCBkZWZhdWx0VmFsdWUsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9SIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBkZWZhdWx0VmFsdWUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBvcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGNvbGxlY3Rpb25Nb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Li4uIGFycmF5KSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlzdXBlcihhcnJheSk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhhZGFwdGVyLCBudWxsLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb24pOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQWRhcHRlciBhZGFwdGVyLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJdGhpcyhhZGFwdGVyLCBudWxsLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlzdXBlcihjb2xsZWN0aW9uTW9kZWwpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBjb250YWluZWQgYm9vbGVhbnMgYXJlIHRydWU7IG90aGVyd2lzZSByZXR1cm4KLQkgKiBmYWxzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuY29sbGVjdGlvbk1vZGVsLnNpemUoKSA9PSAwKSA/IHRoaXMuZGVmYXVsdFZhbHVlIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmJ1aWxkVmFsdWUodGhpcy5nZXRCb29sZWFucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8Qm9vbGVhbj4gZ2V0Qm9vbGVhbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4sIEJvb2xlYW4+KHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwpIHsKLQkJCQlyZXR1cm4gYm9vbGVhbk1vZGVsLmdldFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGdldENvbGxlY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Pikgc3VwZXIuZ2V0Q29sbGVjdGlvbk1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBhZGFwdGVyIGFsbG93cyB0aGUge0BsaW5rIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWx9IHRvIGJlCi0JICogcGx1Z2dhYmxlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbXBvc2l0ZSBib29sZWFuIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbgotCQkgKiBvZiBib29sZWFuIG1vZGVscy4KLQkJICovCi0JCUJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBib29sZWFucyBhcmUgdHJ1ZTsgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgQU5EX0FEQVBURVIgPSBuZXcgQWRhcHRlcigpIHsKLQkJcHVibGljIEJvb2xlYW4gYnVpbGRWYWx1ZShJdGVyYWJsZTxCb29sZWFuPiBib29sZWFucykgewotCQkJZm9yIChCb29sZWFuIGIgOiBib29sZWFucykgewotCQkJCWlmICggISBiLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkFORF9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotCS8qKgotCSAqIFJldHVybiBmYWxzZSBpZiBhbGwgdGhlIGJvb2xlYW5zIGFyZSBmYWxzZTsgb3RoZXJ3aXNlIHJldHVybiB0cnVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlciBPUl9BREFQVEVSID0gbmV3IEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyBCb29sZWFuIGJ1aWxkVmFsdWUoSXRlcmFibGU8Qm9vbGVhbj4gYm9vbGVhbnMpIHsKLQkJCWZvciAoQm9vbGVhbiBiIDogYm9vbGVhbnMpIHsKLQkJCQlpZiAoYi5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPUl9BREFQVEVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZjE2YTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OdWxsTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBjb2xsZWN0aW9ucy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IGJlIGFuICJpZGVudGl0eSBzZXQiIHRoYXQgZG9lcyBub3QKLSAqIGNvbnRhaW4gdGhlIHNhbWUgaXRlbSB0d2ljZSBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICogPHA+Ci0gKiBUZXJtaW5vbG9neTo8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZXM8L2VtPiAtIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsOyB0aGVzZQotICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIGNvbXBvbmVudCBDVk1zIGJ5IHRoZSB0cmFuc2Zvcm1lcgotICogPGxpPjxlbT5jb21wb25lbnQgQ1ZNczwvZW0+IC0gdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0IGFyZSBjb21iaW5lZAotICogICAgYnkgdGhpcyBjb21wb3NpdGUgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbAotICogPGxpPjxlbT5pdGVtczwvZW0+IC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBDVk1zCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+Ci17Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgKG9wdGlvbmFsKSB1c2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB0byBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyB0aGF0Ci0JICogd2VyZSBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyOyBrZXllZCBieSB0aGUgaXRlbQotCSAqIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElkZW50aXR5SGFzaE1hcDxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiBjb21wb25lbnRDVk1zID0KLQkJCW5ldyBJZGVudGl0eUhhc2hNYXA8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4oKTsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBjb2xsZWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscyBhYm92ZTsga2V5ZWQgYnkgdGhlIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLgotCSAqIFVzZSB7QGxpbmsgQXJyYXlMaXN0fXMgc28gd2UgY2FuIHVzZSB7QGxpbmsgQXJyYXlMaXN0fS1zcGVjaWZpYyBtZXRob2RzCi0JICogKGUuZy4ge0BsaW5rIEFycmF5TGlzdCNjbG9uZSgpfSBhbmQge0BsaW5rIEFycmF5TGlzdCNlbnN1cmVDYXBhY2l0eShpbnQpfSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJZGVudGl0eUhhc2hNYXA8Q29sbGVjdGlvblZhbHVlTW9kZWw8RTI+LCBBcnJheUxpc3Q8RTI+PiBjb2xsZWN0aW9ucyA9Ci0JCQluZXcgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4oKTsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29tcG9uZW50Q1ZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFMT4obGlzdEhvbGRlciksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb248PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24uIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChFMS4uLiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoRTFbXSBjb2xsZWN0aW9uLCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbiksIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbXBvbmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudENvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxFMj4odGhpcy5idWlsZENvbGxlY3Rpb25zSXRlcmF0b3JzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxJdGVyYXRvcjxFMj4+IGJ1aWxkQ29sbGVjdGlvbnNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxBcnJheUxpc3Q8RTI+LCBJdGVyYXRvcjxFMj4+KHRoaXMuY29sbGVjdGlvbnMudmFsdWVzKCkuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RTI+IHRyYW5zZm9ybShBcnJheUxpc3Q8RTI+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24sCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYWRkQWxsQ29tcG9uZW50U291cmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSBhbGwgdGhlIHNvdXJjZXMgdG8gY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMKLQkgKiBhbmQgYWRkIHRoZWlyIGl0ZW1zIHRvIG91ciBjYWNoZSwgd2l0aCBubyBldmVudCBub3RpZmljYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQWxsQ29tcG9uZW50U291cmNlcygpIHsKLQkJZm9yIChFMSBzb3VyY2UgOiB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50U291cmNlKHNvdXJjZSwgTnVsbExpc3QuPEUyPmluc3RhbmNlKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBjb21wb25lbnRzLi4uCi0JCWZvciAoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA6IHRoaXMuY29tcG9uZW50Q1ZNcy52YWx1ZXMoKSkgewotCQkJY29tcG9uZW50Q1ZNLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQl9Ci0JCS8vIC4uLmFuZCBjbGVhciB0aGUgY2FjaGUKLQkJdGhpcy5jb21wb25lbnRDVk1zLmNsZWFyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbnMuY2xlYXIoKTsKLQkJdGhpcy5zaXplID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgYWRkZWQ7Ci0JICogYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgaXRlbXMgdG8gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFMj4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JCWZvciAoRTEgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZShpdGVtLCBhZGRlZEl0ZW1zKTsKLQkJfQotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKFZBTFVFUywgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgc291cmNlIHRvIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbAotCSAqIGFuZCBhZGQgaXRzIGl0ZW1zIHRvIG91ciBjYWNoZSBhbmQgdGhlICJjb2xsZWN0aW5nIHBhcmFtZXRlciIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50U291cmNlKEUxIHNvdXJjZSwgTGlzdDxFMj4gYWRkZWRJdGVtcykgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJaWYgKHRoaXMuY29tcG9uZW50Q1ZNcy5wdXQoc291cmNlLCBjb21wb25lbnRDVk0pICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImR1cGxpY2F0ZSBjb21wb25lbnQ6ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29tcG9uZW50Q1ZNLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihWQUxVRVMsIHRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIpOwotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRDVk0uc2l6ZSgpKTsKLQkJaWYgKHRoaXMuY29sbGVjdGlvbnMucHV0KGNvbXBvbmVudENWTSwgY29tcG9uZW50Q29sbGVjdGlvbikgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZHVwbGljYXRlIGNvbGxlY3Rpb246ICIgKyBzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQlhZGRlZEl0ZW1zLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IENWTSB0byB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudAotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSwgQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uKSB7Ci0JCWludCBpdGVtc1NpemUgPSBjb21wb25lbnRDVk0uc2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChjb21wb25lbnRDb2xsZWN0aW9uLCBjb21wb25lbnRDVk0pOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOwotCSAqIHJlbW92ZSB0aGVpciBjb3JyZXNwb25kaW5nIGl0ZW1zIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCQlmb3IgKEUxIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2UoaXRlbSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaXRlbXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIGZyb20gb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbXBvbmVudFNvdXJjZShFMSBzb3VyY2UsIExpc3Q8RTI+IHJlbW92ZWRJdGVtcykgewotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNID0gdGhpcy5jb21wb25lbnRDVk1zLnJlbW92ZShzb3VyY2UpOwotCQlpZiAoY29tcG9uZW50Q1ZNID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY29tcG9uZW50OiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNvbXBvbmVudENWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5yZW1vdmUoY29tcG9uZW50Q1ZNKTsKLQkJaWYgKGNvbXBvbmVudENvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb2xsZWN0aW9uOiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJlbW92ZWRJdGVtcy5hZGRBbGwoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIG91ciBzaXplIGFuZCBjb2xsZWN0aW9uIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbXBvbmVudEl0ZW1zKEFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbikgewotCQl0aGlzLnNpemUgLT0gY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCk7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgY2xlYXJlZDsKLQkgKiBjbGVhciBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFZBTFVFUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29tcG9uZW50U291cmNlcygpIHsKLQkJLy8gY29weSB0aGUga2V5cyBzbyB3ZSBkb24ndCBlYXQgb3VyIG93biB0YWlsCi0JCUFycmF5TGlzdDxFMT4gY29weSA9IG5ldyBBcnJheUxpc3Q8RTE+KHRoaXMuY29tcG9uZW50Q1ZNcy5rZXlTZXQoKSk7Ci0JCWZvciAoRTEgc291cmNlIDogY29weSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2Uoc291cmNlLCBOdWxsTGlzdC48RTI+aW5zdGFuY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgY2hhbmdlZDsKLQkgKiByZWJ1aWxkIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRTb3VyY2VzKCk7Ci0JCXRoaXMuYWRkQWxsQ29tcG9uZW50U291cmNlcygpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRvIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gdHJhbnNmb3JtKEUxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgaGFkIGl0ZW1zIGFkZGVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaW50IGl0ZW1zU2l6ZSA9IGV2ZW50LmdldEl0ZW1zU2l6ZSgpOwotCQl0aGlzLnNpemUgKz0gaXRlbXNTaXplOwotCi0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCWNvbXBvbmVudENvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoY29tcG9uZW50Q29sbGVjdGlvbi5zaXplKCkgKyBpdGVtc1NpemUpOwotCi0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCksIGNvbXBvbmVudENvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgaGFkIGl0ZW1zIHJlbW92ZWQ7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2l6ZSAtPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBjb21wb25lbnRDb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIHdhcyBjbGVhcmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMgYnkgY2xlYXJpbmcgb3V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50Q29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQodGhpcy5jb21wb25lbnRDVk0oZXZlbnQpKTsKLQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKFZBTFVFUywgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyBjaGFuZ2VkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMgYnkgY2xlYXJpbmcgb3V0IHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvbGxlY3Rpb24gYW5kIHRoZW4gcmVidWlsZGluZyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9ucy5nZXQoY29tcG9uZW50Q1ZNKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRJdGVtcyhjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGRDb21wb25lbnRJdGVtcyhjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSkpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4gY29tcG9uZW50Q1ZNKENvbGxlY3Rpb25FdmVudCBldmVudCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMDE3YjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byBjb252ZXJ0IGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IHRvIHlldCBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LiBUaGlzIGNvbXBvc2l0ZSBsaXN0IGNvbnRhaW5zCi0gKiB0aGUgY29tYmluZWQgaXRlbXMgZnJvbSBhbGwgdGhlc2UgY29tcG9uZW50IGxpc3RzLgotICogPHA+Ci0gKiBUZXJtaW5vbG9neTo8dWw+Ci0gKiA8bGk+PGVtPnNvdXJjZXM8L2VtPiAtIHRoZSBpdGVtcyBpbiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsOyB0aGVzZQotICogICAgYXJlIGNvbnZlcnRlZCBpbnRvIGNvbXBvbmVudCBMVk1zIGJ5IHRoZSB0cmFuc2Zvcm1lcgotICogPGxpPjxlbT5jb21wb25lbnQgTFZNczwvZW0+IC0gdGhlIGNvbXBvbmVudCBsaXN0IHZhbHVlIG1vZGVscyB0aGF0IGFyZSBjb21iaW5lZAotICogICAgYnkgdGhpcyBjb21wb3NpdGUgbGlzdCB2YWx1ZSBtb2RlbAotICogPGxpPjxlbT5pdGVtczwvZW0+IC0gdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk1zCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8RTEsIEUyPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEUxPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RTI+Ci17Ci0JLyoqCi0JICogVGhpcyBpcyB0aGUgKG9wdGlvbmFsKSB1c2VyLXN1cHBsaWVkIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMKLQkgKiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgbGlzdCB0byBsaXN0IHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyOwotCi0JLyoqCi0JICogQ2FjaGUgb2YgdGhlIHNvdXJjZXMsIGNvbXBvbmVudCBMVk1zLCBsaXN0cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbmZvPiBpbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oKTsKLQlwcm90ZWN0ZWQgY2xhc3MgSW5mbyB7Ci0JCS8vIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lcgotCQlmaW5hbCBFMSBzb3VyY2U7Ci0JCS8vIHRoZSBsaXN0IHZhbHVlIG1vZGVsIGdlbmVyYXRlZCBieSB0aGUgdHJhbnNmb3JtZXIKLQkJZmluYWwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTTsKLQkJLy8gY2FjaGUgb2YgdGhlIGl0ZW1zIGhlbGQgYnkgdGhlIGNvbXBvbmVudCBMVk0KLQkJZmluYWwgQXJyYXlMaXN0PEUyPiBpdGVtczsKLQkJLy8gdGhlIGNvbXBvbmVudCBMVk0ncyBiZWdpbm5pbmcgaW5kZXggd2l0aGluIHRoZSBjb21wb3NpdGUgTFZNCi0JCWludCBiZWdpbjsKLQkJcHJvdGVjdGVkIEluZm8oRTEgc291cmNlLCBMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNLCBBcnJheUxpc3Q8RTI+IGl0ZW1zLCBpbnQgYmVnaW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMuY29tcG9uZW50TFZNID0gY29tcG9uZW50TFZNOwotCQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCQkJdGhpcy5iZWdpbiA9IGJlZ2luOwotCQl9Ci0JfQotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGNvbXBvbmVudCBsaXN0IHZhbHVlIG1vZGVscy4gKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjb21wb25lbnRMVk1MaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgY29tcG9zaXRlIGxpc3QuICovCi0JcHJpdmF0ZSBpbnQgc2l6ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwuIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmPHVsPgotCSAqIDxsaT4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbCBhbHJlYWR5IGNvbnRhaW5zIG90aGVyCi0JICogICAgICAgbGlzdCB2YWx1ZSBtb2RlbHMsIG9yCi0JICogPGxpPiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShFMSl9Ci0JICogICAgICAgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lci5OdWxsLjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+Pmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCQl0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyID0gdGhpcy5idWlsZENvbXBvbmVudExWTUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0LiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoRTEuLi4gbGlzdCkgewotCQl0aGlzKG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFMT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKEUxW10gbGlzdCwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudExpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbXBvbmVudCBMVk0gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gdGhpcy5zaXplKSkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgdGhpcy5zaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgaW5mbyBsaXN0Ci0JCWZvciAoaW50IGkgPSB0aGlzLmluZm9MaXN0LnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChpKTsKLQkJCWlmIChpbmRleCA+PSBpbmZvLmJlZ2luKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMuZ2V0KGluZGV4IC0gaW5mby5iZWdpbik7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOyAgLy8gc29tZXRoaW5nIGlzIHdhY2sKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEUyPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8RTI+KHRoaXMuYnVpbGRMaXN0c0l0ZXJhdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFMj4+IGJ1aWxkTGlzdHNJdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8SW5mbywgTGlzdEl0ZXJhdG9yPEUyPj4odGhpcy5pbmZvTGlzdC5saXN0SXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEUyPiB0cmFuc2Zvcm0oSW5mbyBpbmZvKSB7Ci0JCQkJcmV0dXJuIGluZm8uaXRlbXMubGlzdEl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmxpc3RJdGVyYXRvcigpLCB0aGlzLnNpemUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMubGlzdEhvbGRlciwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgZmlyZSBldmVudAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBzdG9wIGxpc3RlbmluZyB0byB0aGUgY29tcG9uZW50IExWTXMuLi4KLQkJZm9yIChJbmZvIGluZm8gOiB0aGlzLmluZm9MaXN0KSB7Ci0JCQlpbmZvLmNvbXBvbmVudExWTS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQl9Ci0JCS8vIC4uLmFuZCBjbGVhciB0aGUgY2FjaGUKLQkJdGhpcy5pbmZvTGlzdC5jbGVhcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBhZGRlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogQWRkIGluZm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2VzIHRvIG91ciBjYWNoZS4KLQkgKiBGaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiByZXF1ZXN0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50U291cmNlcyhpbnQgYWRkZWRTb3VyY2VzSW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYWRkZWRTb3VyY2VzLCBpbnQgYWRkZWRTb3VyY2VzU2l6ZSwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJQXJyYXlMaXN0PEluZm8+IG5ld0luZm9MaXN0ID0gbmV3IEFycmF5TGlzdDxJbmZvPihhZGRlZFNvdXJjZXNTaXplKTsKLQkJLy8gdGhlICdpdGVtcycgYXJlIGVpdGhlciB0YWNrZWQgb24gdG8gdGhlIGVuZCBvcgotCQkvLyBhdCB0aGUgJ2JlZ2luJyBpbmRleCBvZiB0aGUgZmlyc3QgJ2luZm8nIHRoYXQgaXMgYmVpbmcgcHVzaGVkIGJhY2sKLQkJaW50IG5ld0l0ZW1zSW5kZXggPSAoYWRkZWRTb3VyY2VzSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQoYWRkZWRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCi0JCWludCBiZWdpbiA9IG5ld0l0ZW1zSW5kZXg7Ci0JCWZvciAoRTEgc291cmNlIDogYWRkZWRTb3VyY2VzKSB7Ci0JCQlMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNID0gdGhpcy50cmFuc2Zvcm0oc291cmNlKTsKLQkJCWNvbXBvbmVudExWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGNvbXBvbmVudExWTS5zaXplKCkpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpdGVtcywgY29tcG9uZW50TFZNLmxpc3RJdGVyYXRvcigpKTsKLQkJCW5ld0luZm9MaXN0LmFkZChuZXcgSW5mbyhzb3VyY2UsIGNvbXBvbmVudExWTSwgaXRlbXMsIGJlZ2luKSk7Ci0JCQliZWdpbiArPSBpdGVtcy5zaXplKCk7Ci0JCX0KLQkJdGhpcy5pbmZvTGlzdC5hZGRBbGwoYWRkZWRTb3VyY2VzSW5kZXgsIG5ld0luZm9MaXN0KTsKLQkJaW50IG5ld0l0ZW1zU2l6ZSA9IGJlZ2luIC0gbmV3SXRlbXNJbmRleDsKLQkJdGhpcy5zaXplICs9IG5ld0l0ZW1zU2l6ZTsKLQotCQkvLyBidW1wIHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBwdXNoZWQgYmFjayBieSB0aGUgaW5zZXJ0Ci0JCWludCBtb3ZlZEluZm9zSW5kZXggPSBhZGRlZFNvdXJjZXNJbmRleCArIGFkZGVkU291cmNlc1NpemU7Ci0JCWZvciAoaW50IGkgPSBtb3ZlZEluZm9zSW5kZXg7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBuZXdJdGVtc1NpemU7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IG5ld0l0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4obmV3SXRlbXNTaXplKTsKLQkJCWZvciAoaW50IGkgPSBhZGRlZFNvdXJjZXNJbmRleDsgaSA8IG1vdmVkSW5mb3NJbmRleDsgaSsrKSB7Ci0JCQkJbmV3SXRlbXMuYWRkQWxsKHRoaXMuaW5mb0xpc3QuZ2V0KGkpLml0ZW1zKTsKLQkJCX0KLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIG5ld0l0ZW1zSW5kZXgsIG5ld0l0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZW1vdmVkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRTb3VyY2VzKGludCByZW1vdmVkU291cmNlc0luZGV4LCBpbnQgcmVtb3ZlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgcmVtb3ZlZEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldChyZW1vdmVkU291cmNlc0luZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVkU291cmNlc0luZGV4ID0gcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZTsKLQkJaW50IG1vdmVkSXRlbXNJbmRleCA9IChtb3ZlZFNvdXJjZXNJbmRleCA9PSB0aGlzLmluZm9MaXN0LnNpemUoKSkgPyB0aGlzLnNpemUgOiB0aGlzLmluZm9MaXN0LmdldChtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gbW92ZWRJdGVtc0luZGV4IC0gcmVtb3ZlZEl0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCUxpc3Q8SW5mbz4gc3ViTGlzdCA9IHRoaXMuaW5mb0xpc3Quc3ViTGlzdChyZW1vdmVkU291cmNlc0luZGV4LCByZW1vdmVkU291cmNlc0luZGV4ICsgcmVtb3ZlZFNvdXJjZXNTaXplKTsKLQkJQXJyYXlMaXN0PEluZm8+IHJlbW92ZWRJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oc3ViTGlzdCk7ICAvLyBtYWtlIGEgY29weQotCQlzdWJMaXN0LmNsZWFyKCk7Ci0KLQkJLy8gZGVjcmVtZW50IHRoZSAnYmVnaW4nIGluZGV4IGZvciBhbGwgdGhlIGluZm9zIHRoYXQgd2VyZSBtb3ZlZCBmb3J3YXJkIGJ5IHRoZSBkZWxldGVzCi0JCWZvciAoaW50IGkgPSByZW1vdmVkU291cmNlc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCi0JCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJcmVtb3ZlZEluZm8uY29tcG9uZW50TFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX1ZBTFVFUywgdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lcik7Ci0JCX0KLQotCQlpZiAoZmlyZUV2ZW50KSB7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHJlbW92ZWRJdGVtc1NpemUpOwotCQkJZm9yIChJbmZvIHJlbW92ZWRJbmZvIDogcmVtb3ZlZEluZm9MaXN0KSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZEFsbChyZW1vdmVkSW5mby5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIHJlbW92ZWRJdGVtc0luZGV4LCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIHJlcGxhY2VkOyB1cGRhdGUgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIFJlcGxhY2VkIGNvbXBvbmVudCBzb3VyY2VzIHdpbGwgbm90ICh0eXBpY2FsbHkpIG1hcCB0byBhIHNldCBvZiByZXBsYWNlZAotCSAqIGl0ZW1zLCBzbyB3ZSByZW1vdmUgYW5kIGFkZCB0aGUgY29ycmVzcG9uZGluZyBsaXN0cyBvZiBpdGVtcywgcmVzdWx0aW5nIGluCi0JICogdHdvIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlQ29tcG9uZW50U291cmNlcyhpbnQgcmVwbGFjZWRTb3VyY2VzSW5kZXgsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gbmV3U291cmNlcywgaW50IHJlcGxhY2VkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKHJlcGxhY2VkU291cmNlc0luZGV4LCBuZXdTb3VyY2VzLCByZXBsYWNlZFNvdXJjZXNTaXplLCBmaXJlRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb3ZlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVDb21wb25lbnRTb3VyY2VzKGludCB0YXJnZXRTb3VyY2VzSW5kZXgsIGludCBzb3VyY2VTb3VyY2VzSW5kZXgsIGludCBtb3ZlZFNvdXJjZXNMZW5ndGgsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCWludCBzb3VyY2VJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQoc291cmNlU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgbmV4dFNvdXJjZVNvdXJjZUluZGV4ID0gc291cmNlU291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgbmV4dFNvdXJjZUl0ZW1JbmRleCA9IChuZXh0U291cmNlU291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFNvdXJjZVNvdXJjZUluZGV4KS5iZWdpbjsKLQkJaW50IG1vdmVJdGVtc0xlbmd0aCA9IG5leHRTb3VyY2VJdGVtSW5kZXggLSBzb3VyY2VJdGVtc0luZGV4OwotCi0JCWludCB0YXJnZXRJdGVtc0luZGV4ID0gLTE7Ci0JCWlmIChzb3VyY2VTb3VyY2VzSW5kZXggPiB0YXJnZXRTb3VyY2VzSW5kZXgpIHsKLQkJCS8vIG1vdmUgZnJvbSBoaWdoIHRvIGxvdyBpbmRleAotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHRhcmdldFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCX0gZWxzZSB7Ci0JCQkvLyBtb3ZlIGZyb20gbG93IHRvIGhpZ2ggaW5kZXggKGhpZ2hlciBpdGVtcyBtb3ZlIGRvd24gZHVyaW5nIG1vdmUpCi0JCQlpbnQgbmV4dFRhcmdldFNvdXJjZUluZGV4ID0gdGFyZ2V0U291cmNlc0luZGV4ICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQkJdGFyZ2V0SXRlbXNJbmRleCA9IChuZXh0VGFyZ2V0U291cmNlSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobmV4dFRhcmdldFNvdXJjZUluZGV4KS5iZWdpbjsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0YXJnZXRJdGVtc0luZGV4IC0gbW92ZUl0ZW1zTGVuZ3RoOwotCQl9Ci0KLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5pbmZvTGlzdCwgdGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgsIG1vdmVkU291cmNlc0xlbmd0aCk7Ci0KLQkJLy8gdXBkYXRlIHRoZSAnYmVnaW4nIGluZGV4ZXMgb2YgYWxsIHRoZSBhZmZlY3RlZCAnaW5mb3MnCi0JCWludCBtaW4gPSBNYXRoLm1pbih0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCk7Ci0JCWludCBtYXggPSBNYXRoLm1heCh0YXJnZXRTb3VyY2VzSW5kZXgsIHNvdXJjZVNvdXJjZXNJbmRleCkgKyBtb3ZlZFNvdXJjZXNMZW5ndGg7Ci0JCWludCBiZWdpbiA9IE1hdGgubWluKHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgpOwotCQlmb3IgKGludCBpID0gbWluOyBpIDwgbWF4OyBpKyspIHsKLQkJCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpOwotCQkJaW5mby5iZWdpbiA9IGJlZ2luOwotCQkJYmVnaW4gKz0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX1ZBTFVFUywgdGFyZ2V0SXRlbXNJbmRleCwgc291cmNlSXRlbXNJbmRleCwgbW92ZUl0ZW1zTGVuZ3RoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGNsZWFyZWQ7IGNsZWFyIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNsZWFyQ29tcG9uZW50U291cmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ29tcG9uZW50U291cmNlcygpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKDAsIHRoaXMuaW5mb0xpc3Quc2l6ZSgpLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBmaXJlIGV2ZW50Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgY2hhbmdlZDsgcmVidWlsZCBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBuZXdTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKG5ld1NpemUgPT0gMCkgewotCQkJdGhpcy5jbGVhckNvbXBvbmVudFNvdXJjZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvbGRTaXplID0gdGhpcy5pbmZvTGlzdC5zaXplKCk7Ci0JCWlmIChvbGRTaXplID09IDApIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcygwLCB0aGlzLmxpc3RIb2xkZXIsIG5ld1NpemUsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBtaW4gPSBNYXRoLm1pbihuZXdTaXplLCBvbGRTaXplKTsKLQkJLy8gaGFuZGxlIHJlcGxhY2VkIHNvdXJjZXMgaW5kaXZpZHVhbGx5IHNvIHdlIGRvbid0IGZpcmUgZXZlbnRzIGZvciB1bmNoYW5nZWQgc291cmNlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlFMSBuZXdTb3VyY2UgPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpOwotCQkJRTEgb2xkU291cmNlID0gdGhpcy5pbmZvTGlzdC5nZXQoaSkuc291cmNlOwotCQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG5ld1NvdXJjZSwgb2xkU291cmNlKSkgewotCQkJCXRoaXMucmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoaSwgbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFMT4obmV3U291cmNlKSwgMSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG5ld1NpemUgPCBvbGRTaXplKSB7Ci0JCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMobWluLCBvbGRTaXplIC0gbmV3U2l6ZSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3U2l6ZSA+IG9sZFNpemUKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKG1pbiwgdGhpcy5idWlsZFN1Ykxpc3RIb2xkZXIobWluKSwgbmV3U2l6ZSAtIG9sZFNpemUsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBidWlsZFN1Ykxpc3RIb2xkZXIoaW50IGZyb21JbmRleCkgewotCQlpbnQgbGlzdEhvbGRlclNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLCBsaXN0SG9sZGVyU2l6ZSkuc3ViTGlzdChmcm9tSW5kZXgsIGxpc3RIb2xkZXJTaXplKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBidWlsZFN1Ykxpc3RIb2xkZXIoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxpc3RIb2xkZXJTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJcmV0dXJuICgoZnJvbUluZGV4ID09IDApICYmICh0b0luZGV4ID09IGxpc3RIb2xkZXJTaXplKSkgPwotCQkJCXRoaXMubGlzdEhvbGRlciA6Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLCBsaXN0SG9sZGVyU2l6ZSkuc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIGxpc3QgdmFsdWUgbW9kZWwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8RTI+IHRyYW5zZm9ybShFMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgTFZNLgotCSAqLwotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihMaXN0VmFsdWVNb2RlbDxFMj4gY29tcG9uZW50TFZNKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJaWYgKHRoaXMuaW5mb0xpc3QuZ2V0KGkpLmNvbXBvbmVudExWTSA9PSBjb21wb25lbnRMVk0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGNvbXBvbmVudCBMVk06ICIgKyBjb21wb25lbnRMVk0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGV2ZW50J3MgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4Rm9yKExpc3RFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5pbmRleE9mKHRoaXMuZ2V0Q29tcG9uZW50TFZNKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50SXRlbXMoY29tcG9uZW50TFZNSW5kZXgsIHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KSwgZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21wb25lbnRJdGVtcyhpbnQgY29tcG9uZW50TFZNSW5kZXgsIEluZm8gaW5mbywgaW50IGFkZGVkSXRlbXNJbmRleCwgSXRlcmFibGU8RTI+IGFkZGVkSXRlbXMsIGludCBhZGRlZEl0ZW1zU2l6ZSkgewotCQkvLyB1cGRhdGUgdGhlIGFmZmVjdGVkICdiZWdpbicgaW5kaWNlcwotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gKz0gYWRkZWRJdGVtc1NpemU7Ci0JCX0KLQkJdGhpcy5zaXplICs9IGFkZGVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGluZm8uaXRlbXMsIGFkZGVkSXRlbXNJbmRleCwgYWRkZWRJdGVtcywgYWRkZWRJdGVtc1NpemUpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIGFkZGVkSXRlbXNJbmRleCwgaW5mby5pdGVtcy5zdWJMaXN0KGFkZGVkSXRlbXNJbmRleCwgYWRkZWRJdGVtc0luZGV4ICsgYWRkZWRJdGVtc1NpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyB1cGRhdGUgdGhlIGFmZmVjdGVkICdiZWdpbicgaW5kaWNlcwotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJaW50IHJlbW92ZWRJdGVtc1NpemUgPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0JCX0KLQkJdGhpcy5zaXplIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJaW50IGl0ZW1JbmRleCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWluZm8uaXRlbXMuc3ViTGlzdChpdGVtSW5kZXgsIGl0ZW1JbmRleCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKS5jbGVhcigpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIGNoYW5nZXMgdG8gdGhlICdiZWdpbicgaW5kaWNlcyBvciBzaXplCi0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJZm9yIChFMiBpdGVtIDogdGhpcy5nZXRDb21wb25lbnRJdGVtcyhldmVudCkpIHsKLQkJCWluZm8uaXRlbXMuc2V0KGkrKywgaXRlbSk7Ci0JCX0KLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIG9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gY2hhbmdlcyB0byB0aGUgJ2JlZ2luJyBpbmRpY2VzIG9yIHNpemUKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUoaW5mby5pdGVtcywgZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgaW5mby5iZWdpbikpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGxpc3RzIHdhcyBjbGVhcmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJdGhpcy5jbGVhckNvbXBvbmVudExpc3QoY29tcG9uZW50TFZNSW5kZXgsIHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJDb21wb25lbnRMaXN0KGludCBjb21wb25lbnRMVk1JbmRleCwgSW5mbyBpbmZvKSB7Ci0JCS8vIHVwZGF0ZSB0aGUgYWZmZWN0ZWQgJ2JlZ2luJyBpbmRpY2VzCi0JCWludCByZW1vdmVkSXRlbXNTaXplID0gaW5mby5pdGVtcy5zaXplKCk7Ci0JCWlmIChyZW1vdmVkSXRlbXNTaXplID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlBcnJheUxpc3Q8RTI+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oaW5mby5pdGVtcyk7ICAvLyBtYWtlIGEgY29weQotCQlpbmZvLml0ZW1zLmNsZWFyKCk7Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4sIGl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0cyBjaGFuZ2VkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZSBieSBzeW5jaHJvbml6aW5nIHRoZSBhcHByb3ByaWF0ZQotCSAqIGxpc3QgYW5kIGZpcmluZyB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudExpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCi0JCWludCBuZXdJdGVtc1NpemUgPSBpbmZvLmNvbXBvbmVudExWTS5zaXplKCk7Ci0JCWlmIChuZXdJdGVtc1NpemUgPT0gMCkgewotCQkJdGhpcy5jbGVhckNvbXBvbmVudExpc3QoY29tcG9uZW50TFZNSW5kZXgsIGluZm8pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9sZEl0ZW1zU2l6ZSA9IGluZm8uaXRlbXMuc2l6ZSgpOwotCQlpZiAob2xkSXRlbXNTaXplID09IDApIHsKLQkJCXRoaXMuYWRkQ29tcG9uZW50SXRlbXMoY29tcG9uZW50TFZNSW5kZXgsIGluZm8sIDAsIGluZm8uY29tcG9uZW50TFZNLCBuZXdJdGVtc1NpemUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG1pbiA9IE1hdGgubWluKG5ld0l0ZW1zU2l6ZSwgb2xkSXRlbXNTaXplKTsKLQkJLy8gaGFuZGxlIHJlcGxhY2VkIGl0ZW1zIGluZGl2aWR1YWxseSBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyBmb3IgdW5jaGFuZ2VkIGl0ZW1zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCUUyIG5ld0l0ZW0gPSBpbmZvLmNvbXBvbmVudExWTS5nZXQoaSk7Ci0JCQlFMiBvbGRJdGVtID0gaW5mby5pdGVtcy5zZXQoaSwgbmV3SXRlbSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4gKyBpLCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJfQotCi0JCWludCBkZWx0YSA9IG5ld0l0ZW1zU2l6ZSAtIG9sZEl0ZW1zU2l6ZTsKLQkJaWYgKGRlbHRhID09IDApIHsgIC8vIG5ld0l0ZW1zU2l6ZSA9PSBvbGRJdGVtc1NpemUKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiArPSBkZWx0YTsKLQkJfQotCQl0aGlzLnNpemUgKz0gZGVsdGE7Ci0KLQkJaWYgKGRlbHRhIDwgMCkgeyAgLy8gbmV3SXRlbXNTaXplIDwgb2xkSXRlbXNTaXplCi0JCQlMaXN0PEUyPiBzdWJMaXN0ID0gaW5mby5pdGVtcy5zdWJMaXN0KG5ld0l0ZW1zU2l6ZSwgb2xkSXRlbXNTaXplKTsKLQkJCUFycmF5TGlzdDxFMj4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oc3ViTGlzdCk7ICAvLyBtYWtlIGEgY29weQotCQkJc3ViTGlzdC5jbGVhcigpOwotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luICsgbmV3SXRlbXNTaXplLCByZW1vdmVkSXRlbXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gbmV3SXRlbXNTaXplID4gb2xkSXRlbXNTaXplCi0JCUFycmF5TGlzdDxFMj4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGRlbHRhKTsKLQkJZm9yIChpbnQgaSA9IG9sZEl0ZW1zU2l6ZTsgaSA8IG5ld0l0ZW1zU2l6ZTsgaSsrKSB7Ci0JCQlhZGRlZEl0ZW1zLmFkZChpbmZvLmNvbXBvbmVudExWTS5nZXQoaSkpOwotCQl9Ci0JCWluZm8uaXRlbXMuYWRkQWxsKGFkZGVkSXRlbXMpOwotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luICsgb2xkSXRlbXNTaXplLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEUyPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEUyPiBnZXRDb21wb25lbnRMVk0oTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoTGlzdFZhbHVlTW9kZWw8RTI+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTRjMDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gYWRhcHRzIGEKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gaG9sZGluZyBvdGhlciB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXMKLSAqIHRvIGEgc2luZ2xlIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjb21wb25lbnQgdmFsdWVzCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBtdXN0IG5vdCBjb250YWluIGFueSBkdXBsaWNhdGVzCi0gKiBvciB0aGlzIGNsYXNzIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjb21wb25lbnQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIHNvIHdlIGNhbiBzdG9wIGxpc3RlbmluZyB0bwotCSAqIHRoZW0gd2hlbiB0aGV5IGFyZSByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElkZW50aXR5SGFzaEJhZzxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGNvbXBvbmVudFBWTXMgPSAKLQkJCW5ldyBJZGVudGl0eUhhc2hCYWc8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PigpOwotCi0JLyoqCi0JICogTGlzdGVuIHRvIGV2ZXJ5IHByb3BlcnR5IHZhbHVlIG1vZGVsIGluIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqIElmIG9uZSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBvdXIgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8+Li4uIGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoY29sbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBldmVudCBjYW4gYmUgdXNlZCB0byBpbXByb3ZlCi0JICogdGhlIHBlcmZvcm1hbmNlIG9mIGJ1aWxkaW5nIGEgbmV3IHZhbHVlIChlLmcuIHNvbWUgcHJvcGVydHkgY2hhbmdlcyBtYXkKLQkgKiBub3QgbmVjZXNzaXRhdGUgdGhlIHJlLWNhbGN1bGF0aW9uIG9mIHRoZSB2YWx1ZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsXygpOwotCQl0aGlzLmFkZENvbXBvbmVudFBWTXModGhpcy5nZXRDb2xsZWN0aW9uTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiB2b2lkIGFkZENvbXBvbmVudFBWTXMoSXRlcmFibGU8RT4gcHZtcykgewotCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBlYWNoIDogcHZtcykgewotCQkJdGhpcy5jb21wb25lbnRQVk1zLmFkZChlYWNoKTsKLQkJCWVhY2guYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbF8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IHZvaWQgcmVtb3ZlQ29tcG9uZW50UFZNcyhJdGVyYWJsZTxFPiBwdm1zKSB7Ci0JCWZvciAoUHJvcGVydHlWYWx1ZU1vZGVsPD8+IGVhY2ggOiBwdm1zKSB7Ci0JCQllYWNoLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLmNvbXBvbmVudFBWTXMucmVtb3ZlKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJc3VwZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFBWTXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQlzdXBlci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29tcG9uZW50UFZNcygpIHsKLQkJLy8gY29weSB0aGUgbGlzdCBzbyB3ZSBkb24ndCBlYXQgb3VyIG93biB0YWlsCi0JCUFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4odGhpcy5jb21wb25lbnRQVk1zKTsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKGNvcHkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFBWTXMoKTsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpOwotCQlzdXBlci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH17QGNvZGU8PyBleHRlbmRzIH17QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTw/Pj59LgotCSAqLwotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gZ2V0Q29sbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSB0aGlzLmNvbGxlY3Rpb25Nb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8+Pn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9e0Bjb2RlPD8gZXh0ZW5kcyB9e0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8Pz4+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwMTYxNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHdyYXBwZXIgZXh0ZW5kcyBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gKG9yIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0pCi0gKiB3aXRoIGZpeGVkIGNvbGxlY3Rpb25zIG9mIGl0ZW1zIG9uIGVpdGhlciBlbmQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEJlIGNhcmVmdWwgdXNpbmcgb3Igd3JhcHBpbmcgdGhpcyBsaXN0IHZhbHVlIG1vZGVsLCBzaW5jZSB0aGUKLSAqICJleHRlbmRlZCIgaXRlbXMgbWF5IGJlIHVuZXhwZWN0ZWQgYnkgdGhlIGNsaWVudCBjb2RlIG9yIHdyYXBwZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiB0aGUgaXRlbXMgInByZXBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHByZWZpeDsKLQotCS8qKiB0aGUgaXRlbXMgImFwcGVuZGVkIiB0byB0aGUgd3JhcHBlZCBsaXN0ICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gc3VmZml4OwotCi0KLQkvLyAqKioqKioqKioqIGxvdHMgbycgY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBhbmQgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8RT4oc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBFIHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHByZWZpeCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihFIHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIExpc3Q8PyBleHRlbmRzIEU+IHN1ZmZpeCkgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5wcmVmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgc3VmZml4LgotCSAqLwotCXB1YmxpYyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeCBjb250YWluaW5nIGEgc2luZ2xlIG51bGwgaXRlbS4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChudWxsKTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KAotCQkJdGhpcy5wcmVmaXgubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksCi0JCQl0aGlzLnN1ZmZpeC5saXN0SXRlcmF0b3IoKQotCQkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJaW50IHByZWZpeFNpemUgPSB0aGlzLnByZWZpeC5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHByZWZpeFNpemUpIHsKLQkJCXJldHVybiB0aGlzLnByZWZpeC5nZXQoaW5kZXgpOwotCQl9IGVsc2UgaWYgKGluZGV4ID49IHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWZmaXguZ2V0KGluZGV4IC0gKHByZWZpeFNpemUgKyB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCAtIHByZWZpeFNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcmVmaXguc2l6ZSgpICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSArIHRoaXMuc3VmZml4LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJQXJyYXlMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuc2l6ZSgpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5wcmVmaXgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJbGlzdC5hZGRBbGwodGhpcy5zdWZmaXgpOwotCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsV3JhcHBlciBpbXBsZW1lbnRhdGlvbi9vdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOyAgLy8gbm90ICJjbGVhcmVkIgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFByZWZpeChMaXN0PEU+IHByZWZpeCkgewotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1ZmZpeChMaXN0PEU+IHN1ZmZpeCkgewotCQl0aGlzLnN1ZmZpeCA9IHN1ZmZpeDsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxFPiBidWlsZExpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RJdGVyYXRvcl8oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlZmQ0Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9Ci0gKiB0byBkZXRlcm1pbmUgd2hpY2ggaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIHJldHVybmVkIGJ5IGNhbGxzCi0gKiB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9LgotICogPHA+Ci0gKiBUaGUgZmlsdGVyIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lOyBhbGxvd2luZyB0aGUgc2FtZQotICogYWRhcHRlciB0byBiZSB1c2VkIHdpdGggZGlmZmVyZW50IGZpbHRlciBjcml0ZXJpYSAoZS5nLiB3aGVuIHRoZSB1c2VyCi0gKiB3YW50cyB0byB2aWV3IGEgbGlzdCBvZiA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMpLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiB0aGUgb2JqZWN0cyBpbiB0aGUgImZpbHRlcmVkIiBjb2xsZWN0aW9uIGNhbiBjaGFuZ2UgaW4gc3VjaCBhIHdheQotICogdGhhdCB0aGV5IHNob3VsZCBiZSByZW1vdmVkIGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiwgeW91IHdpbGwKLSAqIG5lZWQgdG8gd3JhcCB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiBpbiBhbiB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0uCi0gKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbHRlciBvbmx5ICJhY2NlcHRzIiBpdGVtcyB3aG9zZSBuYW1lcyBiZWdpbgotICogd2l0aCAiWCIgYW5kIHRoZSBuYW1lcyBvZiB0aGUgaXRlbXMgY2FuIGNoYW5nZSwgeW91IHdpbGwgbmVlZCB0bwotICogd3JhcCB0aGUgb3JpZ2luYWwgbGlzdCBvZiB1bmZpbHRlcmVkIGl0ZW1zIHdpdGggYW4KLSAqIHtAbGluayBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyB0byBlYWNoCi0gKiBpdGVtJ3MgbmFtZSBhbmQgZmlyZXMgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IHdoZW5ldmVyIGFuIGl0ZW0ncyBuYW1lCi0gKiBjaGFuZ2VzLiBUaGUgZXZlbnQgd2lsbCBjYXVzZSB0aGlzIHdyYXBwZXIgdG8gcmUtZmlsdGVyIHRoZSBjaGFuZ2VkCi0gKiBpdGVtIGFuZCBhZGQgb3IgcmVtb3ZlIGl0IGZyb20gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBhcyBhcHByb3ByaWF0ZS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoaXMgZmlsdGVycyB0aGUgaXRlbXMgaW4gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgRmlsdGVyPEU+IGZpbHRlcjsKLQotCS8qKiBDYWNoZSB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBmaWx0ZXIgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248RT4gZmlsdGVyZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIEZpbHRlci5OdWxsLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpLCBmaWx0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLmZpbHRlcmVkSXRlbXMpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyZWRJdGVtcy5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMvaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIG91ciBjYWNoZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24sCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLmZpbHRlcih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjYWNoZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbgotCQl0aGlzLmZpbHRlcmVkSXRlbXMuY2xlYXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkvLyBmaWx0ZXIgdGhlIHZhbHVlcyBiZWZvcmUgcHJvcGFnYXRpbmcgdGhlIGNoYW5nZSBldmVudAotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZmlsdGVyKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSwgdGhpcy5maWx0ZXJlZEl0ZW1zLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gKm5vdCogZmlsdGVyIHRoZSB2YWx1ZXMsIGJlY2F1c2UgdGhleSBtYXkgbm8gbG9uZ2VyIGJlCi0JCS8vICJhY2NlcHRlZCIgYW5kIHRoYXQgbWlnaHQgYmUgd2h5IHRoZXkgd2VyZSByZW1vdmVkIGluIHRoZSBmaXJzdCBwbGFjZTsKLQkJLy8gYW55d2F5LCBhbnkgZXh0cmFuZW91cyBpdGVtcyBhcmUgaGFybWxlc3MKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGV2ZW50LmdldEl0ZW1zKCksIHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVidWlsZEZpbHRlcmVkSXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGFuZ2UgdGhlIGZpbHRlciBhbmQgcmVidWlsZCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoRmlsdGVyPEU+IGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQkJdGhpcy5yZWJ1aWxkRmlsdGVyZWRJdGVtcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSB0aGF0IGZpbHRlcnMgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZmlsdGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEU+KGl0ZW1zLCB0aGlzLmZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGNhY2hlIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkRmlsdGVyZWRJdGVtcygpIHsKLQkJdGhpcy5maWx0ZXJlZEl0ZW1zLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLmZpbHRlcih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmZpbHRlcmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZmlsdGVyZWRJdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjkzNTgyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9Ci0gKiB0byBkZXRlcm1pbmUgd2hlbiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBieSBjYWxscwotICogdG8ge0BsaW5rICNnZXRWYWx1ZSgpfS4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfSwgYSBzdWJjbGFzcwotICogY2FuIG92ZXJyaWRlIHtAbGluayAjYWNjZXB0KFQpfS4KLSAqIDxwPgotICogT25lLCBwb3NzaWJseSB1bmRlc2lyYWJsZSwgc2lkZS1lZmZlY3Qgb2YgdXNpbmcgdGhpcyB2YWx1ZSBtb2RlbCBpcyB0aGF0Ci0gKiBpdCBtdXN0IHJldHVybiAqc29tZXRoaW5nKiBhcyB0aGUgdmFsdWUuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCi0gKiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gd2hlbmV2ZXIgdGhlIHdyYXBwZWQgdmFsdWUgaXMgbm90ICJhY2NlcHRlZCIsCi0gKiB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBhbmQvb3Igb3ZlcnJpZGRlbiAoe0BsaW5rICNnZXREZWZhdWx0VmFsdWUoKX0pLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgRmlsdGVyPFQ+IGZpbHRlcjsKLQlwcm90ZWN0ZWQgZmluYWwgVCBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjYWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgRmlsdGVyLkRpc2FibGVkLjxUPmluc3RhbmNlKCksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIGZpbHRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgZmlsdGVyLCBhbmQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIEZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlclZhbHVlKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVQgZXZlbnRPbGRWYWx1ZSA9IChUKSBldmVudC5nZXRPbGRWYWx1ZSgpOwotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKGV2ZW50T2xkVmFsdWUpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJVCBldmVudE5ld1ZhbHVlID0gKFQpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuZmlsdGVyVmFsdWUoZXZlbnROZXdWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzICJhY2NlcHRlZCIgc2ltcGx5IHJldHVybiBpdCwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBUIGZpbHRlclZhbHVlKFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXB0KHZhbHVlKSA/IHZhbHVlIDogdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHNob3VsZAotCSAqIHJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGZyb20gYSBjYWxsIHRvCi0JICoge0BsaW5rICNnZXRWYWx1ZSgpfTsgdGhlIHZhbHVlIGNhbWUKLQkgKiBmcm9tIHRoZSBuZXN0ZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXIuYWNjZXB0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBpZgotCSAqIHRoZSBuZXN0ZWQgdmFsdWUgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFQgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWVhYzBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBCaWRpRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjZ2V0VmFsdWUoKSBnZXRWYWx1ZSgpfSBhbmQgbW9kaWZpZWQgYnkgY2FsbHMgdG8KLSAqIHtAbGluayAjc2V0VmFsdWUoVCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBCaWRpRmlsdGVyfSwgYSBzdWJjbGFzcwotICogY2FuIG92ZXJyaWRlIHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjYWNjZXB0KFQpIGFjY2VwdChUKX0gYW5kIHtAbGluayAjcmV2ZXJzZUFjY2VwdChUKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4gKHtAbGluayBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwjZ2V0RGVmYXVsdFZhbHVlKCkgZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqIDxwPgotICogU2ltaWxhcmx5LCBpZiBhbiBpbmNvbWluZyB2YWx1ZSBpcyBub3QgInJldmVyc2UgYWNjZXB0ZWQiLCA8ZW0+bm90aGluZzwvZW0+Ci0gKiB3aWxsIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciwgbm90IGV2ZW4gPGNvZGU+bnVsbDwvY29kZT4uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjYWNjZXB0KFQpfSBhbmQge0BsaW5rICNyZXZlcnNlQWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSwgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICNhY2NlcHQoVCl9IGFuZCB7QGxpbmsgI3JldmVyc2VBY2NlcHQoVCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBCaWRpRmlsdGVyfS4KLQkgKiA8ZW0+YW5kPC9lbT4geW91IG5lZWQgdG8gc3BlY2lmeQotCSAqIGEgZGVmYXVsdCB2YWx1ZSBvdGhlciB0aGFuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgVCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgQmlkaUZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgZmlsdGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLCBmaWx0ZXIsIGFuZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgQmlkaUZpbHRlcjxUPiBmaWx0ZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJaWYgKHRoaXMucmV2ZXJzZUFjY2VwdCh2YWx1ZSkpIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZmlsdGVyaW5nIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsCi0JICogc2hvdWxkIHBhc3MgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRvIHRoZSBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBpbiBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgI3NldFZhbHVlKFQpfS4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpbHRlcigpLnJldmVyc2VBY2NlcHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFQ+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIGJpZGlyZWN0aW9uYWwgZmlsdGVyLgotCSAqLwotCXByb3RlY3RlZCBCaWRpRmlsdGVyPFQ+IGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIChCaWRpRmlsdGVyPFQ+KSB0aGlzLmZpbHRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZmODE4My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBsaXN0IHZhbHVlIG1vZGVsIHRoYXQgcHJvdmlkZXMgYmVoYXZpb3IgZm9yIHdyYXBwaW5nIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogKG9yIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0pIGFuZCBsaXN0ZW5pbmcgZm9yIGNoYW5nZXMgdG8gYXNwZWN0cyBvZiB0aGUKLSAqIDxlbT5pdGVtczwvZW0+IGhlbGQgYnkgdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pLiBDaGFuZ2VzIHRvIHRoZSBhY3R1YWwgbGlzdAotICogKG9yIGNvbGxlY3Rpb24pIGFyZSBhbHNvIG1vbml0b3JlZC4KLSAqIAotICogVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IGFkZGluZwotICogb3IgcmVtb3ZpbmcgaXRlbXMgb3IgdGhlIGl0ZW1zIHRoZW1zZWx2ZXMgbWlnaHQgY2hhbmdlIGluIGEgZmFzaGlvbiB0aGF0Ci0gKiBtaWdodCBjaGFuZ2UgdGhlIGxpc3Qgb3IgY29sbGVjdGlvbidzIGV4dGVybmFsIGFwcGVhcmFuY2UuCi0gKiAKLSAqIFN1YmNsYXNzZXMgbmVlZCB0byBvdmVycmlkZSB0d28gbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VJdGVtXyhNb2RlbCl9PHA+Ci0gKiAgICAgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtIGFuZCBjYWxsCi0gKiAgICAge0BsaW5rICNpdGVtQXNwZWN0Q2hhbmdlZChFdmVudE9iamVjdCl9IHdoZW5ldmVyIHRoZSBhc3BlY3QgY2hhbmdlcwotICogPGxpPntAbGluayAjZGlzZW5nYWdlSXRlbV8oTW9kZWwpfTxwPgotICogICAgIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHNwZWNpZmllZCBpdGVtCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCi0JLyoqCi0JICogTWFpbnRhaW4gYSBjb3VudGVyIGZvciBlYWNoIG9mIHRoZSBpdGVtcyBpbiB0aGUKLQkgKiB3cmFwcGVkIGxpc3QgaG9sZGVyIHdlIGFyZSBsaXN0ZW5pbmcgdG8uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElkZW50aXR5SGFzaE1hcDxFLCBTaW1wbGVJbnRSZWZlcmVuY2U+IGNvdW50ZXJzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb3VudGVycyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8RSwgU2ltcGxlSW50UmVmZXJlbmNlPigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGNvbGxlY3Rpb24gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgYW5kIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5lbmdhZ2VBbGxJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUFsbEl0ZW1zKCkgewotCQl0aGlzLmVuZ2FnZUl0ZW1zKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbXMoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCWZvciAoRSBpdGVtIDogaXRlbXMpIHsKLQkJCXRoaXMuZW5nYWdlSXRlbShpdGVtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW0oRSBpdGVtKSB7Ci0JCS8vIGxpc3RlbiB0byBlYWNoIGl0ZW0gb25seSBvbmNlCi0JCVNpbXBsZUludFJlZmVyZW5jZSBjb3VudGVyID0gdGhpcy5jb3VudGVycy5nZXQoaXRlbSk7Ci0JCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCWNvdW50ZXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCQl0aGlzLmNvdW50ZXJzLnB1dChpdGVtLCBjb3VudGVyKTsKLQkJCXRoaXMuZW5nYWdlSXRlbV8oKE1vZGVsKSBpdGVtKTsKLQkJfQotCQljb3VudGVyLmluY3JlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIgYW5kIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxJdGVtcygpOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUFsbEl0ZW1zKCkgewotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbXMoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zKSB7Ci0JCWZvciAoRSBpdGVtIDogaXRlbXMpIHsKLQkJCXRoaXMuZGlzZW5nYWdlSXRlbShpdGVtKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW0oRSBpdGVtKSB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIGVhY2ggaXRlbSBvbmx5IG9uY2UKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXJzLmdldChpdGVtKTsKLQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgewotCQkJLy8gc29tZXRoaW5nIGlzIHdyb25nIGlmIHRoaXMgaGFwcGVucy4uLiAgfmJqdgotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBjb3VudGVyOiAiICsgaXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoY291bnRlci5kZWNyZW1lbnQoKSA9PSAwKSB7Ci0JCQl0aGlzLmNvdW50ZXJzLnJlbW92ZShpdGVtKTsKLQkJCXRoaXMuZGlzZW5nYWdlSXRlbV8oKE1vZGVsKSBpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIEZvcndhcmQgdGhlIGV2ZW50IGFuZCBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFkZGVkIGl0ZW1zLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMsIGZvcndhcmQgdGhlIGV2ZW50LAotCSAqIGFuZCBiZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIGFkZGVkIGl0ZW1zLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCQl0aGlzLmVuZ2FnZUl0ZW1zKHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE5vIG5lZWQgdG8gY2hhbmdlIGFueSBsaXN0ZW5lcnM7IGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZC4KLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgcmVtb3ZlZCBpdGVtcyBhbmQgZm9yd2FyZCB0aGUgZXZlbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzKTsKLQkJdGhpcy5jb3VudGVycy5jbGVhcigpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgaGFzIGNoYW5nZWQgaW4gc29tZSBkcmFtYXRpYyBmYXNoaW9uLgotCSAqIFJlY29uZmlndXJlIG91ciBsaXN0ZW5lcnMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB3ZSBzaG91bGQgb25seSBuZWVkIHRvIGRpc2VuZ2FnZSBlYWNoIGl0ZW0gb25jZS4uLgotCQkvLyBtYWtlIGEgY29weSB0byBwcmV2ZW50IGEgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCQlDb2xsZWN0aW9uPEU+IGtleXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMuY291bnRlcnMua2V5U2V0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZUl0ZW1zKGtleXMpOwotCQl0aGlzLmNvdW50ZXJzLmNsZWFyKCk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQkJdGhpcy5lbmdhZ2VBbGxJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVtIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlbSBoYXMgYSBib3VuZCBwcm9wZXJ0eSB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZS4gVGhlIGxpc3RlbmVycyB3aWxsIGhhdmUgdG8gZGV0ZXJtaW5lCi0JICogd2hldGhlciB0aGUgaXRlbSBhc3BlY3QgY2hhbmdlIGlzIHNpZ25pZmljYW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1Bc3BlY3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFdmVudE9iamVjdCBldmVudCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjgxN2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU2ltcGxlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIGFsbCBvZiB0aGUgY2hhbmdlcwotICogb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VMaXN0ZW5lciBpdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzk3MzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBjb2xsZWN0aW9uCi0gKiBhc3BlY3RzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIGl0ZW1zJyBjb2xsZWN0aW9ucyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gY29sbGVjdGlvbk5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBDb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtQ29sbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBDb2xsZWN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIGNvbGxlY3Rpb25OYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBjb2xsZWN0aW9uTmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIENvbGxlY3Rpb24gYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBjb2xsZWN0aW9uIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25OYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQlpdGVtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJaXRlbS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWNhYzJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgbGlzdAotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGxpc3ROYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gTGlzdCBhc3BlY3RzLgotCSAqLwotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy5pdGVtTGlzdExpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1MaXN0TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBsaXN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCB0aGUgTGlzdCBhc3BlY3QgaGFzIAotCSAqIGNoYW5nZWQuICBEbyB0aGUgc2FtZSB0aGluZyBubyBtYXR0ZXIgd2hpY2ggZXZlbnQgb2NjdXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtTGlzdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBsaXN0IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJaXRlbS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMuaXRlbUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBhMzY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiBwcm9wZXJ0aWVzIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgcHJvcGVydGllcyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcuLi4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBwcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5wcm9wZXJ0eU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMuaXRlbVByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRjNWVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaXRlbVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgaXRlbSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuaXRlbVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gc3RhdGUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0uYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWl0ZW0ucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWU1YTk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgdHJlZQotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgdHJlZSB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gdHJlZU5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgaXRlbVRyZWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmVlTmFtZXMgPSB0cmVlTmFtZXM7Ci0JCXRoaXMuaXRlbVRyZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtVHJlZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmVlTmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGZhY3QgdGhhdCBhIHRyZWUgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbVRyZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gdHJlZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJaXRlbS5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMuaXRlbVRyZWVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWViNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzCi0gKiBiYXNpYyBsaXN0IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSBsaXN0cyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI0xJU1RfVkFMVUVTfSBsaXN0LgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9Ci0gKiA8bGk+e0BsaW5rICNnZXQoaW50KX0KLSAqIDxsaT57QGxpbmsgI3NpemVfKCl9Ci0gKiA8bGk+e0BsaW5rICN0b0FycmF5XygpfQotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplKCl9Ci0gKiA8bGk+e0BsaW5rICN0b0FycmF5KCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdEFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBsaXN0cyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfTElTVF9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihTdHJpbmcgbGlzdE5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7bGlzdE5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgbGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFN0cmluZ1tdIGxpc3ROYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgbGlzdE5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMubGlzdE5hbWVzID0gbGlzdE5hbWVzOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiBsaXN0TmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBsaXN0TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2xpc3ROYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIGxpc3QgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIGxpc3QgYXNwZWN0IHRoYXQgZG9lcyBub3QKLQkgKiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhciBzdWJqZWN0OyBidXQgdGhlIHN1YmplY3Qgd2lsbCBjaGFuZ2UsIHJlc3VsdGluZyBpbgotCSAqIGEgbmV3IGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX0xJU1RfTkFNRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBsaXN0IGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBsaXN0IGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoTGlzdEFzcGVjdEFkYXB0ZXIudGhpcy5saXN0TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3ZjIyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5IHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBXZSBrZWVwIGFuIGludGVybmFsIGNvbGxlY3Rpb24gc29tZXdoYXQgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZCBsaXN0LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBsaXN0IHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBsaXN0IHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayBpdGVyYXRvcigpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSBsaXN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIE91ciBpbnRlcm5hbCBjb2xsZWN0aW9uLCB3aGljaCBob2xkcyB0aGUgc2FtZSBlbGVtZW50cyBhcwotCSAqIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIGNvbGxlY3Rpb24gYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBsaXN0Ci0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBjb2xsZWN0aW9uIGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJLy8gdHJ5IHRvIHByZXZlbnQgYmFja2Rvb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBsaXN0Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxFPih0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5zaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGNvbGxlY3Rpb24gKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY29sbGVjdGlvbiB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlcgotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmc/IG1vdmluZyBpdGVtcyBpbiBhIGxpc3QgaGFzIG5vIG5ldCBlZmZlY3Qgb24gYSBjb2xsZWN0aW9uLi4uCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHB1dCBpbiBlbXB0eSBjaGVjayBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyB1bm5lY2Vzc2FyaWx5Ci0JCWlmICggISB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFZBTFVFUyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgY29sbGVjdGlvbiB3aXRoIHRoZSB3cmFwcGVkIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5saXN0SG9sZGVyLnNpemUoKSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIHRoaXMuY29sbGVjdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQkJCXRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb2xsZWN0aW9uKCkgewotCQkvLyBpZiB0aGUgbmV3IGxpc3QgaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbihzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29sbGVjdGlvbihpbnQgc2l6ZSkgewotCQl0aGlzLmNvbGxlY3Rpb24uZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb24uYWRkKGVhY2gpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTM2MzhiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RBZGFwdGVyfSBwcm92aWRlcyBsaXN0IGNoYW5nZSBzdXBwb3J0Ci0gKiBieSBhZGFwdGluZyBhIHN1YmplY3QncyBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHRvIGEgbWluaW11bSBzZXQKLSAqIG9mIGxpc3QgY2hhbmdlIGV2ZW50cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RDdXJhdG9yPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8Uz4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIEhvdyB0aGUgbGlzdCBsb29rZWQgYmVmb3JlIHRoZSBsYXN0IHN0YXRlIGNoYW5nZSAqLwotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PEU+IHJlY29yZDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgbGlzdGVucyBmb3IgdGhlIHN1YmplY3QncyBzdGF0ZSB0byBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q3VyYXRvcihTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFM+KHN1YmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjdXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyLgotCSAqIFRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnJlY29yZCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgZG8gaW52ZW50b3J5IGFuZCByZXBvcnQgdG8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q3VyYXRvci50aGlzLnN1Ym1pdEludmVudG9yeVJlcG9ydCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic3RhdGUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5nZXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgbWFuaWZlc3RhdGlvbiBvZiB0aGUgc3ViamVjdCdzIGxpc3QgYXNwZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gTElTVF9WQUxVRVM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYXNwZWN0IGhhcyBjaGFuZ2VkLCBub3RpZnkgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMucmVjb3JkKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIGFkZCBvdXIgbGlzdGVuZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdCwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnJlY29yZCwgdGhpcy5pdGVyYXRvckZvclJlY29yZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIHJlbW92ZSBvdXIgbGlzdGVuZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgc3ViamVjdAotCQl0aGlzLnJlY29yZC5jbGVhcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0Q3VyYXRvciBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGRpZmZlcmVudCBmcm9tIHtAbGluayBMaXN0VmFsdWVNb2RlbCNpdGVyYXRvcigpfS4KLQkgKiBJdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgd2hlbiB0aGUgc3ViamVjdCBjaGFuZ2VzIG9yIHRoZQotCSAqIHN1YmplY3QncyAic3RhdGUiIGNoYW5nZXMgKGFzIHNpZ25pZmllZCBieSBhIHN0YXRlIGNoYW5nZSBldmVudCkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPEU+IGl0ZXJhdG9yRm9yUmVjb3JkKCk7Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0Jdm9pZCBzdWJtaXRJbnZlbnRvcnlSZXBvcnQoKSB7Ci0JCUxpc3Q8RT4gbmV3UmVjb3JkID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5pdGVyYXRvckZvclJlY29yZCgpKTsKLQkJaW50IHJlY29yZEluZGV4ID0gMDsKLQotCQkvLyBhZGQgaXRlbXMgZnJvbSB0aGUgbmV3IHJlY29yZAotCQlmb3IgKEUgbmV3SXRlbSA6IG5ld1JlY29yZCkgewotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJCXJlY29yZEluZGV4Kys7Ci0JCX0KLQotCQkvLyBjbGVhbiBvdXQgaXRlbXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHRoZSBuZXcgcmVjb3JkCi0JCWZvciAocmVjb3JkSW5kZXggPSAwOyByZWNvcmRJbmRleCA8IHRoaXMucmVjb3JkLnNpemUoKTsgKSB7Ci0JCQlFIGl0ZW0gPSB0aGlzLnJlY29yZC5nZXQocmVjb3JkSW5kZXgpOwotCi0JCQlpZiAobmV3UmVjb3JkLmNvbnRhaW5zKGl0ZW0pKSB7Ci0JCQkJcmVjb3JkSW5kZXgrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgaXRlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW52ZW50b3J5TmV3SXRlbShpbnQgcmVjb3JkSW5kZXgsIEUgbmV3SXRlbSkgewotCQlMaXN0PEU+IHJlYyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5yZWNvcmQpOwotCi0JCWlmICgocmVjb3JkSW5kZXggPCByZWMuc2l6ZSgpKSAmJiByZWMuZ2V0KHJlY29yZEluZGV4KS5lcXVhbHMobmV3SXRlbSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocmVjLmNvbnRhaW5zKG5ld0l0ZW0pKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tSW52ZW50b3J5KHJlY29yZEluZGV4LCByZWMuZ2V0KHJlY29yZEluZGV4KSk7Ci0JCQl0aGlzLmludmVudG9yeU5ld0l0ZW0ocmVjb3JkSW5kZXgsIG5ld0l0ZW0pOwotCQl9IGVsc2UgewotCQkJdGhpcy5hZGRJdGVtVG9JbnZlbnRvcnkocmVjb3JkSW5kZXgsIG5ld0l0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1Ub0ludmVudG9yeShpbnQgaW5kZXgsIEUgaXRlbSkgewotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIHRoaXMucmVjb3JkLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUl0ZW1Gcm9tSW52ZW50b3J5KGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgaXRlbSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5yZWNvcmQsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnJlY29yZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNmNzEwNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIGxpc3QgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGxpc3QgdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwMWEzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBsaXN0IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBwcm9wYWdhdGUKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLXsKLQkvKiogVGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0VmFsdWVNb2RlbFdyYXBwZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0T2xkSXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRPbGRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExMDYxYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHJlYWQtb25seSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgY29sbGVjdGlvbi4gSW4gcGFydGljdWxhciwgdGhpcwotICogaXMgdXNlZnVsIGZvciB0aGUgbGVhZiBub2RlcyBvZiBhIHRyZWUgdGhhdCBuZXZlciBoYXZlCi0gKiBjaGlsZHJlbi4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODAxY2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGVtcHR5IGxpc3QgdmFsdWUgbW9kZWwgZm9yIHdoZW4geW91IGRvbid0Ci0gKiBuZWVkIHRvIHN1cHBvcnQgYSBsaXN0LgotICogPHA+Ci0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIEVNUFRZX0FSUkFZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDQ1ZDk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGEgdmFsdWUuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNGI5NjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFRyZWVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSB0cmVlIHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdQotICogZG9uJ3QgbmVlZCB0byBzdXBwb3J0IGFueSBub2Rlcy4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsVHJlZVZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFRyZWVWYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBOdWxsVHJlZVZhbHVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gbm9kZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjdhNzM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSBzdGFuZGFyZCBwcm9wZXJ0aWVzIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjVkFMVUV9IHByb3BlcnR5LgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyfSk6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZV8oKX0KLSAqIDxsaT57QGxpbmsgI3NldFZhbHVlXyhPYmplY3QpfQotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfQotICogPGxpPntAbGluayAjc2V0VmFsdWUoT2JqZWN0KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBWPgotCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxTLCBWPgotewotCS8qKiBUaGUgbmFtZSBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnRpZXMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9QUk9QRVJUWV9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgb2YgdGhlIHN1YmplY3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7cHJvcGVydHlOYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoU3RyaW5nW10gcHJvcGVydHlOYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgcHJvcGVydHlOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXM7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdCBob2xkZXIKLQkgKiBhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlciwgQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBwcm9wZXJ0eU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1twcm9wZXJ0eU5hbWVzLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIHByb3BlcnR5IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBwcm9wZXJ0eSBhc3BlY3QgdGhhdCBkb2VzIG5vdAotCSAqIGNoYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIHN1YmplY3Q7IGJ1dCB0aGUgc3ViamVjdCB3aWxsIGNoYW5nZSwgcmVzdWx0aW5nIGluCi0JICogYSBuZXcgcHJvcGVydHkuIChBIHtAbGluayBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbH0gY291bGQgYWxzbyBiZQotCSAqIHVzZWQgaW4gdGhpcyBzaXR1YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgRU1QVFlfUFJPUEVSVFlfTkFNRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgc3ViamVjdCdzIHByb3BlcnR5IGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoUHJvcGVydHlBc3BlY3RBZGFwdGVyLnRoaXMucHJvcGVydHlOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIHByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNDMyYWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGNvbGxlY3Rpb24KLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQkJLy8gcG9zdHBvbmUgYnVpbGRpbmcgdGhlIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgdmFsdWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgYW4gZXF1aXZhbGVudAotCSAqIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCUUgZXZlbnROZXdWYWx1ZSA9IChFKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCVByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50TmV3VmFsdWUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMuaXRlcmF0b3JfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgdmFsdWUgd2l0aCB0aGUgd3JhcHBlZCB2YWx1ZQotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoRSBuZXdWYWx1ZSkgewotCQlFIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJLy8gd2Ugd291bGRuJ3QgZ2V0IHRoZSBldmVudCBpZiB0aGUgbmV3IHZhbHVlIHdlcmUgbnVsbCB0b28KLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWQUxVRVMsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBvbGRWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIHdvdWxkbid0IGdldCB0aGUgZXZlbnQgaWYgdGhlIG5ldyB2YWx1ZSB3YXMgdGhlIHNhbWUgYXMgdGhlIG9sZAotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKG5ld1ZhbHVlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmYTNjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgcmVhZC1vbmx5LCBzaW5nbGUtZWxlbWVudCB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgY29sbGVjdGlvbiB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGZvcndhcmRzIGFueSBldmVudHMgZmlyZWQgYnkgdGhlIHZhbHVlIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCi0JLyoqIENhY2hlIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgRSB2YWx1ZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRvIGEgbGlzdAotCSAqIHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh2YWx1ZUhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXI7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHZhbHVlIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBsaXN0IGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlFIGV2ZW50TmV3VmFsdWUgPSAoRSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQlQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudE5ld1ZhbHVlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8KLQkJCQkJRW1wdHlMaXN0SXRlcmF0b3IuPEU+aW5zdGFuY2UoKQotCQkJCToKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IHRoaXMuYnVpbGRJT09CRShpbmRleCwgMCk7Ci0JCX0KLQkJaWYgKGluZGV4ID4gMCkgewotCQkJdGhyb3cgdGhpcy5idWlsZElPT0JFKGluZGV4LCAxKTsKLQkJfQotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IEVNUFRZX09CSkVDVF9BUlJBWSA6IG5ldyBPYmplY3RbXSB7dGhpcy52YWx1ZX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGJ1aWxkSU9PQkUoaW50IGluZGV4LCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkluZGV4OiAiICsgaW5kZXggKyAiLCBTaXplOiAiICsgc2l6ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgdmFsdWUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSB2YWx1ZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJRSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChMSVNUX1ZBTFVFUywgMCwgbmV3VmFsdWUpOwotCQl9IGVsc2UgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgMCwgb2xkVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIDAsIG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MWI4NWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBwcm9wYWdhdGUKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUKLSAqIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICN2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHByb3BhZ2F0ZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWx1ZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsLiBUaGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVj4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJlZ2luIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnZhbHVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2Y3Yjk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBhY3R1YWxseQotICogLi4uIDxlbT5pc24ndDwvZW0+IC4uLiB3cml0YWJsZS4gIEl0IGNhbiBob3dldmVyIGJlIHVzZWQgaW4gcGxhY2VzIHRoYXQgcmVxdWlyZSBhIAotICoge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSBhbmQgd2hlcmUgdGhlIGRldmVsb3BlciBpcyBzdXJlIHRoYXQgbm8gCi0gKiBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byB3cml0ZSB0byBpdC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQ+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCXB1YmxpYyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDcyMmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+U2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHJldHVybnMgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCi0gKiBvbmx5IG9uY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgZmluYWwgSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+KGxpc3RIb2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbiwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBjYWNoZSB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBuZXN0ZWQgY29sbGVjdGlvbgotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFPihldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCWludCB1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJCWlmICh0aGlzLmJhZy51bmlxdWVDb3VudCgpID4gdW5pcXVlQ291bnQpIHsKLQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJQXJyYXlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlpbnQgdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpZiAodGhpcy5iYWcucmVtb3ZlKGl0ZW0pKSB7Ci0JCQkJaWYgKHRoaXMuYmFnLnVuaXF1ZUNvdW50KCkgPCB1bmlxdWVDb3VudCkgewotCQkJCQl1bmlxdWVDb3VudCA9IHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JCQkJCXJlbW92ZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGl0ZW06ICIgKyBpdGVtKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5iYWcsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgbmV3IEhhc2hTZXQ8RT4odGhpcy5iYWcpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0ZWVjMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbn0KLSAqIHRoYXQgc2ltcGx5IGhvbGRzIGEgY29sbGVjdGlvbiBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4sIENvbGxlY3Rpb248RT4KLXsKLQkvKiogVGhlIGNvbGxlY3Rpb24uICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggYW4gZW1wdHkgaW5pdGlhbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbEl0ZXJhdG9yPEU+KHRoaXMuY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHRoZSBjb2xsZWN0aW9uJ3MgZWxlbWVudHMgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbi5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuY29sbGVjdGlvbiwgdmFsdWVzKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VCBleHRlbmRzIE9iamVjdD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi50b0FycmF5KGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihvLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihjLCB0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvIGluc3RhbmNlb2YgQ29sbGVjdGlvbjw/PikgJiYgKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PikpIHsKLQkJCUNvbGxlY3Rpb248RT4gYzEgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlDb2xsZWN0aW9uPEU+IGMyID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oKChDb2xsZWN0aW9uPEU+KSBvKS5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBjMS5lcXVhbHMoYzIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKS5oYXNoQ29kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhdG9yICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCB0aGlzLm5leHQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDk0M2Y5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVMaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCB7QGxpbmsgTGlzdH0gdGhhdCBzaW1wbHkgaG9sZHMgYQotICogbGlzdCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWw8RT4sIExpc3Q8RT4KLXsKLQkvKiogVGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3Q8RT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBTaW1wbGVMaXN0VmFsdWVNb2RlbChMaXN0PEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggYW4gZW1wdHkgaW5pdGlhbCBsaXN0LgotCSAqLwotCXB1YmxpYyBTaW1wbGVMaXN0VmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0PEU+KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgTElTVF9WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxJdGVyYXRvcjxFPih0aGlzLmxpc3QuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbG93IHRoZSBsaXN0J3MgZWxlbWVudHMgdG8gYmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiBsaXN0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgbGlzdCk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheSgpOwotCX0KLQotCXB1YmxpYyA8VCBleHRlbmRzIE9iamVjdD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KGEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvTGlzdChvLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KG8sIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0KGMsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmNsZWFyTGlzdCh0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKChvIGluc3RhbmNlb2YgTGlzdDw/PikgJiYgKG8gaW5zdGFuY2VvZiBMaXN0VmFsdWVNb2RlbDw/PikpIHsKLQkJCUxpc3Q8RT4gbDEgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3QpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaXN0PEU+IGwyID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoKChMaXN0PEU+KSBvKS5pdGVyYXRvcigpKTsKLQkJCXJldHVybiBsMS5lcXVhbHMobDIpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIEUgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXJldHVybiB0aGlzLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIGVsZW1lbnQsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGVsZW1lbnQsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXB1YmxpYyBFIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5sYXN0SW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KSk7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQkvLyBUT0RPIGhtbW0gIH5ianYKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhIHNpbmdsZSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE1vdmUgYSBzdWItbGlzdCBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubW92ZUl0ZW1zSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSByYW5nZSBvZiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBMaXN0PEU+IGVsZW1lbnRzKSB7Ci0JCXRoaXMuc2V0SXRlbXNJbkxpc3QoaW5kZXgsIGVsZW1lbnRzLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBpbmRleCA9IC0xOwotCQlwcml2YXRlIFQgbmV4dDsKLQotCQlMb2NhbEl0ZXJhdG9yKEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMuaW5kZXgrKzsKLQkJCXJldHVybiB0aGlzLm5leHQ7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5pbmRleCwgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yOwotCQlwcml2YXRlIGludCBsYXN0ID0gLTE7Ci0JCXByaXZhdGUgaW50IG5leHQgPSAwOwotCQlwcml2YXRlIFQgY3VycmVudDsKLQotCQlMb2NhbExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCQkJdGhpcy5sYXN0ID0gdGhpcy5uZXh0Kys7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUIHByZXZpb3VzKCkgewotCQkJdGhpcy5jdXJyZW50ID0gdGhpcy5pdGVyYXRvci5wcmV2aW91cygpOwotCQkJdGhpcy5sYXN0ID0gLS10aGlzLm5leHQ7Ci0JCQlyZXR1cm4gdGhpcy5jdXJyZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBzZXQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCBvLCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCBhZGQoVCBvKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZChvKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1BZGRlZChMSVNUX1ZBTFVFUywgdGhpcy5uZXh0LCBvKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKExJU1RfVkFMVUVTLCB0aGlzLmxhc3QsIHRoaXMuY3VycmVudCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0ZDFjNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gdGhhdCBzaW1wbHkgaG9sZHMgb24gdG8gYW4KLSAqIG9iamVjdCBhbmQgdXNlcyBpdCBhcyB0aGUgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JLyoqIFRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgVCB2YWx1ZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbChUIHZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIGEgc3RhcnRpbmcgdmFsdWUgb2YgbnVsbC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFZBTFVFKTsKLQl9Ci0KLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCVQgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZCwgdmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxZmY0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfQotICogKG9yIHtAbGluayBMaXN0VmFsdWVNb2RlbH0pIGJlaGF2ZSBsaWtlIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogdGhhdCBrZWVwcyBpdHMgY29udGVudHMgc29ydGVkIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLSAqIDxwPgotICogVGhlIHtAbGluayBDb21wYXJhdG9yfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzb3J0IGNyaXRlcmlhIChlLmcuIHdoZW4gdGhlIHVzZXIKLSAqIHdhbnRzIHRvIHNvcnQgYSBsaXN0IG9mIGZpbGVzIGZpcnN0IGJ5IG5hbWUsIHRoZW4gYnkgZGF0ZSwgdGhlbiBieSBzaXplKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZQotICogdW5wcmVkaWN0YWJsZSB3aGVuZXZlcgotICogd2UgZG8gbm90IGhhdmUgYW55IGxpc3RlbmVycy4gVGhpcyBzaG91bGQgbm90IGJlIHRvbyBwYWluZnVsIHNpbmNlLAotICogbW9zdCBsaWtlbHksIGNsaWVudCBvYmplY3RzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKiAKLSAqIEBzZWUgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLXsKLQkvKioKLQkgKiBBIGNvbXBhcmF0b3IgdXNlZCBmb3Igc29ydGluZyB0aGUgZWxlbWVudHM7Ci0JICogaWYgaXQgaXMgbnVsbCwgd2UgdXNlICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvbXBhcmF0b3IuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlciwgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIGJhc2VkIG9uIHRoZSBlbGVtZW50cycgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHNldENvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU29ydCB0aGUgaW50ZXJuYWwgbGlzdCBiZWZvcmUgdGhlIHN1cGVyY2xhc3MKLQkgKiBzZW5kcyBvdXQgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZExpc3QoaW50IHNpemUpIHsKLQkJc3VwZXIuYnVpbGRMaXN0KHNpemUpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IHRoZSBsaXN0IGFmdGVyIGFkZGluZyB0aGUgaXRlbXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFycmF5TGlzdDxFPiBuZXdMaXN0ID0gKEFycmF5TGlzdDxFPikgdGhpcy5saXN0LmNsb25lKCk7Ci0JCW5ld0xpc3QuZW5zdXJlQ2FwYWNpdHkobmV3TGlzdC5zaXplKCkgKyBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobmV3TGlzdCwgdGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG5ld0xpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYnVpbGRTeW5jTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0aGlzLmNvbXBhcmF0b3IsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIHNvcnQgdGhlIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLCBpZiBuZWNlc3Nhcnk7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc29ydExpc3QoKSB7Ci0JCS8vIHNhdmUgdGhlIHVuc29ydGVkIHN0YXRlIG9mIHRoZSBzb3J0ZWQgbGlzdCBzbyB3ZSBjYW4gbWluaW1pemUgdGhlIG51bWJlciBvZiAicmVwbGFjZWQiIGl0ZW1zCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBcnJheUxpc3Q8RT4gdW5zb3J0ZWRMaXN0ID0gKEFycmF5TGlzdDxFPikgdGhpcy5saXN0LmNsb25lKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5saXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCQlSYW5nZSBkaWZmUmFuZ2UgPSBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UodW5zb3J0ZWRMaXN0LCB0aGlzLmxpc3QpOwotCQlpZiAoZGlmZlJhbmdlLnNpemUgPiAwKSB7Ci0JCQlMaXN0PEU+IHVuc29ydGVkSXRlbXMgPSB1bnNvcnRlZExpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCUxpc3Q8RT4gc29ydGVkSXRlbXMgPSB0aGlzLmxpc3Quc3ViTGlzdChkaWZmUmFuZ2Uuc3RhcnQsIGRpZmZSYW5nZS5lbmQgKyAxKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9WQUxVRVMsIGRpZmZSYW5nZS5zdGFydCwgc29ydGVkSXRlbXMsIHVuc29ydGVkSXRlbXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE0ZjM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSB3cmFwcGVyIHRoYXQga2VlcHMgdGhlIGNvbnRlbnRzIG9mIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBzb3J0ZWQKLSAqIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLSAqIDxwPgotICogVGhlIHtAbGluayBDb21wYXJhdG9yfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBzb3J0IGNyaXRlcmlhIChlLmcuIHdoZW4gdGhlIHVzZXIKLSAqIHdhbnRzIHRvIHNvcnQgYSBsaXN0IG9mIGZpbGVzIGZpcnN0IGJ5IG5hbWUsIHRoZW4gYnkgZGF0ZSwgdGhlbiBieSBzaXplKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogY29sbGVjdGlvbiB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50IG9iamVjdHMgd2lsbCBhbHNvIGJlIGxpc3RlbmVycy4KLSAqIAotICogQHNlZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKgotCSAqIEEgY29tcGFyYXRvciB1c2VkIGZvciBzb3J0aW5nIHRoZSBlbGVtZW50czsKLQkgKiBpZiBpdCBpcyBudWxsLCB3ZSB1c2UgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXByb3RlY3RlZCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3I7Ci0KLQkvKioKLQkgKiBPdXIgaW50ZXJuYWwgbGlzdCwgd2hpY2ggaG9sZHMgdGhlIHNhbWUgZWxlbWVudHMgYXMKLQkgKiB0aGUgd3JhcHBlZCBsaXN0LCBidXQga2VlcHMgdGhlbSBzb3J0ZWQuCi0JICovCi0JLy8gd2UgZGVjbGFyZSB0aGlzIGFuIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNjbG9uZSgpIGFuZCAjZW5zdXJlQ2FwYWNpdHkoaW50KQotCXByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8RT4gc29ydGVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgotCSAqLwotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxFPihsaXN0SG9sZGVyLnNpemUoKSk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBzb3J0ZWQgbGlzdCBhbmQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogYmFzZWQgb24gdGhlIGVsZW1lbnRzJyAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcihMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcikgewotCQl0aGlzKGxpc3RIb2xkZXIsIG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMuc29ydGVkTGlzdCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5zb3J0ZWRMaXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5zb3J0ZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuc29ydGVkTGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgc29ydGVkIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc29ydGVkIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcgotCQl0aGlzLnNvcnRlZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZFNvcnRlZExpc3QoKSB7Ci0JCS8vIGlmIHRoZSBuZXcgbGlzdCBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpbnQgc2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplICE9IDApIHsKLQkJCXRoaXMuYnVpbGRTb3J0ZWRMaXN0KHNpemUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRTb3J0ZWRMaXN0KGludCBzaXplKSB7Ci0JCXRoaXMuc29ydGVkTGlzdC5lbnN1cmVDYXBhY2l0eShzaXplKTsKLQkJZm9yIChFIGVhY2ggOiB0aGlzLmxpc3RIb2xkZXIpIHsKLQkJCXRoaXMuc29ydGVkTGlzdC5hZGQoZWFjaCk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLnNvcnRlZExpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpcnN0IGFkZCB0aGUgaXRlbXMgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLi4uCi0JCXRoaXMuYWRkSXRlbXNUb0xpc3QodGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyAuLi50aGVuIHNvcnQgdGhlIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuc29ydExpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gbm8gc29ydGluZyBuZWVkZWQKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpcnN0IHJlbW92ZSB0aGUgb2xkIGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QodGhpcy5nZXRPbGRJdGVtcyhldmVudCksIHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkvLyB0aGVuIGFkZCB0aGUgbmV3IGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuZ2V0TmV3SXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gLi4udGhlbiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycwotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotICAgIAkvLyBkbyBub3RoaW5nIC0gc29ydCBvcmRlciBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3Qgd2FzIGNsZWFyZWQuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLSAgICAJdGhpcy5jbGVhckxpc3QodGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBoYXMgY2hhbmdlZCBpbiBzb21lIGRyYW1hdGljIGZhc2hpb24uCi0JICogUmVidWlsZCBvdXIgc29ydGVkIGxpc3QgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgc2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplID09IDApIHsKLQkJCWlmICh0aGlzLnNvcnRlZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gbm8gY2hhbmdlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuc29ydGVkTGlzdC5pc0VtcHR5KCkpIHsKLQkJCQl0aGlzLmJ1aWxkU29ydGVkTGlzdChzaXplKTsKLQkJCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCAwLCB0aGlzLnNvcnRlZExpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNvcnRlZExpc3QuY2xlYXIoKTsKLQkJCQl0aGlzLmJ1aWxkU29ydGVkTGlzdChzaXplKTsKLQkJCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5zb3J0ZWRMaXN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNvcnQgdGhlIHNvcnRlZCBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycywgaWYgbmVjZXNzYXJ5OwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRMaXN0KCkgewotCQkvLyBzYXZlIHRoZSB1bnNvcnRlZCBzdGF0ZSBvZiB0aGUgc29ydGVkIGxpc3Qgc28gd2UgY2FuIG1pbmltaXplIHRoZSBudW1iZXIgb2YgInJlcGxhY2VkIiBpdGVtcwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHVuc29ydGVkTGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMuc29ydGVkTGlzdC5jbG9uZSgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMuc29ydGVkTGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJUmFuZ2UgZGlmZlJhbmdlID0gQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKHVuc29ydGVkTGlzdCwgdGhpcy5zb3J0ZWRMaXN0KTsKLQkJaWYgKGRpZmZSYW5nZS5zaXplID4gMCkgewotCQkJTGlzdDxFPiB1bnNvcnRlZEl0ZW1zID0gdW5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQlMaXN0PEU+IHNvcnRlZEl0ZW1zID0gdGhpcy5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfVkFMVUVTLCBkaWZmUmFuZ2Uuc3RhcnQsIHNvcnRlZEl0ZW1zLCB1bnNvcnRlZEl0ZW1zKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuc29ydGVkTGlzdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDE3OWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudDo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBtb2RlbAotICogPC91bD4KLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMKLSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpOjx1bD4KLSAqIDxsaT57QGxpbmsgI3N0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgbW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZCBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0YXRlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMubW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIG1vZGVsJ3Mgc3RhdGUgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NDUyODYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gdGhhdCBjYW4gYmUgdXNlZCBmb3IKLSAqIHJldHVybmluZyBhbiBpdGVyYXRvciBvbiBhIHN0YXRpYyBjb2xsZWN0aW9uLCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSBlbGVtZW50cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsKEUuLi4gZWxlbWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzLmNsb25lKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBlbGVtZW50cykgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gQXJyYXlUb29scy5hcnJheShlbGVtZW50cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMubGVuZ3RoOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJLy8gd2UgY2FuIGNhc3QgaGVyZSBzaW5jZSBvdXIgY29uc3RydWN0b3JzIHJlcXVpcmUgdGhlIGVsZW1lbnRzIHRvIGJlCi0JCS8vIG9mIHR5cGUgRSBhbmQgQXJyYXlJdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJcmV0dXJuIChJdGVyYXRvcjxFPikgbmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0Pih0aGlzLmVsZW1lbnRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcodGhpcy5lbGVtZW50cykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGI2ZjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgc3RhdGljIGxpc3QsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIGVsZW1lbnRzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBlbGVtZW50czsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgbGlzdCB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWwoRS4uLiBlbGVtZW50cykgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gZWxlbWVudHMuY2xvbmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0aWMgbGlzdCB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEU+IGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBBcnJheVRvb2xzLmFycmF5KGVsZW1lbnRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFIGFuZCBBcnJheUl0ZXJhdG9yIGlzIHJlYWQtb25seQotCQlyZXR1cm4gKEl0ZXJhdG9yPEU+KSBuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KHRoaXMuZWxlbWVudHMpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQkvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIG91ciBjb25zdHJ1Y3RvcnMgcmVxdWlyZSB0aGUgZWxlbWVudHMgdG8gYmUKLQkJLy8gb2YgdHlwZSBFIGFuZCBBcnJheUxpc3RJdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJcmV0dXJuIChMaXN0SXRlcmF0b3I8RT4pIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxPYmplY3Q+KHRoaXMuZWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMubGVuZ3RoOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJLy8gd2UgY2FuIGNhc3QgaGVyZSBzaW5jZSBvdXIgY29uc3RydWN0b3JzIHJlcXVpcmUgdGhlIGVsZW1lbnRzIHRvIGJlCi0JCS8vIG9mIHR5cGUgRQotCQlyZXR1cm4gKEUpIHRoaXMuZWxlbWVudHNbaW5kZXhdOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5jbG9uZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKEFycmF5cy50b1N0cmluZyh0aGlzLmVsZW1lbnRzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzhmNWFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYSBzdGF0aWMgdmFsdWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNUcmVlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc2ZTYwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNUcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVHJlZVZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb24gYSBzdGF0aWMgdHJlZSwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY1RyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgdHJlZSdzIG5vZGVzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbm9kZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IHRyZWUgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZXMuCi0JICovCi0JcHVibGljIFN0YXRpY1RyZWVWYWx1ZU1vZGVsKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBub2RlcykgewotCQlzdXBlcigpOwotCQlpZiAobm9kZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5ub2RlcyA9IG5vZGVzOwotCX0KLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5ub2Rlcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5vZGVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyNDFiMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byB0cmFuc2Zvcm0gYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9Ci0gKiAob3IgYWRhcHRlZCB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KSBpbnRvIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIHdob3NlIGl0ZW1zIGFyZSB0cmFuZm9ybWF0aW9ucyBvZiB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQKLSAqIHtAbGluayBMaXN0VmFsdWVNb2RlbH0uIEl0IHdpbGwga2VlcCBpdHMgY29udGVudHMgaW4gc3luY2ggd2l0aAotICogdGhlIGNvbnRlbnRzIG9mIHRoZSB3cmFwcGVkIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gYW5kIG5vdGlmaWVzIGl0cwotICogbGlzdGVuZXJzIG9mIGFueSBjaGFuZ2VzLgotICogPHA+Ci0gKiBUaGUge0BsaW5rIFRyYW5zZm9ybWVyfSBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbnMuCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfSwKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtSXRlbV8oT2JqZWN0KX0gb3IsCi0gKiBpZiBzb21ldGhpbmcgb3RoZXIgdGhhbiBudWxsIHNob3VsZCBiZSByZXR1cm5lZCB3aGVuIHRoZSB3cmFwcGVkIGl0ZW0KLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCi0JLyoqIFRoaXMgdHJhbnNmb3JtcyB0aGUgaXRlbXMsIHVubGVzcyB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfSkuICovCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXI7Ci0KLQkvKiogVGhlIGxpc3Qgb2YgdHJhbnNmb3JtZWQgaXRlbXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8RTI+IHRyYW5zZm9ybWVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtSXRlbV8oT2JqZWN0KX0gb3Ige0BsaW5rICN0cmFuc2Zvcm1JdGVtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfQotCSAqIG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFMT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxFMSwgRTI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RTI+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFMj4odGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgdHJhbnNmb3JtZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIG5ldyBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtTmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgb2xkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1PbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlbXMsIGludCBzaXplKSB7Ci0JCUxpc3Q8RTI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RTI+KHNpemUpOwotCQlmb3IgKEUxIGl0ZW0gOiBpdGVtcykgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtSXRlbShFMSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIGl0ZW0gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgaXRlbSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSB0cmFuc2Zvcm1lciBhbmQgcmVidWlsZCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGNhY2hlIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlciksIHRoaXMudHJhbnNmb3JtZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogVHJhbnNmb3JtIHRoZW0sIGFkZCB0aGVtIHRvIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0LAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGV2ZW50LmdldEluZGV4KCksIHRoaXMudHJhbnNmb3JtSXRlbXMoZXZlbnQpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0Ci0JICogYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogUmVwbGFjZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybU5ld0l0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCXRoaXMubW92ZUl0ZW1zSW5MaXN0KGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdHJhbnNmb3JtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgd3JhcHBlZCBpdGVtIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgaXRlbSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBpdGVtKSB7Ci0JCQlyZXR1cm4gKGl0ZW0gPT0gbnVsbCkgPyBudWxsIDogVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybUl0ZW1fKGl0ZW0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZGFkYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byB0cmFuc2Zvcm0gdGhlIHdyYXBwZWQgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfSwKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxUMSwgVDI+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQxPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQyPgotewotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUcmFuc2Zvcm1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JICAgIFQxIGV2ZW50T2xkVmFsdWUgPSAoVDEpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtT2xkKGV2ZW50T2xkVmFsdWUpOwotCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkgICAgVDEgZXZlbnROZXdWYWx1ZSA9IChUMSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy50cmFuc2Zvcm1OZXcoZXZlbnROZXdWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNnZXRWYWx1ZSgpfSwKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybU9sZChPYmplY3QpfSwgYW5kCi0JICoge0BsaW5rICN0cmFuc2Zvcm1OZXcoT2JqZWN0KX0uCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybShUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkLCBub24tbnVsbCwgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm1fKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUMSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBCeSBkZWZhdWx0LCBjYWxsIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogQnkgZGVmYXVsdCwgY2FsbCB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50KX0uCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdHJhbnNmb3JtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBudWxsLgotCSAqIElmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCBudWxsLCBpdCBpcyB0cmFuc2Zvcm1lZCBieSBhIHN1YmNsYXNzCi0JICogaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsI3RyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCQlwdWJsaWMgVDIgdHJhbnNmb3JtKFQxIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMudHJhbnNmb3JtXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MmQ0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgQmlkaVRyYW5zZm9ybWVyfQotICogdG86PHVsPgotICogPGxpPnRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfQotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICoge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9OwotICogb3IsIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwgb3IgdGhlIG5ldyB2YWx1ZSBpcyBudWxsLCBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfQotICogYW5kIHtAbGluayAjcmV2ZXJzZVRyYW5zZm9ybShPYmplY3QpfS4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGJpZGkgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCaWRpVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVDIgdmFsdWUpIHsKLQkJLy8gInJldmVyc2UtdHJhbnNmb3JtIiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtKFQyIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkucmV2ZXJzZVRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkLCBub24tPGNvZGU+bnVsbDwvY29kZT4sCi0JICogdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVDIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+fSwKLQkgKiBzbyB0aGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPn0sCi0JICogc28gdGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLgotCSAqLwotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBnZXRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIChCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPikgdGhpcy50cmFuc2Zvcm1lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogd3JhcHBlZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICogVGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciB3aWxsIGFsc28gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlIG5ldyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXQgaXMgcmV2ZXJzZS10cmFuc2Zvcm1lZAotCSAqIGJ5IGEgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEJpZGlUcmFuc2Zvcm1lcgotCQlleHRlbmRzIERlZmF1bHRUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+Ci0JewotCQlwdWJsaWMgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucmV2ZXJzZVRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZDFlZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzCi0gKiBiYXNpYyB0cmVlIGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSB0cmVlcyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI05PREVTfSB0cmVlLgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNub2Rlc18oKX0KLSAqIDxsaT57QGxpbmsgI25vZGVzKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJlZUFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyB0cmVlcyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfVFJFRV9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyB0cmVlIGFzcGVjdHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCB0cmVlLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihTdHJpbmcgdHJlZU5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7dHJlZU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgdHJlZXMuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFN0cmluZ1tdIHRyZWVOYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgdHJlZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiB0cmVlTmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCB0cmVlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RyZWVOYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIHRyZWUgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHRyZWUgYXNwZWN0IHRoYXQgZG9lcyBub3QKLQkgKiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhciBzdWJqZWN0OyBidXQgdGhlIHN1YmplY3Qgd2lsbCBjaGFuZ2UsIHJlc3VsdGluZyBpbgotCSAqIGEgbmV3IHRyZWUuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX1RSRUVfTkFNRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyB0cmVlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSB0cmVlIGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy5ub2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZU5vZGVBZGRlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNThjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHRyZWUgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGNvbGxlY3Rpb24gdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI25vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICN0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHRyZWUgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVWYWx1ZU1vZGVsPD8+IHRyZWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgdHJlZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiB0cmVlIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHJlZUhvbGRlciA9IHRyZWVIb2xkZXI7Ci0JCXRoaXMudHJlZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZUFkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHRyZWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy50cmVlSG9sZGVyLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHJlZUhvbGRlcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB0cmVlIGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc2ZDVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9Ci0gKiBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIDxlbT5hc3BlY3RzPC9lbT4gb2YgdGhlIDxlbT52YWx1ZTwvZW0+IGNvbnRhaW5lZAotICogYnkgdGhlIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0uIENoYW5nZXMgdG8gdGhlIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0ncwotICogdmFsdWUgYXJlIGFsc28gbW9uaXRvcmVkLgotICogPHA+Ci0gKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHZhbHVlIHRoYXQgbWF5IGNoYW5nZSwgYnV0IHdob3NlIGFzcGVjdHMgY2FuIGFsc28KLSAqIGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdCBtaWdodCBiZSBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBDbGllbnRzIHdpbGwgbmVlZCB0byBsaXN0ZW4gZm9yIHR3byBkaWZmZXJlbnQgY2hhbmdlIG5vdGlmaWNhdGlvbnM6Ci0gKiBhIHByb3BlcnR5IGNoYW5nZSBldmVudCB3aWxsIGJlIGJlIGZpcmVkIHdoZW4gdGhlIDxlbT52YWx1ZTwvZW0+IGNoYW5nZXM7Ci0gKiBhIHN0YXRlIGNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gYW4gPGVtPmFzcGVjdDwvZW0+IG9mIHRoZSB2YWx1ZSBjaGFuZ2VzLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlVmFsdWVfKCl9PHA+Ci0gKiAgICAgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlIGFuZCBjYWxsCi0gKiAgICAge0BsaW5rICN2YWx1ZUFzcGVjdENoYW5nZWQoKX0gd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAgICAgKHRoaXMgd2lsbCBmaXJlIGEgc3RhdGUgY2hhbmdlIGV2ZW50KQotICogPGxpPntAbGluayAjZGlzZW5nYWdlVmFsdWVfKCl9PHA+Ci0gKiAgICAgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgdmFsdWUKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqIENhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBjYW4gZGlzZW5nYWdlLiBOdWxsIHVudGlsIHdlIGhhdmUgYSBsaXN0ZW5lciovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVBc3BlY3RBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gYWxsb3cgYm90aCBwcm9wZXJ0eSBhbmQgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayBmb3Igc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgfHwgc3VwZXIuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBlbmdhZ2UgYW4gYXNwZWN0IG9mIHRoZSB2YWx1ZSBtb2RlbCdzIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSBhbiBhc3BlY3Qgb2YgdGhlIHZhbHVlIG1vZGVsJ3MgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZV8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byBzb21lIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZV8oKTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gYW4gYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpOwotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuZXZlciB0aGUgdmFsdWUncyBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFY+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGNhOGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBhbGwgdGhlIGFzcGVjdHMKLSAqIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQ2hhbmdlQWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgdmFsdWVBc3BlY3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2hhbmdlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFZhbHVlQ2hhbmdlQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUFzcGVjdExpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQXNwZWN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ2hhbmdlQWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVBc3BlY3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZkZmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdmFsdWVDb2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIGNvbGxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjlhMTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBsaXN0Ci0gKiBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlTGlzdEFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBsaXN0cyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgbGlzdHMuCi0JICovCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy52YWx1ZUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdCBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMudmFsdWVMaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy52YWx1ZUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjZiZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBwcm9wZXJ0aWVzIHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZVByb3BlcnR5QWRhcHRlci50aGlzLnByb3BlcnR5TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMudmFsdWVQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDllNjM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgdmFsdWUgc3RhdGUuCi0JICovCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlYzBhZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiB0cmVlIGFzcGVjdHMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVUcmVlQWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIHRyZWVzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIHZhbHVlVHJlZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVUcmVlQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnZhbHVlVHJlZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlVHJlZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHRyZWUgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudmFsdWVUcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUFkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTYxZDQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgc2luZ2xlLWVsZW1lbnQge0BsaW5rIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgY29sbGVjdGlvbiB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKiBBbHNvLCBvbmx5IGEgc2luZ2xlLWVsZW1lbnQgY29sbGVjdGlvbiBjYW4gYmUgd3JpdHRlbiB0byB0aGUgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIHdyaXRhYmxlCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewotCQlJdGVyYXRvcjxFPiBzdHJlYW0gPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUUgbmV3VmFsdWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tc2luZ2xldG9uIGNvbGxlY3Rpb246ICIgKyB2YWx1ZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gb3VyIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWxzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYzMDg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgc2luZ2xlLWVsZW1lbnQge0BsaW5rIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgbGlzdCB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKiBBbHNvLCBvbmx5IGEgc2luZ2xlLWVsZW1lbnQgbGlzdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JaW1wbGVtZW50cyBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIHdyaXRhYmxlCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiBsaXN0VmFsdWVzKSB7Ci0JCUl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUUgbmV3VmFsdWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tc2luZ2xldG9uIGxpc3Q6ICIgKyBsaXN0VmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8vIG91ciBjb25zdHJ1Y3RvciB0YWtlcyBvbmx5IHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVscwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NjcwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlTdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgUHJvcGVydHlWYWx1ZU1vZGVsLgotICogSXQgbGlzdGVucyBmb3IgdGhlIGFwcHJvcHJpYXRlICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KLSAqIFZBTFVFIHByb3BlcnR5IGNoYW5nZXMuIEl0IGFsc28gYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZQotICogZm9yIHRoZSBQcmVmZXJlbmNlLCB3aGljaCwgYnkgZGVmYXVsdCwgaXMgbnVsbCAoYW5kIGlzIHByb2JhYmx5ICpub3QqIGEgdmVyeQotICogZ29vZCBkZWZhdWx0KS4KLSAqIAotICogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlIGlzIHJldHVybmVkLAotICogdW5jaGFuZ2VkLCBhcyBhIHN0cmluZyBvciBhcyBzb21lIG90aGVyIG9iamVjdCAoZS5nLiBhbiBJbnRlZ2VyKSBieQotICogc2V0dGluZyB0aGUgYWRhcHRlcidzIGNvbnZlcnRlci4gSW50ZXJuYWxseSwgdGhlIHByZWZlcmVuY2UncyB2YWx1ZQotICogaXMgc3RvcmVkIGFzIHRoZSBjb252ZXJ0ZWQgb2JqZWN0OyBhbmQgdGhlIGNvbnZlcnNpb25zIHRha2UgcGxhY2UKLSAqIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhlIHByZWZlcmVuY2VzIG5vZGUgb3IgcmV0cmlldmluZyB0aGUKLSAqIHZhbHVlIGZyb20gYW4gZXZlbnQgZmlyZWQgYnkgdGhlIHByZWZlcmVuY2VzIG5vZGUuCi0gKiAKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIGFkYXB0ZXJzIGJlY2F1c2UgdGhlCi0gKiBjaGFuZ2UgZXZlbnRzIGZpcmVkIG9mZiBieSBhIFByZWZlcmVuY2VzIG5vZGUgYXJlIGFzeW5jaHJvbm91cyBmcm9tCi0gKiB0aGUgY2hhbmdlIGl0c2VsZi4gKEFic3RyYWN0UHJlZmVyZW5jZXMgdXNlcyBhbiBldmVudCBkaXNwYXRjaCBkYWVtb24uKQotICogQXMgYSByZXN1bHQsIGEgY2xpZW50IGNhbiBzZXQgb3VyIHZhbHVlIHdpdGggI3NldFZhbHVlKE9iamVjdCkgYW5kIHdlCi0gKiB3aWxsIHJldHVybiBmcm9tIHRoYXQgbWV0aG9kIGJlZm9yZSB3ZSBldmVyIHJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20KLSAqIHRoZSBQcmVmZXJlbmNlcyBub2RlIHRoYXQgKml0KiBoYXMgY2hhbmdlZC4gVGhpcyBtZWFucyB3ZSBjYW5ub3QKLSAqIHJlbHkgb24gdGhhdCBldmVudCB0byBrZWVwIG91ciBpbnRlcm5hbGx5IGNhY2hlZCB2YWx1ZSBpbiBzeW5jaC4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotewotCS8qKiBUaGUga2V5IHRvIHRoZSBwcmVmZXJlbmNlIHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcga2V5OwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgKG9iamVjdCkgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgdmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAob2JqZWN0KSB2YWx1ZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHByZWZlcmVuY2UncwotCSAqIHN0cmluZyB2YWx1ZSB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpLCBrZXksIGRlZmF1bHRWYWx1ZSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmb3JCb29sZWFuKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCWRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gZm9ySW50ZWdlcihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCUludGVnZXIudmFsdWVPZihkZWZhdWx0VmFsdWUpLAotCQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2UuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5KSB7Ci0JCXRoaXMocHJlZmVyZW5jZXNIb2xkZXIsIGtleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhwcmVmZXJlbmNlc0hvbGRlciwga2V5LCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48UD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlcjxQPiBjb252ZXJ0ZXIpIHsKLQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIpOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQSBwcmVmZXJlbmNlIGhhcyBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycyBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQuZ2V0S2V5KCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgKGNvbnZlcnRlZCkgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBQIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgY2FjaGVkIHZhbHVlLCB0aGVuIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoUCB2YWx1ZSkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQlyZXR1cm47CQkvLyBubyBjaGFuZ2VzIGFsbG93ZWQgd2hlbiB3ZSBoYXZlIG5vIGxpc3RlbmVycwotCQl9Ci0KLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHZhbHVlKTsKLQotCQlpZiAoKHRoaXMuc3ViamVjdCAhPSBudWxsKSAmJiB0aGlzLnByZWZlcmVuY2VJc1RvQmVTZXQob2xkLCB2YWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQl0aGlzLnN1YmplY3QuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMua2V5KTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1YmplY3QgbWF5IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSwgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBQIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9PYmplY3QodGhpcy5zdWJqZWN0LmdldCh0aGlzLmtleSwgdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5kZWZhdWx0VmFsdWUpKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlIGFmdGVyIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgc3RyaW5nLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oUCB2YWx1ZSkgewotCQl0aGlzLnN1YmplY3QucHV0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIHNob3VsZCBiZSBwYXNzZWQKLQkgKiB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBCeSBkZWZhdWx0LCBvbmx5IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwKLQkgKiB3aWxsIGl0IGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBUaGlzIGFsc28gaGFzIHRoZQotCSAqIGVmZmVjdCBvZiBub3QgY3JlYXRpbmcgbmV3IHByZWZlcmVuY2VzIGluIHRoZSAiYmFja2luZyBzdG9yZSIKLQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlIGlmIHRoZXkKLQkgKiB3b3VsZCBsaWtlIHRvIEFMV0FZUyBwYXNzIHRocm91Z2ggdGhlIG5ldyB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmZXJlbmNlSXNUb0JlU2V0KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGFzCi0JICogdGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKFAgbykgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHZhbHVlIHN0cmluZyB0byBhbgotCSAqIGFwcHJvcHJpYXRlbHktdHlwZWQgb2JqZWN0IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9PYmplY3Qocyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoU3RyaW5nIHByZWZLZXksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByZWZLZXkuZXF1YWxzKHRoaXMua2V5KSkgewotCQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgcHJlZmVyZW5jZSBjaGFuZ2VkOyBlaXRoZXIgYmVjYXVzZSB3ZSBjaGFuZ2VkIGl0Ci0JICogaW4gI3NldFZhbHVlXyhPYmplY3QpIG9yIGEgdGhpcmQtcGFydHkgY2hhbmdlZCBpdC4KLQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBiZWNhdXNlIG9mIG91ciBvd24gY2hhbmdlLCB0aGUgZXZlbnQgd2lsbCBiZQotCSAqIHN3YWxsb3dlZCBiZWNhdXNlIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJhODRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciB3cmFwcyBhIFByZWZlcmVuY2VzIG5vZGUgYW5kIGNvbnZlcnRzIGl0cyBwcmVmZXJlbmNlcyBpbnRvIGEKLSAqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIG9mIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxzLiBJdCBsaXN0ZW5zIGZvcgotICogInByZWZlcmVuY2UiIGNoYW5nZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBWQUxVRSBjb2xsZWN0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFA+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFByZWZlcmVuY2VzPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4KLXsKLQotCS8qKiBDYWNoZSB0aGUgY3VycmVudCBwcmVmZXJlbmNlcywgc3RvcmVkIGluIG1vZGVscyBhbmQga2V5ZWQgYnkgbmFtZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHByZWZlcmVuY2VzOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlcyBub2RlIGZvciBhZGRlZCBvciByZW1vdmVkIHByZWZlcmVuY2VzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4oKTsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZXMgaGF2ZSBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBpdGVyYXRvciA9IChJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlcmF0b3IpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gc3RyZWFtID0gdGhpcy5wcmVmZXJlbmNlTW9kZWxzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSBzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5wcmVmZXJlbmNlcy5wdXQocHJlZmVyZW5jZU1vZGVsLmdldEtleSgpLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBmb3Igc29tZSBvZGQgcmVhc29uLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBhICJkZWFkIgotCQkJLy8gcHJlZmVyZW5jZXMgbm9kZTsgc28gaGFuZGxlIHRoZSBleGNlcHRpb24gdGhhdCBnZXRzIHRocm93biBoZXJlCi0JCQlpZiAoICEgZXguZ2V0TWVzc2FnZSgpLmVxdWFscygiTm9kZSBoYXMgYmVlbiByZW1vdmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnByZWZlcmVuY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZU1vZGVscygpIHsKLQkJU3RyaW5nW10ga2V5czsKLQkJdHJ5IHsKLQkJCWtleXMgPSB0aGlzLnN1YmplY3Qua2V5cygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PihuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGtleXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHRyYW5zZm9ybShTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5idWlsZFByZWZlcmVuY2VNb2RlbChrZXkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHR3ZWFrIHRoZSBtb2RlbCB1c2VkIHRvIHdyYXAgdGhlCi0JICogc3BlY2lmaWVkIHByZWZlcmVuY2UgKGUuZy4gdG8gY3VzdG9taXplIHRoZSBtb2RlbCdzIGNvbnZlcnRlcikuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gYnVpbGRQcmVmZXJlbmNlTW9kZWwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4odGhpcy5zdWJqZWN0SG9sZGVyLCBrZXkpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSB3YXMgcmVtb3ZlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLnByZWZlcmVuY2VzLnJlbW92ZShrZXkpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgaWYgKCAhIHRoaXMucHJlZmVyZW5jZXMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyBhZGRlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl0aGlzLnByZWZlcmVuY2VzLnB1dChrZXksIHByZWZlcmVuY2VNb2RlbCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgewotCQkJLy8gYSBwcmVmZXJlbmNlJ3MgdmFsdWUgY2hhbmdlZCAtIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2FiNDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSB0aGUgSkRLCi0gKiAo4CBsYSBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbCkuIFRoaXMgY2xhc3MgcHJvdmlkZXM6Ci0gKiAtIHN1cHBvcnQgZm9yIGEgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMKLSAqIC0gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmlyaW5nIGV2ZW50cyBmb3IgdGhvc2UgbGlzdGVuZXJzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVNb2RlbAotCWltcGxlbWVudHMgVHJlZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQkvKiogT3VyIGxpc3RlbmVycy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcnRpYWwgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMuCi0JICogKFRoZXJlIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBvZiBtYWtpbmcgdGhpcyB0eXBlIG9mIG1ldGhvZCBwdWJsaWM7Ci0JICogYWx0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIHByb3RlY3RlZC4uLi4pCi0JICovCi0JcHVibGljIFRyZWVNb2RlbExpc3RlbmVyW10gdHJlZU1vZGVsTGlzdGVuZXJzKCkgewotIAkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGVzIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZXMgdGhlbXNlbHZlcwotCSAqIGFyZSBzdGlsbCB0aGUgc2FtZSBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0NoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGUgY2hhbmdlZCwgYnV0IHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSByb290IGNoYW5nZWQsIGJ1dCB0aGUgcm9vdCBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290Q2hhbmdlZChPYmplY3Qgcm9vdCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKG5ldyBPYmplY3RbXSB7cm9vdH0sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0luc2VydGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc1JlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZVJlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKE9iamVjdFtdIHBhdGgpIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCk7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlU3RydWN0dXJlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290UmVwbGFjZWQoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQobmV3IE9iamVjdFtdIHtuZXdSb290fSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNjljZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5CdXR0b25Nb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgSkNoZWNrQm94KSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQKLSAqIGhvbGRzIGEgYm9vbGVhbi4KLSAqIAotICogTWF5YmUgbm90IHRoZSByaWNoZXN0IGNsYXNzIGluIG91ciB0b29sYm94LCBidXQgaXQgd2FzIHRoZQotICogdmljdGltIG9mIHJlZmFjdG9yaW5nLi4uLiAgfmJqdgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlzdXBlcihib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMTgyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIGJ5IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIHRvCi0gKiBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0IGludG8gdGhlIG1vZGVscyB1c2VkIGZvciBlYWNoIG9mCi0gKiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdyBpbiB0aGUgdGFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uQWRhcHRlciB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuCi0JICogVHlwaWNhbGx5IHRoaXMgaXMgc3RhdGljLgotCSAqLwotCWludCBjb2x1bW5Db3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCVN0cmluZyBjb2x1bW5OYW1lKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCUNsYXNzPD8+IGNvbHVtbkNsYXNzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBlZGl0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgc2FtZSBmb3IgZXZlcnkgcm93LgotCSAqLwotCWJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I1ZjdkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBMaXN0RGF0YUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDb21ib0JveCkgaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsIChvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsKS4KLSAqIEZvciBjb21ibyBib3hlcywgdGhlIG1vZGVsIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcwotICogdHlwaWNhbGx5IGEgZGlmZmVyZW50IG1vZGVsIG9iamVjdCB0aGFuIHRoZSBvbmUgdGhhdCBob2xkcyB0aGUgY29sbGVjdGlvbgotICogb2YgY2hvaWNlcy4KLSAqIAotICogRm9yIGV4YW1wbGUsIGEgTVdSZWZlcmVuY2UgKHRoZSBzZWxlY3Rpb25Pd25lcikgaGFzIGFuIGF0dHJpYnV0ZQotICogInNvdXJjZVRhYmxlIiAodGhlIGNvbGxlY3Rpb25Pd25lcikKLSAqIHdoaWNoIGhvbGRzIG9uIHRvIGEgY29sbGVjdGlvbiBvZiBNV0RhdGFiYXNlRmllbGRzLiBXaGVuIHRoZSBzZWxlY3Rpb24KLSAqIGlzIGNoYW5nZWQgdGhpcyBtb2RlbCB3aWxsIGtlZXAgdGhlIGxpc3RlbmVycyBhd2FyZSBvZiB0aGUgY2hhbmdlcy4KLSAqIFRoZSBpbmhlcml0ZWQgbGlzdCBtb2RlbCB3aWxsIGtlZXAgaXRzIGxpc3RlbmVycyBhd2FyZSBvZiBjaGFuZ2VzIHRvIHRoZQotICogY29sbGVjdGlvbiBtb2RlbAotICogCi0gKiBJbiBhZGRpdGlvbiB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIgcmVxdWlyZWQgYnkgdGhlIHN1cGVyY2xhc3MsCi0gKiBhbiBpbnN0YW5jZSBvZiB0aGlzIENvbWJvQm94TW9kZWwgbXVzdCBiZSBzdXBwbGllZCB3aXRoIGEKLSAqIHNlbGVjdGlvbiBob2xkZXIsIHdoaWNoIGlzIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgcHJvdmlkZXMgYWNjZXNzCi0gKiB0byB0aGUgc2VsZWN0aW9uICh0eXBpY2FsbHkgYSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIpLgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIExpc3RNb2RlbEFkYXB0ZXIKLQlpbXBsZW1lbnRzIENvbWJvQm94TW9kZWwKLXsKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGFuZCBzZWxlY3Rpb24gaG9sZGVyIGFyZSByZXF1aXJlZDsKLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCWlmIChzZWxlY3Rpb25Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIgPSBzZWxlY3Rpb25Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBhbmQgc2VsZWN0aW9uIGhvbGRlciBhcmUgcmVxdWlyZWQ7Ci0JICovCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlpZiAoc2VsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyID0gc2VsZWN0aW9uSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBub3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZAotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyLnRoaXMuZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBzZWxlY3RlZEl0ZW0pIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGVuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBkaXNlbmdhZ2UgdGhlIHNlbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgdGhlIGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCS8vIEkgZ3Vlc3MgdGhpcyB3aWxsIHdvcmsuLi4KLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIC0xLCAtMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3Rpb25Ib2xkZXIgKyAiOiIgKyB0aGlzLmxpc3RIb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZjhjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJEYXRlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgZGF0ZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJEYXRlTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJEYXRlTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBkYXRlIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGRhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBuZXcgRGF0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBudWxsLCBudWxsLCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCkgewotCQl0aGlzKGRhdGVIb2xkZXIsIHN0YXJ0LCBlbmQsIGNhbGVuZGFyRmllbGQsIG5ldyBEYXRlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoZGF0ZUhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiAoRGF0ZSkgZGF0ZUhvbGRlci5nZXRWYWx1ZSgpLCBzdGFydCwgZW5kLCBjYWxlbmRhckZpZWxkKTsKLQkJdGhpcy5kYXRlSG9sZGVyID0gZGF0ZUhvbGRlcjsKLQkJdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBkYXRlIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZShPYmplY3QpLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuZGF0ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRGF0ZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3Bpbm5lciBkYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRhdGVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ZjQwNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRWxlbWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlNlZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERvY3VtZW50TGlzdGVuZXIKLSAqIChlLmcuIGEgSlRleHRGaWVsZCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgc3RyaW5nLgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciAic21hbGwiIGRvY3VtZW50czsKLSAqIGkuZS4gZG9jdW1lbnRzIHVzZWQgYnkgdGV4dCBmaWVsZHMsIG5vdCB0ZXh0IHBhbmVzLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIKLQlpbXBsZW1lbnRzIERvY3VtZW50LCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgZGVsZWdhdGUgZG9jdW1lbnQgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBEb2N1bWVudCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgZG9jdW1lbnQuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJpbmVkTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcuICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN0cmluZ0xpc3RlbmVyOwotCi0gICAgLyoqIFRoZSBldmVudCBsaXN0ZW5lciBsaXN0IGZvciB0aGUgZG9jdW1lbnQuICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHN0cmluZyBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsIERvY3VtZW50IGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdHJpbmdIb2xkZXIgPT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0cmluZ0hvbGRlciA9IHN0cmluZ0hvbGRlcjsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZwotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl0aGlzLnN0cmluZ0xpc3RlbmVyID0gdGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIGEgcGxhaW4gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQl0aGlzKHN0cmluZ0hvbGRlciwgbmV3IFBsYWluRG9jdW1lbnQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5zdHJpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0cmluZyBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJdGhpcy5zdHJpbmdMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcigpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnRlcmZhY2UgQ29tYmluZWRMaXN0ZW5lciBleHRlbmRzIERvY3VtZW50TGlzdGVuZXIsIFVuZG9hYmxlRWRpdExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlQ2hhbmdlZFVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlSW5zZXJ0VXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVSZW1vdmVVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVuZG9hYmxlRWRpdEhhcHBlbmVkKFVuZG9hYmxlRWRpdEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVVuZG9hYmxlRWRpdEhhcHBlbmVkKGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludGVybmFsRG9jdW1lbnRFdmVudAotCQlleHRlbmRzIEV2ZW50T2JqZWN0Ci0JCWltcGxlbWVudHMgRG9jdW1lbnRFdmVudAotCXsKLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgZGVsZWdhdGU7Ci0JCi0JCXByb3RlY3RlZCBJbnRlcm5hbERvY3VtZW50RXZlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50RXZlbnQgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJfQotCQlwdWJsaWMgRWxlbWVudENoYW5nZSBnZXRDaGFuZ2UoRWxlbWVudCBlbGVtKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRDaGFuZ2UoZWxlbSk7Ci0JCX0KLQkJcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJcmV0dXJuIChEb2N1bWVudCkgdGhpcy5zb3VyY2U7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE9mZnNldCgpOwotCQl9Ci0JCXB1YmxpYyBFdmVudFR5cGUgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFR5cGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFjMWU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5MaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIExpc3REYXRhTGlzdGVuZXIKLSAqIChlLmcuIGEgSkxpc3QpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgTGlzdE1vZGVsICptdXN0KiBiZSBzdXBwbGllZCB3aXRoIGEgdmFsdWUgbW9kZWwsCi0gKiB3aGljaCBpcyBhIExpc3RWYWx1ZU1vZGVsIG9uIHRoZSBib3VuZCBsaXN0IG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIG9uIHRoZSBib3VuZCBjb2xsZWN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pCi0gKiBpdHNlbGYgY2FuIGJlIG51bGwsIGJ1dCB0aGUgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyBpdCBjYW5ub3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdExpc3RNb2RlbAotewotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgbGlzdCBmb3IgImRyYW1hdGljIiBjaGFuZ2VzLgotCSAqIEBzZWUgI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxpc3RTaXplOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciAtIGluaXRpYWxpemUgc3R1ZmYuCi0JICovCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwoY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdFNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/PiBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzTGlzdERhdGFMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdENoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBlbmQgPSBzdGFydCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMTsKLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldFRhcmdldEluZGV4KCkpICsgZXZlbnQuZ2V0TGVuZ3RoKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKCkgewotCQlpZiAodGhpcy5saXN0U2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJdGhpcy5saXN0U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNlMGIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTGlzdE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgdmFsdWUKLSAqIGluIHRoZSBsaXN0LgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgYSBzdWItY2xhc3Mgb2YgU3Bpbm5lckxpc3RNb2RlbCBiZWNhdXNlIG9mIHNvbWUKLSAqIGNyYXBweSBqZGsgY29kZS4uLi4gIH5ianYKLSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIjY3JlYXRlRWRpdG9yKGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCkKLSAqIAotICogTkI6IFRoaXMgbW9kZWwgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdmFsdWVzIHRoYXQgaGF2ZSBhIHJlYXNvbmFibHkKLSAqIGluZXhwZW5zaXZlICNlcXVhbHMoKSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzZWUgI3N5bmNocm9uaXplKE9iamVjdCkKLSAqIAotICogSWYgdGhpcyBjbGFzcyBuZWVkcyB0byBiZSBtb2RpZmllZCwgaXQgd291bGQgYmVob292ZSB1cyB0byByZXZpZXcgdGhlCi0gKiBvdGhlciwgc2ltaWxhciBjbGFzc2VzOgotICogQHNlZSBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogQHNlZSBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgU3Bpbm5lckxpc3RNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGZpcnN0IGl0ZW0gb24gdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1vZGVsIHZhbHVlIGl0c2VsZiBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBuZXcgT2JqZWN0W10ge2RlZmF1bHRWYWx1ZX0sIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdFtdIHZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBBcnJheXMuYXNMaXN0KHZhbHVlcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgTGlzdDxPYmplY3Q+IHZhbHVlcykgewotCQl0aGlzKHZhbHVlSG9sZGVyLCB2YWx1ZXMsIHZhbHVlcy5nZXQoMCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgTGlzdDxPYmplY3Q+IHZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZXMpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXI7Ci0JCXRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzcGlubmVyIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MjQ2My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBudW1iZXIuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTnVtYmVyTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJOdW1iZXJNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwgbnVtYmVyIHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbnVtYmVyLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGgKLQkgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBudW1iZXJDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHplcm8uCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG51bGwsIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgSW50ZWdlci52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSwgaW50IHN0ZXBTaXplKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSwgbWluaW11bSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIEludGVnZXIudmFsdWVPZihtaW5pbXVtKSwgSW50ZWdlci52YWx1ZU9mKG1heGltdW0pLCBJbnRlZ2VyLnZhbHVlT2Yoc3RlcFNpemUpLCBJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgRG91YmxlLnZhbHVlT2YobWluaW11bSksIERvdWJsZS52YWx1ZU9mKG1heGltdW0pLCBEb3VibGUudmFsdWVPZihzdGVwU2l6ZSksIERvdWJsZS52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIENvbXBhcmFibGU8Pz4gbWluaW11bSwgQ29tcGFyYWJsZTw/PiBtYXhpbXVtLCBOdW1iZXIgc3RlcFNpemUsIE51bWJlciBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IChOdW1iZXIpIG51bWJlckhvbGRlci5nZXRWYWx1ZSgpLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyID0gbnVtYmVySG9sZGVyOwotCQl0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibnVtYmVyIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG51bWJlciBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnNldFZhbHVlKChOdW1iZXIpIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE51bWJlciBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5udW1iZXJIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NDdiMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgTGlzdFNlbGVjdGlvbk1vZGVsIGlzIGF3YXJlIG9mIHRoZSBMaXN0TW9kZWwgYW5kCi0gKiBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGFjY2VzcyBhbmQgc2V0IHRoZQotICogc2VsZWN0ZWQgKm9iamVjdHMqLCBhcyBvcHBvc2VkIHRvIHRoZSBzZWxlY3RlZCAqaW5kZXhlcyouCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwKLQlleHRlbmRzIERlZmF1bHRMaXN0U2VsZWN0aW9uTW9kZWwKLXsKLQkvKiogVGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0TW9kZWwgbGlzdE1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBsaXN0IG1vZGVsIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdERhdGFMaXN0ZW5lciBsaXN0RGF0YUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHNlbGVjdGlvbiBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5saXN0RGF0YUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3REYXRhTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0RGF0YUxpc3RlbmVyIGJ1aWxkTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0RGF0YUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgc2VsZWN0aW9uCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC50aGlzLmxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGRhdGEgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5LCB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCB3aGVuIHRoZQotCSAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGhhdmUgY2hhbmdlZC4gTW9zdCBvZiB0aGUgdGltZSB0aGlzIGp1c3QKLQkgKiBtZWFucyBhbiBpdGVtIGhhcyBjaGFuZ2VkIGluIGEgd2F5IHRoYXQgYWZmZWN0cyBpdHMgZGlzcGxheSBzdHJpbmcKLQkgKiBvciBpY29uLiBXZSB0eXBpY2FsbHkgb25seSB1c2UgdGhlIGNsYXNzIGZvciBlZGl0cyBpbnZvbHZpbmcKLQkgKiBzaW5nbGUgc2VsZWN0aW9uLgotCSAqIEEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBzZWxlY3Rpb24KLQkgKiBzaG91bGQgYmUgY2xlYXJlZCBiZWNhdXNlIGEgY2hhbmdlIGNvdWxkIG1lYW4gdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdERhdGFFdmVudCBldmVudCkgewotCQkvKip0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ki8KLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFNlbGVjdGlvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihMaXN0U2VsZWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdFNlbGVjdGlvbkxpc3RlbmVycygpIHsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdFNlbGVjdGlvbkxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBtb2RlbCByZWZlcmVuY2VkIGJ5IHRoZSBsaXN0IHNlbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsIGdldExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgc2VsZWN0ZWRWYWx1ZXNTaXplKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCW4rKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIHZhbHVlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBzZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpIDw9IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzZWxlY3RlZFZhbHVlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJT2JqZWN0W10gdGVtcCA9IG5ldyBPYmplY3RbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGkpOwotCQkJfQotCQl9Ci0JCWlmIChuID09IG1heFNpemUpIHsKLQkJCS8vIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgaW5kaWNlcyBpbiBvcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50W10gc2VsZWN0ZWRJbmRpY2VzKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gbmV3IGludFswXTsKLQkJfQotCi0JCWludCBtYXhTaXplID0gKG1heCAtIG1pbikgKyAxOwotCQlpbnRbXSB0ZW1wID0gbmV3IGludFttYXhTaXplXTsKLQkJaW50IG4gPSAwOwotCQlpbnQgY291bnQgPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8PSBtYXg7IGkrKykgewotCQkJaWYgKHRoaXMuaXNTZWxlY3RlZEluZGV4KGkpICYmIChpIDwgY291bnQpKSB7Ci0JCQkJdGVtcFtuKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlBcnJheXMuc29ydCh0ZW1wKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlBcnJheXMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0VmFsdWVJc0FkanVzdGluZyh0cnVlKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsbVNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbG1TaXplKTsKLQkJCXRoaXMucmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW5kZXgsIGluZGV4KTsKLQkJfQotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhvYmplY3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFuY2hvciBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldEFuY2hvclNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRBbmNob3JTZWxlY3Rpb25JbmRleChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldExlYWRTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGxlYWQgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TGVhZFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRMZWFkU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlYWRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5zZXRMZWFkU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1heFNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWF4IHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1pblNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWluIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1pblNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2lzU2VsZWN0ZWRJbmRleChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVJc1NlbGVjdGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLAotCSAqIHdpdGhvdXQgd3JhcHBpbmcgdGhlIGFjdGlvbnMgaW4gImFkanVzdGluZyIgZXZlbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJaW50IGxpc3RNb2RlbFNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbGlzdE1vZGVsU2l6ZSk7Ci0JCQl0aGlzLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZihvYmplY3QsIGxtLCBsbS5nZXRTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIGxpc3QgbW9kZWwgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogUmV0dXJuIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBsaXN0IG1vZGVsLgotCSAqLwotCS8vIHdlJ3JlIGp1c3QgamVya2luZyBhcm91bmQgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGhlcmUKLQkvLyAoaW4gbWVtb3J5IG9mIFBoaWwuLi4pOwotCS8vIGNhbGwgdGhpcyBtZXRob2QgaW5zaWRlIGxvb3BzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgbGlzdE1vZGVsCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0LCBMaXN0TW9kZWwgbG0sIGludCBsaXN0TW9kZWxTaXplKSB7Ci0JCWZvciAoaW50IGkgPSBsaXN0TW9kZWxTaXplOyBpLS0gPiAwOyApIHsKLQkJCWlmIChsbS5nZXRFbGVtZW50QXQoaSkuZXF1YWxzKG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTlmY2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuTXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB0cmVlIHdpdGggYSAibnVsbCIgcm9vdCB0aGF0Ci0gKiBoYXMgYSBzZXQgb2YgInByaW1pdGl2ZSIgY2hpbGRyZW4uIFRoZXNlICJwcmltaXRpdmUiIGNoaWxkcmVuIGRvIG5vdCBoYXZlCi0gKiBjaGlsZHJlbiB0aGVtc2VsdmVzLCBtYWtpbmcgdGhlIHRyZWUgYSBtYXhpbXVtIG9mIDIgbGV2ZWxzIGRlZXAuCi0gKiBUaGlzIG1vZGVsIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIHRoZSByb290J3MgY2hpbGRyZW4gd2l0aCBhCi0gKiBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgKG5vbi1tb2RlbCkgb2JqZWN0cwotICogKGUuZy4gU3RyaW5ncykuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgYW4gImVkaXRhYmxlIiBsaXN0IG9mIHByaW1pdGl2ZXMuIFNpbmNlIHRoZSBKREsKLSAqIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBhbiBlZGl0YWJsZSBsaXN0Ym94LCB3ZSBtdXN0IHVzZSBhbiBlZGl0YWJsZSB0cmVlLgotICogV2Ugd3JhcCBldmVyeXRoaW5nIGluIERlZmF1bHRNdXRhYmxlVHJlZU5vZGVzLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50ICNwcmltaXRpdmVDaGFuZ2VkKGludCwgT2JqZWN0KSBhbmQgdXBkYXRlCi0gKiB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlCi0gKiBsaXN0IGRpcmVjdGx5IGFuZCBwcmVzc2VzIDxFbnRlcj4uCi0gKiAKLSAqIFRoZSBKVHJlZSB1c2luZyB0aGlzIG1vZGVsIG11c3QgYmUgY29uZmlndXJlZCBhcyAiZWRpdGFibGUiOgotICogCXRyZWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gKi8KLS8vIFRPRE8gY29udmVydCB0byB1c2UgYW4gYWRhcHRlciBpbnN0ZWFkIG9mIHJlcXVpcmluZyBzdWJjbGFzcwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwKLQlleHRlbmRzIERlZmF1bHRUcmVlTW9kZWwKLXsKLQkvKiogYSBtb2RlbCBvbiB0aGUgbGlzdCBvZiBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIGEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIHRoZSBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIG9mIHRoZSBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcihuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShudWxsLCB0cnVlKSk7ICAvLyB0cnVlID0gdGhlIHJvb3QgY2FuIGhhdmUgY2hpbGRyZW4KLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzCi0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIAotCSAqIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoZSBwcmltaXRpdmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB3YXMKLQkgKiBlZGl0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIgYW5kIHRoZSBuZXcgdmFsdWUgaXMgYXMgc3BlY2lmaWVkLgotCSAqIENvbnZlcnQgdGhlIHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHBsYWNlIGl0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGluc3RlYWQgb2YgY2hhbmdpbmcgdGhlIG5vZGUgZGlyZWN0bHkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IChUcmVlTm9kZSkgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCQlpbnQgaW5kZXggPSAoKFRyZWVOb2RlKSB0aGlzLmdldFJvb3QoKSkuZ2V0SW5kZXgobm9kZSk7Ci0JCXRoaXMucHJpbWl0aXZlQ2hhbmdlZChpbmRleCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGUgbGlzdCBvZiBwcmltaXRpdmVzCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KCk7Ci0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0Jdm9pZCBjbGVhckxpc3QoKSB7Ci0JCWludCBjaGlsZGNvdW50ID0gdGhpcy5yb290LmdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGNoaWxkY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudCgoTXV0YWJsZVRyZWVOb2RlKXRoaXMucm9vdC5nZXRDaGlsZEF0KGkpKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZFByaW1pdGl2ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcmltaXRpdmUoT2JqZWN0IHByaW1pdGl2ZSkgewotCQl0aGlzLmluc2VydFByaW1pdGl2ZSh0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpLCBwcmltaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlCi0JICogYW5kIGluc2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290LgotCSAqLwotCXZvaWQgaW5zZXJ0UHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcmltaXRpdmUsIGZhbHNlKTsgLy8gZG9uJ3QgYWxsb3cgY2hpbGRyZW4gb24gdGhlIGNoaWxkIG5vZGUKLQkJdGhpcy5pbnNlcnROb2RlSW50byhub2RlLCAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCU11dGFibGVUcmVlTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIG5vZGUgYXQgY2hpbGRJbmRleC4KLQkgKi8KLQl2b2lkIHJlcGxhY2VQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQlub2RlLnNldFVzZXJPYmplY3QocHJpbWl0aXZlKTsKLQkJdGhpcy5ub2RlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRJdGVtc1NpemUoKTsgaSsrKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlbW92ZU5vZGUoZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXROZXdJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlcGxhY2VQcmltaXRpdmUoaSsrLCBpdGVtKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPihldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQl0ZW1wLmFkZChQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMucmVtb3ZlTm9kZShldmVudC5nZXRTb3VyY2VJbmRleCgpKSk7Ci0JCQl9Ci0JCQlpbnQgaSA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCQlmb3IgKE11dGFibGVUcmVlTm9kZSBub2RlIDogdGVtcCkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBub2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuY2xlYXJMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMzExMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhICh0eXBpY2FsbHkgc2hhcmVkKQotICogUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiAKLSAqIE5PVEU6IERvICpub3QqIHVzZSB0aGlzIG1vZGVsIHdpdGggYSBCdXR0b25Hcm91cCwgc2luY2UgdGhlCi0gKiBzaGFyZWQgdmFsdWUgaG9sZGVyIGFuZCB0aGUgd3JhcHBlcnMgYnVpbHQgYnkgdGhpcyBhZGFwdGVyIHdpbGwKLSAqIGtlZXAgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiBjaGVja2VkLiBBbHNvLCB0aGlzIGFsbG93cwotICogdXMgdG8gdW5jaGVjayBhbGwgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCB3aGVuIHRoZSBzaGFyZWQKLSAqIHZhbHVlIGlzIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIHVwIGEgc2V0IG9mIHdyYXBwZXJzIHRoYXQgd2lsbCBjb252ZXJ0IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBob2xkZXIgYW5kIGJ1dHRvbiB2YWx1ZSB0by9mcm9tIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBJZiB0aGUgdmFsdWUgaG9sZGVyJ3MgdmFsdWUgbWF0Y2hlcyB0aGUgYnV0dG9uIHZhbHVlLAotCSAqIHRoZSB3cmFwcGVyIHdpbGwgcmV0dXJuIHRydWUuIExpa2V3aXNlLCBpZiB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHdyYXBwZXIgd2lsbCBzZXQgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgdG8gdGhlIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBmaWx0ZXJpbmdQVk0gPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pih2YWx1ZUhvbGRlciwgbmV3IFJhZGlvQnV0dG9uRmlsdGVyKGJ1dHRvblZhbHVlKSk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3QsIEJvb2xlYW4+KGZpbHRlcmluZ1BWTSwgbmV3IFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIoYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB1c2VyIGNhbm5vdCBkZS1zZWxlY3QgYSByYWRpbyBidXR0b24gLSB0aGUgdXNlcgotCSAqIGNhbiBvbmx5ICpzZWxlY3QqIGEgcmFkaW8gYnV0dG9uLiBPbmx5IHRoZSBtb2RlbCBjYW4KLQkgKiBjYXVzZSBhIHJhZGlvIGJ1dHRvbiB0byBiZSBkZS1zZWxlY3RlZC4gV2UgdXNlIHRoZQotCSAqIEFSTUVEIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgYmVpbmcgZGUtc2VsZWN0ZWQKLQkgKiBieSB0aGUgdXNlci4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbgotCQkvLyByYWRpbyBidXR0b25zIGNhbgotCQlpZiAoKGIgPT0gZmFsc2UpICYmIHRoaXMuaXNBcm1lZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBvbmx5IHBhc3MgdGhyb3VnaCBhIG5ldyB2YWx1ZSB0byB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlciB3aGVuIGl0IG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmFkaW9CdXR0b25GaWx0ZXIgaW1wbGVtZW50cyBCaWRpRmlsdGVyPE9iamVjdD4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25GaWx0ZXIoT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idXR0b25WYWx1ZSA9IGJ1dHRvblZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgdG8gdGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkJICogKm9ubHkqIHdoZW4gaXQgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHModGhpcy5idXR0b25WYWx1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgdHJhbnNmb3JtZXIgd2lsbCBjb252ZXJ0IHRoZSB3cmFwcGVkIHZhbHVlIHRvIEJvb2xlYW4uVFJVRQotCSAqIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPE9iamVjdCwgQm9vbGVhbj4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIHdyYXBwZWQgdmFsdWUgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlIHJldHVybiB0cnVlLAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiBmYWxzZTsKLQkJICogYnV0IGlmIGl0IGlzIG51bGwgc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdGhlCi0JCSAqIGJ1dHRvbiBtb2RlbCdzIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZAotCQkgKi8KLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUuZXF1YWxzKHRoaXMuYnV0dG9uVmFsdWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRydWUsIHBhc3MgdGhyb3VnaCB0aGUgb3VyIGJ1dHRvbiB2YWx1ZTsKLQkJICogb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaCBudWxsCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgPyB0aGlzLmJ1dHRvblZhbHVlIDogbnVsbDsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTBjYWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RTcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgQ2hhbmdlTGlzdGVuZXIKLSAqIChlLmcuIGEgSlNwaW5uZXIpIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIHZhbHVlLgotICogCi0gKiBOb3RlOiBpdCBpcyBsaWtlbHkgeW91IHdhbnQgdG8gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXMgaW5zdGVhZCBvZgotICogdGhpcyBvbmU6Ci0gKiAgICAgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqICAgICBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAgICAgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIAotICogTkI6IFRoaXMgbW9kZWwgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdmFsdWVzIHRoYXQgaGF2ZSBhIGZhaXJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFNwaW5uZXJNb2RlbAotewotCS8qKiBUaGUgZGVsZWdhdGUgc3Bpbm5lciBtb2RlbCB3aG9zZSBiZWhhdmlvciB3ZSAiZW5oYW5jZSIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXJNb2RlbCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgc3Bpbm5lciBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGFuZCBkZWxlZ2F0ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgU3Bpbm5lck1vZGVsIGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh2YWx1ZUhvbGRlciA9PSBudWxsIHx8IGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMudmFsdWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoaXMgd2lsbCB3cmFwIGEgc2ltcGxlIG51bWJlciBzcGlubmVyIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgbmV3IFNwaW5uZXJOdW1iZXJNb2RlbCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZXhwYW5kIGFjY2VzcyBhIGJpdCBmb3IgaW5uZXIgY2xhc3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIGZvcndhcmQgdGhlIGV2ZW50LCB3aXRoIHRoaXMgYXMgdGhlIHNvdXJjZQotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkZWxlZ2F0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmRlbGVnYXRlLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXh0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE5leHRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJldmlvdXNWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UHJldmlvdXNWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCQl0aGlzLmRlbGVnYXRlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQSB0aGlyZCBwYXJ0eSBoYXMgbW9kaWZpZWQgdGhlIHVuZGVybHlpbmcgdmFsdWUuCi0JICogU3luY2hyb25pemUgdGhlIGRlbGVnYXRlIG1vZGVsIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlbGVnYXRlJ3MgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QgdmFsdWUpIHsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUxpc3RlbmVyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyOWMxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIFRhYmxlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRhYmxlTW9kZWxMaXN0ZW5lciAoZS5nLiBhIEpUYWJsZSkKLSAqIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBtb2RlbCBvYmplY3RzLAotICogZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0byBhIHJvdyBpbiB0aGUgdGFibGUuCi0gKiBUeXBpY2FsbHksIGVhY2ggY29sdW1uIG9mIHRoZSB0YWJsZSB3aWxsIGJlIGJvdW5kIHRvIGEgZGlmZmVyZW50IGFzcGVjdAotICogb2YgdGhlIGNvbnRhaW5lZCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBGb3IgZXhhbXBsZSwgYSBNV1RhYmxlIGhhcyBhbiBhdHRyaWJ1dGUgJ2RhdGFiYXNlRmllbGRzJyB0aGF0IGhvbGRzCi0gKiBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHJvd3Mgb2YKLSAqIGEgSlRhYmxlOyBhbmQgZWFjaCBNV0RhdGFiYXNlRmllbGQgaGFzIGEgbnVtYmVyCi0gKiBvZiBhdHRyaWJ1dGVzIChlLmcuIG5hbWUsIHR5cGUsIHNpemUpIHRoYXQgY2FuIGJlIGJvdW5kIHRvIHRoZSBjb2x1bW5zIG9mCi0gKiBhIHJvdyBpbiB0aGUgSlRhYmxlLiBBcyB0aGVzZSBkYXRhYmFzZSBmaWVsZHMgYXJlIGFkZGVkLCByZW1vdmVkLCBhbmQKLSAqIGNoYW5nZWQsIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgVGFibGVNb2RlbCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYQotICogbGlzdCBob2xkZXIgKGUuZy4gdGhlICdkYXRhYmFzZUZpZWxkcycpLCB3aGljaCBpcyBhIHZhbHVlCi0gKiBtb2RlbCBvbiB0aGUgYm91bmQgY29sbGVjdGlvbiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlCi0gKiBjb2xsZWN0aW9uIGl0c2VsZiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBsaXN0IHZhbHVlIG1vZGVsIHRoYXQKLSAqIGhvbGRzIGl0IGlzIHJlcXVpcmVkLiBUeXBpY2FsbHkgdGhpcyBsaXN0IHdpbGwgYmUgc29ydGVkIChAc2VlCi0gKiBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIpLgotICogCi0gKiBUaGlzIFRhYmxlTW9kZWwgbXVzdCBhbHNvIGJlIHN1cHBsaWVkIHdpdGggYSBDb2x1bW5BZGFwdGVyIHRoYXQKLSAqIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGhlYWRlcnMsIHJlbmRlcmVycywgZWRpdG9ycywgYW5kIGNvbnRlbnRzCi0gKiBvZiB0aGUgdmFyaW91cyBjb2x1bW5zLgotICogCi0gKiBEZXNpZ24gZGVjaXNpb246Ci0gKiBDZWxsIGxpc3RlbmVyIG9wdGlvbnMgKGZyb20gbG93IHNwYWNlL2hpZ2ggdGltZSB0byBoaWdoIHNwYWNlL2xvdyB0aW1lKToKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBsaXN0ZW5pbmcgdG8gZXZlcnkgY2VsbCAodGhpcyBpcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgcm93Ci0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgcGVyIGNlbGwKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwKLXsKLQkvKioKLQkgKiBhIGxpc3Qgb2YgdXNlciBvYmplY3RzIHRoYXQgYXJlIGNvbnZlcnRlZCB0bwotCSAqIHJvd3MgdmlhIHRoZSBjb2x1bW4gYWRhcHRlcgotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogZWFjaCByb3cgaXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMKLQkgKi8KLQkvLyBkZWNsYXJlIGFzIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiByb3dzOwotCi0JLyoqCi0JICogY2xpZW50LXN1cHBsaWVkIGFkYXB0ZXIgdGhhdCBwcm92aWRlcyB3aXRoIHRoZSB2YXJpb3VzIGNvbHVtbgotCSAqIHNldHRpbmdzIGFuZCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgTFZNCi0JICogaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscwotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogdGhlIHNpbmdsZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gZXZlcnkgY2VsbCdzIG1vZGVsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNlbGxMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdGFibGUgbW9kZWwgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RzCi0JICogYW5kIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gY29sdW1uQWRhcHRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucm93cyA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPigpOwotCQl0aGlzLmNlbGxMaXN0ZW5lciA9IHRoaXMuYnVpbGRDZWxsTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBjb2x1bW5BZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5hZGRSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVwbGFjZVJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXROZXdJdGVtcyhldmVudCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5tb3ZlUm93cyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuY2xlYXJUYWJsZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZWJ1aWxkVGFibGUoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCXJldHVybiAoSXRlcmFibGU8T2JqZWN0PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENlbGxMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5jZWxsQ2hhbmdlZCgoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2VsbCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJldHVybiByb3dbY29sdW1uSW5kZXhdLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcm93W2NvbHVtbkluZGV4XS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzVGFibGVNb2RlbExpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5maXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUYWJsZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhbmQgdGhlIHZhcmlvdXMgYXNwZWN0cwotCSAqIG9mIHRoZSBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGUgcm93cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdHMgaW50byByb3dzIGFuZCBsaXN0ZW4gdG8gdGhlIGNlbGxzLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VBbGxDZWxscygpIHsKLQkJdGhpcy5yb3dzLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VBbGxDZWxscygpIHsKLQkJZm9yIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93IDogdGhpcy5yb3dzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyhyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSb3coV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNlbGxIb2xkZXIpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMucm93cy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gcm93Lmxlbmd0aDsgai0tID4gMDsgKSB7Ci0JCQkJaWYgKHJvd1tqXSA9PSBjZWxsSG9sZGVyKSB7Ci0JCQkJCXRoaXMuZmlyZVRhYmxlQ2VsbFVwZGF0ZWQoaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgaXRlbXMgdG8gcm93cwotCSAqLwotCXZvaWQgYWRkUm93cyhpbnQgaW5kZXgsIGludCBzaXplLCBJdGVyYWJsZTxPYmplY3Q+IGl0ZW1zKSB7Ci0JCUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KHNpemUpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQluZXdSb3dzLmFkZChyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5hZGRBbGwoaW5kZXgsIG5ld1Jvd3MpOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NJbnNlcnRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVSb3dzKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHRoaXMucm93cy5yZW1vdmUoaW5kZXgpKTsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NEZWxldGVkKGluZGV4LCBpbmRleCArIHNpemUgLSAxKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSb3dzKGludCBpbmRleCwgSXRlcmFibGU8T2JqZWN0PiBpdGVtcykgewotCQlpbnQgaSA9IGluZGV4OwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJCXJvdyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKGl0ZW0pOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKHRoaXMucm93cy5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KSArIGxlbmd0aCAtIDE7Ci0JCXRoaXMuZmlyZVRhYmxlUm93c1VwZGF0ZWQoc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCBjbGVhclRhYmxlKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLQl2b2lkIHJlYnVpbGRUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmVuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGIyNjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbi5Ub2dnbGVCdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChib29sZWFuSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQnV0dG9uTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmICh0aGlzLmlzU2VsZWN0ZWQoKSAhPSBiKSB7CS8vIHN0b3AgdGhlIHJlY3Vyc2lvbiEKLQkJCXN1cGVyLnNldFNlbGVjdGVkKGIpOy8vcHV0IHRoZSBzdXBlciBjYWxsIGZpcnN0LCBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBnZXRzIGNhbGxlZCB0d2ljZQotCQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRBY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVBY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkSXRlbUxpc3RlbmVyKEl0ZW1MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRJdGVtTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVJdGVtTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBoYXZlIG5vIGxpc3RlbmVycyBhdCBhbGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KCkgPT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIElmIGl0IGlzIG51bGwsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3RlZChCb29sZWFuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZCgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMGZhZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgVHJlZU1vZGVsTGlzdGVuZXIKLSAqIChlLmcuIGEgSlRyZWUpIGluIHN5bmNoIHdpdGggYSB0cmVlIG9mIFRyZWVOb2RlVmFsdWVNb2RlbCBvYmplY3RzLiBVbmxpa2UKLSAqIGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbCwgeW91IGRvIG5vdCBhZGQgYW5kIHJlbW92ZSBub2RlcyB3aXRoCi0gKiBtZXRob2RzIGltcGxlbWVudGVkIGhlcmUuIFlvdSBjYW4gYWRkIGFuZCByZW1vdmUgbm9kZXMgYnkgYWRkaW5nIGFuZAotICogcmVtb3ZpbmcgdGhlbSBkaXJlY3RseSB0by9mcm9tIHRoZSBub2RlcyAob3IsIG1vcmUgdHlwaWNhbGx5LCB0aGUgZG9tYWluCi0gKiBvYmplY3RzIHRoZSBub2RlcyBhcmUgd3JhcHBpbmcgYW5kIGxpc3RlbmluZyB0bykuCi0gKiAKLSAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgY2FuIG5ldmVyIGJlIG51bGwsCi0gKiB3aGljaCwgdHlwaWNhbGx5LCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gKElmIHlvdSB3YW50IHRvIGRpc3BsYXkgYW4gZW1wdHkKLSAqIHRyZWUgeW91IGNhbiBzZXQgdGhlIEpUcmVlJ3MgdHJlZU1vZGVsIHRvIG51bGwuKQotICovCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RUcmVlTW9kZWwKLXsKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHRyZWUncyByb290IG5vZGUgYW5kIGl0cwotCSAqIGNvcnJlc3BvbmRpbmcgbGlzdGVuZXIuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gc3dhcCBvdXQKLQkgKiB0aGUgZW50aXJlIHRyZWUuIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgc2hvdWxkCi0JICogbmV2ZXIgYmUgc2V0IHRvIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyOwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciByb290TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiBhIG5vZGUncyBpbnRlcm5hbAotCSAqICJzdGF0ZSIgY2hhbmdlcyAoYXMgb3Bwb3NlZCB0byB0aGUgbm9kZSdzIHZhbHVlIG9yIGxpc3Qgb2YKLQkgKiBjaGlsZHJlbiksIGFsbG93aW5nIHVzIHRvIGZvcndhcmQgbm90aWZpY2F0aW9uIHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIG5vZGVTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgInZhbHVlIgotCSAqIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyBzdGF0ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqIFR5cGljYWxseSwgdGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGggbm9kZXMgdGhhdCBob2xkCi0JICogcHJpbWl0aXZlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5vZGVWYWx1ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYW4gdW5kZXJseWluZyBub2RlJ3MKLQkgKiAibGlzdCIgb2YgY2hpbGRyZW4gY2hhbmdlcywgYWxsb3dpbmcgdXMgdG8ga2VlcCBvdXIKLQkgKiBpbnRlcm5hbCB0cmVlIGluIHN5bmNoIHdpdGggdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjaGlsZHJlbkxpc3RlbmVyOwotCi0JLyogdGhlc2UgYXR0cmlidXRlcyBtYWtlIHVwIG91ciBpbnRlcm5hbCB0cmVlICovCi0JLyoqCi0JICogVGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMsIHdoaWNoIGlzCi0JICogbW9zdCBvZiB0aGUgdGltZS4gVGhlIHJvb3QgaXMgY2FjaGVkIHNvIHdlIGNhbiBkaXNlbmdhZ2UKLQkgKiBmcm9tIGl0IHdoZW4gaXQgaGFzIGJlZW4gc3dhcHBlZCBvdXQuCi0JICovCi0JcHJpdmF0ZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcm9vdDsKLQotCS8qKgotCSAqIE1hcCB0aGUgbm9kZXMgdG8gdGhlaXIgbGlzdHMgb2YgY2hpbGRyZW4uCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIHN3YXAgb3V0IHRoZSBlbnRpcmUgbGlzdCBvZiBjaGlsZHJlbgotCSAqIHdoZW4gd2UgcmVjZWl2ZSBhICNsaXN0Q2hhbmdlZCgpIGV2ZW50ICh3aGljaCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZmZlY3RlZCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNyZWJ1aWxkQ2hpbGRyZW4oKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4gY2hpbGRyZW5MaXN0czsKLQotCS8qKgotCSAqIE1hcCB0aGUgY2hpbGRyZW4gbW9kZWxzIHRvIHRoZWlyIHBhcmVudHMuCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIGZpZ3VyZSBvdXQgdGhlICJyZWFsIiBzb3VyY2Ugb2YgdGhlCi0JICogbGlzdCBjaGFuZ2UgZXZlbnRzICh0aGUgcGFyZW50KS4KLQkgKiBAc2VlIEV2ZW50Q2hhbmdlUG9saWN5I3BhcmVudCgpCi0JICovCi0JZmluYWwgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcGFyZW50czsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHJvb3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHJvb3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yb290SG9sZGVyID0gcm9vdEhvbGRlcjsKLQkJdGhpcy5yb290TGlzdGVuZXIgPSB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKTsKLQkJdGhpcy5ub2RlVmFsdWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFRyZWVOb2RlVmFsdWVNb2RlbDxUPiwgTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+PigpOwotCQl0aGlzLnBhcmVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHJvb3QuCi0JICovCi0JcHVibGljIFRyZWVNb2RlbEFkYXB0ZXIoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4ocm9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJvb3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJyb290IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCW5ldyBBZGRFdmVudENoYW5nZVBvbGljeShldmVudCkuYWRkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVtb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVwbGFjZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZXBsYWNlQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCW5ldyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLm1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgQ2xlYXJFdmVudENoYW5nZVBvbGljeShldmVudCkuY2xlYXJDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IENoYW5nZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZWJ1aWxkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoaWxkcmVuIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZChpbmRleCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkcmVuU2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGlzTGVhZihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG5vZGUpLmlzTGVhZigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCSgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCkpLnNldFZhbHVlKChUKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRJbmRleE9mQ2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5pbmRleE9mQ2hpbGQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyIG5vZGVzCi0JICogaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucm9vdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCQl0aGlzLnJvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJvb3QoKSB7Ci0JCXRoaXMuYWRkTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyCi0JICogbm9kZXMgaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucmVtb3ZlUm9vdCgpOwotCQl0aGlzLmRpc2VuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5yb290ID0gbnVsbDsKLQkJdGhpcy5yb290SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIGZyb20gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUm9vdCgpIHsKLQkJdGhpcy5yZW1vdmVOb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJvb3QgaGFzIGJlZW4gc3dhcHBlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGJpdCBnbmFybHkgYmVjYXVzZSB0aGUgQVBJIGZvciBub3RpZnlpbmcgbGlzdGVuZXJzCi0JICogdGhhdCB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQgZm9yCi0JICogbm9uLXJvb3Qgbm9kZXMuCi0JICovCi0Jdm9pZCByb290Q2hhbmdlZCgpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5ld1Jvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJLy8gcmVtb3ZlIGFsbCB0aGUgY3VycmVudCByb290J3MgY2hpbGRyZW4gZnJvbSB0aGUgdHJlZQotCQkvLyBhbmQgcmVtb3ZlIHRoZSBpdCBmcm9tIHRoZSBpbnRlcm5hbCB0cmVlCi0JCXRoaXMucmVtb3ZlUm9vdCgpOyAKLQotCQkvLyBzYXZlIHRoZSBvbGQgcm9vdCBhbmQgc3dhcCBpbiB0aGUgbmV3IHJvb3QKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG9sZFJvb3QgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0KLQkJLy8gd2UgbXVzdCBiZSBsaXN0ZW5pbmcgdG8gYm90aCB0aGUgb2xkIGFuZCBuZXcgcm9vdHMgd2hlbiB3ZSBmaXJlIHRoZSBldmVudAotCQkvLyBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGV5IGhhdmUgbGlzdGVuZXJzCi0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmZpcmVUcmVlUm9vdFJlcGxhY2VkKHRoaXMucm9vdCk7Ci0JCS8vIG5vdyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCByb290Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZShvbGRSb290KTsKLQotCQkvLyBhZGQgdGhlIG5ldyByb290IHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFuZAotCQkvLyBhZGQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgdHJlZSBhbHNvCi0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciB0aGUgInZhbHVlIiBvciB0aGUgInN0YXRlIiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGNoYW5nZWQsCi0JICogZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIG5vZGVDaGFuZ2VkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZVRyZWVSb290Q2hhbmdlZChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVRyZWVOb2RlQ2hhbmdlZChwYXJlbnQucGF0aCgpLCBwYXJlbnQuaW5kZXhPZkNoaWxkKG5vZGUpLCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZXMsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlIG5vZGVzIHdlcmUgYWRkZWQsCi0JICogYW5kIHRoZW4gYWRkIHRoZSBub2RlcyB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgYmVmb3JlIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogYWRkaW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgYWRkQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5lbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hZGROb2RlKGNoaWxkSW5kaWNlc1tpXSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCQlub2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogYWRkaW5nIHRoZW0gdG8gdGhlIGludGVybmFsIHRyZWUgYWxzby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCXRoaXMuYWRkTm9kZVRvSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLmFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZVRvSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyA9PSBudWxsKSB7Ci0JCQlzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChwYXJlbnQsIHNpYmxpbmdzKTsKLQkJfQotCQlzaWJsaW5ncy5hZGQoaW5kZXgsIG5vZGUpOwotCi0JCXRoaXMucGFyZW50cy5wdXQoY2hpbGRyZW5Nb2RlbCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gb3VyIGludGVybmFsIHRyZWUsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlCi0JICogbm9kZXMgd2VyZSByZW1vdmVkLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2Rlcy4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgdW50aWwgYWZ0ZXIgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiByZW1vdmluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIHRoZSBpbmRpY2VzIHNsaWRlIGRvd24gYSBub3RjaCBlYWNoIHRpbWUgd2UgcmVtb3ZlIGEgY2hpbGQKLQkJCXRoaXMucmVtb3ZlTm9kZShjaGlsZEluZGljZXNbaV0gLSBpLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5kaXNlbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcnN0LCByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIHJlbW92aW5nIHRoZW0gZnJvbSBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlbW92ZSB0aGUgbm9kZSBpdHNlbGYgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKSB7Ci0JCXRoaXMucGFyZW50cy5yZW1vdmUoY2hpbGRyZW5Nb2RlbCk7Ci0KLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHNpYmxpbmdzID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlzaWJsaW5ncy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VOb2RlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5vZGUuY2hpbGRyZW5Nb2RlbCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQkJbm9kZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ub2RlVmFsdWVMaXN0ZW5lcik7Ci0JCW5vZGUucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIG1vdmVDaGlsZHJlbihUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKGNoaWxkcmVuTGlzdC5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQljaGlsZHJlbkxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQl0aGlzLmZpcmVUcmVlU3RydWN0dXJlQ2hhbmdlZChwYXJlbnQucGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvYWxlc2NlIHNvbWUgb2YgdGhlIGNvbW1vbiBjaGFuZ2UgcG9saWN5IGJlaGF2aW9yLgotCSAqLwotCWFic3RyYWN0IGNsYXNzIENoYW5nZVBvbGljeSB7Ci0KLQkJQ2hhbmdlUG9saWN5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbih0aGlzLnBhcmVudCgpLnBhdGgoKSwgdGhpcy5jaGlsZEluZGljZXMoKSwgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwKLQkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnRpZ3VvdXMuCi0JCSAqLwotCQlpbnRbXSBjaGlsZEluZGljZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEluZGljZXModGhpcy5jaGlsZHJlblN0YXJ0SW5kZXgoKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEFycmF5KHRoaXMuZ2V0Q2hpbGRyZW4oKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW4gYXJyYXkgdG8gaG9sZCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkJICogSWYgdGhleSBhcmUgZGlmZmVyZW50IHNpemVzLCBzb21ldGhpbmcgaXMgc2NyZXdlZCB1cC4uLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYnVpbGRBcnJheShJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGVsZW1lbnRzLCBpbnQgc2l6ZSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBhcnJheSA9IG5ldyBUcmVlTm9kZVZhbHVlTW9kZWxbc2l6ZV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCQlhcnJheVtpKytdID0gZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYSBzZXQgb2YgaW5kaWNlcywgc3RhcnRpbmcgYXQgemVybyBhbmQKLQkJICogY29udGludWluZyBmb3IgdGhlIHNwZWNpZmllZCBzaXplLgotCQkgKi8KLQkJaW50W10gYnVpbGRJbmRpY2VzKGludCBzaXplKSB7Ci0JCQlyZXR1cm4gYnVpbGRJbmRpY2VzKDAsIHNpemUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgewotCQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbc2l6ZV07Ci0JCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGV4Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kaWNlczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblN0YXJ0SW5kZXgoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblNpemUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKTsKLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0RXZlbnQgZm9yIGFkZGluZywgcmVtb3ZpbmcsIHJlcGxhY2luZywKLQkgKiBhbmQgY2hhbmdpbmcgY2hpbGRyZW4uCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlmaW5hbCBMaXN0RXZlbnQgZXZlbnQ7Ci0KLQkJRXZlbnRDaGFuZ2VQb2xpY3koTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1hcCB0aGUgTGlzdENoYW5nZUV2ZW50J3Mgc291cmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIFRyZWVNb2RlbEFkYXB0ZXIudGhpcy5wYXJlbnRzLmdldCh0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RBZGRFdmVudCBmb3IgYWRkaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIEFkZEV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUFkZEV2ZW50Q2hhbmdlUG9saWN5KExpc3RBZGRFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0QWRkRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0UmVtb3ZlRXZlbnQgZm9yIGFkZGluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBSZW1vdmVFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZW1vdmVFdmVudENoYW5nZVBvbGljeShMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdFJlbW92ZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW0gaW5kZXggaXMgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFdmVudCgpLmdldEluZGV4KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW1zIGFyZSB0aGUgY2hpbGRyZW4uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtcygpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdFJlcGxhY2VFdmVudCBmb3IgcmVwbGFjaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIFJlcGxhY2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZXBsYWNlRXZlbnRDaGFuZ2VQb2xpY3koTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0UmVwbGFjZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0UmVwbGFjZUV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlcGxhY2VFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZXBsYWNlRXZlbnQncyBpdGVtcyBhcmUgdGhlIGNoaWxkcmVuLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0TmV3SXRlbXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIG9sZCBub2RlcyBhbmQgYWRkIHRoZSBuZXcgb25lcy4KLQkJICovCi0JCXZvaWQgcmVwbGFjZUNoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHRoaXMucGFyZW50KCkucGF0aCgpOwotCQkJaW50W10gY2hpbGRJbmRpY2VzID0gdGhpcy5jaGlsZEluZGljZXMoKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIHRoaXMuZ2V0T2xkQ2hpbGRyZW4oKSk7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMuYWRkQ2hpbGRyZW4ocGFyZW50UGF0aCwgY2hpbGRJbmRpY2VzLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBnZXRPbGRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkodGhpcy5nZXRPbGRJdGVtcygpLCB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCkpOwotCQl9Ci0KLQkJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldE9sZEl0ZW1zKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0T2xkSXRlbXMoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RNb3ZlRXZlbnQgZm9yIG1vdmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBFdmVudENoYW5nZVBvbGljeSB7Ci0KLQkJTW92ZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdE1vdmVFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiAoTGlzdE1vdmVFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCXZvaWQgbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm1vdmVDaGlsZHJlbih0aGlzLnBhcmVudCgpLCB0aGlzLmdldEV2ZW50KCkuZ2V0VGFyZ2V0SW5kZXgoKSwgdGhpcy5nZXRFdmVudCgpLmdldFNvdXJjZUluZGV4KCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0Q2xlYXJFdmVudCBmb3IgY2xlYXJpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgQ2xlYXJFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDbGVhckV2ZW50Q2hhbmdlUG9saWN5KExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgYWxsIHRoZSBub2Rlcy4KLQkJICovCi0JCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0LCBjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdENoYW5nZUV2ZW50IGZvciBjbGVhcmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBDaGFuZ2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDaGFuZ2VFdmVudENoYW5nZVBvbGljeShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIHRoZSBvbGQgbm9kZXMgYW5kIGFkZCBhbGwgdGhlIG5ldyBub2Rlcy4KLQkJICovCi0JCXZvaWQgcmVidWlsZENoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IHRoaXMucGFyZW50KCk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGgoKTsKLQkJCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSBUcmVlTW9kZWxBZGFwdGVyLnRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWludFtdIGNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShjaGlsZHJlbkxpc3QsIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0KLQkJCWNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKHBhcmVudC5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpKTsKLQkJCWNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkocGFyZW50LmNoaWxkcmVuTW9kZWwoKSwgcGFyZW50LmNoaWxkcmVuU2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgVHJlZU5vZGVWYWx1ZU1vZGVsIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBOb2RlQ2hhbmdlUG9saWN5IGV4dGVuZHMgQ2hhbmdlUG9saWN5IHsKLQkJcHJpdmF0ZSBmaW5hbCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZTsKLQotCQlOb2RlQ2hhbmdlUG9saWN5KFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgbm9kZSBpdHNlbGYgaXMgdGhlIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMubm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleCBpcyBhbHdheXMgemVyby4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gc2l6ZSBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpemUKLQkJICogb2YgdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKS5zaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gYXJlIGFsbCB0aGUgb2JqZWN0cyBoZWxkIGJ5Ci0JCSAqIHRoZSBjaGlsZHJlbiBtb2RlbC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMubm9kZS5jaGlsZHJlbk1vZGVsKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzJhNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIE5vZGUgY2xhc3Nlcy4KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgaW5pdGlhbGl6YXRpb24KLSAqICAgICBlbmZvcmNlZCBvYmplY3QgaWRlbnRpdHkgd3J0ICNlcXVhbHMoKS8jaGFzaENvZGUoKQotICogICAgIGNvbnRhaW5tZW50IGhpZXJhcmNoeSAocGFyZW50L2NoaWxkKQotICogICAgIHVzZXIgY29tbWVudAotICogICAgIGRpcnR5IGZsYWcKLSAqICAgICBwcm9ibGVtcwotICogICAgIHNvcnRpbmcKLSAqIAotICogVHlwaWNhbGx5LCBzdWJjbGFzc2VzIHNob3VsZCBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogICAgIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcnMKLSAqICAgICAgICAgKHdpdGggdGhlIGFwcHJvcHJpYXRlbHktcmVzdHJpY3RpdmUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgcGFyZW50KQotICogICAgICNpbml0aWFsaXplKCkKLSAqICAgICAjaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpCi0gKiAgICAgI2NoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjYWRkQ2hpbGRyZW5UbyhMaXN0IGxpc3QpCi0gKiAgICAgI25vZGVSZW1vdmVkKE5vZGUpCi0gKiAgICAgI3ZhbGlkYXRvcigpCi0gKiAgICAgI3RyYW5zaWVudEFzcGVjdE5hbWVzKCkgb3IKLSAqICAgICAgICAgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0IHRyYW5zaWVudEFzcGVjdE5hbWVzKQotICogICAgICNhZGRQcm9ibGVtc1RvKExpc3QgY3VycmVudFByb2JsZW1zKQotICogICAgICNub25WYWxpZGF0ZWRBc3BlY3ROYW1lcygpCi0gKiAgICAgICAgICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykKLSAqICAgICAjZGlzcGxheVN0cmluZygpCi0gKiAgICAgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBOb2RlCi17Ci0KLQkvKiogQ29udGFpbm1lbnQgaGllcmFyY2h5LiAqLwotCXByaXZhdGUgTm9kZSBwYXJlbnQ7ICAvLyBwc2V1ZG8tZmluYWwKLQotCS8qKiBUcmFjayB3aGV0aGVyIHRoZSBub2RlIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGlydHlCcmFuY2g7Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSdzIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSBWZWN0b3I8UHJvYmxlbT4gcHJvYmxlbXM7CQkvLyBwc2V1ZG8tZmluYWwKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfUFJPQkxFTV9NRVNTQUdFX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVGhpcyBtdXN0IGJlIHJlY2FsY3VsYXRlZCBldmVyeSB0aW1lIHRoaXMgbm9kZSBvciBvbmUgb2YgaXRzCi0JICogZGVzY2VuZGFudHMgY2hhbmdlcyBpdCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCi0JLyoqIFVzZXIgY29tbWVudC4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb21tZW50OwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0cyBvZiB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gdHJhbnNpZW50QXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JLyoqCi0JICogU2V0cyBvZiBub24tdmFsaWRhdGVkIGFzcGVjdCBuYW1lcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogTW9zdCBvYmplY3RzIG11c3QgaGF2ZSBhIHBhcmVudC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgbm9kZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZShOb2RlIHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmNvbW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGEgbmV3IG9iamVjdCBpcyBkaXJ0eSwgYnkgZGVmaW5pdGlvbgotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5kaXJ0eUJyYW5jaCA9IHRydWU7Ci0KLQkJdGhpcy5wcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UuCi0JICogQHNlZSAjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnROb2RlKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKHBhcmVudE5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIgYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdE5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogT3ZlcnJpZGUgI2FkZENoaWxkcmVuVG8oTGlzdCkuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNhZGRDaGlsZHJlblRvKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJdGhpcy5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIGNoaWxkcmVuCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKiBOQjogUm9vdCBub2RlIG1vZGVsIGltcGxlbWVudGF0aW9ucyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyByb290IG5vZGUgc2hvdWxkIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT25seSByb290IG5vZGVzIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3QuLi4gbWVzc2FnZUFyZ3VtZW50cykgewotCQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtKHRoaXMsIG1lc3NhZ2VLZXksIG1lc3NhZ2VUeXBlLCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXksIGludCBtZXNzYWdlVHlwZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByb2JsZW0obWVzc2FnZUtleSwgbWVzc2FnZVR5cGUsIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkvLyBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCQkvLyBXaGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlYnVpbGQgdGhlICJicmFuY2giIHByb2JsZW1zIGFuZCByZXR1cm4gd2hldGhlciB0aGV5IGhhdmUKLQkgKiBjaGFuZ2VkLgotCSAqIE5COiBUaGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgbXVzdCBiZSByZS1jYWxjdWxhdGVkCi0JICogd2l0aCBFVkVSWSAic2lnbmlmaWNhbnQiIGNoYW5nZSAtIHdlIGNhbm5vdCBrZWVwIGl0IGluIHN5bmNoIHZpYQotCSAqIGNoYW5nZSBub3RpZmljYXRpb25zIGJlY2F1c2UgaWYgYSBkZXNjZW5kYW50IHdpdGggcHJvYmxlbXMgaXMKLQkgKiByZW1vdmVkIG9yIHJlcGxhY2VkIHdlIHdpbGwgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgaXRzCi0JICogcHJvYmxlbXMgd2VyZSByZW1vdmVkIGZyb20gb3VyICJicmFuY2giIHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja0JyYW5jaFByb2JsZW1zKCkgewotCQlWZWN0b3I8UHJvYmxlbT4gb2xkQnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuYnJhbmNoUHJvYmxlbXMuc2l6ZSgpOwotCi0JCXRoaXMuYnJhbmNoUHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5hZGRBbGwodGhpcy5wcm9ibGVtcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRCcmFuY2hQcm9ibGVtc1RvKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQl9Ci0KLQkJLy8gaWYgdGhlIHNpemUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB6ZXJvLCBvdXIgdmlydHVhbCBmbGFnIGhhcyBjaGFuZ2VkCi0JCWludCBuZXdTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JCWlmICgob2xkU2l6ZSA9PSAwKSAmJiAobmV3U2l6ZSAhPSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIGZhbHNlLCB0cnVlKTsKLQkJfSBlbHNlIGlmICgob2xkU2l6ZSAhPSAwKSAmJiAobmV3U2l6ZSA9PSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIHRydWUsIGZhbHNlKTsKLQkJfQotCi0JCWlmIChvbGRCcmFuY2hQcm9ibGVtcy5lcXVhbHModGhpcy5icmFuY2hQcm9ibGVtcykpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBkaWQgbm90IGNoYW5nZQotCQl9Ci0JCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBjaGFuZ2VkCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgYWxsIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSBhbmQgYWxsCi0JICogdGhlIHByb2JsZW1zIG9mIGl0cyBkZXNjZW5kYW50cyB0byB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gbGlzdCkgewotCQlsaXN0LmFkZEFsbCh0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQ7Ci0JICogdGhlcmVmb3JlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgaGF2ZSBjaGFuZ2VkIGFsc28gYW5kCi0JICogbXVzdCBiZSByZWJ1aWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlYnVpbGRCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKCAhIHRoaXMuY2hlY2tCcmFuY2hQcm9ibGVtcygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBzaG91bGQgbm90IGdldCBoZXJlIHVubGVzcyBvdXIgXCJicmFuY2hcIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZGV2ZWxvcGVyLWZyaWVuZGx5IFN0cmluZy4gSWYgeW91IHdhbnQgc29tZXRoaW5nIHVzZWZ1bCBmb3IKLQkgKiBkaXNwbGF5aW5nIGluIGEgdXNlciBpbnRlcmZhY2UsIHVzZSAjZGlzcGxheVN0cmluZygpLgotCSAqIElmIHlvdSB3YW50IHRvIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBpbiB5b3VyICN0b1N0cmluZygpLAotCSAqIG92ZXJyaWRlICN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKS4gCi0JICogV2hhdGV2ZXIgeW91IGFkZCB0byB0aGF0IHN0cmluZyBidWZmZXIgd2lsbCBzaG93IHVwIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgotCSAqIEBzZWUgQWJzdHJhY3RNb2RlbCN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKQotCSAqIEBzZWUgI2Rpc3BsYXlTdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQXN5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTA2ZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogc2ltcGx5IHNldHMgYSBzaGFyZWQgInZhbGlkYXRlIiBmbGFnIHRvIHRydWUuIFRoaXMgc2hvdWxkIHRyaWdnZXIgYQotICogc2VwYXJhdGUgInZhbGlkYXRpb24iIHRocmVhZCB0byBiZWdpbiB2YWxpZGF0aW5nIHRoZSBhcHByb3ByaWF0ZQotICogYnJhbmNoIG9mIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhlIHNwZWNpZmllZCBzaGFyZWQKLQkgKiAidmFsaWRhdGUiIGZsYWcuIFRoaXMgZmxhZyBzaG91bGQgYmUgc2hhcmVkIHdpdGgKLQkgKiBhbm90aGVyIHRocmVhZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1ZhbGlkYXRvcihTeW5jaHJvbml6ZWRCb29sZWFuIHZhbGlkYXRlRmxhZykgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbGlkYXRlRmxhZyA9IHZhbGlkYXRlRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZSwgdHJpZ2dlcmluZwotCSAqIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQotCSAqIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy52YWxpZGF0ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsaWRhdGVGbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMmYzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvYmxlbSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvYmxlbQotCWltcGxlbWVudHMgUHJvYmxlbQotewotCXByaXZhdGUgZmluYWwgTm9kZSBzb3VyY2U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZUtleTsKLQlwcml2YXRlIGZpbmFsIGludCBtZXNzYWdlVHlwZTsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHM7Ci0KLQotCURlZmF1bHRQcm9ibGVtKE5vZGUgc291cmNlLCBTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLm1lc3NhZ2VLZXkgPSBtZXNzYWdlS2V5OwotCQl0aGlzLm1lc3NhZ2VUeXBlID0gbWVzc2FnZVR5cGU7Ci0JCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2JsZW0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE5vZGUgc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBtZXNzYWdlS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlS2V5OwotCX0KLQotCXB1YmxpYyBpbnQgbWVzc2FnZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1lc3NhZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgYmVjYXVzZSBwcm9ibGVtcyBhcmUgcmVwZWF0ZWRseQotCSAqIHJlLWNhbGN1bGF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgcHJvYmxlbXMgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nCi0JICogc2V0IG9mIHByb2JsZW1zOyBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBwcm9ibGVtcyBhbmQKLQkgKiBpZ25vcmUgYW55IGZyZXNobHktZ2VuZXJhdGVkIGR1cGxpY2F0ZXMuCi0JICogQWxzbywgcHJvYmxlbXMgYXJlIG5vdCBzYXZlZCB0byBkaXNrLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBQcm9ibGVtKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVByb2JsZW0gb3RoZXIgPSAoUHJvYmxlbSkgbzsKLQkJcmV0dXJuIHRoaXMuc291cmNlID09IG90aGVyLnNvdXJjZSgpCi0JCQkJJiYgdGhpcy5tZXNzYWdlS2V5LmVxdWFscyhvdGhlci5tZXNzYWdlS2V5KCkpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLm1lc3NhZ2VBcmd1bWVudHMsIG90aGVyLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlLmhhc2hDb2RlKCkgXiB0aGlzLm1lc3NhZ2VLZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2VLZXkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Ob2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYjIwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudCBhcyBkaXJ0eSBicmFuY2hlcy4KLQkgKiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBkaXJ0eS4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgc2F2ZSBsb2NhdGlvbiBvZiBzb21lCi0JICogdG9wLWxldmVsIG5vZGUgaXMgY2hhbmdlZCBhbmQgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUgbXVzdCBiZSBtYXJrZWQgZGlydHkgc28gaXQKLQkgKiB3aWxsIGJlIHdyaXR0ZW4gb3V0LgotCSAqLwotCXZvaWQgbWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzIGJyYW5jaCBoYXMgYmVlbiBtYXJrZWQgY2xlYW4uIElmIHRoZSBub2RlCi0JICogaXRzZWxmIGlzIGNsZWFuIGFuZCBpZiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIGNsZWFuLCB0aGUKLQkgKiBub2RlJ3MgYnJhbmNoIGNhbiBiZSBtYXJrZWQgY2xlYW4uIFRoZW4sIGlmIHRoZSBub2RlJ3MKLQkgKiBicmFuY2ggaXMgY2xlYW4sIHRoZSBub2RlIHdpbGwgbm90aWZ5IGl0cyBwYXJlbnQgdGhhdCBpdCBtaWdodAotCSAqIGJlIGNsZWFuIGFsc28uIFRoaXMgbWVzc2FnZSBpcyBwcm9wYWdhdGVkIHVwIHRoZSBjb250YWlubWVudAotCSAqIHRyZWUgd2hlbiBhIHBhcnRpY3VsYXIgbm9kZSBiZWNvbWVzIGNsZWFuLgotCSAqLwotCXZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBNYXJrIHRoZSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGNsZWFuLgotCSAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaGFzIGp1c3QgYmVlbgotCSAqIHJlYWQgaW4gb3Igd3JpdHRlbiBvdXQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKiBOb3QgdGhlIGJlc3Qgb2YgbWV0aG9kIG5hbWVzLi4uLiA6LSgKLQkgKi8KLQl2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9ibGVtcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFJldHVybiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFNldCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgaW52b2tlZCBieSBhIGNsaWVudDsgYW5kIGl0IHdpbGwKLQkgKiB0eXBpY2FsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0JICogCSNicmFuY2hQcm9ibGVtcygpCi0JICogCSNoYXNCcmFuY2hQcm9ibGVtcygpCi0JICogV2hldGhlciB0aGUgbm9kZSBtYWludGFpbnMgaXRzIHByb2JsZW1zIG9uIHRoZSBmbHkKLQkgKiBvciB3YWl0cyB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIFByb2JsZW0KLQkgKi8KLQl2b2lkIHZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBCUkFOQ0hfUFJPQkxFTVNfTElTVCA9ICJicmFuY2hQcm9ibGVtcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCWludCBicmFuY2hQcm9ibGVtc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMgaGF2ZSBwcm9ibGVtcy4KLQkgKi8KLQlib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZID0gImhhc0JyYW5jaFByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0KLQotCS8vICoqKioqKioqKiogZGlzcGxheWluZy9zb3J0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwsIHN1aXRhYmxlIGZvciBzb3J0aW5nLgotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2ltcGxlIGludGVyZmFjZSBkZWZpbmluZyBhICJyZWZlcmVuY2UiIGJldHdlZW4gdHdvIG5vZGVzLgotCSAqIEBzZWUgTm9kZSNhZGRCcmFuY2hSZWZlcmVuY2VzVG8oamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JaW50ZXJmYWNlIFJlZmVyZW5jZSB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInNvdXJjZSIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogcmVmZXJlbmNlcyB0aGUgInRhcmdldCIgbm9kZS4KLQkJICovCi0JCU5vZGUgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInRhcmdldCIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogaXMgcmVmZXJlbmNlZCBieSB0aGUgInNvdXJjZSIgbm9kZS4KLQkJICovCi0JCU5vZGUgdGFyZ2V0KCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEEgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgYSBub2RlIGFzIGFwcHJvcHJpYXRlLgotCSAqIFR5cGljYWxseSB0aGUgdmFsaWRhdGlvbiB3aWxsCi0JICogCS0gb2NjdXIgd2hlbmV2ZXIgYSBub2RlIGhhcyBjaGFuZ2VkCi0JICogCS0gZW5jb21wYXNzIHRoZSBlbnRpcmUgdHJlZSBjb250YWluaW5nIHRoZSBub2RlCi0JICogCS0gZXhlY3V0ZSBhc3luY2hyb25vdXNseQotCSAqLwotCWludGVyZmFjZSBWYWxpZGF0b3IgewotCi0JCS8qKgotCQkgKiBBICJzaWduaWZpY2FudCIgYXNwZWN0IGhhcyBjaGFuZ2VkOwotCQkgKiB2YWxpZGF0ZSB0aGUgbm9kZSBhcyBhcHByb3ByaWF0ZQotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBTdG9wIGFsbCB2YWxpZGF0aW9uIG9mIHRoZSBub2RlIHVudGlsICNyZXN1bWUoKSBpcyBjYWxsZWQuCi0JCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW55IGxvbmctcnVubmluZwotCQkgKiBhY3Rpb24gdGhhdCB0cmlnZ2VycyBudW1lcm91cyBjaGFuZ2VzIHRvIHRoZSBub2RlLiBCZSBzdXJlIHRvCi0JCSAqIG1hdGNoIGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRoIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvCi0JCSAqICNyZXN1bWUoKS4KLQkJICovCi0JCXZvaWQgcGF1c2UoKTsKLQotCQkvKioKLQkJICogUmVzdW1lIHZhbGlkYXRpb24gb2YgdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlCi0JCSAqIGNhbGxlZCBhZnRlciBhIG1hdGNoaW5nIGNhbGwgdG8gI3BhdXNlKCkuCi0JCSAqLwotCQl2b2lkIHJlc3VtZSgpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBOb2RlIHNvdXJjZTsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQkJcHVibGljIFNpbXBsZVJlZmVyZW5jZShOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCX0KLQkJcHVibGljIE5vZGUgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlOwotCQl9Ci0JCXB1YmxpYyBOb2RlIHRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLnRhcmdldDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlICsgIiA9PiAiICsgdGhpcy50YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGRvZXMgbm90aGluZyB0byB2YWxpZGF0ZSB0aGUgbm9kZS4KLQkgKi8KLQlWYWxpZGF0b3IgTlVMTF9WQUxJREFUT1IgPQotCQluZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsLmluc3RhbmNlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5vZGUuTlVMTF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1BsdWdnYWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyODNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlCi0gKiBwYXVzZS9yZXN1bWUgcG9ydGlvbiBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkZWxlZ2F0ZXMgdGhlIGFjdHVhbAotICogdmFsaWRhdGlvbiB0byBhICJwbHVnZ2FibGUiIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2dhYmxlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBOb2RlLlZhbGlkYXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBwYXVzZTsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPblJlc3VtZTsKLQlwcml2YXRlIGZpbmFsIERlbGVnYXRlIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBBc3luY2hyb25vdXNWYWxpZGF0b3IodmFsaWRhdGVGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlLlZhbGlkYXRvciBidWlsZFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihuZXcgU3luY2hyb25vdXNWYWxpZGF0b3Iobm9kZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsZWdhdGUuCi0JICovCi0JcHVibGljIFBsdWdnYWJsZVZhbGlkYXRvcihEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXVzZSgpIHsKLQkJaWYgKHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgcGF1c2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5wYXVzZSA9IGZhbHNlOwotCQkvLyB2YWxpZGF0ZSBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB2YWxpZGF0aW9uIHdhcyBwYXVzZWQKLQkJaWYgKHRoaXMudmFsaWRhdGVPblJlc3VtZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCQl0aGlzLmRlbGVnYXRlLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlbGVnYXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW55IGRlbGVnYXRlcyBvZiBhIHBsdWdnYWJsZSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBEZWxlZ2F0ZSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB2YWxpZGF0b3IgaXMgbm90ICJwYXVzZWQiIC0gcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbi4KLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCi0JCS8qKgotCQkgKiBUaGlzIGRlbGVnYXRlIGRvZXMgbm90aGluZy4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBEZWxlZ2F0ZSB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERlbGVnYXRlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCXB1YmxpYyBzdGF0aWMgRGVsZWdhdGUgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I0Nzc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotLyoqCi0gKiBEZWZpbmUgYW4gaW50ZXJmYWNlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW1zIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUgbW9zdCBjbG9zZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvYmxlbS4KLQkgKi8KLQlOb2RlIHNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHByb2JsZW0ncyBtZXNzYWdlLgotCSAqLwotCVN0cmluZyBtZXNzYWdlS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvYmxlbSdzIG1lc3NhZ2UuCi0JICovCi0JT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaWRlbnRpZmllZCBwcm9ibGVtJ3MgbWVzc2FnZQotCSAqLwotCWludCBtZXNzYWdlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2JsZW0gaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogSXQgaXMgZXF1YWwgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkgKiBQcm9ibGVtIGludGVyZmFjZSBhbmQgaXRzIHNvdXJjZSwgbWVzc2FnZSBrZXksIGFuZCBtZXNzYWdlCi0JICogYXJndW1lbnRzIGFyZSBhbGwgZXF1YWwgdG8gdGhpcyBwcm9ibGVtJ3MuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ibGVtJ3MgaGFzaCBjb2RlLCB3aGljaCBzaG91bGQgY2FsY3VsYXRlZCBhcyBhbgotCSAqIFhPUiBvZiB0aGUgc291cmNlJ3MgaGFzaCBjb2RlIGFuZCB0aGUgbWVzc2FnZSBrZXkncyBoYXNoIGNvZGUuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NjY4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZSBpbnRlcmZhY2UKLSAqIHdpbGwgdmFsaWRhdGUgdGhlIG5vZGUgaW1tZWRpYXRlbHkuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgaW4gYSBzaW5nbGUgdGhyZWFkIG9yIGdlbmVyYXRpbmcKLSAqIHByb2JsZW0gcmVwb3J0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgaW1tZWRpYXRlbHkgdmFsaWRhdGUgdGhlCi0JICogc3BlY2lmaWVkIG5vZGUuCi0JICovCi0JcHVibGljIFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLm5vZGUudmFsaWRhdGVCcmFuY2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjQxMmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYSBjbGllbnQgdG8gYmV0dGVyIGNvbnRyb2wgdGhlIHBlcmZvcm1hbmNlIG9mCi0gKiBhIGNvbWJvIGJveCBtb2RlbCBieSBhbGxvd2luZyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgd2hlbiBpdCBpcwotICogYWNjZXB0YWJsZSBmb3IgdGhlIG1vZGVsIHRvICJjYWNoZSIgYW5kICJ1bmNhY2hlIiBpdHMgbGlzdCBvZiBlbGVtZW50cy4KLSAqIFRoZSBtb2RlbCBtYXkgaWdub3JlIHRoZXNlIGhpbnRzIGlmIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhY2hpbmdDb21ib0JveE1vZGVsIGV4dGVuZHMgQ29tYm9Cb3hNb2RlbCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FjaGUgdGhlIGNvbWJvQm94TW9kZWwgTGlzdC4gIElmIHlvdSBjYWxsIHRoaXMsIHlvdQotICAgICAqIG11c3QgbWFrZSBzdXJlIHRvIGNhbGwgdW5jYWNoZUxpc3QoKSBhcyB3ZWxsLiAgT3RoZXJ3aXNlCi0gICAgICogc3RhbGUgZGF0YSB3aWxsIGJlIGluIHRoZSBDb21ib0JveCB1bnRpbCBjYWNoZUxpc3QoKSBpcyAKLSAgICAgKiBjYWxsZWQgYWdhaW4gb3IgdW5jYWNoZUxpc3QoKSBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgdm9pZCBjYWNoZUxpc3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgY2FjaGVkIGxpc3QuICBOZXh0IHRpbWUgdGhlIGxpc3QgaXMgbmVlZGVkIGl0IHdpbGwKLSAgICAgKiBiZSBidWlsdCB3aGVuIGl0IGlzIG5vdCBjYWNoZWQuCi0gICAgICovCi0gICAgdm9pZCB1bmNhY2hlTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkgY2FjaGVkLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgCi0gICAgICogTW91c2VFdmVudHMsIHNpbmNlIHRoZXkgYXJlIG5vdCB0ZXJyaWJseSBwcmVkaWN0YWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2FjaGVkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMmIyZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHJvdywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGhhc0ZvY3VzID8gIFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlLmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpIDogTk9fRk9DVVNfQk9SREVSOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNlbGwgc2hvdWxkIGJlIG9wYXF1ZSBpbiB0aGUgdGFibGUuCi0JICogSWYgdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWJsZSdzIGJhY2tncm91bmQKLQkgKiBhbmQgdGFibGUgaXMgb3BhcXVlLCB3ZSBkb24ndCBuZWVkIHRvIHBhaW50IHRoZSBiYWNrZ3JvdW5kIC0KLQkgKiB0aGUgdGFibGUgd2lsbCBkbyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjZWxsSXNPcGFxdWVJbihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWE0M2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBjb21iby1ib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiBjYWNoaW5nIHRoZSBjb21ibyBib3ggYmVjYXVzZSB3ZSBhcmUgY2FjaGluZyB0aGUgY29tYm9Cb3hNb2RlbC4KLQkgKiBFdmVyeXRpbWUgd2UgcmVidWlsdCB0aGUgY29tYm9Cb3ggd2Ugd291bGQgc2V0IHRoZSBtb2RlbCBvbiBpdCBhbmQgbm90Ci0JICogcmVtb3ZlIHRoZSBtb2RlbCBmcm9tIHRoZSBvbGQgY29tYm8gYm94LiAgVGhpcyBtZWFudCB0aGF0IG5ldyBsaXN0ZW5lcnMKLQkgKiBrZXB0IGJlaW5nIGFkZGVkIHRvIHRoZSBjb21ib0JveE1vZGVsIGZvciBldmVyeSBjb21ib0JveCBidWlsZC4KLQkgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIHdheSB0byBjbGVhciBvdXQgdGhlIG9sZCBjb21ibyBib3gsIG9yIHdoeQotCSAqIHdlIHdlcmUgYnVpbGRpZyBhIG5ldyBjb21ibyBib3ggZXZlcnkgdGltZSBzbyBJIHdlbnQgd2l0aCBjYWNoaW5nIGl0LgotCSAqLwotCXByaXZhdGUgSkNvbWJvQm94IGNvbWJvQm94OwotCQotCS8qKiB0aGUgaXRlbXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29tYm8gYm94ICovCi0JcHJpdmF0ZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbDsKLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXI7Ci0JT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgc3RhdGljIGludCBoZWlnaHQgPSAtMTsKLQlib29sZWFuIGZha2VGb2N1c0ZsYWc7Ci0KLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQkKLQkvKiogaG9sZCB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3ggKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0Rm9yZWdyb3VuZDsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0QmFja2dyb3VuZDsKLQotCS8qKiAibm9ybWFsIiBib3JkZXIgLSBhc3N1bWUgdGhlIGRlZmF1bHQgdGFibGUgImZvY3VzIiBib3JkZXIgaXMgMSBwaXhlbCB0aGljayAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBOT19GT0NVU19CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tYm8tYm94IG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjYWNoaW5nIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgcmVuZGVyZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY2FjaGluZyBjb21iby1ib3ggbW9kZWwgYW5kIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobW9kZWwpOwotCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gc2F2ZSB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3gsIHNvIHdlCi0JCS8vIGNhbiB1c2UgdGhlbSB0byBwYWludCBub24tc2VsZWN0ZWQgY2VsbHMKLQkJaWYgKGhlaWdodCA9PSAtMSkgewotCQkJSkNvbWJvQm94IGNiID0gbmV3IEpDb21ib0JveCgpOwotCQkJY2IuYWRkSXRlbSgibSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGFkZCBpbiBzcGFjZSBmb3IgdGhlIGJvcmRlciB0b3AgYW5kIGJvdHRvbQotCQkJaGVpZ2h0ID0gY2IuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCArIDI7Ci0KLQkJCWRlZmF1bHRGb3JlZ3JvdW5kID0gY2IuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZGVmYXVsdEJhY2tncm91bmQgPSBjYi5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQl9Ci0KLSAgICBzdGF0aWMgSkxhYmVsIHByb3RvdHlwZUxhYmVsID0gbmV3IEpMYWJlbCgiUHJvdG90eXBlIiwgbmV3IEVtcHR5SWNvbigxNiksIFN3aW5nQ29uc3RhbnRzLkxFQURJTkcpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcm90ZWN0ZWQgSkNvbWJvQm94IGJ1aWxkQ29tYm9Cb3goKSB7Ci0KLQkJZmluYWwgSkNvbWJvQm94IHJlc3VsdCA9IG5ldyBKQ29tYm9Cb3goKSB7Ci0JCQlwcml2YXRlIGJvb2xlYW4gZmFrZUZvY3VzOwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLQkJCQlyZXR1cm4gZmFrZUZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJCQlmYWtlRm9jdXMgPSBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuZmFrZUZvY3VzRmxhZzsKLQkJCQlzdXBlci5wYWludChnKTsKLQkJCQlmYWtlRm9jdXMgPSBmYWxzZTsKLQkJCX0KLQkJCS8vd3JhcCB0aGUgcmVuZGVyZXIgdG8gZGVhbCB3aXRoIHRoZSBwcm90b3R5cGVEaXNwbGF5VmFsdWUKLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0UmVuZGVyZXIoZmluYWwgTGlzdENlbGxSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJICAgICAgICBzdXBlci5zZXRSZW5kZXJlcihuZXcgTGlzdENlbGxSZW5kZXJlcigpewotCQkgICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHYsIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQkgICAgICAgICAgICAgICAgaWYgKHYgPT0gcHJvdG90eXBlTGFiZWwpIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG90eXBlTGFiZWw7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdiwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9KTsKLQkJICAgIH0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBnZXRTZWxlY3RlZEluZGV4KCkgewotCQkgICAgICAgIGJvb2xlYW4gbGlzdE5vdENhY2hlZCA9ICFsaXN0SXNDYWNoZWQoKTsKLQkJICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotCQkgICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgCi0JCQkJaW50IGluZGV4ID0gc3VwZXIuZ2V0U2VsZWN0ZWRJbmRleCgpOwotCi0JCSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLQkJICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkJICAgICAgICB9Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkgICB9Ci0KLQkJfTsKLQkJLy8gc3RvbGUgdGhpcyBjb2RlIGZyb20gamF2YXguc3dpbmcuRGVmYXVsdENlbGxFZGl0b3IKLQkJcmVzdWx0LnB1dENsaWVudFByb3BlcnR5KCJKQ29tYm9Cb3guaXNUYWJsZUNlbGxFZGl0b3IiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJlc3VsdC5hZGRQb3B1cE1lbnVMaXN0ZW5lcih0aGlzLmJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSk7Ci0JCQotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHJlc3VsdC5zZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBnZXRMaXN0Qm94KHJlc3VsdCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotICAgIAotICAgIHByaXZhdGUgSkxpc3QgZ2V0TGlzdEJveChKQ29tYm9Cb3ggcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHJlc3VsdC5nZXRVSSgpLCAibGlzdEJveCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0JCi0JcHJpdmF0ZSBBY3Rpb25MaXN0ZW5lciBidWlsZEFjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQlKQ29tYm9Cb3ggY2IgPSAoSkNvbWJvQm94KSBlLmdldFNvdXJjZSgpOwotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBjYi5nZXRTZWxlY3RlZEl0ZW0oKTsKLQotCQkJCS8vIE9ubHkgdXBkYXRlIHRoZSBzZWxlY3RlZCBpdGVtIGFuZCBpbnZva2UgaW1tZWRpYXRlRWRpdCgpIGlmIHRoZQotCQkJCS8vIHNlbGVjdGVkIGl0ZW0gYWN0dWFsbHkgY2hhbmdlZCwgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkJCQkvLyBlZGl0aW5nLCB0aGUgbW9kZWwgY2hhbmdlcyBhbmQgY2F1c2VzIHRoaXMgbWV0aG9kIHRvIGJlIGludm9rZWQsCi0JCQkJLy8gaXQgY2F1c2VzIENSIzM5NjM2NzUgdG8gb2NjdXIgYmVjYXVzZSBpbW1lZGlhdGVFZGl0KCkgc3RvcCB0aGUKLQkJCQkvLyBlZGl0aW5nLCB3aGljaCBpcyBkb25lIGF0IHRoZSB3cm9uZyB0aW1lCi0JCQkJaWYgKENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy52YWx1ZSAhPSBzZWxlY3RlZEl0ZW0pIHsKLQkJCQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLnZhbHVlID0gY2IuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJaWYgKHRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBvcHVwTWVudUxpc3RlbmVyIGJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZVZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCWlmIChsaXN0SXNDYWNoZWQoKSkgewotCQkJCQl1bmNhY2hlTGlzdCgpOwotCQkJCX0KLQkJCQljYWNoZUxpc3QoKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkgICAgICAgICAgICBpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkgICAgICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkgICAgICAgICAgICB9Ci0KLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7Ci0JICAgICAgICAgICAgaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JICAgICAgICAgICAgfQotCQkJfQotCQl9OwotCX0KLQotCQotCXZvaWQgY2FjaGVMaXN0KCkgewotCQl0aGlzLm1vZGVsLmNhY2hlTGlzdCgpOwotCX0KLQkKLQl2b2lkIHVuY2FjaGVMaXN0KCkgewotCQl0aGlzLm1vZGVsLnVuY2FjaGVMaXN0KCk7Ci0JfQkKLQkKLQlib29sZWFuIGxpc3RJc0NhY2hlZCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWwuaXNDYWNoZWQoKTsKLQl9Ci0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQl0aGlzLmZha2VGb2N1c0ZsYWcgPSBzZWxlY3RlZCB8fCBoYXNGb2N1czsKLQkJaWYgKHRoaXMuY29tYm9Cb3ggPT0gbnVsbCkgewotCQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYnVpbGRDb21ib0JveCgpOwotCQotCQkJdGhpcy5jb21ib0JveC5zZXRDb21wb25lbnRPcmllbnRhdGlvbih0YWJsZS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0TW9kZWwodGhpcy5tb2RlbCk7Ci0JCQlpZiAodGhpcy5yZW5kZXJlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb21ib0JveC5zZXRSZW5kZXJlcih0aGlzLnJlbmRlcmVyKTsKLQkJCX0KLQkJCXRoaXMuY29tYm9Cb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRFbmFibGVkKHRhYmxlLmlzRW5hYmxlZCgpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWwsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJfQotCi0JCS8vIFdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgbW9kZWwgc2luY2UgSkNvbWJvQm94IG1pZ2h0IHByZXZlbnQgdXMgZnJvbQotCQkvLyBzZWxlY3RpbmcgdGhlIHZhbHVlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdmFsdWUgaXMgbm90IGNvbnRhaW5lZAotCQkvLyBpbiB0aGUgbW9kZWwsIHNlZSBDUiMzOTUwMDQ0IGZvciBhbiBleGFtcGxlCi0JCXRoaXMubW9kZWwuc2V0U2VsZWN0ZWRJdGVtKHZhbCk7Ci0KLQkJcmV0dXJuIHRoaXMuY29tYm9Cb3g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZvcmVncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/Ci0JCQlVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSAvLyROT04tTkxTLTEkCi0JCToKLQkJCU5PX0ZPQ1VTX0JPUkRFUjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZW5kZXJlcidzIHByZWZlcnJlZCBoZWlnaHQuIFRoaXMgYWxsb3dzIHlvdQotCSAqIHRvIHNldCB0aGUgcm93IGhlaWdodCB0byBzb21ldGhpbmcgdGhlIGNvbWJvLWJveCB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzYWRiNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFVzZWQgYnkgZ2VuZXJhbC1wdXJwb3NlIFVJIG1vZGVscyBhbmQgcmVuZGVyZXJzIHRvIGNhc3QKLSAqIGFwcGxpY2F0aW9uIG1vZGVsIG9iamVjdHMgdG8gc29tZXRoaW5nIGRpc3BsYXlhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlCi0JZXh0ZW5kcyBNb2RlbAotewotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGVsCi0JICogaW4gYSB0ZXh0dWFsIFVJIHNldHRpbmcgKHR5cGljYWxseSB0aGUgb2JqZWN0J3MgbmFtZSkuCi0JICogV2hlbiB0aGUgZGlzcGxheSBzdHJpbmcgY2hhbmdlcywgdGhlIG1vZGVsIHNob3VsZCBmaXJlCi0JICogdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb246Ci0JICogICAgIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkRGlzcGxheVN0cmluZywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCVN0cmluZyBESVNQTEFZX1NUUklOR19QUk9QRVJUWSA9ICJkaXNwbGF5U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kZWwKLQkgKiBpbiBhIFVJIGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIGljb25zICh0aGUgaWNvbiBjYW4gYmUgbnVsbCkuCi0JICogV2hlbiB0aGUgaWNvbiBjaGFuZ2VzLCB0aGUgbW9kZWwgc2hvdWxkIGZpcmUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbjoKLQkgKiAgICAgdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElDT05fUFJPUEVSVFksIG9sZEljb24sIHRoaXMuaWNvbigpKTsKLQkgKi8KLQlJY29uIGljb24oKTsKLQkJU3RyaW5nIElDT05fUFJPUEVSVFkgPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0ZmJjZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLS8qKgotICogSW1wbGVtZW50IHRoZSBJY29uIGludGVyZmFjZSB3aXRoIGFuIGljb24gdGhhdCBoYXMgYSBzaXplIGJ1dAotICogZG9lcyBub3QgcGFpbnQgYW55dGhpbmcgb24gdGhlIGdyYXBoaWNzIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eUljb24KLQlpbXBsZW1lbnRzIEljb24KLXsKLQlwcml2YXRlIGZpbmFsIGludCB3aWR0aDsKLQlwcml2YXRlIGZpbmFsIGludCBoZWlnaHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVtcHR5SWNvbiBOVUxMX0lOU1RBTkNFID0gbmV3IEVtcHR5SWNvbigwKTsKLQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlJY29uKGludCBzaXplKSB7Ci0JCXRoaXMoc2l6ZSwgc2l6ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEljb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcGFpbnRJY29uKENvbXBvbmVudCBjLCBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHkpIHsKLQkJLy8gZG9uJ3QgcGFpbnQgYW55dGhpbmcgZm9yIGFuIGVtcHR5IGljb24KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25XaWR0aCgpIHsgCi0JCXJldHVybiB0aGlzLndpZHRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SWNvbkhlaWdodCgpIHsKLQkJcmV0dXJuIHRoaXMuaGVpZ2h0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdEJyb3dzZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWU5YWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJLy8gZGVmYXVsdCBiZWhhdmlvciBzaG91bGQgYmUgdG8gdXNlIHRoZSBjZWxsIHJlbmRlcmVyIGZyb20gdGhlIGNvbWJvYm94LgotCQl0aGlzLnBhbmVsLmxpc3RCb3goKS5zZXRDZWxsUmVuZGVyZXIoY29tYm9Cb3guZ2V0UmVuZGVyZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG1lc3NhZ2UgY2FuIGJlIGFueXRoaW5nIC0gaGVyZSB3ZSBidWlsZCBhIGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJdGhpcy5wYW5lbC5zZXRDb21wbGV0ZUxpc3QodGhpcy5jb252ZXJ0VG9BcnJheShjb21ib0JveC5nZXRNb2RlbCgpKSk7Ci0JCXRoaXMucGFuZWwuc2V0U2VsZWN0aW9uKGNvbWJvQm94LmdldE1vZGVsKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQlyZXR1cm4gdGhpcy5wYW5lbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIEpPcHRpb25QYW5lLk9LX0NBTkNFTF9PUFRJT047Ci0JfQotCi0JcHJvdGVjdGVkIGludCBtZXNzYWdlVHlwZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFOwotCX0KLQotCXByb3RlY3RlZCBJY29uIGljb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uVmFsdWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsCi0JICogaW50byBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFRvQXJyYXkoTGlzdE1vZGVsIG1vZGVsKSB7Ci0JCWludCBzaXplID0gbW9kZWwuZ2V0U2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbW9kZWwuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY3VzdG9tIHBhbmVsICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFM+IGV4dGVuZHMgRmlsdGVyaW5nTGlzdFBhbmVsPFM+IHsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHJvdGVjdGVkIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsKCkgewotCQkJc3VwZXIoRU1QVFlfQVJSQVksIG51bGwpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBEaXNhYmxlIHRoZSBwZXJmb3JtYW5jZSB0d2VhayBiZWNhdXNlIEpPcHRpb25QYW5lCi0JCSAqIHdpbGwgdHJ5IG9wZW4gd2lkZSBlbm91Z2ggdG8gZGlzYWJsZSB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyOwotCQkgKiBhbmQgaXQgbG9va3MgYSBiaXQgY2x1bXN5LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgcHJvdG90eXBlQ2VsbFZhbHVlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODYwOGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nTWF0Y2hlcjsKLQotLyoqCi0gKiBUaGlzIHBhbmVsIHByZXNlbnRzIGFuIGVudHJ5IGZpZWxkIGFuZCBhIGxpc3QgYm94IG9mIGNob2ljZXMgdGhhdAotICogYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBib3ggYnkgZW50ZXJpbmcKLSAqIGEgcGF0dGVybiBpbiB0aGUgZW50cnkgZmllbGQuCi0gKiAKLSAqIEJ5IGRlZmF1bHQsIHR3byB3aWxkY2FyZHMgYXJlIGFsbG93ZWQgaW4gdGhlIHBhdHRlcm46Ci0gKiAJJyonIHdpbGwgbWF0Y2ggYW55IHNldCBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycwotICogCSc/JyB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyCi0gKiAKLSAqIFRoZSBwYW5lbCBjb25zaXN0cyBvZiA0IGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY3VzdG9taXplZDoKLSAqIAktIDEgdGV4dCBmaWVsZAotICogCS0gMSBsaXN0IGJveAotICogCS0gMiBsYWJlbHMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgYWJvdmUKLSAqIAotICogT3RoZXIgYXNwZWN0cyBvZiB0aGUgcGFuZWwncyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZDoKLSAqIAktIHRoZSBzdHJpbmcgY29udmVydGVyIGRldGVybWluZXMgaG93IHRoZSBvYmplY3RzIGluIHRoZQotICogCQlsaXN0IGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgY29tcGFyZWQgdG8gdGhlIHBhdHRlcm4KLSAqIAkJZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZDsgYnkgZGVmYXVsdCB0aGUgY29udmVydGVyIHNpbXBseQotICogCQl1c2VzIHRoZSByZXN1bHQgb2YgdGhlIG9iamVjdCdzICN0b1N0cmluZygpIG1ldGhvZAotICogCQkoaWYgeW91IHJlcGxhY2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIsIHlvdSB3aWxsIHByb2JhYmx5Ci0gKiAJCXdhbnQgdG8gcmVwbGFjZSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyIGFsc28pCi0gKiAJLSB0aGUgc3RyaW5nIG1hdGNoZXIgY2FuIGFsc28gYmUgY2hhbmdlZCBpZiB5b3Ugd291bGQKLSAqIAkJbGlrZSBkaWZmZXJlbnQgcGF0dGVybiBtYXRjaGluZyBiZWhhdmlvciB0aGFuIHRoYXQKLSAqIAkJZGVzY3JpYmVkIGFib3ZlCi0gKiAJLSB5b3UgY2FuIHNwZWNpZnkgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbGlzdCAtIHRoaXMgbWF5Ci0gKiAJCWZvcmNlIHRoZSB1c2VyIHRvIGVudGVyIGEgcGF0dGVybiByZXN0cmljdGl2ZSBlbm91Z2gKLSAqIAkJdG8gcmVzdWx0IGluIGEgbGlzdCBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gc2l6ZTsgdGhlCi0gKiAJCWRlZmF1bHQgaXMgLTEsIHdoaWNoIGRpc2FibGVzIHRoZSByZXN0cmljdGlvbgotICogCi0gKiBUaGlzIHBhbmVsIGlzIG5vdCBhIHR5cGljYWwgcGFuZWwsIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXMgbm90IHNoYXJlCi0gKiBpdHMgbW9kZWwgd2l0aCBjbGllbnRzIHZpYSB2YWx1ZSBtb2RlbHMuIEluc3RlYWQsIHRoaXMgcGFuZWwncyBtb2RlbAotICogaXMgc2V0IGFuZCBxdWVyaWVkIGRpcmVjdGx5IGJlY2F1c2UgaXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBhCi0gKiBkaWFsb2cgdGhhdCBkaXJlY3RzIHRoZSB1c2VyJ3MgYmVoYXZpb3IgKGFzIG9wcG9zZWQgdG8gYSAibm9ybWFsIgotICogd2luZG93KS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBleHRlbmRzIEpQYW5lbCB7Ci0KLQkvKioKLQkgKiBUaGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcwotCSAqIChhcyBvcHBvc2VkIHRvIHRoZSBwYXJ0aWFsIGxpc3QgaGVsZCBieSB0aGUgbGlzdCBib3gpLgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gY29tcGxldGVMaXN0OwotCi0JLyoqCi0JICogQW4gYWRhcHRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMgaW4gdGhlIGxpc3QKLQkgKiB0byBzdHJpbmdzIHNvIHRoZXkgY2FuIGJlIHJ1biB0aHJvdWdoIHRoZSBtYXRjaGVyCi0JICogYW5kIGRpc3BsYXllZCBpbiB0aGUgdGV4dCBmaWVsZC4KLQkgKi8KLQlTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyOwotCi0JLyoqIFRoZSB0ZXh0IGZpZWxkLiAqLwotCXByaXZhdGUgSlRleHRGaWVsZCB0ZXh0RmllbGQ7Ci0JcHJpdmF0ZSBKTGFiZWwgdGV4dEZpZWxkTGFiZWw7Ci0JcHJpdmF0ZSBEb2N1bWVudExpc3RlbmVyIHRleHRGaWVsZExpc3RlbmVyOwotCi0JLyoqIFRoZSBsaXN0IGJveC4gKi8KLQlwcml2YXRlIEpMaXN0IGxpc3RCb3g7Ci0JcHJpdmF0ZSBKTGFiZWwgbGlzdEJveExhYmVsOwotCi0JLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBpbnQgbWF4TGlzdFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbWF0Y2hlciB1c2VkIHRvIGZpbHRlciB0aGUgbGlzdCBhZ2FpbnN0Ci0JICogdGhlIHBhdHRlcm4gZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZC4gQnkgZGVmYXVsdCwKLQkgKiB0aGlzIGFsbG93cyB0aGUgdHdvIHdpbGRjYXJkIGNoYXJhY3RlcnMgZGVzY3JpYmVkIGluCi0JICogdGhlIGNsYXNzIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXI7Ci0KLQkvKioKLQkgKiBQZXJmb3JtYW5jZSB0d2VhazogV2UgdXNlIHRoaXMgYnVmZmVyIGluc3RlYWQgb2YKLQkgKiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBkdXJpbmcgZmlsdGVyaW5nIHNvIHdlIGRvbid0IGhhdmUKLQkgKiB0byBrZWVwIHJlLWFsbG9jYXRpbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWZmZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgVEVYVF9GSUVMRF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDUsIDApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBMSVNUX0JPWF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDAsIDUsIDApOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBGaWx0ZXJpbmdMaXN0UGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2hvaWNlcwotCSAqIGFuZCBpbml0aWFsIHNlbGVjdGlvbi4gVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncyAod2hpY2ggc2ltcGx5IGNhbGxzICN0b1N0cmluZygpIG9uCi0JICogdGhlIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdMaXN0UGFuZWwoT2JqZWN0W10gY29tcGxldGVMaXN0LCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzKGNvbXBsZXRlTGlzdCwgaW5pdGlhbFNlbGVjdGlvbiwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJc3VwZXIobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLmluaXRpYWxpemUoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSB0aGlzLmRlZmF1bHRNYXhMaXN0U2l6ZSgpOwotCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQotCQl0aGlzLnRleHRGaWVsZExpc3RlbmVyID0gdGhpcy5idWlsZFRleHRGaWVsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5zdHJpbmdNYXRjaGVyID0gdGhpcy5idWlsZFN0cmluZ01hdGNoZXIoKTsKLQotCQl0aGlzLmluaXRpYWxpemVMYXlvdXQoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZEJ1ZmZlcigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbdGhpcy5tYXgoKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG1heCBudW1iZXIgb2YgZW50cmllcyBhbGxvd2VkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcml2YXRlIGludCBtYXgoKSB7Ci0JCWlmICh0aGlzLm1heExpc3RTaXplID09IC0xKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoOwotCQl9Ci0JCXJldHVybiBNYXRoLm1pbih0aGlzLm1heExpc3RTaXplLCB0aGlzLmNvbXBsZXRlTGlzdC5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSB0ZXh0IGZpZWxkCi0JICogYW5kIGZpbHRlciB0aGUgbGlzdCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciBidWlsZFRleHRGaWVsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5maWx0ZXJMaXN0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGludCBkZWZhdWx0TWF4TGlzdFNpemUoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ01hdGNoZXIgYnVpbGRTdHJpbmdNYXRjaGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0cmluZ01hdGNoZXI8VD4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxheW91dChPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQkvLyB0ZXh0IGZpZWxkCi0JCUpQYW5lbCB0ZXh0RmllbGRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRCb3JkZXIoVEVYVF9GSUVMRF9MQUJFTF9CT1JERVIpOwotCQl0ZXh0RmllbGRQYW5lbC5hZGQodGhpcy50ZXh0RmllbGRMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQl0aGlzLnRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzLnRleHRGaWVsZExpc3RlbmVyKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRMYWJlbEZvcih0aGlzLnRleHRGaWVsZCk7Ci0JCXRleHRGaWVsZFBhbmVsLmFkZCh0aGlzLnRleHRGaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLQkJdGhpcy5hZGQodGV4dEZpZWxkUGFuZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJLy8gbGlzdCBib3gKLQkJSlBhbmVsIGxpc3RCb3hQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldEJvcmRlcihMSVNUX0JPWF9MQUJFTF9CT1JERVIpOwotCQlsaXN0Qm94UGFuZWwuYWRkKHRoaXMubGlzdEJveExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCXRoaXMubGlzdEJveCA9IG5ldyBKTGlzdCgpOwotCQl0aGlzLmxpc3RCb3guc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuY29tcGxldGVMaXN0LCB0aGlzLm1heCgpKSk7Ci0JCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQkvLyBwZXJmb3JtYW5jZSB0d2Vhayg/KQotCQl0aGlzLmxpc3RCb3guc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHRoaXMucHJvdG90eXBlQ2VsbFZhbHVlKCkpOwotCQl0aGlzLmxpc3RCb3guc2V0UHJvdG90eXBlQ2VsbFZhbHVlKG51bGwpOwotCQl0aGlzLmxpc3RCb3guc2V0Q2VsbFJlbmRlcmVyKHRoaXMuYnVpbGREZWZhdWx0Q2VsbFJlbmRlcmVyKCkpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRMYWJlbEZvcih0aGlzLmxpc3RCb3gpOwotCQkvLyBidWcgMjc3NzgwMiAtIHNjcm9sbCBiYXJzIHNob3VsZG4ndCBiZSBvbiB0aGUgdGFiIHNlcXVlbmNlCi0JCUpTY3JvbGxQYW5lIGxpc3RCb3hTY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRoaXMubGlzdEJveCk7Ci0JCWxpc3RCb3hTY3JvbGxQYW5lLmdldEhvcml6b250YWxTY3JvbGxCYXIoKS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCQlsaXN0Qm94U2Nyb2xsUGFuZS5nZXRWZXJ0aWNhbFNjcm9sbEJhcigpLnNldEZvY3VzYWJsZShmYWxzZSk7Ci0JCWxpc3RCb3hQYW5lbC5hZGQobGlzdEJveFNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIHdpZGdldHMKLQkJdGhpcy5saXN0Qm94LnNldFNlbGVjdGVkVmFsdWUoaW5pdGlhbFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCXRoaXMudGV4dEZpZWxkLnNlbGVjdCgwLCB0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCi0JCXRoaXMuYWRkKGxpc3RCb3hQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBzZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3guZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCXRoaXMubGlzdEJveC5zZXRTZWxlY3RlZFZhbHVlKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGNvbXBsZXRlTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcGxldGVMaXN0OwotCX0KLQotCS8qKgotCSAqIHJlYnVpbGQgdGhlIGZpbHRlcmluZyBidWZmZXIgYW5kIHJlLWFwcGx5IHRoZSBmaWx0ZXIKLQkgKiB0byB0aGUgbmV3IGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wbGV0ZUxpc3QoT2JqZWN0W10gY29tcGxldGVMaXN0KSB7Ci0JCXRoaXMuY29tcGxldGVMaXN0ID0gY29tcGxldGVMaXN0OwotCQlpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgdGhpcy5tYXgoKSkgewotCQkJLy8gdGhlIGJ1ZmZlciB3aWxsIG5ldmVyIHNocmluayAtIG1pZ2h0IHdhbnQgdG8gcmUtY29uc2lkZXIuLi4gIH5ianYKLQkJCXRoaXMuYnVmZmVyID0gdGhpcy5idWlsZEJ1ZmZlcigpOwotCQl9Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBpbnQgbWF4TGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLm1heExpc3RTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1heExpc3RTaXplKGludCBtYXhMaXN0U2l6ZSkgewotCQl0aGlzLm1heExpc3RTaXplID0gbWF4TGlzdFNpemU7Ci0JCWlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCB0aGlzLm1heCgpKSB7Ci0JCQkvLyB0aGUgYnVmZmVyIHdpbGwgbmV2ZXIgc2hyaW5rIC0gbWlnaHQgd2FudCB0byByZS1jb25zaWRlci4uLiAgfmJqdgotCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBhcHBseSB0aGUgbmV3IGZpbHRlciB0byB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIHRleHQgZmllbGQKLQkgKiAoc28gd2UgY2FuIHNldCB0aGUgZm9jdXMpCi0JICovCi0JcHVibGljIEpUZXh0RmllbGQgdGV4dEZpZWxkKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RmllbGQ7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSB0ZXh0IGZpZWxkIGxhYmVsCi0JICovCi0JcHVibGljIEpMYWJlbCB0ZXh0RmllbGRMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEZpZWxkTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEZpZWxkTGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIGxpc3QgYm94Ci0JICogKHNvIHdlIGNhbiBhZGQgbW91c2UgbGlzdGVuZXJzIGZvciBkb3VibGUtY2xpY2tpbmcpCi0JICovCi0JcHVibGljIEpMaXN0IGxpc3RCb3goKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3g7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdEJveENlbGxSZW5kZXJlcihMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMubGlzdEJveC5zZXRDZWxsUmVuZGVyZXIocmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgbGlzdCBib3ggbGFiZWwKLQkgKi8KLQlwdWJsaWMgSkxhYmVsIGxpc3RCb3hMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveExhYmVsOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RCb3hMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRzRm9udChGb250IGZvbnQpIHsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRGb250KGZvbnQpOwotCQl0aGlzLnRleHRGaWVsZC5zZXRGb250KGZvbnQpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRGb250KGZvbnQpOwotCQl0aGlzLmxpc3RCb3guc2V0Rm9udChmb250KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdNYXRjaGVyOwotCX0KLQotCS8qKgotCSAqIHJlLWFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdNYXRjaGVyKFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcikgewotCQl0aGlzLnN0cmluZ01hdGNoZXIgPSBzdHJpbmdNYXRjaGVyOwotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIGRpc2FibGUgcGVyZm9ybWFuY2UgdHdlYWsKLQkgKiBieSByZXR1cm5pbmcgbnVsbCBoZXJlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdG90eXBlQ2VsbFZhbHVlKCkgewotCQlyZXR1cm4gIj09PT09PT09PT0+IEFfU1RSSU5HX1RIQVRfSVNfREVGSU5JVEVMWV9MT05HRVJfVEhBTl9FVkVSWV9TVFJJTkdfSU5fVEhFX0xJU1QgPD09PT09PT09PT0iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgdXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGJ1aWxkIHRoZSB0ZXh0Ci0JICogdXNlZCBieSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKChUKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogU29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgdXMgdG8gZmlsdGVyIHRoZSBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIGEgZmFzdCB0eXBpc3QgY2FuCi0JICogZ2VuZXJhdGUgZXZlbnRzIHF1aWNrZXIgdGhhbiB3ZSBjYW4gZmlsdGVyIHRoZSBsaXN0LiAoPyAgfmJqdikKLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBmaWx0ZXJMaXN0KCkgewotCQkvLyB0ZW1wb3JhcmlseSBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBib3ggc2VsZWN0aW9uLCBzaW5jZSB3ZSB3aWxsCi0JCS8vIGJlIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gZHVyaW5nIHRoZSBmaWx0ZXJpbmcgYW5kIGRvbid0IHdhbnQKLQkJLy8gdGhhdCB0byBhZmZlY3QgdGhlIHRleHQgZmllbGQKLQkJdGhpcy5maWx0ZXJMaXN0KHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBib3ggdG8gbWF0Y2ggdGhlCi0JICogc3BlY2lmaWVkIHBhdHRlcm4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbHRlckxpc3QoU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RyaW5nTWF0Y2hlci5zZXRQYXR0ZXJuU3RyaW5nKHBhdHRlcm4pOwotCQkJaW50IGogPSAwOwotCQkJaW50IGxlbiA9IHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJCWludCBtYXggPSB0aGlzLm1heCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh0aGlzLnN0cmluZ01hdGNoZXIubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcodGhpcy5lbnRyeShpKSkpKSB7Ci0JCQkJCXRoaXMuYnVmZmVyW2orK10gPSB0aGlzLmNvbXBsZXRlTGlzdFtpXTsKLQkJCQl9Ci0JCQkJaWYgKGogPT0gbWF4KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuYnVmZmVyLCBqKSk7Ci0JCX0KLQotCQkvLyBhZnRlciBmaWx0ZXJpbmcgdGhlIGxpc3QsIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0aW9uCi0JCWlmICh0aGlzLmxpc3RCb3guZ2V0TW9kZWwoKS5nZXRTaXplKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0TGVhZFNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmVuc3VyZUluZGV4SXNWaXNpYmxlKDApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgVCBlbnRyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChUKSB0aGlzLmNvbXBsZXRlTGlzdFtpbmRleF07Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBsaXN0IG1vZGVsIHRoYXQgd3JhcHMgb25seSBhIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kZWwgd2lsbCBpbmNsdWRlIHRoZSBhcnJheSBlbnRyaWVzIGZyb20gMCB0byAoc2l6ZSAtIDEpLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKGZpbmFsIE9iamVjdFtdIGFycmF5LCBmaW5hbCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0TGlzdE1vZGVsKCkgewotCQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJCXJldHVybiBzaXplOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGFycmF5W2luZGV4XTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiYWQyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQVdURXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQVdURXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LlJvYm90OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcucGxhZi5iYXNpYy5CYXNpY0NvbWJvQm94VUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHdheSB0byBoYW5kbGUgc2VsZWN0aW5nIGFuIGl0ZW0gZnJvbSBhCi0gKiBsaXN0IHRoYXQgbWF5IGdyb3cgdG9vIGxhcmdlIHRvIGJlIGhhbmRsZWQgY29udmVuaWVudGx5IGJ5IGEgY29tYm8tYm94LiAKLSAqIElmIHRoZSBsaXN0J3Mgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lnbmF0ZWQgImxvbmciIGxpc3Qgc2l6ZSwgCi0gKiB0aGUgY2hvaWNlIGxpc3Qgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBub3JtYWwgY29tYm8tYm94IHBvcHVwOyAKLSAqIG90aGVyd2lzZSwgYSBkaWFsb2cgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBzZWxlY3Rpb24uCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgYnJvd3NlIG1lY2hhbmlzbSwgc3ViY2xhc3NlcyBtYXkgCi0gKiAJLSBvdmVycmlkZSB0aGUgbWV0aG9kICNidWlsZEJyb3dzZXIoKQotICogIC0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnJvd3NlKCksIGluIHdoaWNoIGNhc2UgdGhlIG1ldGhvZCAKLSAqIAkJI2J1aWxkQnJvd3NlcigpIG1heSBiZSBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENob29zZXIgCi0JZXh0ZW5kcyBKQ29tYm9Cb3gKLXsKLQkKLQkvKiogdGhlIHNpemUgb2YgYSAibG9uZyIgbGlzdCAtIGFueXRoaW5nIHNtYWxsZXIgaXMgYSAic2hvcnQiIGxpc3QgKi8KLQlpbnQgbG9uZ0xpc3RTaXplID0gREVGQVVMVF9MT05HX0xJU1RfU0laRTsKLQkKLQkvKiogdGhlIGRlZmF1bHQgc2l6ZSBvZiBhICJsb25nIiBsaXN0LCB3aGljaCBpcyAyMCAodG8gbWF0Y2ggSk9wdGlvblBhbmUncyBiZWhhdmlvcikgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xPTkdfTElTVF9TSVpFID0gMjA7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggbG9uZyBsaXN0IHNpemUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJU1RfU0laRV9QUk9QRVJUWSA9ICJsb25nTGlzdFNpemUiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTcpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotCSAqIHdoZXRoZXIgdGhlIGNob29zZXIgaXMgY2hvb3NhYmxlLiAgaWYgYSBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUsCi0JICogaXQgb25seSBzZXJ2ZXMgYXMgYSBkaXNwbGF5IHdpZGdldC4gIGEgdXNlciBtYXkgbm90IGNoYW5nZSBpdHMgCi0JICogc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBjaG9vc2FibGUgPSB0cnVlOwotCQotCS8qKiBwcm9wZXJ0eSBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIGNob29zYWJsZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TQUJMRV9QUk9QRVJUWSA9ICJjaG9vc2FibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRoZSBicm93c2VyIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QgLSB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nICovCi0JcHJpdmF0ZSBMaXN0QnJvd3NlciBicm93c2VyOwotCQotICAgIHByaXZhdGUgTm9kZVNlbGVjdG9yIG5vZGVTZWxlY3RvcjsKLSAgICAKLQkvKiogSU5URVJOQUwgLSBUaGUgcG9wdXAgaXMgYmVpbmcgc2hvd24uICBVc2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcC4gKi8KLQlib29sZWFuIHBvcHVwQWxyZWFkeUluUHJvZ3Jlc3M7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaG9vc2VyIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIExpc3RDaG9vc2VyKENvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCBub2RlU2VsZWN0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdENob29zZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICAgICAgdGhpcy5ub2RlU2VsZWN0b3IgPSBub2RlU2VsZWN0b3I7Ci0gICAgfQotCS8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcigpKTsKLSAgICAgICAgdGhpcy5hZGRLZXlMaXN0ZW5lcihidWlsZEYzS2V5TGlzdGVuZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGxpc3RCb3goKS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGxpc3RCb3goKSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHRoaXMudWksICJsaXN0Qm94Iik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0JLyoqIAotCSAqIFdoZW4gdGhlIHBvcHVwIGlzIGFib3V0IHRvIGJlIHNob3duLCB0aGUgZXZlbnQgaXMgY29uc3VtZWQsIGFuZCAKLQkgKiBQb3B1cEhhbmRsZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlc2hvdyB0aGUgcG9wdXAgb3IgdG8gc2hvdwotCSAqIHRoZSBsb25nIGxpc3QgYnJvd3Nlci4KLQkgKi8KLQlwcml2YXRlIFBvcHVwTWVudUxpc3RlbmVyIGJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJTGlzdENob29zZXIudGhpcy5hYm91dFRvU2hvd1BvcHVwKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicG9wLXVwIG1lbnUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoaXMgY29kZSBpcyBiZWluZyByZWFjaGVkIGR1ZSB0byB0aGUgUG9wdXBIYW5kbGVyIGFscmVhZHkgYmVpbmcgaW4gcHJvZ3Jlc3MsCi0JICogdGhlbiBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBhbmQgbGF1bmNoIHRoZSBQb3B1cEhhbmRsZXIuCi0JICovCi0Jdm9pZCBhYm91dFRvU2hvd1BvcHVwKCkgewotCQlpZiAodGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFBvcHVwSGFuZGxlcigpKTsKLQl9Ci0gCi0gICAgCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBidWlsZEYzS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0YzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvVG9TZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRjMga2V5IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBnb1RvU2VsZWN0ZWRJdGVtKCkgewotICAgICAgICBpZiAoZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdENob29zZXIudGhpcy5ub2RlU2VsZWN0b3Iuc2VsZWN0Tm9kZUZvcihnZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBCcm93c2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIAotCSAqIExhemlseSBpbml0aWFsaXplIGJlY2F1c2Ugc3ViY2xhc3NlcyBtYXkgaGF2ZSBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIHRvIGRvCi0JICogYmVmb3JlIGJyb3dzZXIgY2FuIGJlIGJ1aWx0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyb3dzZSgpIHsKLQkJaWYgKHRoaXMuYnJvd3NlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJyb3dzZXIgPSB0aGlzLmJ1aWxkQnJvd3NlcigpOwotCQl9Ci0JCQotCQl0aGlzLmJyb3dzZXIuYnJvd3NlKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJicm93c2VyIiB1c2VkIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbG9uZyBsaXN0LAotCSAqIHR5cGljYWxseSB2aWEgYSBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIGJ1aWxkQnJvd3NlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0QnJvd3NlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIENob29zYWJsZSBmdW5jdGlvbmFsaXR5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogb3ZlcnJpZGUgYmVoYXZpb3IgLSBjb25zdW1lIHNlbGVjdGlvbiBpZiBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBhbkluZGV4KSB7Ci0JCWlmICh0aGlzLmNob29zYWJsZSkgewotCQkJc3VwZXIuc2V0U2VsZWN0ZWRJbmRleChhbkluZGV4KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQXJyb3dCdXR0b24oKSB7Ci0JCXRyeSB7Ci0JCQlCYXNpY0NvbWJvQm94VUkgY29tYm9Cb3hVaSA9IChCYXNpY0NvbWJvQm94VUkpIExpc3RDaG9vc2VyLnRoaXMuZ2V0VUkoKTsKLQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcnJvd0J1dHRvbi5nZXRNb2RlbCgpLnNldFByZXNzZWQoZmFsc2UpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRoaXMgaXMgYSBodWdlIGhhY2sgdG8gdHJ5IGFuZCBtYWtlIHRoZSBjb21ibyBib3ggbG9vayByaWdodCwKLQkJCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCQkJdGhpcy5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1vdmVzIHRoZSBtb3VzZSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiBiZWZvcmUgYW55IGppZ2dlcnkgcG9rZXJ5IHRoYXQgd2UndmUgZG9uZS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBjaGVja01vdXNlUG9zaXRpb24oKSB7Ci0JCQlpZiAodGhpcy5ldmVudENvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBQb2ludCBuZXdDb21wb25lbnRMb2NhdGlvbiA9IHRoaXMuZXZlbnRDb21wb25lbnQuZ2V0TG9jYXRpb25PblNjcmVlbigpOwotCQkJYm9vbGVhbiBjb21wb25lbnRNb3ZlZCA9IAotCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnggLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnggIT0gMAotCQkJCXx8IG5ld0NvbXBvbmVudExvY2F0aW9uLnkgLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnkgIT0gMDsKLQkJCQotCQkJaWYgKGNvbXBvbmVudE1vdmVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3IFJvYm90KCkubW91c2VNb3ZlKAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueCArIHRoaXMubW91c2VMb2NhdGlvbi54LAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueSArIHRoaXMubW91c2VMb2NhdGlvbi55Ci0JCQkJCSk7Ci0JCQkJfQotCQkJCWNhdGNoIChBV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gbW92ZSBmYWlsZWQgLSBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwNzliZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi0vKioKLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEYzIG9yIGNob29zZXMKLSAqICdHbyBUbycgaW4gdGhlIGNvbnRleHQgbWVudQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVTZWxlY3RvciAKLXsgICAgICAgCi0gICAgLyoqCi0gICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBOb2RlIGluIHRoZSB0cmVlIG9yIHRoZSBlZGl0b3IgcGFuZWwuCi0gICAgICovCi0gICAgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIE5vZGVTZWxlY3RvciB3aWxsIGRvIG5vdGhpbmcgd2hlbiBzZWxlY3ROb2RlRm9yKE9iamVjdCkgaXMgY2FsbGVkCi0gICAgICovCi0gICAgY2xhc3MgRGVmYXVsdE5vZGVTZWxlY3RvciBpbXBsZW1lbnRzIE5vZGVTZWxlY3RvciB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKSB7Ci0gICAgICAgICAgICAvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY5YTdjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQKLSAqIHdoZW5ldmVyIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhY2hpbmcgKGkuZS4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24KLSAqIGxpc3QgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIGxpdHRsZSBsYXRlbmN5KS4gQWxsIHRoZSBub3JtYWwgQ29tYm9Cb3hNb2RlbAotICogYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIGEgY2xpZW50LXN1cHBsaWVkIENvbWJvQm94TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRzIENhY2hpbmdDb21ib0JveE1vZGVsIHsKLQlwcml2YXRlIENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0KLQlwdWJsaWMgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwoQ29tYm9Cb3hNb2RlbCB3cmFwcGVkQ29tYm9Cb3hNb2RlbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsID0gd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hpbmdDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNhY2hlTGlzdCgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBhbkl0ZW0pIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5zZXRTZWxlY3RlZEl0ZW0oYW5JdGVtKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0gIAotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwYjZiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIERpc3BsYXlhYmxlIGNvbnZlcnRzIGFueSBPYmplY3QKLSAqIHRvIGEgRGlzcGxheWFibGUuIFN1YmNsYXNzIGl0IHRvIG92ZXJyaWRlICNkaXNwbGF5U3RyaW5nKCkgYW5kCi0gKiAjaWNvbigpIGlmIG5lY2Vzc2FyeS4gQ2hhbmdlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGZpcmVkIGlmIHRoZQotICogb2JqZWN0IGlzIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIFN0cmluZ3MgLSB0aGUgZGlzcGxheSBzdHJpbmcKLSAqIHdpbGwgc2ltcGx5IGJlIHRoZSBTdHJpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlzcGxheWFibGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIERpc3BsYXlhYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGEgRGlzcGxheWFibGUuICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRpc3BsYXlhYmxlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoT2JqZWN0IG9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoY2hhciBjKSB7Ci0JCXRoaXMoQ2hhcmFjdGVyLnZhbHVlT2YoYykpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShieXRlIGIpIHsKLQkJdGhpcyhCeXRlLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShzaG9ydCBzKSB7Ci0JCXRoaXMoU2hvcnQudmFsdWVPZihzKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGludCBpKSB7Ci0JCXRoaXMoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUobG9uZyBsKSB7Ci0JCXRoaXMoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoZmxvYXQgZikgewotCQl0aGlzKEZsb2F0LnZhbHVlT2YoZikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShkb3VibGUgZCkgewotCQl0aGlzKERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGlzcGxheWFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlTdHJpbmcgPSB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJSWNvbiBvbGRJY29uID0gdGhpcy5pY29uKCk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElDT05fUFJPUEVSVFksIG9sZEljb24sIHRoaXMuaWNvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gKChCb29sZWFuKSB0aGlzLm9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIGIpIHsKLQkJdGhpcy5zZXRPYmplY3QoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRDaGFyKCkgewotCQlyZXR1cm4gKChDaGFyYWN0ZXIpIHRoaXMub2JqZWN0KS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyKGNoYXIgYykgewotCQl0aGlzLnNldE9iamVjdChDaGFyYWN0ZXIudmFsdWVPZihjKSk7Ci0JfQotCi0JcHVibGljIGJ5dGUgZ2V0Qnl0ZSgpIHsKLQkJcmV0dXJuICgoQnl0ZSkgdGhpcy5vYmplY3QpLmJ5dGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ5dGUoYnl0ZSBiKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEJ5dGUudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFNob3J0KCkgewotCQlyZXR1cm4gKChTaG9ydCkgdGhpcy5vYmplY3QpLnNob3J0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydChzaG9ydCBzKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KFNob3J0LnZhbHVlT2YocykpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50KCkgewotCQlyZXR1cm4gKChJbnRlZ2VyKSB0aGlzLm9iamVjdCkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGkpIHsKLQkJdGhpcy5zZXRPYmplY3QoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMb25nKCkgewotCQlyZXR1cm4gKChMb25nKSB0aGlzLm9iamVjdCkubG9uZ1ZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9uZyhsb25nIGwpIHsKLQkJdGhpcy5zZXRPYmplY3QoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiAoKEZsb2F0KSB0aGlzLm9iamVjdCkuZmxvYXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsb2F0KGZsb2F0IGYpIHsKLQkJdGhpcy5zZXRPYmplY3QoRmxvYXQudmFsdWVPZihmKSk7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7Ci0JCXJldHVybiAoKERvdWJsZSkgdGhpcy5vYmplY3QpLmRvdWJsZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG91YmxlKGRvdWJsZSBkKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwMDUzMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hvb3Nlci5Ccm93c2VyIHVzZXMgYQotICogSk9wdGlvblBhbmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgc2VsZWN0aW9uLiBTdWJjbGFzc2VzIAotICogY2FuIGNoYW5nZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG1lc3NhZ2UsIGFuZC9vciBpY29uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdEJyb3dzZXIKLQlpbXBsZW1lbnRzIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIAotewotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCi0JcHJvdGVjdGVkIFNpbXBsZUxpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdXNpbmcgYSBKT3B0aW9uUGFuZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBicm93c2UoTGlzdENob29zZXIgY2hvb3NlcikgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gCi0JCQlKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm1lc3NhZ2VUeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLmljb24oY2hvb3NlciksIAotCQkJCXRoaXMuc2VsZWN0aW9uVmFsdWVzKGNob29zZXIpLCAKLQkJCQl0aGlzLmluaXRpYWxTZWxlY3Rpb25WYWx1ZShjaG9vc2VyKQotCQkJKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgbWVzc2FnZVR5cGUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEljb24gaWNvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9BcnJheShjb21ib0JveC5nZXRNb2RlbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uVmFsdWUoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsCi0JICogaW50byBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFRvQXJyYXkoTGlzdE1vZGVsIG1vZGVsKSB7Ci0JCWludCBzaXplID0gbW9kZWwuZ2V0U2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbW9kZWwuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJkMjkwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZEljb24odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSBubyBpY29uIGF0IGFsbCB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24uCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkgewotCQkvLyByZXBsaWNhdGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEljb24pID8gKEljb24pIHZhbHVlIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZQotCSAqIGFjY2Vzc2libGUgdmlhIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSB0aGUgb2JqZWN0J3MgZGVmYXVsdCBzdHJpbmcKLQkgKiByZXByZXNlbnRhdGlvbiAoYXMgcmV0dXJuZWQgYnkgI3RvU3RyaW5nKCkpOyB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24sIGluIHdoaWNoIGNhc2Ugbm8gdGV4dCBpcyBkaXNwbGF5ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJY29uKSA/ICIiIDogKCh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRvb2xUaXBUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZGlzcGxheWVkIHdoZW4gdGhlIGN1cnNvciBsaW5nZXJzIG92ZXIgdGhlIHNwZWNpZmllZCBjZWxsLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUb29sVGlwVGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzaWJsZSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBjb21wb25lbnQgdXNlZCB0byByZW5kZXIKLQkgKiB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZSBhY2Nlc3NpYmxlIHZpYQotCSAqIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRBY2Nlc3NpYmxlTmFtZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2FkYTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBzcGlubmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiogdGhlIGNvbXBvbmVudCB1c2VkIHRvIHBhaW50IHRoZSBjZWxsICovCi0JcHJvdGVjdGVkIEpTcGlubmVyIHNwaW5uZXI7Ci0JCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCBpcyBhICJudW1iZXIiIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCB3aWxsIGRldGVybWluZSBob3cgdGhlIHZhbHVlcyBhcmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoU3Bpbm5lck1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNwaW5uZXIgYnVpbGRTcGlubmVyKCkgewotCQlKU3Bpbm5lciBzID0gbmV3IEpTcGlubmVyKCk7Ci0JCXMuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gczsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5zcGlubmVyLnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0KLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLmVkaXRvcigpOwotCQllZGl0b3Iuc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJZWRpdG9yLnNldEJhY2tncm91bmQodGhpcy5iYWNrZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0KLQkJdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxGb3JlZ3JvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEZvcmVncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEJhY2tncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0QmFja2dyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcm93LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNvbHVtbikgewotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcih0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCksIDEpOwotCQl9Ci0JCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0QmFja2dyb3VuZCgpLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVkaXRvciBjb21wb25lbnQgd2hvc2UgY29sb3JzIHNob3VsZCBiZSBzZXQKLQkgKiBieSB0aGUgcmVuZGVyZXIuCi0JICovCi0JcHJvdGVjdGVkIEpDb21wb25lbnQgZWRpdG9yKCkgewotCQlKQ29tcG9uZW50IGVkaXRvciA9IHRoaXMuc3Bpbm5lci5nZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpIHsKLQkJCS8vIHR5cGljYWxseSwgdGhlIGVkaXRvciB3aWxsIGJlIHRoZSBkZWZhdWx0IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4uLgotCQkJZWRpdG9yID0gKChKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSBlZGl0b3IpLmdldFRleHRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyJ3MgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJLy8gQ1IjMzk5OTMxOCAtIFRoaXMgbnVsbCBjaGVjayBuZWVkcyB0byBiZSByZW1vdmVkIG9uY2UgSkRLIGJ1ZyBpcyBmaXhlZAotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGlubmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzLnNwaW5uZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBzcGlubmVyIHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJcmV0dXJuIChpbnQpIHRoaXMuc3Bpbm5lci5nZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU4MmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0Q2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDZWxsRWRpdG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbFJlbmRlcmVyOwotCi0vKioKLSAqIEEgdGFibGUgY2VsbCBlZGl0b3IgdGhhdCB3cmFwcyBhIHRhYmxlIGNlbGwgcmVuZGVyZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDZWxsRWRpdG9yIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yIHsKLQotCS8qKiBkZWxlZ2F0ZSB0byBhIHJlbmRlcmVyICovCi0JcHJpdmF0ZSBSZW5kZXJlciByZW5kZXJlcjsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIGVkaXRvciB0aGF0IGJlaGF2ZXMgbGlrZSB0aGUgc3BlY2lmaWVkIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5pbml0aWFsaXplKHJlbmRlcmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShSZW5kZXJlciByKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByOwotCQlyLnNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcih0aGlzLmJ1aWxkSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBidWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbW1lZGlhdGVFZGl0KCkgewotCQkJCVRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIudGhpcy5zdG9wQ2VsbEVkaXRpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENlbGxFZGl0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxFZGl0b3JDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgdHJ1ZSwgcm93LCBjb2x1bW4pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIE1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHJlbmRlcmVyCi0JICogdGhhdCBjYW4gYmUgd3JhcHBlZCBieSBhIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBSZW5kZXJlciBleHRlbmRzIFRhYmxlQ2VsbFJlbmRlcmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlbmRlcmVyLgotCQkgKi8KLQkJT2JqZWN0IGdldFZhbHVlKCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBpbW1lZGlhdGUgZWRpdCBsaXN0ZW5lcgotCQkgKi8KLQkJdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgewotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJlciBkb2VzIGFuICJpbW1lZGlhdGUgZWRpdCIKLQkJICovCi0JCXZvaWQgaW1tZWRpYXRlRWRpdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRhMjM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogVGhpcyBzeW5jaHJvbml6ZXIgd2lsbCBwZXJmb3JtIHN5bmNocm9uaXphdGlvbnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsCi0gKiBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9IHRvIHJldHVybiBpbW1lZGlhdGVseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHNob3VsZCBoYW5kbGUgYW55IGV4Y2VwdGlvbnMKLSAqIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5IHNvIHRoZSB0aHJlYWQKLSAqIGNhbiBjb250aW51ZSB0aGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBTeW5jaHJvbml6ZXIKLXsKLQkvKioKLQkgKiBUaGlzIGZsYWcgaXMgc2hhcmVkIHdpdGggdGhlIHN5bmNocm9uaXphdGlvbi9jb25zdW1lciB0aHJlYWQuIFNldHRpbmcgaXQgdG8gdHJ1ZQotCSAqIHdpbGwgdHJpZ2dlciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGJlZ2luIG9yLCBpZiB0aGUgc3luY2hyb25pemF0aW9uIGlzCi0JICogY3VycmVudGx5IGV4ZWN1dGluZywgdG8gZXhlY3V0ZSBhZ2Fpbiwgb25jZSB0aGUgY3VycmVudCBleGVjdXRpb24gaXMKLQkgKiBjb21wbGV0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNocm9uaXplRmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQKLQkgKiBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQKLQkgKiBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkpIHsKLQkJdGhpcyhjb21tYW5kLCB0aHJlYWRGYWN0b3J5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJdGhpcyhjb21tYW5kLCBudWxsLCB0aHJlYWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yID0gbmV3IENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IodGhpcy5idWlsZENvbnN1bWVyKGNvbW1hbmQpLCB0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lKTsKLQl9Ci0KLQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyIGJ1aWxkQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgQ29uc3VtZXIoY29tbWFuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQsIGJ1dCBwb3N0cG9uZSB0aGUgZmlyc3QKLQkgKiBzeW5jaHJvbml6YXRpb24gdW50aWwgcmVxdWVzdGVkLCBpLmUuIHZpYSBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSAic3luY2hyb25pemUiIGZsYWcgaGVyZTsgc28gaWYgdGhlIGZsYWcgaGFzCi0JICogYmVlbiBzZXQgPGVtPmJlZm9yZTwvZW0+IGdldHRpbmcgaGVyZSwgdGhlIGZpcnN0IHN5bmNocm9uaXphdGlvbiB3aWxsCi0JICogc3RhcnQgcHJvbXB0bHkgKGFsYmVpdCwgYXN5bmNocm9ub3VzbHkpLgotCSAqIFRoZSAic3luY2hyb25pemUiIGZsYWcgd2lsbCBiZSBzZXQgaWY6PHVsPgotCSAqIDxsaT57QGxpbmsgI3N5bmNocm9uaXplKCl9IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIHN5bmNocm9uaXplciB3YXMKLQkgKiAgICAgY29uc3RydWN0ZWQgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQ7IG9yCi0JICogPGxpPntAbGluayAjc3luY2hyb25pemUoKX0gd2FzIGNhbGxlZCBhZnRlciB7QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZAotCSAqICAgICBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZCAodG8gcmVzdGFydCB0aGUgc3luY2hyb25pemVyKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgYW4gb3V0c3RhbmRpbmcgcmVxdWVzdAotCSAqICAgICBmb3IgYSBzeW5jaHJvbml6YXRpb24gKGkuZS4gdGhlICJzeW5jaHJvbml6YXRpb24iIGZsYWcgd2FzIHNldCBhdAotCSAqICAgICB0aGUgdGltZSB7QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZCkKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICJzeW5jaHJvbml6ZSIgZmxhZyBzbyB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCB3aWxsIGVpdGhlcjx1bD4KLQkgKiA8bGk+aWYgdGhlIHRocmVhZCBpcyBxdWllc2NlZCwgc3RhcnQgYSBzeW5jaHJvbml6YXRpb24gaW1tZWRpYXRlbHksIG9yCi0JICogPGxpPmlmIHRoZSB0aHJlYWQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBhIHN5bmNocm9uaXphdGlvbiwgZXhlY3V0ZSBhbm90aGVyCi0JICogICAgIHN5bmNocm9uaXphdGlvbiBvbmNlIHRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCXRoaXMuc3luY2hyb25pemVGbGFnLnNldFRydWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RvcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyfQotCSAqIHdpbGwgZXhlY3V0ZSB0aGUgY2xpZW50LXN1cHBsaWVkICJzeW5jaHJvbml6ZSIgY29tbWFuZC4KLQkgKiBJdCB3aWxsIHdhaXQgdW50aWwgdGhlIHNoYXJlZCAic3luY2hyb25pemUiIGZsYWcgaXMgc2V0IHRvIGV4ZWN1dGUgdGhlCi0JICogY29tbWFuZC4gT25jZSB0aGUgY29tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZSB1bnRpbAotCSAqIHRoZSBmbGFnIGlzIHNldCBhZ2Fpbi4gSWYgdGhlIGZsYWcgd2FzIHNldCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgKiBjb21tYW5kIChlaXRoZXIgcmVjdXJzaXZlbHkgYnkgdGhlIGNvbW1hbmQgaXRzZWxmIG9yIGJ5IGFub3RoZXIgdGhyZWFkKSwKLQkgKiB0aGUgY29tbWFuZCB3aWxsIGJlIHJlLWV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZwotCSAqIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCWNsYXNzIENvbnN1bWVyCi0JCWltcGxlbWVudHMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIG9uIHRoZQotCQkgKiBzeW5jaHJvbml6YXRpb24vY29uc3VtZXIgdGhyZWFkLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkJQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJfQotCi0JCS8qKgotCQkgKiBXYWl0IHVudGlsIHRoZSAic3luY2hyb25pemUiIGZsYWcgaXMgc2V0LAotCQkgKiB0aGVuIGNsZWFyIGl0IGFuZCBhbGxvdyB0aGUgInN5bmNocm9uaXplIiBjb21tYW5kIHRvIGV4ZWN1dGUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJQXN5bmNocm9ub3VzU3luY2hyb25pemVyLnRoaXMuc3luY2hyb25pemVGbGFnLndhaXRUb1NldEZhbHNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRXhlY3V0ZSB0aGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWY4MTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotCi0vKioKLSAqIEV4dGVuZCB0aGUgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSBvdXRzdGFuZGluZyAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7IHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIHN5bmNocm9uaXphdGlvbnMgY2FuIGJlCi0gKiB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBMaXN0ZW5lcnMgc2hvdWxkIGhhbmRsZSBhbnkgZXhjZXB0aW9ucwotICogYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkgc28gdGhlIHRocmVhZAotICogY2FuIGNvbnRpbnVlIHRoZSBzeW5jaHJvbml6YXRpb24gcHJvY2VzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kIHRvIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgdG8gcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoY29tbWFuZCwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBjb25zdW1lciB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcwotCSAqIHF1aWVzY2VkLgotCSAqLwotCUBPdmVycmlkZQotCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NvbnN1bWVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zeW5jaHJvbml6YXRpb25RdWllc2NlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHJ1bm5hYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB7QGxpbmsgQXN5bmNocm9ub3VzU3luY2hyb25pemVyLkNvbnN1bWVyfQotCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKLQkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgotCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgotCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIGlzIGFzeW5jaHJvbm91cywgbm8gb3RoZXIgdGhyZWFkIHdpbGwgYmUgYWJsZSB0bwotCSAqIGluaXRpYXRlIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHVudGlsIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgaGF2ZSBiZWVuCi0JICogbm90aWZpZWQuIE5vdGUgYWxzbywgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0JICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSk7Ci0JICogYnV0IHRoaXMgc3luY2hyb25pemF0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKLQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCSAqLwotCWNsYXNzIENhbGxiYWNrQ29uc3VtZXIKLQkJZXh0ZW5kcyBDb25zdW1lcgotCXsKLQkJQ2FsbGJhY2tDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXN1cGVyKGNvbW1hbmQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBvdXIgdGhyZWFkIGlzICJpbnRlcnJ1cHRlZCI7Ci0JCQkvLyB0aGF0IHNlZW1zIG9rLi4uICB+Ymp2Ci0JCQlpZiAoQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6ZUZsYWcuaXNGYWxzZSgpKSB7Ci0JCQkJQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTEwNjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7Ci0gKiBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBzeW5jaHJvbml6YXRpb25zIGNhbiBiZSB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiBhbm90aGVyIHN5bmNocm9uaXphdGlvbiBpcyBpbml0aWF0ZWQgd2hpbGUgd2UgYXJlCi0gKiBub3RpZnlpbmcgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyAoaS5lLiB0aGUgJ2FnYWluJyBmbGFnIGlzIHNldCksIGl0IHdpbGwgbm90Ci0gKiBzdGFydCB1bnRpbCBhbGwgdGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQuCi0gKiBOb3RlIGFsc28sIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgY2FuLCB0aGVtc2VsdmVzLAotICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9KTsKLSAqIGJ1dCB0aGlzIHN5bmNocm9uaXphdGlvbiB3aWxsIG5vdCBvY2N1ciB1bnRpbCA8ZW0+YWZ0ZXI8L2VtPiBhbGwgdGhlCi0gKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZCB0byBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHVibGljIENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCXN1cGVyLmV4ZWN1dGVfKCk7Ci0JCWlmICh0aGlzLnN0YXRlLmdldFZhbHVlKCkgIT0gU3RhdGUuUkVQRUFUKSB7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBhcmUgInN0b3BwZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJdGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjMyZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotCi0vKioKLSAqIFRoaXMgc3luY2hyb25pemVyIHdpbGwgc3luY2hyb25pemUgaW1tZWRpYXRlbHkgYW5kIG5vdCByZXR1cm4gdW50aWwgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24gYW5kIGFueSBuZXN0ZWQgKHJlY3Vyc2l2ZSkgc3luY2hyb25pemF0aW9ucyBhcmUgY29tcGxldGUuCi0gKiBJbiBzb21lIHNpdHVhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHksIGFuZCBmb3IgYXMKLSAqIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZSwgYXMgaXQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBkZWFkbG9ja3MuIEEKLSAqIGRlYWRsb2NrIGNhbiBvY2N1ciB3aGVuIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0gaXMgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAqIHRocmVhZHMgYW5kIG11bHRpcGxlIHJlc291cmNlcyBhcmUgbG9ja2VkIGJ5IHRoZSBzeW5jaHJvbml6YXRpb24gaW4gdmFyeWluZwotICogb3JkZXJzLgotICogPHA+Ci0gKiBBcyBkZWZpbmVkIGluIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UsIHtAbGluayBTeW5jaHJvbml6ZXIjc3RhcnQoKX0KLSAqIGFuZCB7QGxpbmsgU3luY2hyb25pemVyI3N0b3AoKX0KLSAqIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLgotICoge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSBzaG91bGQKLSAqIGFsd2F5cyBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkIChpLmUuIG9ubHkgcmVjdXJzaXZlbHksIGJleW9uZCB0aGUKLSAqIGluaXRpYWwgY2FsbCk7IGFsdGhvdWdoLCB0aGlzIHRvbyBpcyBub3QgcmVxdWlyZWQuCi0gKiBUaGlzIHRocmVhZCBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBleGVjdXRlcwotICoge0BsaW5rIFN5bmNocm9uaXplciNzdGFydCgpfSBhbmQge0BsaW5rIFN5bmNocm9uaXplciNzdG9wKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBzeW5jaHJvbml6YXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IChpLmUuIHRoZQotCSAqIHN5bmNocm9uaXphdGlvbiBtYXkgcmVjdXJzZSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemVyJ3MgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8U3RhdGU+IHN0YXRlOwotCi0JLyoqCi0JICogVGhlIHN5bmNocm9uaXplcidzIGluaXRpYWwgc3RhdGUgaXMge0BsaW5rICNTVE9QUEVEfS4KLQkgKi8KLQllbnVtIFN0YXRlIHsKLQkJU1RPUFBFRCwKLQkJUkVBRFksCi0JCUVYRUNVVElORywKLQkJUkVQRUFULAotCQlTVE9QUElORwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCS8vIHVzZSB0aGUgc3luY2hyb25pemVyIGFzIHRoZSBtdXRleCBzbyBpdCBpcyBmcmVlZCB1cCBieSB0aGUgd2FpdCBpbiAjc3RvcCgpCi0JCXRoaXMuc3RhdGUgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PFN0YXRlPihTdGF0ZS5TVE9QUEVELCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyJ3Mge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFQURZIFJFQURZfQotCSAqIGFuZCBleGVjdXRlIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUKLQkgKiBzeW5jaHJvbml6ZXIgaXMgbm90IHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFQURZOgotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0J3MgcG9zc2libGUgdG8gY29tZSBiYWNrIGhlcmUgaWYgdGhlIHN5bmNocm9uaXphdGlvbiBjb21tYW5kIHJlY3Vyc2VzCi0JICogYW5kIHRyaWdnZXJzIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQlpZiAodGhpcy5iZWdpblN5bmNocm9uaXphdGlvbigpKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjbGllbnQgaGFzIHJlcXVlc3RlZCBhIHN5bmNocm9uaXphdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBjYW4gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uLgotCSAqIElmIGEgc3luY2hyb25pemF0aW9uIGlzIGFscmVhZHkgdW5kZXIgd2F5LCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIGJ1dCBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfQotCSAqIHNvIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudAotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGJlZ2luU3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCS8vIHN5bmNocm9uaXphdGlvbiBpcyBub3QgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQkJLy8gc2V0IGZsYWcgc28gYSBuZXcgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudCBvbmUgaXMgZmluaXNoZWQKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFUEVBVCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgaXMgYWxyZWFkeSBzZXQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBhcmUgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldCBvZiAicmVjdXJzaW5nIgotCSAqIHN5bmNocm9uaXphdGlvbnMuIEFueSByZWN1cnNpdmUgY2FsbCB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IHdpbGwKLQkgKiBzaW1wbHkgc2V0IHRoZSB7QGxpbmsgI3N0YXRlfSB0byB7QGxpbmsgU3RhdGUjUkVQRUFUIFJFUEVBVH0sCi0JICogY2F1c2luZyB0aGUgY29tbWFuZCB0byBleGVjdXRlIGFnYWluLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZV8oKSB7Ci0JCWRvIHsKLQkJCXRoaXMuZXhlY3V0ZSgpOwotCQl9IHdoaWxlICh0aGlzLnJlcGVhdFN5bmNocm9uaXphdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4gRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQKLQkgKiBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHRocmVhZC4gU3RvcmUgdGhlbSB1cCBmb3IgbGF0ZXIgcGFpbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQl2b2lkIGV4ZWN1dGVfKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbiBoYXMgZmluaXNoZWQuCi0JICogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGJlZ2luIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVwZWF0U3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJY2FzZSBSRUFEWToKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzeW5jaHJvbml6YXRpb24gaGFzIGZpbmlzaGVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGFub3RoZXI7IHJldHVybiB0byAicmVhZHkiCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5SRUFEWSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgd2FzIHNldDsgY2xlYXIgaXQgYW5kIHN0YXJ0IGFub3RoZXIgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQkvLyBhIGNsaWVudCBoYXMgaW5pdGlhdGVkIGEgInN0b3AiOyBtYXJrIHRoZSAic3RvcCIgY29tcGxldGUgYW5kIHBlcmZvcm0gbm8gbW9yZSBzeW5jaHJvbml6YXRpb25zCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUEVEKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmxhZ3Mgc28gdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIHN5bmNocm9uaXphdGlvbiB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gc2ltcGx5IHJldHVybiB0byAic3RvcHBlZCIgc3RhdGUKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyBzZXQgdGhlICJzdG9wcGluZyIgZmxhZyBhbmQgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGhhcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBJTkcpOwotCQkJCXRoaXMud2FpdFVudGlsU3RvcHBlZCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmICh0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJVGhyb3dhYmxlW10gdGVtcCA9IHRoaXMuZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbdGhpcy5leGNlcHRpb25zLnNpemUoKV0pOwotCQkJdGhpcy5leGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3YWl0IHdpbGwgZnJlZSB1cCB0aGUgc3luY2hyb25pemVyJ3Mgc3luY2hyb25pemVkIG1ldGhvZHMKLQkgKiAoc2luY2UgdGhlIHN5bmNocm9uaXplciBpcyB0aGUgc3RhdGUncyBtdXRleCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFN0b3BwZWQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN0YXRlLndhaXRVbnRpbFZhbHVlSXMoU3RhdGUuU1RPUFBFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGZpbmlzaCAtIGlnbm9yZTsKLQkJCS8vICdzdGF0ZScgaXMgc3RpbGwgc2V0IHRvICdTVE9QUElORycsIHNvIHRoZSAjc3luY2hyb25pemVfKCkgbG9vcAotCQkJLy8gd2lsbCBzdGlsbCBzdG9wIC0gd2UganVzdCB3b24ndCB3YWl0IGFyb3VuZCBmb3IgaXQuLi4KLQkJfQotCX0KLQotCXByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MGNiMjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbW9kZWxzIHRoYXQgbm90aWZ5IGxpc3RlbmVycyBvZgotICogY2hhbmdlcyB0byBib3VuZCBwcm9wZXJ0aWVzLCBjb2xsZWN0aW9ucywgbGlzdHMsIGFuZC9vciB0cmVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBMaXN0Q2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgVHJlZUNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsCi0gKi8KLS8vIFRPRE8gdXNlIG9iamVjdHMgKElEcz8pIGluc3RlYWQgb2Ygc3RyaW5ncyB0byBpZGVudGlmeSBhc3BlY3RzPwotcHVibGljIGludGVyZmFjZSBNb2RlbCB7Ci0KLQkvLyAqKioqKioqKioqIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNoYW5nZSBldmVudHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBzdGF0ZSBjaGFuZ2UgZXZlbnRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMsCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGxpc3QgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHRyZWUgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCB0cmVlIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MDJiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIHRoZSBjaGFuZ2UgZXZlbnRzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IG1vZGVscy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RlbCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTW9kZWwpIHN1cGVyLmdldFNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5idWlsZFNpbXBsZVRvU3RyaW5nT24odGhpcywgc2IpOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJaWYgKHNiLmxlbmd0aCgpID09IGxlbikgewotCQkJc2IuZGVsZXRlQ2hhckF0KGxlbiAtIDEpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJLy8gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBkbyBzb21ldGhpbmcgYSBiaXQgbW9yZSBoZWxwZnVsCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQWRkRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmEyZTdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGl0ZW1zIHRvIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25BZGRFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyogCi0gKiBEZXNpZ24gb3B0aW9uczoKLSAqIC0gY3JlYXRlIGEgY29sbGVjdGlvbiB0byB3cmFwIGEgc2luZ2xlIGFkZGVkIG9yIHJlbW92ZWQgaXRlbQotICogCSh0aGlzIGlzIHRoZSBvcHRpb24gd2UgaW1wbGVtZW50ZWQgYmVsb3cgYW5kIGluIGNvbGxhYm9yYXRpbmcgY29kZSkKLSAqIAlzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gb3B0aW1pemUgZG93bnN0cmVhbSBjb2RlIGZvcgotICogCXNpbmdsZSBpdGVtcywgd2UgdGFrZSBhbm90aGVyIHBlcmZvcm1hbmNlIGhpdCBieSBidWlsZGluZwotICogCWEgY29sbGVjdGlvbiBlYWNoIHRpbWUgIChAc2VlIENvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpKQotICogCWFuZCBmb3JjaW5nIGRvd25zdHJlYW0gY29kZSB0byB1c2UgYW4gaXRlcmF0b3IgZXZlcnkgdGltZQotICogCi0gKiAtIGZpcmUgYSBzZXBhcmF0ZSBldmVudCBmb3IgZWFjaCBpdGVtIGFkZGVkIG9yIHJlbW92ZWQKLSAqIAllbGltaW5hdGVzIGFueSBwb3RlbnRpYWwgZm9yIG9wdGltaXphdGlvbnMgdG8gZG93bnN0cmVhbSBjb2RlCi0gKiAKLSAqIC0gYWRkIHByb3RvY29sIHRvIHN1cHBvcnQgYm90aCBzaW5nbGUgaXRlbXMgYW5kIGNvbGxlY3Rpb25zCi0gKiAJYWRkcyBjb25kaXRpb25hbCBsb2dpYyB0byBkb3duc3RyZWFtIGNvZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbGxlY3Rpb25BZGRFdmVudCBleHRlbmRzIENvbGxlY3Rpb25FdmVudCB7Ci0KLQkvKiogVGhlIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gaXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyYzc1OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbiBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGNvbGxlY3Rpb24gZXZlbnRzLgotICogQSA8Y29kZT5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkNvbGxlY3Rpb25DaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGNvbGxlY3Rpb24gbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgY29sbGVjdGlvbiBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGNvbGxlY3Rpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24udG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnY29sbGVjdGlvbicgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb2xsZWN0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvbi5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0NvbGxlY3Rpb25OYW1lLCB0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYjJhZGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25DbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlMGJkYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotLy8gVE9ETyBhZGQgIml0ZW0vb3JpZ2luYWwvbmVzdGVkIGV2ZW50IiBmb3IgaXRlbSBjaGFuZ2VkPwotLyoqCi0gKiBBICJjb2xsZWN0aW9uIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogVGhlIGludGVudCBpcyB0aGF0IGFueSBsaXN0ZW5lcgotICogY2FuIGtlZXAgaXRzZWxmIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIGNvbGxlY3Rpb24gdmlhIHRoZSBjb2xsZWN0aW9uCi0gKiBldmVudHMgaXQgcmVjZWl2ZXMgYW5kIG5lZWQgbm90IG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbAotICogY29sbGVjdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25FdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25FdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb2xsZWN0aW9uTmFtZSA9IGNvbGxlY3Rpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbGxlY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25SZW1vdmVFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjIxOGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gcmVtb3ZlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlbW92ZXMgaXRlbXMKLSAqIGZyb20gYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbi4gQSA8Y29kZT5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBpdGVtcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdpdGVtcycgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGNvbGxlY3Rpb25OYW1lKTsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEFkZEV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwNzQwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBhZGQiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgYWRkcyBpdGVtcyB0byBhCi0gKiAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0QWRkRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0QWRkRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKiBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4KLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqIEBwYXJhbSBpdGVtcyBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0QWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLml0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdEFkZEV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZjI5MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgbGlzdCBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIGxpc3QgZXZlbnRzLgotICogQSA8Y29kZT5MaXN0Q2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPkxpc3RDaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIGxpc3QgbmFtZSBhbmQKLSAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBsaXN0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENoYW5nZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKgotCSAqIFRoZSB0aGUgbGlzdCBpbiBpdHMgY3VycmVudCBzdGF0ZS4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG5lY2Vzc2FyeSBjaGFuZ2VzIHRvIHN5bmNocm9uaXplCi0JICogd2l0aCB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGxpc3Q7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGxpc3QudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnbGlzdCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBPYmplY3RbXSBsaXN0KSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldExpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMubGlzdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRMaXN0U2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMubGlzdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCB0aGlzLmxpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWY1NTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdENsZWFyRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0Q2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiBuZXcgTGlzdENsZWFyRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0RXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QzNDU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8vIFRPRE8gYWRkICJpdGVtL29yaWdpbmFsL25lc3RlZCBldmVudCIgZm9yIGl0ZW0gY2hhbmdlZD8KLS8qKgotICogQSAibGlzdCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBhbnkgbGlzdGVuZXIKLSAqIGNhbiBrZWVwIGl0c2VsZiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyBsaXN0IHZpYSB0aGUgbGlzdAotICogZXZlbnRzIGl0IHJlY2VpdmVzIGFuZCBuZWVkIG5vdCBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwKLSAqIGxpc3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0RXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIGxpc3ROYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBMaXN0RXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKGxpc3ROYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjdlZGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdE1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBtb3ZlcyB0aGUgZWxlbWVudHMgaW4KLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdE1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RNb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCB0YXJnZXRJbmRleDsKLQotCS8qKiBUaGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBzb3VyY2VJbmRleDsKLQotCS8qKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IG1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHRhcmdldEluZGV4IFRoZSBpbmRleCB0byB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gc291cmNlSW5kZXggVGhlIGluZGV4IGZyb20gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICogQHBhcmFtIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy50YXJnZXRJbmRleCA9IHRhcmdldEluZGV4OwotCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNvdXJjZUluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2VJbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuc291cmNlSW5kZXgpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy50YXJnZXRJbmRleCk7Ci0JCXNiLmFwcGVuZCgiIGxlbmd0aD0iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMudGFyZ2V0SW5kZXggKyBvZmZzZXQsIHRoaXMuc291cmNlSW5kZXggKyBvZmZzZXQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZW1vdmVFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxYjgyZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImxpc3QgcmVtb3ZlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlbW92ZXMgaXRlbXMKLSAqIGZyb20gYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0UmVtb3ZlRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLS8qCi0gKiBTZWUgZGVzaWduIGRpc2N1c3Npb24gaW4gQ29sbGVjdGlvbkFkZEV2ZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0UmVtb3ZlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7aXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIExpc3RSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0UmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5pdGVtcyA9IGl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQlzYi5hcHBlbmQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzLml0ZW1zKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBuZXcgTGlzdFJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMuaXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZmMzc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RSZXBsYWNlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCByZXBsYWNlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIHJlcGxhY2VzIGl0ZW1zIGluIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RSZXBsYWNlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0UmVwbGFjZUV2ZW50IGV4dGVuZHMgTGlzdEV2ZW50IHsKLQotCS8qKiBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLQkvKiogVGhlIG5ldyBpdGVtcyB0aGF0IHJlcGxhY2VkIHRoZSBvbGQgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBuZXdJdGVtczsKLQotCS8qKiBUaGUgb2xkIGl0ZW1zIHRoYXQgd2VyZSByZXBsYWNlZCBieSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gb2xkSXRlbXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgcmVwbGFjZSBldmVudCBmb3IgYSBsaXN0IG9mIHJlcGxhY2VkIGl0ZW1zLgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW0gaW4gdGhlIGxpc3Qgd2FzIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdJdGVtIFRoZSBuZXcgaXRlbSBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gb2xkSXRlbSBUaGUgb2xkIGl0ZW0gaW4gdGhlIGxpc3QgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXcgT2JqZWN0W10ge25ld0l0ZW19LCBuZXcgT2JqZWN0W10ge29sZEl0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZXBsYWNlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgaW4gdGhlIGxpc3Qgd2VyZSByZXBsYWNlZC4KLQkgKiBAcGFyYW0gbmV3SXRlbXMgVGhlIG5ldyBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKiBAcGFyYW0gb2xkSXRlbXMgVGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdCB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBuZXdJdGVtcywgTGlzdDw/PiBvbGRJdGVtcykgewotCQl0aGlzKHNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcy50b0FycmF5KCksIG9sZEl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgZWl0aGVyICduZXdJdGVtcycgb3IgJ29sZEl0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0UmVwbGFjZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdFtdIG5ld0l0ZW1zLCBPYmplY3RbXSBvbGRJdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJaWYgKG5ld0l0ZW1zLmxlbmd0aCAhPSBvbGRJdGVtcy5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemVzIG11c3QgbWF0Y2ggLSBuZXcgaXRlbXMgc2l6ZTogIiArIG5ld0l0ZW1zLmxlbmd0aCAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiBvbGQgaXRlbXMgc2l6ZTogIiArIG9sZEl0ZW1zLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCXRoaXMubmV3SXRlbXMgPSBuZXdJdGVtczsKLQkJdGhpcy5vbGRJdGVtcyA9IG9sZEl0ZW1zOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3IGl0ZW1zIHRoYXQgcmVwbGFjZWQgdGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0TmV3SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMubmV3SXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2xkIGl0ZW1zIHRoYXQgd2VyZSByZXBsYWNlZCBieSB0aGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRPbGRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5vbGRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uZXdJdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMub2xkSXRlbXMpOwotCQlzYi5hcHBlbmQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMubmV3SXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIG5ld0xpc3ROYW1lLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBsaXN0IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBsaXN0IG5hbWUgYW5kIGRpc3BsYWNpbmcKLQkgKiB0aGUgaW5kZXggYnkgdGhlIHNwZWNpZmllZCBhbW91bnQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UmVwbGFjZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMuaW5kZXggKyBvZmZzZXQsIHRoaXMubmV3SXRlbXMsIHRoaXMub2xkSXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWM3NDc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1Byb3BlcnR5Q2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJwcm9wZXJ0eSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgcHJvcGVydHkuIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBIDxjb2RlPlByb3BlcnR5Q2hhbmdlRXZlbnQ8L2NvZGU+IGlzIGFjY29tcGFuaWVkIGJ5IHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMKLSAqIG9mIHRoZSBwcm9wZXJ0eS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjaGFuZ2VkLiAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQotCS8qKiBUaGUgcHJvcGVydHkncyBvbGQgdmFsdWUsIGJlZm9yZSB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG5ldyB2YWx1ZSwgYWZ0ZXIgdGhlIGNoYW5nZS4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqIEBwYXJhbSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2xkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9sZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE5ld1ZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5uZXdWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnByb3BlcnR5TmFtZSk7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5vbGRWYWx1ZSk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUHJvcGVydHlDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgdGhpcy5wcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHByb3BlcnR5IG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBwcm9wZXJ0eSBuYW1lLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1Byb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdQcm9wZXJ0eU5hbWUsIHRoaXMub2xkVmFsdWUsIHRoaXMubmV3VmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFjMzk5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1N0YXRlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgZ2VuZXJpYyAic3RhdGUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgdG8KLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuCi0gKiBBbnkgbGlzdGVuZXIgY2FuIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGFzIG5lY2Vzc2FyeSBzaW5jZSB0aGUgbW9kZWwgaXMKLSAqIGF2YWlsYWJsZSBhcyB0aGUgZXZlbnQncyAnc291cmNlJy4KLSAqIEEgPGNvZGU+U3RhdGVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbiBhcmd1bWVudCB0byB0aGUKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZUNoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBzdGF0ZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKi8KLQlwdWJsaWMgU3RhdGVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RhdGVDaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQWRkRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUwMjcxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSBhZGQiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgYWRkcyBhIG5vZGUgdG8gYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUFkZEV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotCS8qKgotICAgICAqIFBhdGggdG8gdGhlIG5vZGUgYWRkZWQgdG8gdGhlIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIHBhdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIGFkZGVkLgotCSAqLwotCXB1YmxpYyBUcmVlQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIHBhdGgudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAncGF0aCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgVHJlZUFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMucGF0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCB0cmVlIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0cmVlIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVBZGRFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVBZGRFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkN2UwMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIHRyZWUgaW4gYSBtYW5uZXIgdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkKLSAqIHRoZSBvdGhlciB0cmVlIGV2ZW50cy4KLSAqIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNoYW5nZUV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0gICAgICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgY2hhbmdlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBub2RlcyBUaGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBub2Rlcy50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdub2RlcycgaXMgbnVsbAotCX0KLQkKLQlwcml2YXRlIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gbm9kZXMpIHsKLQkJc3VwZXIoc291cmNlLCB0cmVlTmFtZSk7Ci0JCXRoaXMubm9kZXMgPSBub2RlczsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBub2RlcyBpbiB0aGUgY2hhbmdlZCB0cmVlLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXROb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5ub2Rlcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIGludCBnZXROb2Rlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5vZGVzLmxlbmd0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMubm9kZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDbGVhckV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkOTY1NjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUgY2xlYXIiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2xlYXJzCi0gKiBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDbGVhckV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZUNsZWFyRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGNsZWFyIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUNsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdDb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVDbGVhckV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3Nzc3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInRyZWUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYW55IGxpc3RlbmVyCi0gKiBjYW4ga2VlcCBpdHNlbGYgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgdHJlZSB2aWEgdGhlIHRyZWUgZXZlbnRzCi0gKiBpdCByZWNlaXZlcyBhbmQgbmVlZCBub3QgbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHRyZWUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQkvKiogTmFtZSBvZiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQuICovCi0JZmluYWwgU3RyaW5nIHRyZWVOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIHRyZWVOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgdHJlZSB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBUcmVlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHRyZWVOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUcmVlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJlZU5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlUmVtb3ZlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEzMTU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBhIG5vZGUgcm9tIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRyZWVSZW1vdmVFdmVudCBleHRlbmRzIFRyZWVFdmVudCB7Ci0KLQkvKioKLSAgICAgKiBQYXRoIHRvIHRoZSBub2RlIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBMaXN0PD8+IHBhdGgpIHsKLQkJdGhpcyhzb3VyY2UsIHRyZWVOYW1lLCBwYXRoLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ3BhdGgnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIFRyZWVSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgT2JqZWN0W10gcGF0aCkgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQkJdGhpcy5wYXRoID0gcGF0aDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBwYXJ0IG9mIHRoZSB0cmVlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMucGF0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JcHVibGljIFRyZWVSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCB0cmVlIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCB0cmVlIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVSZW1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdUcmVlTmFtZSkgewotCQlyZXR1cm4gbmV3IFRyZWVSZW1vdmVFdmVudChuZXdTb3VyY2UsIG5ld1RyZWVOYW1lLCB0aGlzLnBhdGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWRjYmQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCi0JLy8gKioqKiogc3RhdGUKLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKiogcHJvcGVydHkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKiogY29sbGVjdGlvbgotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBsaXN0Ci0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiB0cmVlCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM2MjAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotLyoqCi0gKiBHZW5lcmFsIHB1cnBvc2UgY2hhbmdlIGxpc3RlbmVyLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCS8vIGNvbWJpbmUgdGhlIG90aGVyIGxpc3RlbmVyIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWNhODgxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmY2NjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGNvbGxlY3Rpb24uIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBjb2xsZWN0aW9uIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGNvbGxlY3Rpb24gaXMgY2hhbmdlZCBpbiBhIG1hbm5lcgotCSAqIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbW1hbmRDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2ZkNGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBbGwgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggYSBzaW5nbGUgY29tbWFuZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgU2ltcGxlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2hhbmdlIGxpc3RlbmVyIHRoYXQgZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHdoZW5ldmVyCi0JICogaXQgcmVjZWl2ZXMgYW55IGNoYW5nZSBub3RpZmljYXRpb24gZnJvbSB0aGUgbW9kZWwgdG8gd2hpY2ggaXQgaXMgYWRkZWQKLQkgKiBhcyBhIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBDb21tYW5kQ2hhbmdlTGlzdGVuZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjg1YjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBMaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0xpc3RDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODBjNTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotCi0vKioKLSAqIEEgImxpc3QgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIGxpc3QuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5MaXN0Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBsaXN0IHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgYWRkZWQgdG8gYSBib3VuZCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLCBhbmQgdGhlIGluZGV4Ci0JICogYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuCi0JICovCi0Jdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSByZW1vdmVkIGZyb20gYSBib3VuZCBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLCB0aGUgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQsIGFuZCB0aGUgaW5kZXgKLQkgKiBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZW1vdmVkLgotCSAqLwotCXZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUKLQkgKiByZXBsYWNlZCwgYW5kIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGluIGEgYm91bmQgbGlzdCBhcmUgbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaW5kaWNlcyBvZiB3aGVyZSBpdGVtcyB3ZXJlIG1vdmVkCi0JICogZnJvbSBhbmQgdG8uCi0JICovCi0Jdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGxpc3QgaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2xlYXJFdmVudCBvYmplY3QgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgbGlzdCB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjaGFuZ2VkIGluIGEgbWFubmVyCi0JICogdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEEgTGlzdENoYW5nZUV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9NdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTc2MmJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyfSB3aGVuIHRoZSByZXF1ZXN0ZWQgbGlzdGVuZXIKLSAqIG5lZWRzIHRvIGltcGxlbWVudCBtdWx0aXBsZSBtZXRob2RzIChpLmUuIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LAotICoge0BsaW5rIExpc3RDaGFuZ2VMaXN0ZW5lcn0sIG9yIHtAbGluayBUcmVlQ2hhbmdlTGlzdGVuZXJ9KS4KLSAqLwotY2xhc3MgTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlleHRlbmRzIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lciAKLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciwgTGlzdENoYW5nZUxpc3RlbmVyLCBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQkvKiogdGhlIG1ldGhvZHMgd2Ugd2lsbCBpbnZva2Ugb24gdGhlIHRhcmdldCBvYmplY3QgKi8KLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBhZGRNZXRob2Q7Ci0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVtb3ZlTWV0aG9kOwotCXByaXZhdGUgZmluYWwgTWV0aG9kIHJlcGxhY2VNZXRob2Q7CS8vIHRoaXMgY2FuIGJlIG51bGwKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBtb3ZlTWV0aG9kOwkvLyB0aGlzIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgY2xlYXJNZXRob2Q7Ci0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgY2hhbmdlTWV0aG9kOwotCi0KLQkvKioKLQkgKiBUaGUgInJlcGxhY2UiIGFuZCAibW92ZSIgbWV0aG9kcyBhcmUgb3B0aW9uYWwuCi0JICovCi0JTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIHJlcGxhY2VNZXRob2QsIE1ldGhvZCBtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJc3VwZXIodGFyZ2V0KTsKLQkJdGhpcy5hZGRNZXRob2QgPSBhZGRNZXRob2Q7Ci0JCXRoaXMucmVtb3ZlTWV0aG9kID0gcmVtb3ZlTWV0aG9kOwotCQl0aGlzLnJlcGxhY2VNZXRob2QgPSByZXBsYWNlTWV0aG9kOwotCQl0aGlzLm1vdmVNZXRob2QgPSBtb3ZlTWV0aG9kOwotCQl0aGlzLmNsZWFyTWV0aG9kID0gY2xlYXJNZXRob2Q7Ci0JCXRoaXMuY2hhbmdlTWV0aG9kID0gY2hhbmdlTWV0aG9kOwotCX0KLQotCS8qKgotCSAqIE5vICJyZXBsYWNlIiBvciAibW92ZSIgbWV0aG9kcy4KLQkgKi8KLQlNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJdGhpcyh0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBudWxsLCBudWxsLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgQ29sbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBDb2xsZWN0aW9uRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlbW92ZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2xlYXJNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jaGFuZ2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBMaXN0RXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlbW92ZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlcGxhY2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5tb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBUcmVlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IFRyZWVFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmFkZE1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLnJlbW92ZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2xlYXJNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jaGFuZ2VNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OTIzNTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoaXMgaXMgcHJvYmFibHkgb2YgbGltaXRlZCB1c2UsIHNpbmNlIHRoZXJlIG9ubHkgYSBzaW5nbGUgbWV0aG9kIHRvIGltcGxlbWVudDsKLSAqIG1heWJlIGFzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI0ODhmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBICJwcm9wZXJ0eSBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogcHJvcGVydHkuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPiB3aXRoIGEgc291cmNlCi0gKiBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCBvZiBhbnkgYm91bmQgcHJvcGVydHkgdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG1vZGVsIGhhcyBjaGFuZ2VkIGEgYm91bmQgcHJvcGVydHkuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZQotCSAqIGFuZCB0aGUgcHJvcGVydHkncyBvbGQgYW5kIG5ldyB2YWx1ZXMuCi0JICovCi0Jdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjRjZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGZhY3RvcnkgYnVpbGRzIGxpc3RlbmVycyB0aGF0IHJlZmxlY3RpdmVseSBmb3J3YXJkIGNoYW5nZSBldmVudHMuCi0gKiBJZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgaGF2aW5nIHRvbyBtYW55IGxpdHRsZSBjbGFzc2VzIHRoYXQgaGF2ZSB0byBiZQotICogbG9hZGVkIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIsIHlvdSBjYW4gdXNlIG9uZSBvZiB0aGVzZS4KLSAqIE9mIGNvdXJzZSwgdGhpcyBjb21lcyB3aXRoIHRoZSBhZGRpdGlvbmFsIG92ZXJoZWFkIG9mIHJlZmxlY3Rpb24uLi4uCi0gKiBBbHNvIG5vdGUgdGhhdCB0aGUgdmFsaWRpdHkgb2YgdGhlIG1ldGhvZCBuYW1lIGlzIG5vdCBjaGVja2VkIGF0IGNvbXBpbGUKLSAqIHRpbWUsIGJ1dCBhdCBydW50aW1lOyBhbHRob3VnaCB3ZSA8ZW0+ZG88L2VtPiBjaGVjayB0aGUgbWV0aG9kIGFzIHNvb24gYXMgdGhlCi0gKiBsaXN0ZW5lciBpcyBpbnN0YW50aWF0ZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqIHRoZSB0YXJnZXQgb2JqZWN0IG9uIHdoaWNoIHdlIHdpbGwgaW52b2tlIHRoZSBtZXRob2QgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IHRhcmdldDsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PiBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8U3RhdGVDaGFuZ2VFdmVudD5bXSBTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7U1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUV2ZW50PiBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8UHJvcGVydHlDaGFuZ2VFdmVudD5bXSBQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7UFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+IENPTExFQ1RJT05fRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uRXZlbnQ+W10gQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkFkZEV2ZW50PiBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25BZGRFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25BZGRFdmVudD5bXSBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25SZW1vdmVFdmVudD4gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MgPSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uUmVtb3ZlRXZlbnQ+W10gQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7Q09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2xlYXJFdmVudD4gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNsZWFyRXZlbnQ+W10gQ09MTEVDVElPTl9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUV2ZW50PiBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25DaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VFdmVudD5bXSBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PiBMSVNUX0VWRU5UX0NMQVNTID0gTGlzdEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEV2ZW50PltdIExJU1RfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RBZGRFdmVudD4gTElTVF9BRERfRVZFTlRfQ0xBU1MgPSBMaXN0QWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0QWRkRXZlbnQ+W10gTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVtb3ZlRXZlbnQ+IExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTID0gTGlzdFJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlbW92ZUV2ZW50PltdIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlcGxhY2VFdmVudD4gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTID0gTGlzdFJlcGxhY2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZXBsYWNlRXZlbnQ+W10gTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfUkVQTEFDRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RNb3ZlRXZlbnQ+IExJU1RfTU9WRV9FVkVOVF9DTEFTUyA9IExpc3RNb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0TW92ZUV2ZW50PltdIExJU1RfTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX01PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2xlYXJFdmVudD4gTElTVF9DTEVBUl9FVkVOVF9DTEFTUyA9IExpc3RDbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENsZWFyRXZlbnQ+W10gTElTVF9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PiBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTUyA9IExpc3RDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VFdmVudD5bXSBMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PiBUUkVFX0VWRU5UX0NMQVNTID0gVHJlZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUV2ZW50PltdIFRSRUVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVBZGRFdmVudD4gVFJFRV9BRERfRVZFTlRfQ0xBU1MgPSBUcmVlQWRkRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQWRkRXZlbnQ+W10gVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9BRERfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlUmVtb3ZlRXZlbnQ+IFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTID0gVHJlZVJlbW92ZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZVJlbW92ZUV2ZW50PltdIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge1RSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNsZWFyRXZlbnQ+IFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MgPSBUcmVlQ2xlYXJFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDbGVhckV2ZW50PltdIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DTEVBUl9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD4gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MgPSBUcmVlQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2hhbmdlRXZlbnQ+W10gVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEZpbmQgYW5kIHJldHVybiBhIG1ldGhvZCBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0IHRoYXQgY2FuIGJlIGludm9rZWQKLQkgKiByZWZsZWN0aXZlbHkgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZChPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PltdIGV2ZW50Q2xhc3NBcnJheSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBldmVudENsYXNzQXJyYXkpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4MSkgewotCQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgc3VpdGFibGUgZm9yIGJlaW5nIGludm9rZWQgd2hlbiBhCi0JICogY2hhbmdlIGV2ZW50IGhhcyBvY2N1cnJlZC4gVGhyb3cgYW4gZXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBzdWl0YWJsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoTWV0aG9kIG1ldGhvZCwgQ2xhc3M8PyBleHRlbmRzIENoYW5nZUV2ZW50PiBldmVudENsYXNzKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCWludCBwYXJtVHlwZXNMZW5ndGggPSBwYXJtVHlwZXMubGVuZ3RoOwotCQlpZiAocGFybVR5cGVzTGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoKHBhcm1UeXBlc0xlbmd0aCA9PSAxKSAmJiBwYXJtVHlwZXNbMF0uaXNBc3NpZ25hYmxlRnJvbShldmVudENsYXNzKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24obWV0aG9kLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFN0YXRlQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtZXRob2QsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsgb3RoZXJ3aXNlLAotCSAqIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGFkZE1ldGhvZCwgQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKHJlbW92ZU1ldGhvZCwgQ09MTEVDVElPTl9SRU1PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgY2xlYXJNZXRob2ROYW1lLCBTdHJpbmcgY2hhbmdlTWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoCi0JCQkJdGFyZ2V0LAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGFkZE1ldGhvZE5hbWUsIENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZW1vdmVNZXRob2ROYW1lLCBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2xlYXJNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjaGFuZ2VNZXRob2ROYW1lLCBDT0xMRUNUSU9OX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgQ09MTEVDVElPTl9FVkVOVF9DTEFTU19BUlJBWSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHM6IExpc3RDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCByZXBsYWNlTWV0aG9kLCBNZXRob2QgbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBMSVNUX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBMSVNUX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVwbGFjZU1ldGhvZCwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChtb3ZlTWV0aG9kLCBMSVNUX01PVkVfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNsZWFyTWV0aG9kLCBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjaGFuZ2VNZXRob2QsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGFkZE1ldGhvZCwgcmVtb3ZlTWV0aG9kLCByZXBsYWNlTWV0aG9kLCBtb3ZlTWV0aG9kLCBjbGVhck1ldGhvZCwgY2hhbmdlTWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGFueSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIHJlcGxhY2VNZXRob2ROYW1lLCBTdHJpbmcgbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgTElTVF9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCByZXBsYWNlTWV0aG9kTmFtZSwgTElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtb3ZlTWV0aG9kTmFtZSwgTElTVF9NT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBMSVNUX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogVHJlZUNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBUUkVFX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBUUkVFX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgVFJFRV9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIFRSRUVfQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIFRSRUVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBUUkVFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwcm90ZWN0ZWQgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW1wbGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2ltcGxlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4MmI3Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW1wbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBBbGwgY2hhbmdlIG5vdGlmaWNhdGlvbnMgYXJlIGZ1bm5lbGVkIHRocm91Z2ggYSBzaW5nbGUgbWV0aG9kLgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBieQotICogc3ViY2xhc3NpbmcgaXQgYW5kIG92ZXJyaWRpbmcgZWl0aGVyIHtAbGluayAjbW9kZWxDaGFuZ2VkKENoYW5nZUV2ZW50KX0KLSAqIChpZiBhY2Nlc3MgdG8gdGhlIGV2ZW50IGlzIHJlcXVpcmVkKSBvciB7QGxpbmsgI21vZGVsQ2hhbmdlZCgpfSAoaWYgYWNjZXNzCi0gKiB0byB0aGUgZXZlbnQgaXMgbm90IHJlcXVpcmVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbXBsZUNoYW5nZUxpc3RlbmVyCi0JaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotewotCXB1YmxpYyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBub3RpZmllZCB0aGUgbGlzdGVuZXIgb2YgdGhlIGNoYW5nZSBkZXNjcmliZWQgYnkgdGhlCi0JICogc3BlY2lmaWVkIGNoYW5nZSBldmVudC4gQnkgZGVmYXVsdCB0aGUgbGlzdGVuZXIgZXhlY3V0ZXMge0BsaW5rICNtb2RlbENoYW5nZWQoKX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgbm90aWZpZWQgdGhlIGxpc3RlbmVyIG9mIGEgY2hhbmdlLgotCSAqIEJ5IGRlZmF1bHQgdGhlIGxpc3RlbmVyIHRocm93cyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDZlNzVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkge0BsaW5rIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcn0gd2hlbiB0aGUgcmVxdWVzdGVkIGxpc3RlbmVyCi0gKiBuZWVkIG9ubHkgaW1wbGVtZW50IGEgc2luZ2xlIG1ldGhvZCAoaS5lLiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0gb3IKLSAqIHtAbGluayBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfSkuCi0gKi8KLWNsYXNzIFNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi17Ci0KLQkvKiogdGhlIG1ldGhvZCB3ZSB3aWxsIGludm9rZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIG1ldGhvZDsKLQkvKiogY2FjaGUgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWV0aG9kSXNaZXJvQXJndW1lbnQ7Ci0KLQlTaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLm1ldGhvZCA9IG1ldGhvZDsKLQkJdGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGF0ZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50KSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBTdGF0ZUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5tZXRob2RJc1plcm9Bcmd1bWVudCkgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodGhpcy5tZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2M1ZjE4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU3RhdGVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGlzIGlzIHByb2JhYmx5IG9mIGxpbWl0ZWQgdXNlLCBzaW5jZSB0aGVyZSBvbmx5IGEgc2luZ2xlIG1ldGhvZCB0byBpbXBsZW1lbnQ7Ci0gKiBtYXliZSBhcyBhIG51bGwgaW1wbGVtZW50YXRpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0ZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljNTk5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TdGF0ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0byAKLSAqIHN1Y2ggZXh0ZW50IHRoYXQgaXQgY2Fubm90IGJlIGRlbGluZWF0ZWQgYWxsIGFzcGVjdHMgb2YgaXQgdGhhdCBoYXZlIGNoYW5nZWQuIAotICogWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPlN0YXRlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UgbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgCi0gKiBvZiBhbnkgc3VjaCBjaGFuZ2VzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgaW4gc29tZSBnZW5lcmFsIGZhc2hpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZS4KLQkgKi8KLQl2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkN2NjZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVHJlZUNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1RyZWVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGM4OTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIEEgInRyZWUgY2hhbmdlIiBldmVudCBnZXRzIGZpcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIHRyZWUuIFlvdSBjYW4gcmVnaXN0ZXIgYSA8Y29kZT5UcmVlQ2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCB0cmVlIHVwZGF0ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVDaGFuZ2VMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgYWRkZWQgdG8gYSBib3VuZCB0cmVlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIHBhdGggdG8gdGhlIG5vZGUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0Jdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBub2RlIGlzIHJlbW92ZWQgZnJvbSBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCB0cmVlIGlzIGNsZWFyZWQuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCBhbiBlbXB0eSBwYXRoLgotCSAqLwotCXZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIHBvcnRpb24gb2YgYSBib3VuZCB0cmVlIGlzIGNoYW5nZWQgaW4KLQkgKiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzCi0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBbiBldmVudCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UsCi0JICogdGhlIHRyZWUgdGhhdCBjaGFuZ2VkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCi0JICogdHJlZSB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhZGY1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IGNvbGxlY3Rpb24gYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIE1vZGVsLCBJdGVyYWJsZTxFPgotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2xsZWN0aW9uJ3MgdmFsdWVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBWQUxVRVMgPSAidmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCWludCBzaXplKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9MaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ4ODI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCBsaXN0IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBsaXN0IG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIE1vZGVsLCBJdGVyYWJsZTxFPgotewotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotCQlTdHJpbmcgTElTVF9WQUxVRVMgPSAibGlzdCB2YWx1ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqLwotCWludCBzaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgbGlzdC4KLQkgKi8KLQlFIGdldChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0J3MgdmFsdWVzLgotCSAqLwotCU9iamVjdFtdIHRvQXJyYXkoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwYmU0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHByb3BlcnR5IGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBNb2RlbAotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotCSAqLwotCVQgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlTm9kZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI4MWIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gdG8gYmV0dGVyIHN1cHBvcnQKLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlcn0uCi0gKiA8cD4KLSAqIEltcGxlbWVudG9ycyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgZmlyZSBhICJzdGF0ZSBjaGFuZ2UiIGV2ZW50Ci0gKiB3aGVuZXZlciB0aGUgbm9kZSdzIGludGVybmFsIHN0YXRlIGNoYW5nZXMgaW4gYSB3YXkgdGhhdCB0aGUKLSAqIHRyZWUgbGlzdGVuZXJzIHNob3VsZCBiZSBub3RpZmllZC4KLSAqIDxwPgotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBhbHNvIGZpcmUgYSAidmFsdWUgcHJvcGVydHkgY2hhbmdlIgotICogZXZlbnQgd2hlbmV2ZXIgdGhlIG5vZGUncyB2YWx1ZSBjaGFuZ2VzLiBUeXBpY2FsbHksIG9ubHkgbm9kZXMgdGhhdAotICogaG9sZCAicHJpbWl0aXZlIiBkYXRhIHdpbGwgZmlyZSB0aGlzIGV2ZW50LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB2YWx1ZXMgaGVsZCBieSB0aGUgbW9kZWwKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZTsgbnVsbCBpZiB0aGUgbm9kZQotCSAqIGlzIHRoZSByb290LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgbm9kZS4KLQkgKi8KLQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IHZhbHVlIG1vZGVsIG9mIHRoZSBub2RlJ3MgY2hpbGQgbm9kZXMuCi0JICovCi0JTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBjaGlsZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKi8KLQlpbnQgY2hpbGRyZW5TaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBub2RlJ3MgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgc3BlY2lmaWVkIGNoaWxkLgotCSAqLwotCWludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgbGVhZiAoaS5lLiBpdCBoYXMgbm8gY2hpbGRyZW4pCi0JICovCi0JYm9vbGVhbiBpc0xlYWYoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhM2U0NGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdXNlZCB0byBhYnN0cmFjdCB0cmVlIGFjY2Vzc2luZyBhbmQKLSAqIGNoYW5nZSBub3RpZmljYXRpb24gYW5kIG1ha2UgaXQgbW9yZSBwbHVnZ2FibGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBNb2RlbAotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSdzIG5vZGVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IG5vZGVzKCk7Ci0JCVN0cmluZyBOT0RFUyA9ICJub2RlcyI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU1ZmE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZQotICogY29sbGVjdGlvbidzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWVzIGFuZCBmaXJlIGEgY29sbGVjdGlvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgQ29sbGVjdGlvblZhbHVlTW9kZWwjVkFMVUVTCi0JICovCi0Jdm9pZCBzZXRWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjhlNTM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZQotICogbGlzdHMncyB2YWx1ZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxpc3QgdmFsdWVzIGFuZCBmaXJlIGEgbGlzdCBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgTGlzdFZhbHVlTW9kZWwjTElTVF9WQUxVRVMKLQkgKi8KLQl2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gdmFsdWVzKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMzVjMzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBhbGxvdyB0aGUgc2V0dGluZyBvZiB0aGUgcHJvcGVydHkncyB2YWx1ZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdmFsdWUgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIGFuZCBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbCNWQUxVRQotCSAqLwotCXZvaWQgc2V0VmFsdWUoVCB2YWx1ZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5MjI3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBTeW5jaHJvbml6ZXJ9IHRvIG5vdGlmeSBsaXN0ZW5lcnMKLSAqIHdoZW4gYSBzeW5jaHJvbml6YXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgc3luY2hyb25pemF0aW9uIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBxdWllc2NlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsYmFja1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN5bmNocm9uaXplciBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKExpc3RlbmVyKQotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlCi0JICogc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0JCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIENhbGxiYWNrU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIENhbGxiYWNrU3luY2hyb25pemVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwZmI4Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIHByb3RvY29sIGZvciBzdGFydGluZywgc3RvcHBpbmcsIGFuZCBleGVjdXRpbmcgYQotICogbG9uZy1ydW5uaW5nLCByZXBlYXRhYmxlLCBhbmQgcG9zc2libHkgcmVjdXJzaXZlICJzeW5jaHJvbml6YXRpb24iIHByb2Nlc3MuCi0gKiBUaGUgaW50ZW50IGlzIGZvciB0aGUgc3luY2hyb25pemVyIHRvIHN5bmNocm9uaXplIGEgInNlY29uZGFyeSIgbW9kZWwgd2l0aAotICogYSAicHJpbWFyeSIgbW9kZWwuIEFueSBjaGFuZ2UgdG8gdGhlICJwcmltYXJ5IiBtb2RlbCB3aWxsIHRyaWdnZXIgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24uIFRoZSBzeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAqICJzZWNvbmRhcnkiIG1vZGVsIHJlbWFpbnMgaW4gc3luYyBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB7QGxpbmsgI3N0YXJ0KCl9IGFuZCB7QGxpbmsgI3N0b3AoKX0gbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gKiBhIHNpbmdsZSBtYXN0ZXIgdGhyZWFkIHRoYXQgd291bGQgY29udHJvbCB0aGUgc3luY2hyb25pemVyJ3MgbGlmZWN5Y2xlIGFuZAotICogdGhlIHtAbGluayAjc3luY2hyb25pemUoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBmcm9tCi0gKiBtdWx0aXBsZSB0aHJlYWRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN5bmNocm9uaXplciB7Ci0KLQkvKioKLQkgKiBFbmFibGUgdGhlIHN5bmNocm9uaXplciB0byBhbGxvdyBmdXR1cmUgc3luY2hyb25pemF0aW9ucyBhcyByZXF1ZXN0ZWQKLQkgKiBieSBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqLwotCXZvaWQgc3RhcnQoKTsKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBkZXBlbmRlbnQgbW9kZWwgd2l0aCB0aGUgcHJpbWFyeSBtb2RlbC4gRG8gbm90aGluZyBpZgotCSAqIHtAbGluayAjc3RhcnQoKX0gaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLiBEbyBub3RoaW5nIGlmIHtAbGluayAjc3RvcH0KLQkgKiBoYXMgYmVlbiBjYWxsZWQgKHdpdGhvdXQgYW55IGludGVybWVkaWF0ZSBjYWxsIHRvIHtAbGluayAjc3RhcnQoKX0uCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZSgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGltbWVkaWF0ZWx5IG9yLCBpZiBhIHN5bmNocm9uaXphdGlvbiBpcyBjdXJyZW50bHkKLQkgKiBpbiBwcm9ncmVzcywgd2hlbiBpdCBjb21wbGV0ZXMuIFJldHVybiB3aGVuIHRoZSBzeW5jaHJvbml6ZXIgaXMgc3RvcHBlZC4KLQkgKiBObyBmdXJ0aGVyIHN5bmNob25pemF0aW9ucyB3aWxsIHBlcmZvcm1lZCB1bnRpbCB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgU3luY2hyb25pemVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN5bmNocm9uaXplciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgU3luY2hyb25pemVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTeW5jaHJvbml6ZXIuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTMwMzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzOWQxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTU4MDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNUdWUgSmFuIDI1IDEyOjQ4OjQwIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOGFiMzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjBiM2YyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMmI4MjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25Db3JlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25Db3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1OTY4NC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uQ29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkpwdENvbW1vbkNvcmVVdGlsaXR5SmR0VGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvbW1vbkNvcmVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEZhY2V0ZWRQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYmE3NGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBidWlsZHMgYW5kIGhvbGRzIGEgImZhY2V0ZWQiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBpbnN0YWxsaW5nIGZhY2V0cy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RGYWNldGVkUHJvamVjdCBleHRlbmRzIFRlc3RQbGF0Zm9ybVByb2plY3QgewotCXByaXZhdGUgZmluYWwgSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0OwotCi0KLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0RmFjZXRlZFByb2plY3QgYnVpbGRGYWNldGVkUHJvamVjdChTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkKLQkJCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0RmFjZXRlZFByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEZhY2V0ZWRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIFRlc3RGYWNldGVkUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0ID0gdGhpcy5jcmVhdGVGYWNldGVkUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0IGNyZWF0ZUZhY2V0ZWRQcm9qZWN0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpLCB0cnVlLCBudWxsKTsJCS8vIHRydWUgPSAiY29udmVydCBpZiBuZWNlc3NhcnkiCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJRmFjZXRlZFByb2plY3QgZ2V0RmFjZXRlZFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmZhY2V0ZWRQcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMudW5pbnN0YWxsRmFjZXQoZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogaWYgJ2NvbmZpZycgaXMgbnVsbCAoYW5kICdmYWNldE5hbWUnIGlzICJqcHQuanBhIiksIHRoZSBKUEEgcHJvamVjdCB3aWxsIGJlIGJ1aWx0IHdpdGggdGhlIGRlZmF1bHRzCi0JICogZGVmaW5lZCBpbiBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIEluIEpQQSB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGFuIElEYXRhTW9kZWwKLQkgKiBJbiBKQVhCIHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgYSBKYXhiRmFjZXRJbnN0YWxsQ29uZmlnCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSwgT2JqZWN0IGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSW4gSlBBIHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgYW4gSURhdGFNb2RlbAotCSAqIEluIEpBWEIgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBhIEpheGJGYWNldFVuaW5zdGFsbENvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSwgT2JqZWN0IGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmZhY2V0ZWRQcm9qZWN0LnVuaW5zdGFsbFByb2plY3RGYWNldCh0aGlzLmZhY2V0VmVyc2lvbihmYWNldE5hbWUsIHZlcnNpb25OYW1lKSwgY29uZmlnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZhY2V0VmVyc2lvbihTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUpIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChmYWNldE5hbWUpLmdldFZlcnNpb24odmVyc2lvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXZhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE3ZTM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSmF2YSIgcHJvamVjdC4KLSAqIFN1cHBvcnQgZm9yIGFkZGluZyBwYWNrYWdlcyBhbmQgdHlwZXMuCi0gKiAKLSAqICJKYXZhIiBwcm9qZWN0cyBhcmVuJ3QgcmVxdWlyZWQgdG8gYmUgImZhY2V0ZWQiIHByb2plY3RzLCBidXQgZm9yIEpQQQotICogdGVzdGluZyB0aGV5IGFyZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFQcm9qZWN0IGV4dGVuZHMgVGVzdEZhY2V0ZWRQcm9qZWN0IHsKLQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcjsKLQotCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRlc3RKYXZhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQkJdGhpcy5pbnN0YWxsRmFjZXQoImpzdC5qYXZhIiwgIjUuMCIpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHRoaXMuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5zb3VyY2VGb2xkZXIgPSB0aGlzLmphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5hZGRDbGFzc3BhdGhFbnRyeShKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoamFyUGF0aCksIG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NwYXRoRW50cnkoSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgoQXJyYXlUb29scy5hZGQodGhpcy5qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSwgZW50cnkpLCBudWxsKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50IGNyZWF0ZVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZUZvbGRlci5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUsIGZhbHNlLCBudWxsKTsJLy8gZmFsc2UgPSAibm8gZm9yY2UiCi0JfQotCi0JLyoqCi0JICogVGhlIHNvdXJjZSBzaG91bGQgTk9UIGNvbnRhaW4gYSBwYWNrYWdlIGRlY2xhcmF0aW9uOwotCSAqIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU3RyaW5nIHNvdXJjZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVDb21waWxhdGlvblVuaXQodGhpcy5jcmVhdGVQYWNrYWdlKHBhY2thZ2VOYW1lKSwgY29tcGlsYXRpb25Vbml0TmFtZSwgbmV3IFNpbXBsZVNvdXJjZVdyaXRlcihzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc291cmNlIHNob3VsZCBOT1QgY29udGFpbiBhIHBhY2thZ2UgZGVjbGFyYXRpb247Ci0JICogaXQgd2lsbCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjb21waWxhdGlvblVuaXROYW1lLCBTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCh0aGlzLmNyZWF0ZVBhY2thZ2UocGFja2FnZU5hbWUpLCBjb21waWxhdGlvblVuaXROYW1lLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzb3VyY2Ugc2hvdWxkIE5PVCBjb250YWluIGEgcGFja2FnZSBkZWNsYXJhdGlvbjsKLQkgKiBpdCB3aWxsIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50LCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwMCk7Ci0JCXNvdXJjZVdyaXRlci5hcHBlbmRTb3VyY2VUbyhzYik7Ci0JCVN0cmluZyBzb3VyY2UgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChjb21waWxhdGlvblVuaXROYW1lLCBzb3VyY2UsIGZhbHNlLCBudWxsKTsJLy8gZmFsc2UgPSAibm8gZm9yY2UiCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnRlcmZhY2UgU291cmNlV3JpdGVyIHsKLQkJdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgU2ltcGxlU291cmNlV3JpdGVyIGltcGxlbWVudHMgU291cmNlV3JpdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc291cmNlOwotCQlwdWJsaWMgU2ltcGxlU291cmNlV3JpdGVyKFN0cmluZyBzb3VyY2UpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5zb3VyY2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5YzJkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdFBsYXRmb3JtUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJnZW5lcmFsIiBFY2xpcHNlIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgbmF0dXJlcywgZm9sZGVycywgYW5kIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFBsYXRmb3JtUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCi0JLyoqIGNhcnJpYWdlIHJldHVybiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQkKLQkvLyAqKioqKioqKioqIGJ1aWxkZXJzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RQbGF0Zm9ybVByb2plY3QgYnVpbGRQbGF0Zm9ybVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdFBsYXRmb3JtUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgVGVzdFBsYXRmb3JtUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2V0QXV0b0J1aWxkKGF1dG9CdWlsZCk7ICAvLyB3b3Jrc3BhY2Utd2lkZSBzZXR0aW5nCi0JCXRoaXMucHJvamVjdCA9IHRoaXMuYnVpbGRQbGF0Zm9ybVByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBdXRvQnVpbGQoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyhhdXRvQnVpbGQpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgYnVpbGRQbGF0Zm9ybVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHAgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlwLmNyZWF0ZShudWxsKTsKLQkJcC5vcGVuKG51bGwpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvamVjdE5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHRoaXMucHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoQXJyYXlUb29scy5hZGQoZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCksIG5hdHVyZUlEKSk7Ci0JCXRoaXMucHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvamVjdE5hdHVyZShTdHJpbmcgbmF0dXJlSUQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHRoaXMucHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXROYXR1cmVJZHMoQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKSwgbmF0dXJlSUQpKTsKLQkJdGhpcy5wcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDhiZmUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVEZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQVNUVG9vbHNUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQVNUVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW51bUFuZE1lbWJlcnMoU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiZW51bXMiLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRW51bTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtQW5kTWVtYmVycygiVGVzdEVudW0iLCAiRk9PLCBCQVIsIEJBWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJUZXN0QW5ub3RhdGlvbiIsICJUZXN0RW51bSBmb28oKTsiKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1lbnVtcy5UZXN0RW51bS5CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5CQVoiLCAiQGFubm90LlRlc3RBbm5vdGF0aW9uKGZvbz1CQVopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LlRlc3RBbm5vdGF0aW9uIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImZvbyIpOwotCQlKRFRGaWVsZEF0dHJpYnV0ZSBmaWVsZCA9IHRoaXMuaWRGaWVsZChjdSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVFbnVtKChOYW1lKSBkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS4qIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289QkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRW51bSgoTmFtZSlkYWVhLmdldEV4cHJlc3Npb24oZmllbGQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKSk7Ci0JCWFzc2VydEVxdWFscygiZW51bXMuVGVzdEVudW0uQkFaIiwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW00KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImVudW1zLlRlc3RFbnVtIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289VGVzdEVudW0uQkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjRmNTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIFByb3ZpZGUgYW4gZWFzeSg/KSB3YXkgdG8gYnVpbGQgYW4gYW5ub3RhdGVkIHNvdXJjZSBmaWxlLgotICogVGhlIHR5cGUgbXVzdCBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSB7QGxpbmsgI2NyZWF0ZVRlc3RUeXBlKCl9Ci0gKiBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyAoaS5lLiB0aGUgdHlwZSBpcwotICogPGVtPm5vdDwvZW0+IGNyZWF0ZWQgZHVyaW5nIHtAbGluayAjc2V0VXAoKX0pLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uVGVzdENhc2UKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9IEZpbGUuc2VwYXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFByb2plY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUVfID0gUEFDS0FHRV9OQU1FICsgJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSU5GT19GSUxFX05BTUUgPSAicGFja2FnZS1pbmZvLmphdmEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggUEFDS0FHRV9JTkZPX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKCJzcmMiICsgU0VQICsgUEFDS0FHRV9OQU1FICsgU0VQICsgUEFDS0FHRV9JTkZPX0ZJTEVfTkFNRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRV8gKyBUWVBFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FID0gVFlQRV9OQU1FICsgIi5qYXZhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIEZJTEVfUEFUSCA9IG5ldyBQYXRoKCJzcmMiICsgU0VQICsgUEFDS0FHRV9OQU1FICsgU0VQICsgRklMRV9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0JLy8gKioqKioqKioqKiBUZXN0Q2FzZSBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmJ1aWxkSmF2YVByb2plY3QoZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSmF2YVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5kdW1wU291cmNlKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgpOwotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGkgPSAxOwotCQlib29sZWFuIGRlbGV0ZWQgPSBmYWxzZTsKLQkJd2hpbGUgKCAhIGRlbGV0ZWQpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCWRlbGV0ZWQgPSB0cnVlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCWlmIChpID09IDQpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcy5nZXROYW1lKCkgKyAiIC0gdW5hYmxlIHRvIGRlbGV0ZSBwcm9qZWN0IiwgZXgpOwotCQkJCX0KLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNvdXJjZShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldFNvdXJjZShjdSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIGNyZWF0aW9uICoqKioqKioqKgotCQotCS8qKiAKLQkgKiBjcmVhdGUgYW4gdW4tYW5ub3RhdGVkIHBhY2thZ2UtaW5mbwotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFBhY2thZ2VJbmZvKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIGNyZWF0ZSBhbiB1bi1hbm5vdGF0ZWQgcGFja2FnZS1pbmZvIGluIGEgcGFja2FnZSB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIHNob3J0Y3V0IGZvciBzaW1wbHkgYWRkaW5nIGFuIGFubm90YXRpb24gdG8gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQlmaW5hbCBTdHJpbmcgcGFja2FnZUFubm90YXRpb24sIGZpbmFsIFN0cmluZyAuLi4gaW1wb3J0cykgCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCW5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihpbXBvcnRzKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQkJc2IuYXBwZW5kKHBhY2thZ2VBbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhQQUNLQUdFX05BTUUsIGFubm90YXRpb25Xcml0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJcGFja2FnZU5hbWUsIFBBQ0tBR0VfSU5GT19GSUxFX05BTUUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHBhY2thZ2VOYW1lLCBudWxsKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHlwZSBjcmVhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogY3JlYXRlIGFuIHVuLWFubm90YXRlZCB0eXBlCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYW4gYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uSW1wb3J0LCBmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiAoYW5ub3RhdGlvbkltcG9ydCA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpIDoKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KGFubm90YXRpb25JbXBvcnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoaWRGaWVsZEFubm90YXRpb24pOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYSBmdWxseS1xdWFsaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBpZEZpZWxkQW5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShudWxsLCBpZEZpZWxkQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyB0eXBlTmFtZSwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZmlsZU5hbWUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHR5cGVOYW1lKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlciwgdHlwZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZVNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHBhY2thZ2VOYW1lLCB0eXBlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnVtKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCB0aGlzLmNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZmlsZU5hbWUsIHRoaXMuY3JlYXRlRW51bVNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBlbnVtTmFtZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlyZXR1cm4gbmV3IEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlRW51bVNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIGVudW1OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVFbnVtU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lKSB7Ci0JCXJldHVybiBuZXcgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBwYWNrYWdlTmFtZSwgZW51bU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0ZWRFbnVtQW5kTWVtYmVycyhTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKFBBQ0tBR0VfTkFNRSkuYXBwZW5kKCI7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtOyIpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIkBYbWxFbnVtIik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgicHVibGljIGVudW0gIikuYXBwZW5kKGVudW1OYW1lKS5hcHBlbmQoIiB7ICIpLmFwcGVuZChlbnVtQm9keSkuYXBwZW5kKCIgfSIpOwotCQkKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgZW51bU5hbWUgKyAiLmphdmEiLCBzYi50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogd3JpdGVzIHNvdXJjZSBmb3IgcGFja2FnZS1pbmZvIGphdmEgZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTb3VyY2VUbygKLQkJCVN0cmluZ0J1aWxkZXIgc2IsIEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCQotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VOYW1lKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gYW5ub3RhdGlvbldyaXRlci5pbXBvcnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKHN0cmVhbS5uZXh0KCkpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogd3JpdGVzIHNvdXJjZSBmb3IgdHlwaWNhbCBqYXZhIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU291cmNlVG8oCi0JCQlTdHJpbmdCdWlsZGVyIHNiLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIAotCQkJU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCi0JCXNiLmFwcGVuZCgicGFja2FnZSAiKS5hcHBlbmQocGFja2FnZU5hbWUpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBhbm5vdGF0aW9uV3JpdGVyLmltcG9ydHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCXNiLmFwcGVuZChzdHJlYW0ubmV4dCgpKTsKLQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJc2IuYXBwZW5kKENSKTsKLQkJfQotCQlzYi5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQodHlwZU5hbWUpLmFwcGVuZCgiICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oc2IpOwotCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLm5hbWU7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRUZXN0RmllbGQoU3RyaW5nIHRlc3RGaWVsZCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLnRlc3RGaWVsZCA9IHRlc3RGaWVsZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRNZW1iZXJUeXBlVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwkJCi0JCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiB3cml0ZXMgc291cmNlIGZvciB0eXBpY2FsIGphdmEgZW51bSBmaWxlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZEVudW1Tb3VyY2VUbygKLQkJCVN0cmluZ0J1aWxkZXIgc2IsIEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIAotCQkJU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJCi0JCXNiLmFwcGVuZCgicGFja2FnZSAiKS5hcHBlbmQocGFja2FnZU5hbWUpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBhbm5vdGF0aW9uV3JpdGVyLmltcG9ydHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCXNiLmFwcGVuZChzdHJlYW0ubmV4dCgpKTsKLQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJc2IuYXBwZW5kKENSKTsKLQkJfQotCQlzYi5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBlbnVtICIpLmFwcGVuZChlbnVtTmFtZSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIFNVTkRBWSwgIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kTW9uZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTU9OREFZIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSB0ZXN0VHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShUWVBFX05BTUUsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUeXBlKG5hbWUsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShudWxsLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVFR5cGUgYnVpbGRUeXBlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRUVHlwZShkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIGlkRmllbGQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKCJpZCIsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgbmFtZUZpZWxkKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCgibmFtZSIsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgbmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKG5hbWUsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCh0aGlzLnRlc3RUeXBlKGN1KSwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBidWlsZEZpZWxkKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRURmllbGRBdHRyaWJ1dGUoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgaWRHZXRNZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgiZ2V0SWQiLCBjdSk7Ci0JfQotCQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgaWRTZXRNZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgic2V0SWQiLCBuZXcgU3RyaW5nW10geyJpbnQifSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgbmFtZUdldE1ldGhvZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKCJnZXROYW1lIiwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QobmFtZSwgRU1QVFlfU1RSSU5HX0FSUkFZLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBidWlsZE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcywgMSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIG5ldyBKRFRNZXRob2RBdHRyaWJ1dGUodGhpcy50ZXN0VHlwZShjdSksIG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcywgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGN1LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gQVNUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFNvdXJjZUNvbnRhaW5zKFN0cmluZyBzLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGN1KTsKLQkJYm9vbGVhbiBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKHMpID4gLTE7Ci0JCWlmICggISBmb3VuZCkgewotCQkJU3RyaW5nIG1zZyA9ICJzb3VyY2UgZG9lcyBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgc3RyaW5nOiAiICsgcyArICIgKHNlZSBTeXN0ZW0gY29uc29sZSkiOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlmYWlsKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihTdHJpbmcgcywgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShjdSk7Ci0JCWludCBwb3MgPSBzb3VyY2UuaW5kZXhPZihzKTsKLQkJaWYgKHBvcyAhPSAtMSkgewotCQkJU3RyaW5nIG1zZyA9ICJ1bmV4cGVjdGVkIHN0cmluZyBpbiBzb3VyY2UgKHBvc2l0aW9uOiAiICsgcG9zICsgIik6ICIgKyBzICsgIiAoc2VlIFN5c3RlbSBjb25zb2xlKSI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgdGhpcy5nZXROYW1lKCkgKyAiICoqKioiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWZhaWwobXNnKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYW5pcHVsYXRlIGFubm90YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKSkgewotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQlyZXR1cm4gcGFpcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCXJldHVybiBuYS52YWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyhFbnVtRGVjbGFyYXRpb24gZWQpIHsKLQkJcmV0dXJuIGVkLmVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBmb3IgbnVsbCBtZW1iZXIgdmFsdWUgcGFpcgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIHZhbHVlXyhNZW1iZXJWYWx1ZVBhaXIgcGFpcikgewotCQlyZXR1cm4gKHBhaXIgPT0gbnVsbCkgPyBudWxsIDogcGFpci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlXyh0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZS5lcXVhbHMoInZhbHVlIikgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBCdWlsZCBhIG51bWJlciBsaXRlcmFsIGFuZCBzZXQgaXRzIGluaXRpYWwgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBsaXRlcmFsLgotCSAqLwotCXByb3RlY3RlZCBOdW1iZXJMaXRlcmFsIG5ld051bWJlckxpdGVyYWwoQVNUIGFzdCwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiBhc3QubmV3TnVtYmVyTGl0ZXJhbChJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBudW1iZXIgbGl0ZXJhbCBhbmQgc2V0IGl0cyBpbml0aWFsIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbkxpdGVyYWwgbmV3Qm9vbGVhbkxpdGVyYWwoQVNUIGFzdCwgYm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gYXN0Lm5ld0Jvb2xlYW5MaXRlcmFsKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIHN0cmluZyBsaXRlcmFsIGFuZCBzZXQgaXRzIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0xpdGVyYWwgbmV3U3RyaW5nTGl0ZXJhbChBU1QgYXN0LCBTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYXN0Lm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUodmFsdWUpOwotCQlyZXR1cm4gc3RyaW5nTGl0ZXJhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZUxpdGVyYWwgbmV3VHlwZUxpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVR5cGVMaXRlcmFsIHR5cGVMaXRlcmFsID0gYXN0Lm5ld1R5cGVMaXRlcmFsKCk7Ci0JCXR5cGVMaXRlcmFsLnNldFR5cGUodGhpcy5uZXdTaW1wbGVUeXBlKGFzdCwgdHlwZU5hbWUpKTsKLQkJcmV0dXJuIHR5cGVMaXRlcmFsOwotCX0KLQotCXByb3RlY3RlZCBTaW1wbGVUeXBlIG5ld1NpbXBsZVR5cGUoQVNUIGFzdCwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5ld1NpbXBsZVR5cGUoYXN0LCBhc3QubmV3TmFtZSh0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBTaW1wbGVUeXBlIG5ld1NpbXBsZVR5cGUoQVNUIGFzdCwgTmFtZSB0eXBlTmFtZSkgewotCQlyZXR1cm4gYXN0Lm5ld1NpbXBsZVR5cGUodHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFNpbXBsZU5hbWUgbmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IGFzdC5uZXdNZW1iZXJWYWx1ZVBhaXIoKTsKLQkJcGFpci5zZXROYW1lKG5hbWUpOwotCQlwYWlyLnNldFZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHBhaXI7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgYXN0Lm5ld1NpbXBsZU5hbWUobmFtZSksIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIHRoaXMubmV3U3RyaW5nTGl0ZXJhbChhc3QsIHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCB0aGlzLm5ld051bWJlckxpdGVyYWwoYXN0LCB2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIG5hbWUsIHRoaXMubmV3Qm9vbGVhbkxpdGVyYWwoYXN0LCB2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBuZXdFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihBU1QgYXN0LCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA9IGFzdC5uZXdFbnVtQ29uc3RhbnREZWNsYXJhdGlvbigpOwotCQllbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKGVudW1Db25zdGFudE5hbWUpKTsKLQkJcmV0dXJuIGVudW1Db25zdGFudERlY2xhcmF0aW9uOwotCX0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgcGFpcikgewotCQl0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5hZGQocGFpcik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIG5hbWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgbWFya2VyIGFubm90YXRpb24KLQkgKiBieSBmaXJzdCByZXBsYWNpbmcgaXQgd2l0aCBhIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIobm9ybWFsQW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQkJcmV0dXJuIG5vcm1hbEFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIobm9ybWFsQW5ub3RhdGlvbiwgdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgbmFtZSwgdmFsdWUpKTsKLQkJcmV0dXJuIG5vcm1hbEFubm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIG1hcmtlciBhbm5vdGF0aW9uCi0JICogYnkgZmlyc3QgcmVwbGFjaW5nIGl0IHdpdGggYSBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNZW1iZXJWYWx1ZVBhaXIgcGFpcikgewotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSB0aGlzLnJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb24pOwotCQlyZXR1cm4gdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIobm9ybWFsQW5ub3RhdGlvbiwgcGFpcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW51bU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBlbnVtVmFsdWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBhZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIGFubm90YXRpb25OYW1lKTsKLQkJfQotCQl0aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInZhbHVlIiwgZW51bVZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnVtTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgZW51bVZhbHVlKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCWlmIChtZW1iZXJWYWx1ZVBhaXIgPT0gbnVsbCkgewotCQkJdGhpcy5hZGRFbnVtTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lLCBlbnVtVmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJbWVtYmVyVmFsdWVQYWlyLnNldFZhbHVlKGFubm90YXRpb24uZ2V0QVNUKCkubmV3TmFtZShlbnVtVmFsdWUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudW1NZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBtYXJrZXJBbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZEVudW1NZW1iZXJWYWx1ZVBhaXIodGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbihtYXJrZXJBbm5vdGF0aW9uKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnVtTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUsIGFubm90YXRpb24uZ2V0QVNUKCkubmV3TmFtZSh2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIGVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIG1lbWJlclZhbHVlUGFpcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEVudW1Db25zdGFudChFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiA9IHRoaXMubmV3RW51bUNvbnN0YW50RGVjbGFyYXRpb24oZW51bURlY2xhcmF0aW9uLmdldEFTVCgpLCBlbnVtQ29uc3RhbnROYW1lKTsKLQkJdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbikuYWRkKGVudW1Db25zdGFudERlY2xhcmF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRW51bUNvbnN0YW50KEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHNMaXN0ID0gdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbik7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc3RhbnQgOiBlbnVtQ29uc3RhbnRzTGlzdCkgewotCQkJaWYgKGNvbnN0YW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMoZW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCQllbnVtQ29uc3RhbnRzTGlzdC5yZW1vdmUoY29uc3RhbnQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoYW5nZUVudW1Db25zdGFudE5hbWUoRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwgU3RyaW5nIG9sZEVudW1Db25zdGFudE5hbWUsIFN0cmluZyBuZXdFbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHNMaXN0ID0gdGhpcy5lbnVtQ29uc3RhbnRzKGVudW1EZWNsYXJhdGlvbik7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gY29uc3RhbnQgOiBlbnVtQ29uc3RhbnRzTGlzdCkgewotCQkJaWYgKGNvbnN0YW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMob2xkRW51bUNvbnN0YW50TmFtZSkpIHsKLQkJCQl0aGlzLmNoYW5nZUVudW1Db25zdGFudE5hbWUoY29uc3RhbnQsIG5ld0VudW1Db25zdGFudE5hbWUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNoYW5nZUVudW1Db25zdGFudE5hbWUoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24sIFN0cmluZyBuZXdFbnVtQ29uc3RhbnROYW1lKSB7Ci0JCWVudW1Db25zdGFudERlY2xhcmF0aW9uLnNldE5hbWUoZW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0QVNUKCkubmV3U2ltcGxlTmFtZShuZXdFbnVtQ29uc3RhbnROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBhcnJheSBlbGVtZW50IHRvIGFuIGFubm90YXRpb24gdGhhdCBpcyBlaXRoZXIgYSBub3JtYWwgYW5ub3RhdGlvbiBvciBhIG1hcmtlciBhbm5vdGF0aW9uLgotCSAqIElmIGl0IGlzIGEgbWFya2VyIGFubm90YXRpb24gZmlyc3QgbWFrZSBpdCBhIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFycmF5RWxlbWVudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uIGFycmF5RWxlbWVudCkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoYW5ub3RhdGlvbk5hbWUpOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb247Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSB0aGlzLmFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLk1BUktFUl9BTk5PVEFUSU9OKSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbigoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb247Ci0JCX0KLQkJdGhpcy5hZGRBcnJheUVsZW1lbnQobm9ybWFsQW5ub3RhdGlvbiwgaW5kZXgsIGVsZW1lbnROYW1lLCBhcnJheUVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgYXJyYXkgZWxlbWVudCB0byB0aGUgZ2l2ZW4gbm9ybWFsIGFubm90YXRpb24ncyBlbGVtZW50IG5hbWVkIGVsZW1lbnROYW1lLgotCSAqIEFkZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciBpZiBvbmUgZG9lcyBub3QgZXhpc3QuCi0JICogSWYgdGhlIG1lbWJlciB2YWx1ZSBwYWlyIGV4aXN0cyBidXQgdGhlIHZhbHVlIGlzIG5vdCB5ZXQgYW4gYXJyYXksIG1ha2UgaXQgYW4gYXJyYXkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXJyYXlFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb24gYXJyYXlFbGVtZW50KSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQlpZiAocGFpciA9PSBudWxsKSB7Ci0JCQlwYWlyID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgZWxlbWVudE5hbWUsIGFycmF5RWxlbWVudCk7Ci0JCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBwYWlyKTsKLQkJfQotCQllbHNlIHsKLQkJCUV4cHJlc3Npb24gdmFsdWUgPSBwYWlyLmdldFZhbHVlKCk7Ci0JCQlpZiAodmFsdWUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQkJdGhpcy5leHByZXNzaW9ucygoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpLmFkZChpbmRleCwgYXJyYXlFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXlJbml0aWFsaXplciA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQkJCXBhaXIuc2V0VmFsdWUoYXJyYXlJbml0aWFsaXplcik7Ci0JCQkJdGhpcy5leHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKS5hZGQodmFsdWUpOwotCQkJCXRoaXMuZXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcikuYWRkKGluZGV4LCBhcnJheUVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhc3N1bWVzIGFuIGVsZW1lbnQgd2l0aCBuYW1lIGVsZW1lbnROYW1lIGV4aXN0cyB3aXRoIGFuIGFycmF5IGFzIGl0cyB2YWx1ZS4KLQkgKiBNb3ZlIHRoZSBhcnJheSBlbGVtZW50IGF0IHNvdXJjZUluZGV4IHRvIHRoZSB0YXJnZXRJbmRleAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vdmVBcnJheUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQlBcnJheUluaXRpYWxpemVyIGFycmF5ID0gKEFycmF5SW5pdGlhbGl6ZXIpIHBhaXIuZ2V0VmFsdWUoKTsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5leHByZXNzaW9ucyhhcnJheSksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhc3N1bWVzIGFuIGVsZW1lbnQgd2l0aCBuYW1lIGVsZW1lbnROYW1lIGV4aXN0cyB3aXRoIHBvdGVudGlhbGx5IGFuIGFycmF5IGFzIGl0cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgbm90IGFuIGFycmF5LCB0aGVuIHRoZSBtZW1iZXIgdmFsdWUgcGFpciBpcyByZW1vdmVkLgotCSAqIElmIHRoZSBhcnJheSBlbGVtZW50IGlzIHJlbW92ZWQgYW5kIHRoZXJlIGlzIG9ubHkgMSBhcnJheSBlbGVtZW50IGxlZnQsIHRoZSBhcnJheSBpdHNlbGYgaXMgcmVtb3ZlZAotCSAqIGFuZCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgc2V0IGFzIHRoZSB2YWx1ZSBvZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBcnJheUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCkgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJaWYgKHBhaXIuZ2V0VmFsdWUoKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSAoQXJyYXlJbml0aWFsaXplcikgcGFpci5nZXRWYWx1ZSgpOwotCQkJdGhpcy5leHByZXNzaW9ucyhhcnJheSkucmVtb3ZlKGluZGV4KTsKLQkJCWlmICh0aGlzLmV4cHJlc3Npb25zKGFycmF5KS5zaXplKCkgPT0gMSkgewotCQkJCXBhaXIuc2V0VmFsdWUodGhpcy5leHByZXNzaW9ucyhhcnJheSkucmVtb3ZlKDApKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudmFsdWVzKGFubm90YXRpb24pLnJlbW92ZShwYWlyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIGdpdmVuIG1hcmtlciBhbm5vdGF0aW9uIHdpdGggYSBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiByZXBsYWNlTWFya2VyQW5ub3RhdGlvbihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gYW5ub3RhdGlvbnMgPSB0aGlzLmFubm90YXRpb25zKGFubm90YXRpb24uZ2V0UGFyZW50KCkpOwotCQlpbnQgaW5kZXggPSBhbm5vdGF0aW9ucy5pbmRleE9mKGFubm90YXRpb24pOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSBuZXdOb3JtYWxBbm5vdGF0aW9uKGFubm90YXRpb24uZ2V0QVNUKCksIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFubm90YXRpb25zLnNldChpbmRleCwgbm9ybWFsQW5ub3RhdGlvbik7Ci0JCXJldHVybiBub3JtYWxBbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbm9ybWFsIGFubm90YXRpb24gYW5kIHNldCBpdHMgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHRoZSBnaXZlbiBBU1Qgbm9kZS4gCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTm9ybWFsQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3ROb2RlLmdldEFTVCgpLCBuYW1lKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKGFzdE5vZGUsIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFubm90YXRpb24gdG8gdGhlIGdpdmVuIEFTVCBub2RlLiAKLQkgKiBUaGlzIHNob3VsZCBiZSBhIFBhY2thZ2VEZWNsYXJhdGlvbiBvciBhIEJvZHlEZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKEFTVE5vZGUgYXN0Tm9kZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbnMoYXN0Tm9kZSkuYWRkKGFubm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbWFya2VyIGFubm90YXRpb24gYW5kIHNldCBpdHMgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5vcm1hbCBhbm5vdGF0aW9uIHRvIHRoZSBnaXZlbiBBU1Qgbm9kZS4gCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gYWRkTWFya2VyQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3TWFya2VyQW5ub3RhdGlvbihhc3ROb2RlLmdldEFTVCgpLCBuYW1lKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKGFzdE5vZGUsIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQobmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gZnJvbSB0aGUgQVNUIG5vZGUuCi0JICogVGhpcyBzaG91bGQgYmUgYSBQYWNrYWdlRGVjbGFyYXRpb24gb3IgYSBCb2R5RGVjbGFyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihBU1ROb2RlIGFzdE5vZGUsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQl0aGlzLmFubm90YXRpb25zKGFzdE5vZGUpLnJlbW92ZShhbm5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gYW5ub3RhdGlvbnMoQVNUTm9kZSBhc3ROb2RlKSB7Ci0JCWlmIChhc3ROb2RlIGluc3RhbmNlb2YgQm9keURlY2xhcmF0aW9uKSB7Ci0JCQlyZXR1cm4gKChCb2R5RGVjbGFyYXRpb24pIGFzdE5vZGUpLm1vZGlmaWVycygpOwotCQl9Ci0JCWVsc2UgaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBQYWNrYWdlRGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiAoKFBhY2thZ2VEZWNsYXJhdGlvbikgYXN0Tm9kZSkuYW5ub3RhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbldyaXRlciB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpOwotCQl2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKFN0cmluZ0J1aWxkZXIgc2IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIgaW1wbGVtZW50cyBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHtyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQW5ub3RhdGlvbldyaXRlcldyYXBwZXIgaW1wbGVtZW50cyBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uV3JpdGVyIGF3OwotCQlwdWJsaWMgQW5ub3RhdGlvbldyaXRlcldyYXBwZXIoQW5ub3RhdGlvbldyaXRlciBhdykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYXcgPSBhdzsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiB0aGlzLmF3LmltcG9ydHMoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFNldElkTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZE1lbWJlclR5cGVUbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKHNiKTt9Ci0JfQotCi0JcHVibGljIGNsYXNzIEFubm90YXRlZFNvdXJjZVdyaXRlcgotCQkJaW1wbGVtZW50cyBTb3VyY2VXcml0ZXIgewotCQkKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXI7Ci0JCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCQlwcml2YXRlIFN0cmluZyB0eXBlTmFtZTsKLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB7Ci0JCQl0aGlzKGFubm90YXRpb25Xcml0ZXIsIFRZUEVfTkFNRSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCXRoaXMoYW5ub3RhdGlvbldyaXRlciwgUEFDS0FHRV9OQU1FLCB0eXBlTmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYW5ub3RhdGlvbldyaXRlciA9IGFubm90YXRpb25Xcml0ZXI7Ci0JCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQl0aGlzLnR5cGVOYW1lID0gdHlwZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCWlmICh0aGlzLnR5cGVOYW1lICE9IG51bGwpIHsKLQkJCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRTb3VyY2VUbyhzYiwgdGhpcy5hbm5vdGF0aW9uV3JpdGVyLCB0aGlzLnBhY2thZ2VOYW1lLCB0aGlzLnR5cGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUFubm90YXRpb25UZXN0Q2FzZS50aGlzLmFwcGVuZFNvdXJjZVRvKHNiLCB0aGlzLmFubm90YXRpb25Xcml0ZXIsIHRoaXMucGFja2FnZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBFbnVtQW5ub3RhdGlvbldyaXRlciB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpOwotCQl2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kRW51bUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kTW9uZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyIGltcGxlbWVudHMgRW51bUFubm90YXRpb25Xcml0ZXIgewotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE1vbmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcgotCQkJaW1wbGVtZW50cyBTb3VyY2VXcml0ZXIgewotCQkKLQkJcHJpdmF0ZSBFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyOwotCQlwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgZW51bU5hbWU7Ci0JCQotCQlwdWJsaWMgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB7Ci0JCQl0aGlzKGFubm90YXRpb25Xcml0ZXIsIFRZUEVfTkFNRSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBlbnVtTmFtZSkgewotCQkJdGhpcyhhbm5vdGF0aW9uV3JpdGVyLCBQQUNLQUdFX05BTUUsIGVudW1OYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmFubm90YXRpb25Xcml0ZXIgPSBhbm5vdGF0aW9uV3JpdGVyOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQkJdGhpcy5lbnVtTmFtZSA9IGVudW1OYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlBbm5vdGF0aW9uVGVzdENhc2UudGhpcy5hcHBlbmRFbnVtU291cmNlVG8oc2IsIHRoaXMuYW5ub3RhdGlvbldyaXRlciwgdGhpcy5wYWNrYWdlTmFtZSwgdGhpcy5lbnVtTmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmOTJmYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkpvaW5Db2x1bW4iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JCVN0cmluZyB2YWx1ZSA9ICgoU3RyaW5nTGl0ZXJhbCkgdGhpcy52YWx1ZXMoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pLmdldCgwKS5nZXRWYWx1ZSgpKS5nZXRMaXRlcmFsVmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX0lEMiIsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JCVN0cmluZyB2YWx1ZSA9ICgoU3RyaW5nTGl0ZXJhbCkgdGhpcy52YWx1ZXMoKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKSkuZ2V0KDApLmdldFZhbHVlKCkpLmdldExpdGVyYWxWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfSUQyIiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEMiIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkFERFJFU1NfSUQyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiU3RyaW5nIGNvbW1lbnQoKTsgSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb21tZW50PVwidGVzdFwiLGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb21tZW50PVwidGVzdFwiLGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhudWxsKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhudWxsKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIjsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMyk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRDIiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJKb2luQ29sdW1uIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbiB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uLCBAYW5ub3QuSm9pbkNvbHVtbiwiICsgQ1IgKyAiICAgIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCI3NyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4oNzcpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBKb2luQ29sdW1uKSIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiNzciLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPUBhbm5vdC5Kb2luQ29sdW1uKDc3KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKDc3KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zID0geyBASm9pbkNvbHVtbig3NyksIEBKb2luQ29sdW1uIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBhbm5vdC5Kb2luQ29sdW1uKDg4KX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKDc3KSxASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJibGFoXCIsbnVtPTQyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1ucyhjb2x1bW5zID0geyBASm9pbkNvbHVtbih0ZXh0ID0gXCJibGFoXCIsIG51bSA9IDQyKSwgQEpvaW5Db2x1bW4gfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKHRleHQ9XCJiXCIsbnVtPTQpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKHRleHQgPSBcImJcIiwgbnVtID0gNCksIG51bGwsIjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbiB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyBTdHJpbmcgdGV4dCgpOyBpbnQgbnVtKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJsYWhcIixudW09NDIpIik7CQotCQkKLQkJLy9Vc2Ugb2xkIGZvcm1hdHRpbmcgaWYgamR0IGNvcmUgdmVyc2lvbiBpcyAzLjUgb3IgYmVsb3cgLSBzZWUgYnVnIDI4NTYwNAotCQlWZXJzaW9uIHZlcnNpb24gPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpkdC5jb3JlIikuZ2V0VmVyc2lvbigpOwotCQlpbnQgbWFqb3JWZXJzaW9uID0gdmVyc2lvbi5nZXRNYWpvcigpOwotCQlpbnQgbWlub3JWZXJzaW9uID0gdmVyc2lvbi5nZXRNaW5vcigpOwotCQkvL1RoaXMgY29uZGl0aW9uIHNob3VsZCBiZSByZW1vdmVkIGFuZCB0ZXN0IHVwZGF0ZWQgYWZ0ZXIgRGFsaSAzLjAgYnJhbmNoZXMgCi0JCVN0cmluZyBleHBlY3RlZDE7Ci0JCWlmIChtYWpvclZlcnNpb24gPT0gMyAmJiBtaW5vclZlcnNpb24gPD0gNSkgewotCQkJZXhwZWN0ZWQxID0gIkBKb2luQ29sdW1ucyggeyI7Ci0JCX0KLQkJZWxzZSBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbih0ZXh0ID0gXCJibGFoXCIsIG51bSA9IDQyKSwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBKb2luQ29sdW1uICIgKyBDUiArICIgICAgfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMywgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1ufSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCA0KTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCA0KTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IG51bGwsIEBKb2luQ29sdW1uKG5hbWUgPSBcIkFERFJFU1NfSUQwXCIpIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCxAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtudWxsLEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMSk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQ0XCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShleHBlY3RlZCk7ICAvLyB0aGUgc291cmNlIHNob3VsZCBiZSB1bmNoYW5nZWQKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSIpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Kb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDMpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzdjYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0KLQkvLyAqKioqKioqKioqIFRlc3RDYXNlIGJlaGF2aW9yICoqKioqKioqKioKLQotCXB1YmxpYyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1hTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5jb21tYUxlbmd0aCgiLCAiKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbW1hTGVuZ3RoKCIgLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwiKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwgIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5jb21tYUxlbmd0aCgiICAsICAgIikpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwsLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCwsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgICwiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLHgiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICx4ICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAgIHgiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbW1hTGVuZ3RoKCJ4ICAsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwgICAiKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tbWFMZW5ndGgoU3RyaW5nIHMpIHsKLQkJSW50ZWdlciBsZW4gPSAoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksICJjb21tYUxlbmd0aCIsIFN0cmluZy5jbGFzcywgcyk7Ci0JCXJldHVybiBsZW4uaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkBGIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJARm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJAb3JnLmJhci5Gb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkAiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJGb28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKCJGb29AIikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzdHJpbmdJc0Fubm90YXRpb24oU3RyaW5nIHMpIHsKLQkJQm9vbGVhbiBiID0gKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLCAic3RyaW5nSXNBbm5vdGF0aW9uIiwgU3RyaW5nLmNsYXNzLCBzKTsKLQkJcmV0dXJuIGIuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0pwdENvbW1vbkNvcmVVdGlsaXR5SmR0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyODg2MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBU1RUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUeXBlVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NmRhNWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L01lbWJlckFubm90YXRpb25FbGVtZW50QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1ROb2RlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtcyIsIGVudW1OYW1lLCBlbnVtQm9keSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudW0oU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj00OCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgImJhciIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDgpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPSdjJykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhLCAiYmFyIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPWZhbHNlKSkpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYTMsICJmcmVkIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0NvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQkvLyBqdXN0IGEgYml0IGhhY2t5OgotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgicHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT19CQVIgPSBcInh4eFwiOyBAYW5ub3QuRm9vKGJhcj1GT09fQkFSICsgXCJ5eXlcIiArIFwienp6XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ4eHh5eXl6enoiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyQXJpdGhtZXRpYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiaW50IGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NDcgLSA3ICsgMiAqIDEgLyAxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDIpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyU2hpZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTIgPDwgMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT09fQkFSID0gNzc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvck51bWJlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3NyksIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFyYWN0ZXJDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRk9PX0JBUiA9ICdRJzsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIlEiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhcmFjdGVyQ2FzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPShjaGFyKSAweDQxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiQSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NyA+IDIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NyA9PSAyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUJvb2xlYW5PcGVyYXRvcjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSAmJiBmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3I0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9KDcgIT0gMikgPyBmYWxzZSA6IHRydWUpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1iYXp6enopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cImJhenp6elwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJqYXZhLmxhbmcuT2JqZWN0XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWVudW1zLlRlc3RFbnVtLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiXCJmYWxzZVwiIjsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiZnJlZD0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KCIgKyBlbGVtZW50ICsgIikpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e3RydWUsIGZhbHNlfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7bnVsbCwgbnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj03NykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7bnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyB2YWx1ZSA9ICJcInh4eFwiIjsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiYmFyPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbygiICsgZWxlbWVudCArICIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZih2YWx1ZSksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyh2YWx1ZS5sZW5ndGgoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiZmFsc2UiOwotCQlTdHJpbmcgZWxlbWVudCA9ICJmcmVkPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooIiArIGVsZW1lbnQgKyAiKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ldyBBU1ROb2RlVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModmFsdWUubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiXCJ4eHhcIiI7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oIiArIGVsZW1lbnQgKyAiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZihlbGVtZW50KSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVsZW1lbnQubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmV3IEFTVE5vZGVUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZihhbm5vdGF0aW9uKSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFubm90YXRpb24ubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiYmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZyZWQiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlM2EoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZyZWQiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AQmF6KSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBcInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9dHJ1ZSkpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKGppbW15ID0gQEJheihmcmVkID0gdHJ1ZSkpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ5eXkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oYmFyPVwieXl5XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IFN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhcInp6elwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlID0gXCJ6enpcIiwgYmFyID0gXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsgU3RyaW5nIGJheigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJheiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieXl5Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKGJhcj1cInh4eFwiLCBiYXogPSBcInl5eVwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUxMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiaW50IGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PXtAYW5ub3QuQmF6KGZyZWQ9MCksIEBhbm5vdC5CYXooZnJlZD0xKSwgQGFubm90LkJheihmcmVkPTIpLCBAYW5ub3QuQmF6KGZyZWQ9Myl9KSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgMiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEzLCAiZnJlZCIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyKSwgYWVhLmdldFZhbHVlKCkpOwotCQlhZWEuc2V0VmFsdWUoSW50ZWdlci52YWx1ZU9mKDQ4KSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT17QGFubm90LkJheihmcmVkPTApLCBAYW5ub3QuQmF6KGZyZWQ9MSksIEBhbm5vdC5CYXooZnJlZD00OCksIEBhbm5vdC5CYXooZnJlZD0zKX0pKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUxMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJ2YWx1ZSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKFwienp6XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAidmFsdWUiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhcInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gamF2YS5sYW5nLk9iamVjdC5jbGFzcykiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVMaXRlcmFsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9aW50LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJpbnQiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBpbnQuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj12b2lkLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiamF2YS5sYW5nLk9iamVjdCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiaW50Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gaW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXZvaWQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFgiLCAiQGFubm90LkZvbyhiYXI9WFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW00KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJlbnVtcy5UZXN0RW51bSIsICJAYW5ub3QuRm9vKGJhcj1UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLlhYWCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXI9WFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYIiwgZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSBYWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bS5YWFgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtLlhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUoImVudW1zMS5UZXN0RW51bS5YWFgiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMyLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyMT1YWFgsIGJhcjIgPSBUZXN0RW51bS5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtczEuVGVzdEVudW0uKiIsICJAYW5ub3QuRm9vKGJhcjE9WFhYKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMyLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0xIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTIiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0xIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMiBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhcjEgPSBYWFgsIGJhcjIgPSBUZXN0RW51bTIuWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWExID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYWVhMS5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0xLlhYWCIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTIuWFhYIik7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXIxPVhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKiIsICJAYW5ub3QuRm9vKGJhcjE9WFhYKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0yLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuVGVzdEVudW0yOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCS8qKgotCSAqIG5vdCBzdXJlIHRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuLi4KLQkgKiBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGp1c3Qgc2tpcCB0aGUgc3RhdGljIGltcG9ydDsgYnV0IGl0J3MgYSBtYXR0ZXIgb2YgdGFzdGUuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0gWFhYLCBiYXIyID0gVGVzdEVudW0yLlhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiZW51bXMuKiIsICIiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTEuWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMi5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMzIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zMS5UZXN0RW51bSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW0gYmFyMigpOyAgZW51bXMzLlRlc3RFbnVtIGJhcjMoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtLlhYWCwgYmFyMyA9IGVudW1zMy5UZXN0RW51bS5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKCJlbnVtczEuVGVzdEVudW0uWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEzID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIzIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTMgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEzKTsKLQkJYWVhMy5zZXRWYWx1ZSgiZW51bXMzLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGVudW1zMyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtcInN0cmluZzBcIiwgXCJzdHJpbmcxXCJ9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXlDb25jYXRlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtcInN0cmlcIiArIFwibmcwXCIsIFwic1wiICsgXCJ0cmluZzFcIn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXt9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJzdHJpbmcwXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbFN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHsgXCJzdHJpbmcwXCIsIFwic3RyaW5nMVwiIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0ge30pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gZXhwcmVzc2lvbkNvbnZlcnRlciA9IG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgZmFsc2UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIGV4cHJlc3Npb25Db252ZXJ0ZXIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbMF0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3RyaW5nQXJyYXlTaW5nbGVFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQEZvbyhiYXIgPSBcInN0cmluZzBcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCBlbnVtcy5UZXN0RW51bS5ZWVl9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheUludmFsaWRFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCA4OH0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgiLCBudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5U2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50SW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cIlwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHtudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsRW51bUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSB7IFhYWCwgWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHt9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIsIGZhbHNlKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSBYWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIn0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMS5UZXN0RW51bS5YWFgiLCAiZW51bXMxLlRlc3RFbnVtLllZWSJ9KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW1bXSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW1bXSBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9e1hYWCxZWVl9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMxLlRlc3RFbnVtLioiLCAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWVlZOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0xIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTIiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0xW10gYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yW10gYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bTIuWFhYLCBUZXN0RW51bTIuWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0xLlhYWCIsICJlbnVtcy5UZXN0RW51bTEuWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0yLlhYWCIsICJlbnVtcy5UZXN0RW51bTIuWVlZIn0pOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMVtdIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMltdIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyMT17WFhYLFlZWX0sIGJhcjIgPSB7IFRlc3RFbnVtMi5YWFgsIFRlc3RFbnVtMi5ZWVkgfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtMS4qIiwgIkBhbm5vdC5Gb28oYmFyMT17WFhYLFlZWX0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhc3NlcnROb3ROdWxsKGFlYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bTIuWFhYIiwgImVudW1zLlRlc3RFbnVtMi5ZWVkifSk7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMSIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMyIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczMiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyAgZW51bXMzLlRlc3RFbnVtW10gYmFyMygpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9LCBiYXIzID0geyBlbnVtczMuVGVzdEVudW0uWFhYLCBlbnVtczMuVGVzdEVudW0uWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMxLlRlc3RFbnVtLlhYWCIsICJlbnVtczEuVGVzdEVudW0uWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMyLlRlc3RFbnVtLlhYWCIsICJlbnVtczIuVGVzdEVudW0uWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMyA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIzIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMyA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMyk7Ci0JCWFlYTMuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMzLlRlc3RFbnVtLlhYWCIsICJlbnVtczMuVGVzdEVudW0uWVlZIn0pOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NaXNjVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NaXNjVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZjUzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWlzY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1pc2NUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWlzY1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogU2lnbmF0dXJlLnRvU3RyaW5nKC4uLikgcmV0dXJucyBhIGRvdC1xdWFsaWZpZWQgbmFtZSBmb3IgbWVtYmVyIHR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJVHlwZSBoYXNoVGFibGVUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5IYXNodGFibGUiKTsKLQkJSUZpZWxkIHRhYmxlRmllbGQgPSBoYXNoVGFibGVUeXBlLmdldEZpZWxkKCJ0YWJsZSIpOwotCQlTdHJpbmcgdGFibGVGaWVsZFR5cGVTaWduYXR1cmUgPSB0YWJsZUZpZWxkLmdldFR5cGVTaWduYXR1cmUoKTsKLQkJU3RyaW5nIHRhYmxlRmllbGRUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0YWJsZUZpZWxkVHlwZVNpZ25hdHVyZSk7Ci0JCWFzc2VydEVxdWFscyh0YWJsZUZpZWxkVHlwZU5hbWUsICJqYXZhLnV0aWwuSGFzaHRhYmxlLkVudHJ5W10iKTsKLQl9Ci0KLQkvKgotCSAqIElUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHJldHVybnMgYSBkb2xsYXItcXVhbGlmaWVkIG5hbWUgZm9yIG1lbWJlciB0eXBlcwotCSAqIChidXQgdGhlIGxvb2t1cCBvbiBJSmF2YVByb2plY3QgdGFrZXMgYSBkb3QtcXVhbGlmaWVkIG5hbWUhKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVR5cGUgaGFzaFRhYmxlRW50cnlUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5IYXNodGFibGUuRW50cnkiKTsKLQkJYXNzZXJ0RXF1YWxzKGhhc2hUYWJsZUVudHJ5VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgImphdmEudXRpbC5IYXNodGFibGUkRW50cnkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SVR5cGVQYXJhbWV0ZXJpemVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJVHlwZSBtYXBUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5NYXAiKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWRQYXJhbWV0ZXJpemVkTmFtZSgpLCAiamF2YS51dGlsLk1hcDxLIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCwgViBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Iik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmUyZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmFyIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcih5YW5hPUBhbm5vdC5CYXopKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJ5YW5hIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMyk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1cImFubm90LkJhclwiKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyMiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcjIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIyKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmVzdGVkQW5ub3RhdGlvbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjFhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1cImFubm90LkJhclwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyMiBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcjIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXoiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb24xPUBCYXIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24zKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdCB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRmMGY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoYW5ub3RhdGlvbk5hbWUsICIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyLCBAYW5ub3QuQmFyKFwidHdvXCIpfSkiKTsKLQkJLy8gMAotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0KLQkJLy8gMQotCQlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCWFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXIiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJheiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6W10geWFuYSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcih5YW5hPUBhbm5vdC5CYXopKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmF6IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoeWFuYT17QGFubm90LkJhen0pKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCi0JCS8vIG5hbWUgbWlzbWF0Y2gKLQkJZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5YeXoiKTsKLQkJYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJOb3RCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIsIEBhbm5vdC5CYXIoXCJ0d29cIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiWHl6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoIkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcImFubm90LkJhcjFcIiwgXCJhbm5vdC5CYXIyXCIsIFwiYW5ub3QuQmFyM1wifSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5Ob3RCYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcigwKSwgQGFubm90Lk5vdEJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuZXN0ZWRBbm5vdGF0aW9ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjVhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKS5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuTm90QmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCkuaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgbnVsbCwgQGFubm90LkJhcigzKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIG51bGx9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcigwKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5lc3RlZEFubm90YXRpb25zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIG51bGx9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhc3NlcnROdWxsKGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBAQmFyIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAibnVsbCwgQEJhciB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAQmFyLCBcInR3b1wifSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkJhcn0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKHs3LG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJCYXJ9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDg4KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcig4OCksbnVsbCxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksbnVsbCxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3Nyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA0LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3NyksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKDg4KSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQEJhcihNSVNTSU5HKSB9KSIsIGN1KTsgIC8vID8/PwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAibnVsbCwgQEJhcihNSVNTSU5HKSB9KSI7ICAvLyA/Pz8KLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAQmFyKDg4KSwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcihNSVNTSU5HKX0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oezcsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcig4OCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0BCYXIoODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTcoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFyKE1JU1NJTkcpfSkiLCBjdSk7ICAvLyA/Pz8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoNzcpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih4eHggPSA4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb241KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQEJhcigpIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIm51bGwsIEBCYXIoKSB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHsgXCJvbmVcIiwgXCJ0d29cIiB9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7IEBCYXIoeHh4ID0gODgpLCBcInR3b1wiIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcigpfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oezcsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKCl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXIoeHh4PTg4KX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IFwic29tZXRoaW5nXCIgfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IEBCYXIoeHh4ID0gODgpIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE3KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcigpfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xOShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMjAoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQGFubm90LkJhcig3NykpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMDApKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCxAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMTEpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigzMyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcig0NCl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIG51bGwsIEBhbm5vdC5CYXIoMjIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBudWxsLCBAYW5ub3QuQmFyKDQ0KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIG51bGwsIEBhbm5vdC5CYXIoNDQpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoZXhwZWN0ZWQpOyAgLy8gdGhlIHNvdXJjZSBzaG91bGQgYmUgdW5jaGFuZ2VkCi0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcigwMCkpIik7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgbnVsbCwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDIyKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBudWxsLCBAYW5ub3QuQmFyKDMzKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcigxMSl9KSI7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzg2YjkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90IiwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIge30iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Gb28iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCQlFeHByZXNzaW9uIHZhbHVlID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5OVU1CRVJfTElURVJBTCwgdmFsdWUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsICgoTnVtYmVyTGl0ZXJhbCkgdmFsdWUpLmdldFRva2VuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiYW5ub3QuRm9vIiwgIkBGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb3AiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb3AiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb3AiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQkvLyB1bi1xdWFsaWZpZWQgbmFtZQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygxKSBAYW5ub3QuRm9vKDIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vKDEpIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oODgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Gb28oODgpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU1lbWJlclZhbHVlUGFpciBtdnAgPSB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCAiYmFyIiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuYWRkKG12cCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdDEiLCAiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QyIiwgIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QxLkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QyLkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24xKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24yID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMik7Ci0KLQkJYWExLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90MS5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCi0JCWFhMi5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBhbm5vdDIuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90Mi5Gb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdDEiLCAiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QyIiwgIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiYW5ub3QxLioiLCAiQEZvbyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QxLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QxLkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QyLkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24xKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24yID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMik7Ci0KLQkJYWEyLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90Mi5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QyLkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2lsZENhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90LioiLCAiIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24xKTsKLQotCQlhYTEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkODBhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFR5cGVUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCBzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBqZHRDb21waWxhdGlvblVuaXQgPSB0aGlzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCh0aGlzLmJ1aWxkVGVzdDFTb3VyY2UoKSk7Ci0JCWFzc2VydE5vdE51bGwoamR0Q29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRlc3QxU291cmNlKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvdGVzdC54bWwgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM0Njg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY2xhc3NwYXRoIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkZDE1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5wcm9qZWN0IGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDYzM2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NTEyZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNNb24gSmFuIDI0IDE0OjM1OjU4IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhNGZhMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiAKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjQuMy4xIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjYuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2U7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjUuMTAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3I7YnVuZGxlLXZlcnNpb249IlszLjUuMCw0LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0czt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuamZhY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2U2NzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgxOTk3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFVJIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL0pwdENvbW1vblVpVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL0pwdENvbW1vblVpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzYjcyZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9KcHRDb21tb25VaVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3QuSnB0VWlTV1RUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWwuSnB0VWlVdGlsVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIFVJIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25VaVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb21tb25VaVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpU1dUVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VWlVdGlsVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvbW1vblVpVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2I4ZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQXJyYXlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5CYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBhbGV0dGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdCBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWU7Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPiBzZWxlY3RlZFZlaGljbGU7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlXaW5kb3cgd2luZG93ID0gbmV3IERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCQotCQotCXByaXZhdGUgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5zZWxlY3RlZFZlaGljbGUgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDQwMCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVHJlZVBhbmVsKG1haW5QYW5lbCk7Ci0JCWJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWxhYmVsLnNldFRleHQoIk15IFZlaGljbGVzIik7Ci0JCQotCQl0cmVlID0gbmV3IFRyZWVWaWV3ZXIocGFuZWwsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIgPSAKLQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAotCQkJCW5ldyBWZWhpY2xlQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpLAotCQkJCW5ldyBWZWhpY2xlTGFiZWxQcm92aWRlckZhY3RvcnkoKSk7Ci0JCXRyZWUuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRMYWJlbFByb3ZpZGVyKGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRJbnB1dChuZXcgUm9vdCgpKTsKLQkJdHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXNlbGVjdGVkVmVoaWNsZS5zZXRWYWx1ZSgoVmVoaWNsZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVXBwZXJDb250cm9sUGFuZWwocGFuZWwpOwotCQlidWlsZExvd2VyQ29udHJvbFBhbmVsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVXBwZXJDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCWJ1aWxkVmVoaWNsZUNvbWJvKHBhbmVsKTsKLQkJYnVpbGRDb2xvckNvbWJvKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVmVoaWNsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tYm9WaWV3ZXIgY29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNvbWJvLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldExhYmVsUHJvdmlkZXIobmV3IFZlaGljbGVUeXBlTGFiZWxQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0SW5wdXQoCi0JCQluZXcgVmVoaWNsZVR5cGVbXSB7Ci0JCQkJVmVoaWNsZVR5cGUuQklDWUNMRSwgVmVoaWNsZVR5cGUuQ0FSLCAKLQkJCQlWZWhpY2xlVHlwZS5UUlVDSywgVmVoaWNsZVR5cGUuQk9BVAotCQkJfSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldFZlaGljbGVUeXBlKChWZWhpY2xlVHlwZSkgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOyAKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKHZlaGljbGUgPT0gbnVsbCkgPyBudWxsIDogdmVoaWNsZS52ZWhpY2xlVHlwZSgpKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbG9yQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21ib1ZpZXdlciBjb21ibyA9IG5ldyBDb21ib1ZpZXdlcihwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5nZXRDb21ibygpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJY29tYm8uc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0TGFiZWxQcm92aWRlcihuZXcgQ29sb3JMYWJlbFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRJbnB1dChuZXcgQ29sb3JbXSB7Q29sb3IuUkVELCBDb2xvci5CTFVFLCBDb2xvci5ZRUxMT1csIENvbG9yLkdSRUVOfSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldENvbG9yKChDb2xvcikgKChTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCkpOyAKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWNvbWJvLmdldENvbWJvKCkuc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQljb21iby5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oKHZlaGljbGUgPT0gbnVsbCkgPyBudWxsIDogdmVoaWNsZS5jb2xvcigpKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZExvd2VyQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJYnVpbGRFZmZlY3RzTGFiZWwocGFuZWwpOwotCQlidWlsZEdyZXllZENoZWNrQm94KHBhbmVsKTsKLQkJYnVpbGRUcmFuc2x1Y2VudENoZWNrQm94KHBhbmVsKTsKLQkJYnVpbGRBY3Rpb25QYW5lbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEVmZmVjdHNMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KCJDb2xvciBlZmZlY3RzOiAiKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSwgMywgMSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRHcmV5ZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnV0dG9uLnNldFRleHQoImdyZXllZCIpOwotCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0R3JleWVkKGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQlidXR0b24uc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKHZlaGljbGUgIT0gbnVsbCAmJiB2ZWhpY2xlLmlzR3JleWVkKCkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmFuc2x1Y2VudENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJ0cmFuc2x1Y2VudCIpOwotCQlidXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJc2VsZWN0ZWRWZWhpY2xlKCkuc2V0VHJhbnNsdWNlbnQoYnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9KTsKLQkJc2VsZWN0ZWRWZWhpY2xlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIAotCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJVmVoaWNsZSB2ZWhpY2xlID0gc2VsZWN0ZWRWZWhpY2xlKCk7Ci0JCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHZlaGljbGUgIT0gbnVsbCk7Ci0JCQkJCWJ1dHRvbi5zZXRTZWxlY3Rpb24odmVoaWNsZSAhPSBudWxsICYmIHZlaGljbGUuaXNUcmFuc2x1Y2VudCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWN0aW9uUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkUmVmcmVzaFRyZWVBQ0koKS5maWxsKHBhbmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVmcmVzaFRyZWVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZWZyZXNoIHRyZWUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZWZyZXNoVHJlZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlZnJlc2ggdGhlIHRyZWUncyBsYWJlbHMiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCQotCXZvaWQgcmVmcmVzaFRyZWUoKSB7Ci0JCXRyZWUucmVmcmVzaCgpOwotCX0KLQkKLQlwcml2YXRlIFZlaGljbGUgc2VsZWN0ZWRWZWhpY2xlKCkgewotCQlyZXR1cm4gc2VsZWN0ZWRWZWhpY2xlLmdldFZhbHVlKCk7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVUeXBlTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVmVoaWNsZVR5cGUpIGVsZW1lbnQpLmRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29sb3JMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xvcikgZWxlbWVudCkuZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCXsKLQkJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFJvb3QpIHsKLQkJCQlyZXR1cm4gbmV3IFJvb3RDb250ZW50UHJvdmlkZXIoCi0JCQkJCShSb290KSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBWZWhpY2xlQ29udGVudFByb3ZpZGVyKAotCQkJCShWZWhpY2xlKSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFJvb3RDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFZlaGljbGU+Ci0JewotCQlwdWJsaWMgUm9vdENvbnRlbnRQcm92aWRlcihSb290IGl0ZW0sIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBSb290IGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChSb290KSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxWZWhpY2xlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFZlaGljbGU+KHRoaXMuZ2V0TW9kZWwoKS52ZWhpY2xlcygpKTsKLQkJfQotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIFZlaGljbGVDb250ZW50UHJvdmlkZXIoVmVoaWNsZSBpdGVtLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVmVoaWNsZSBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoVmVoaWNsZSkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIGdldE1vZGVsKCkucGFyZW50KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWwgYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlTGFiZWxQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKE9iamVjdCBlbGVtZW50LCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBWZWhpY2xlTGFiZWxQcm92aWRlcigoVmVoaWNsZSkgZWxlbWVudCwgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmVoaWNsZUxhYmVsUHJvdmlkZXIoVmVoaWNsZSB2ZWhpY2xlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodmVoaWNsZSwgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBJbWFnZT4oCi0JCQkJCW5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKFZlaGljbGUpIGdldE1vZGVsKCkpLCAKLQkJCQkJVmVoaWNsZS5DT0xPUl9QUk9QRVJUWSwgVmVoaWNsZS5HUkVZRURfUFJPUEVSVFksIFZlaGljbGUuVFJBTlNMVUNFTlRfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW1hZ2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmltYWdlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlaGljbGUsIFN0cmluZz4oCi0JCQkJCW5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4oKFZlaGljbGUpIGdldE1vZGVsKCkpLCAKLQkJCQkJVmVoaWNsZS5WRUhJQ0xFX1RZUEVfUFJPUEVSVFksIFZlaGljbGUuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5jb2xvcigpLmRlc2NyaXB0aW9uKCkgKyAnICcgKyBzdWJqZWN0LnZlaGljbGVUeXBlKCkuZGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJCXJldHVybiBidWlsZFRleHRNb2RlbCgpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0JCQotCQkKLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290IGV4dGVuZHMgVHJlZU5vZGUKLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBWZWhpY2xlW10gdmVoaWNsZXM7Ci0JCQotCQkKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsKTsKLQkJCXZlaGljbGVzID0gbmV3IFZlaGljbGVbXSB7Ci0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQklDWUNMRSwgQ29sb3IuQkxVRSksCi0JCQkJbmV3IFZlaGljbGUodGhpcywgVmVoaWNsZVR5cGUuQ0FSLCBDb2xvci5ZRUxMT1cpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLlRSVUNLLCBDb2xvci5SRUQpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkJPQVQsIENvbG9yLkdSRUVOKX07Ci0JCX0KLQkJCi0JCXB1YmxpYyBWZWhpY2xlW10gdmVoaWNsZXMoKSB7Ci0JCQlyZXR1cm4gdmVoaWNsZXM7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZSBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwcml2YXRlIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWRUhJQ0xFX1RZUEVfUFJPUEVSVFkgPSAidmVoaWNsZVR5cGUiOwotCQkKLQkJcHJpdmF0ZSBDb2xvciBjb2xvcjsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkKLQkJcHJpdmF0ZSBib29sZWFuIGdyZXllZCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHUkVZRURfUFJPUEVSVFkgPSAiZ3JleWVkIjsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiB0cmFuc2x1Y2VudCA9IGZhbHNlOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUkFOU0xVQ0VOVF9QUk9QRVJUWSA9ICJ0cmFuc2x1Y2VudCI7Ci0JCQotCQlwcml2YXRlIEltYWdlIGltYWdlOwotCQkKLQkJCQotCQlwdWJsaWMgVmVoaWNsZShUcmVlTm9kZSBwYXJlbnQsIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlLCBDb2xvciBjb2xvcikgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXRoaXMudmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIFZlaGljbGVUeXBlIHZlaGljbGVUeXBlKCkgewotCQkJcmV0dXJuIHZlaGljbGVUeXBlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWZWhpY2xlVHlwZShWZWhpY2xlVHlwZSBuZXdWZWhpY2xlVHlwZSkgewotCQkJVmVoaWNsZVR5cGUgb2xkVmVoaWNsZVR5cGUgPSB2ZWhpY2xlVHlwZTsKLQkJCXZlaGljbGVUeXBlID0gbmV3VmVoaWNsZVR5cGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZFSElDTEVfVFlQRV9QUk9QRVJUWSwgb2xkVmVoaWNsZVR5cGUsIG5ld1ZlaGljbGVUeXBlKTsKLQkJfQotCQkKLQkJcHVibGljIENvbG9yIGNvbG9yKCkgewotCQkJcmV0dXJuIGNvbG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRDb2xvcihDb2xvciBuZXdDb2xvcikgewotCQkJQ29sb3Igb2xkQ29sb3IgPSBjb2xvcjsKLQkJCWNvbG9yID0gbmV3Q29sb3I7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGRDb2xvciwgbmV3Q29sb3IpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0dyZXllZCgpIHsKLQkJCXJldHVybiBncmV5ZWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEdyZXllZChib29sZWFuIG5ld0dyZXllZCkgewotCQkJYm9vbGVhbiBvbGRHcmV5ZWQgPSBncmV5ZWQ7Ci0JCQlncmV5ZWQgPSBuZXdHcmV5ZWQ7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEdSRVlFRF9QUk9QRVJUWSwgb2xkR3JleWVkLCBuZXdHcmV5ZWQpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zbHVjZW50KCkgewotCQkJcmV0dXJuIHRyYW5zbHVjZW50OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRUcmFuc2x1Y2VudChib29sZWFuIG5ld1RyYW5zbHVjZW50KSB7Ci0JCQlib29sZWFuIG9sZFRyYW5zbHVjZW50ID0gdHJhbnNsdWNlbnQ7Ci0JCQl0cmFuc2x1Y2VudCA9IG5ld1RyYW5zbHVjZW50OwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUUkFOU0xVQ0VOVF9QUk9QRVJUWSwgb2xkVHJhbnNsdWNlbnQsIG5ld1RyYW5zbHVjZW50KTsKLQkJfQotCQkKLQkJcHVibGljIEltYWdlIGltYWdlKCkgewotCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBJbWFnZUZhY3RvcnkuaW1hZ2UoY29sb3IoKSwgZ3JleWVkLCB0cmFuc2x1Y2VudCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZW51bSBWZWhpY2xlVHlwZQotCXsKLQkJQklDWUNMRSgiYmljeWNsZSIpLAotCQlDQVIoImNhciIpLAotCQlUUlVDSygidHJ1Y2siKSwKLQkJQk9BVCgiYm9hdCIpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIFZlaGljbGVUeXBlKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGVudW0gQ29sb3IKLQl7Ci0JCVJFRCgicmVkIiwgbmV3IFJHQigyNTUsIDAsIDApKSwKLQkJQkxVRSgiYmx1ZSIsIG5ldyBSR0IoMCwgMCwgMjU1KSksCi0JCVlFTExPVygieWVsbG93IiwgbmV3IFJHQigyNTUsIDI1NSwgMCkpLAotCQlHUkVFTigiZ3JlZW4iLCBuZXcgUkdCKDAsIDI1NSwgMCkpOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCQotCQlwcml2YXRlIGZpbmFsIFJHQiByZ2I7Ci0JCQotCQlwcml2YXRlIENvbG9yKFN0cmluZyBkZXNjcmlwdGlvbiwgUkdCIHJnYikgewotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5yZ2IgPSByZ2I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBSR0IgcmdiKCkgewotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbWFnZUZhY3RvcnkKLQl7Ci0JCXByaXZhdGUgc3RhdGljIFJHQiByZ2IoQ29sb3IgY29sb3IsIGJvb2xlYW4gZ3JleWVkLCBib29sZWFuIHRyYW5zbHVjZW50KSB7Ci0JCQlSR0IgcmdiID0gKGdyZXllZCkgPyBuZXcgUkdCKDEyNywgMTI3LCAxMjcpIDogY29sb3IucmdiKCk7Ci0JCQlpZiAodHJhbnNsdWNlbnQpIHsKLQkJCQlyZ2IgPSBuZXcgUkdCKHRyYW5zbHVjaWZ5KHJnYi5yZWQpLCB0cmFuc2x1Y2lmeShyZ2IuZ3JlZW4pLCB0cmFuc2x1Y2lmeShyZ2IuYmx1ZSkpOwotCQkJfQotCQkJcmV0dXJuIHJnYjsKLQkJfQotCQkKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IHRyYW5zbHVjaWZ5KGludCBjb2xvcikgewotCQkJcmV0dXJuIDI1NSAtIChpbnQpICgoMjU1IC0gY29sb3IpICogMC4zKTsKLQkJfQotCQkKLQkJcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZShDb2xvciBjb2xvciwgYm9vbGVhbiBncmV5ZWQsIGJvb2xlYW4gdHJhbnNsdWNlbnQpIHsKLQkJCVBhbGV0dGVEYXRhIHBkID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7cmdiKGNvbG9yLCBncmV5ZWQsIHRyYW5zbHVjZW50KX0pOwotCQkJSW1hZ2VEYXRhIGlkID0gbmV3IEltYWdlRGF0YSgyMCwgMjAsIDEsIHBkKTsKLQkJCWZvciAoaW50IHggPSAwOyB4IDwgMjA7IHggKyspIHsKLQkJCQlmb3IgKGludCB5ID0gMDsgeSA8IDIwOyB5ICsrKSB7Ci0JCQkJCWlkLnNldFBpeGVsKHgsIHksIDApOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXcgSW1hZ2UoRGlzcGxheS5nZXRDdXJyZW50KCksIGlkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGFmNGJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0IGV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFJvb3Qgcm9vdDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+IHNlbGVjdGVkTm9kZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciBjb250cm9sVHJlZTsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB2aWV3VHJlZTsKLQotCXByaXZhdGUgVGV4dCBub2RlTmFtZVRleHQ7Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy5yb290ID0gbmV3IFJvb3QoKTsKLQkJdGhpcy5yb290LmFkZENoaWxkKCJQYXJlbnRfMSIpOwotCQl0aGlzLnNlbGVjdGVkTm9kZSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGU+KHRoaXMucm9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDgwMCwgNDAwKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJYnVpbGRUcmVlUGFuZWwobWFpblBhbmVsKTsKLQkJYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJYnVpbGRDb250cm9sVHJlZVBhbmVsKHBhbmVsKTsKLQkJYnVpbGRWaWV3VHJlZVBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY29udHJvbFRyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJDb250cm9sIHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCQljb250cm9sVHJlZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQljb250cm9sVHJlZS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oZXZlbnQuZ2V0TmV3VmFsdWUoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRWaWV3VHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdmlld1RyZWUgPSBidWlsZFRyZWVQYW5lbCgKLQkJCQlwYXJlbnQsICJWaWV3IHRyZWUiLAotCQkJCW5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKG5ldyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkpLAotCQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZVZpZXdlciBidWlsZFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQotCQlmaW5hbCBUcmVlVmlld2VyIHRyZWUgPSBuZXcgVHJlZVZpZXdlcihwYW5lbCwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQl0cmVlLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRyZWUuc2V0Q29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJdHJlZS5zZXRJbnB1dChyb290KTsKLQotCQlyZXR1cm4gdHJlZTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCVRyZWVOb2RlIHNlbGVjdGlvbiA9IChUcmVlTm9kZSkgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCXNlbGVjdGVkTm9kZS5zZXRWYWx1ZSgoc2VsZWN0aW9uID09IG51bGwpID8gcm9vdCA6IHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDYsIGZhbHNlKSk7Ci0JCWJ1aWxkTm9kZU5hbWVUZXh0KHBhbmVsKTsKLQkJYnVpbGRBZGRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkUmVtb3ZlQUNJKCkuZmlsbChwYW5lbCk7Ci0JCWJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vZGVOYW1lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5vZGVOYW1lVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlub2RlTmFtZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIGNoaWxkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJYWRkQ2hpbGQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJBZGQgYSBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCXNlbGVjdGVkTm9kZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWFjdGlvbi5zZXRFbmFibGVkKCgoVHJlZU5vZGUpIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmNhbkhhdmVDaGlsZHJlbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZE5lc3RlZENoaWxkQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiQWRkIG5lc3RlZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZE5lc3RlZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgbmVzdGVkIGNoaWxkIHdpdGggdGhlIGdpdmVuIG5hbWUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlTmVzdGVkQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVBQ0koKSB7Ci0JCWZpbmFsIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZW1vdmUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlyZW1vdmUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZW1vdmUgdGhlIHNlbGVjdGVkIG5vZGUiKTsKLQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZChldmVudC5nZXROZXdWYWx1ZSgpICE9IHJvb3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkNsZWFyIHRoZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJSZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVzdG9yZSB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBhZGRDaGlsZCgpIHsKLQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZU5hbWVUZXh0LmdldFRleHQoKTsKLQkJaWYgKG5vZGVOYW1lLmxlbmd0aCgpICE9IDApIHsKLQkJCXNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpLmFkZENoaWxkKG5vZGVOYW1lKTsKLQkJfQotCX0KLQotCXZvaWQgYWRkTmVzdGVkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGROZXN0ZWRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZSgpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IHNlbGVjdGVkTm9kZS5nZXRWYWx1ZSgpOwotCQlub2RlLnBhcmVudCgpLnJlbW92ZUNoaWxkKG5vZGUpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQobnVsbCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KG51bGwpOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQljb250cm9sVHJlZS5zZXRJbnB1dChyb290KTsKLQkJdmlld1RyZWUuc2V0SW5wdXQocm9vdCk7Ci0JfQotCi0KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQkoVHJlZU5vZGUpIGl0ZW0sIChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBDb250cm9sVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBWaWV3VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCU9iamVjdCBpdGVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCWlmIChpdGVtIGluc3RhbmNlb2YgUGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBWaWV3VHJlZVBhcmVudEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJCQkoUGFyZW50KSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPFRyZWVOb2RlPgotCXsKLQkJcHVibGljIEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlUcmVlTm9kZSB0cmVlTm9kZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHRyZWVOb2RlLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFRyZWVOb2RlIHRyZWVOb2RlKCkgewotCQkJcmV0dXJuIChUcmVlTm9kZSkgZ2V0TW9kZWwoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVHJlZU5vZGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRyZWVOb2RlKCkucGFyZW50KCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRyZWVOb2RlLCBUcmVlTm9kZT4oVHJlZU5vZGUuQ0hJTERSRU5fTElTVCwgdHJlZU5vZGUoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCXJldHVybiB0cmVlTm9kZSgpLmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCVRyZWVOb2RlIHRyZWVOb2RlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIodHJlZU5vZGUsIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCVRyZWVOb2RlIHBhcmVudCA9IHN1cGVyLmdldFBhcmVudCgpOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGUsIFRyZWVOb2RlPihzdXBlci5idWlsZENoaWxkcmVuTW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IHRyYW5zZm9ybShUcmVlTm9kZSB2YWx1ZSkgewotCQkJCQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIE5lc3QpIHsKLQkJCQkJCQkJZmluYWwgTmVzdCBuZXN0ID0gKE5lc3QpIHZhbHVlOwotCQkJCQkJCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGU+KAotCQkJCQkJCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIG5lc3QpIHsKLQkJCQkJCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gbmVzdC5jaGlsZHJlbigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odmFsdWUpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChUcmVlTm9kZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVHJlZU5vZGUgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JewotCQlwcml2YXRlIFRyZWVOb2RlIHBhcmVudDsKLQotCQlwcm90ZWN0ZWQgZmluYWwgTGlzdDxUcmVlTm9kZT4gY2hpbGRyZW47Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENISUxEUkVOX0xJU1QgPSAiY2hpbGRyZW4iOwotCi0JCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZSBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFRyZWVOb2RlPihjaGlsZHJlbik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJYWRkSXRlbVRvTGlzdChjaGlsZCwgY2hpbGRyZW4sIENISUxEUkVOX0xJU1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCXJlbW92ZUl0ZW1Gcm9tTGlzdChjaGlsZCwgY2hpbGRyZW4sIENISUxEUkVOX0xJU1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoaW50IGluZGV4KSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQkJbmFtZSA9IG5ld05hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkTmVzdGVkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChnZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUm9vdCgpIHsKLQkJCXN1cGVyKG51bGwsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgUGFyZW50KHRoaXMsIG5hbWUpKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFBhcmVudCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgUGFyZW50KFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCWFkZENoaWxkKG5ldyBDaGlsZCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkTmVzdGVkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCVRyZWVOb2RlIG5lc3QgPSBuZXcgTmVzdCh0aGlzKTsKLQkJCWFkZENoaWxkKG5lc3QpOwotCQkJbmVzdC5hZGRDaGlsZChuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxDaGlsZD4gbmVzdGxlc3NDaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Q2hpbGQ+KAotCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUcmVlTm9kZSwgQ2hpbGQ+KGNoaWxkcmVuKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENoaWxkIHRyYW5zZm9ybShUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJCQkJaWYgKG5leHQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCXJldHVybiAoKE5lc3QpIG5leHQpLmNoaWxkKCk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiAoQ2hpbGQpIG5leHQ7Ci0JCQkJCQl9Ci0JCQkJCX0sCi0JCQkJCU5vdE51bGxGaWx0ZXIuPENoaWxkPmluc3RhbmNlKCkKLQkJCQkpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgTmVzdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgTmVzdChUcmVlTm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgIm5lc3QiKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpID09IDA7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoU3RyaW5nIG5hbWUpIHsKLQkJCWFkZENoaWxkKG5ldyBDaGlsZCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQotCQkvKiBjYW4gb25seSBoYXZlIG9uZSBjaGlsZCAqLwotCQlwdWJsaWMgQ2hpbGQgY2hpbGQoKSB7Ci0JCQlyZXR1cm4gKGNoaWxkcmVuLmlzRW1wdHkoKSkgPyBudWxsIDogKENoaWxkKSBjaGlsZHJlbi5nZXQoMCk7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBDaGlsZCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwdWJsaWMgQ2hpbGQoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ODdkOWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IHNlbGVjdGVkSXRlbUhvbGRlcjsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRW1wdHlMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJcG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNb2RlbCwgU2ltcGxlRGlzcGxheWFibGU+KHN1YmplY3RIb2xkZXIsIE1vZGVsLklURU1TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pdGVtcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBTaW1wbGVEaXNwbGF5YWJsZSBidWlsZFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1vZGVsLCBTaW1wbGVEaXNwbGF5YWJsZT4oc3ViamVjdEhvbGRlciwgTW9kZWwuSVRFTV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0SXRlbSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0SXRlbSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFNpbXBsZURpc3BsYXlhYmxlPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFNpbXBsZURpc3BsYXlhYmxlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUuZGlzcGxheVN0cmluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IGJ1aWxkU3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+KCk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBjb21ib1NlbGVjdGVkSXRlbSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGl0ZW1BdChpbnQgaW5kZXgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBpdGVtQ291bnRzKCk7Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248U2ltcGxlRGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IHNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQltb2RlbCAgICAgICAgICAgICAgPSBuZXcgTW9kZWwoKTsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFNoZWxsIHNoZWxsKCkgewotCQlyZXR1cm4gc2hlbGw7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gc3ViamVjdEhvbGRlcjsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyICAgICAgPSBudWxsOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0SXRlbXMoKSB7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBjb3VudCBvZiBpdGVtcyBpcyBub3QgaW4gc3luYyB3aXRoIHRoZSBtb2RlbCIsCi0JCQltb2RlbC5pdGVtc1NpemUoKSwKLQkJCWl0ZW1Db3VudHMoKQotCQkpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtb2RlbC5pdGVtc1NpemUoKTsgaW5kZXgrKykgewotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgaXRlbSBhdCBpbmRleCAiICsgaW5kZXggKyAiIGlzIG5vdCB0aGUgc2FtZSBiZXR3ZWVuIHRoZSBtb2RlbCBhbmQgdGhlIGNvbWJvIiwKLQkJCQltb2RlbC5pdGVtQXQoaW5kZXgpLmRpc3BsYXlTdHJpbmcoKSwKLQkJCQlpdGVtQXQoaW5kZXgpCi0JCQkpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEFmdGVyX1JlbW92ZUl0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX0FkZGVkQmVmb3JlX1JlbW92ZUl0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0FmdGVyQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9TZWxlY3RlZEl0ZW1DaGFuZ2VkX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gYnVpbGRTZWxlY3RlZEl0ZW0oKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQmVmb3JlX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9TZWxlY3RlZEl0ZW1DaGFuZ2VkX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgzKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYWRhcHRlciA9IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhZGFwdGVyLmFkZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0TnVsbFN1YmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsIHNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoYnVpbGRTZWxlY3RlZEl0ZW0oKSk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJLy8gTnVsbCBiZWNhdXNlIHRoZSBzdWJqZWN0IGhvbGRlciBkb2Vzbid0IGhhdmUgdGhlIHN1YmplY3Qgc2V0Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3ROdWxsU3ViamVjdCgpOwotCQl0ZXN0SXRlbXMoKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RSZW1vdmVJdGVtc19BZGRlZEFmdGVyKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0KLQkJQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMCkpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDMpKTsKLQkJbW9kZWwucmVtb3ZlSXRlbXMoaXRlbXMuaXRlcmF0b3IoKSk7Ci0KLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRlc3RTZWxlY3RlZEl0ZW0oU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtKSB7Ci0KLQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0KLQkJCWFzc2VydE51bGwoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIGJlIG51bGwiLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgaWYgKCFlbXB0eUNvbWJvQ2FuSGF2ZVNlbGVjdGVkVmFsdWUoKSkgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBjb21ibydzIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLAotCQkJCSIiLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbSwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBjb3JyZWN0bHkiLAotCQkJCXNlbGVjdGVkSXRlbS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0KLQkJLy8gVGVzdCAxCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0KLQkJLy8gVGVzdCAyCi0JCXNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgxKTsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBudWxsOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5IiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMwotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMik7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgaXRlbTsKLQkJcHJpdmF0ZSBMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXByaXZhdGUgYm9vbGVhbiBzZXRJdGVtQ2FsbGVkOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTV9QUk9QRVJUWSA9ICJpdGVtIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNU19MSVNUID0gIml0ZW1zIjsKLQotCQl2b2lkIGFkZEl0ZW1zKEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBhZGRJdGVtcyhMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJYWRkSXRlbXNUb0xpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBjbGVhckl0ZW1DYWxsZWRGbGFnKCkgewotCQkJc2V0SXRlbUNhbGxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1NldEl0ZW1DYWxsZWQoKSB7Ci0JCQlyZXR1cm4gc2V0SXRlbUNhbGxlZDsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGl0ZW1BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLml0ZW1zLmdldChpbmRleCk7Ci0JCX0KLQotCQlMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zKCkgewotCQkJcmV0dXJuIGl0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0KLQkJaW50IGl0ZW1zU2l6ZSgpIHsKLQkJCXJldHVybiBpdGVtcy5zaXplKCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUl0ZW1zKEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcykgewotCQkJcmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgdGhpcy5pdGVtcywgSVRFTVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHNldEl0ZW0oU2ltcGxlRGlzcGxheWFibGUgaXRlbSkgewotCQkJc2V0SXRlbUNhbGxlZCA9IHRydWU7Ci0KLQkJCVNpbXBsZURpc3BsYXlhYmxlIG9sZEl0ZW0gPSB0aGlzLml0ZW07Ci0JCQl0aGlzLml0ZW0gPSBpdGVtOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChJVEVNX1BST1BFUlRZLCBvbGRJdGVtLCBpdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxTaW1wbGVEaXNwbGF5YWJsZT4gewotCi0JCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgaXRlbTsKLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmVyTm90aWZpZWQ7Ci0KLQkJdm9pZCBjbGVhckluZm8oKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTm90aWZpZWQgPSBmYWxzZTsKLQkJCXRoaXMuaXRlbSA9IG51bGw7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBnZXRJdGVtKCkgewotCQkJcmV0dXJuIGl0ZW07Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xpc3RlbmVyTm90aWZpZWQoKSB7Ci0JCQlyZXR1cm4gbGlzdGVuZXJOb3RpZmllZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8U2ltcGxlRGlzcGxheWFibGU+IGUpIHsKLQkJCWxpc3RlbmVyTm90aWZpZWQgPSB0cnVlOwotCQkJaXRlbSA9IGUuc2VsZWN0ZWRJdGVtKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzc5MzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5Db21ib01vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21ib01vZGVsQWRhcHRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgYm9vbGVhbiBlZGl0YWJsZTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULk5VTEwpOwotCQllZGl0YWJsZSA9IHRydWU7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKSB7Ci0KLQkJY29tYm8gPSBuZXcgQ29tYm8oc2hlbGwoKSwgU1dULlJFQURfT05MWSk7Ci0JCWVkaXRhYmxlID0gZmFsc2U7Ci0KLQkJcmV0dXJuIENvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCWNvbWJvLAotCQkJYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBjb21iby5nZXRUZXh0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkgewotCQlyZXR1cm4gZWRpdGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldEl0ZW0oaW5kZXgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgaXRlbUNvdW50cygpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCUBBZnRlcgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWNvbWJvID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3ZjVkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvSnB0VWlTV1RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDb21ib01vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuY2xhc3MsCi0JVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlTV1RUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpU1dUVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBKVW5pdDRUZXN0QWRhcHRlcihKcHRVaVNXVFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc5MmE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TW9kZWw+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TW9kZWwsIEludGVnZXI+KHN1YmplY3RIb2xkZXIsIE1vZGVsLlZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbHVlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzaGVsbCAgICAgICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQltb2RlbCAgICAgICAgICAgICAgPSBuZXcgTW9kZWwoKTsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBtb2RlbCdzIHZhbHVlIiwKLQkJCW1vZGVsLmdldFZhbHVlKCksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBtb2RlbAotCQlzcGlubmVyLmRpc3Bvc2UoKTsKLQotCQl2YWx1ZSA9IDQ7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHNvbWVob3cgY2hhbmdlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzEoKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMigpIHsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8zKCkgewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl80KCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgdmFsdWUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSAiICsgdmFsdWUsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFuZ2VkKCkgewotCi0JCWludCB2YWx1ZSA9IDI7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJbW9kZWwuY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSBjb21pbmcgZnJvbSB0aGUgbW9kZWwiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBtb2RlbCdzIHZhbHVlIiwKLQkJCW1vZGVsLmdldFZhbHVlKCksCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBtb2RlbCBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHZhbHVlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsCi0JCQltb2RlbC5pc1NldFZhbHVlQ2FsbGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSBtb2RlbAotCQl2YWx1ZSA9IDQ7Ci0JCW1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbW9kZWwncyB2YWx1ZSB3YXMgc29tZWhvdyBjaGFuZ2VkIiwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzcGlubmVyCi0JCXZhbHVlID0gNjsKLQkJc3Bpbm5lci5zZXRTZWxlY3Rpb24odmFsdWUpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbmV3IHZhbHVlIHNldCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHN1cHBvc2VkIHRvIGJlIHVwZGF0ZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQotCQkvLyBEaXNjb25uZWN0IGZyb20gbW9kZWwKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHNldFZhbHVlQ2FsbGVkOwotCQlwcml2YXRlIEludGVnZXIgdmFsdWU7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7Ci0KLQkJdm9pZCBjbGVhclNldFZhbHVlQ2FsbGVkRmxhZygpIHsKLQkJCXNldFZhbHVlQ2FsbGVkID0gZmFsc2U7Ci0JCX0KLQotCQlJbnRlZ2VyIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0KLQkJYm9vbGVhbiBpc1NldFZhbHVlQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldFZhbHVlQ2FsbGVkOwotCQl9Ci0KLQkJdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQlzZXRWYWx1ZUNhbGxlZCA9IHRydWU7Ci0KLQkJCUludGVnZXIgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIHZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlNmRkMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyVGVzdCB7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gc3ViamVjdEhvbGRlcjsKLQotCXByaXZhdGUgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPigpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RW1wbG95ZWU+IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE1hbmFnZXIsIEVtcGxveWVlPihzdWJqZWN0SG9sZGVyLCBNYW5hZ2VyLkVNUExPWUVFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RW1wbG95ZWU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZW1wbG95ZWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5lbXBsb3llZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEVtcGxveWVlPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGZpbmFsIENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEVtcGxveWVlPigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RW1wbG95ZWU+IGUpIHsKLQkJCQllbXBsb3llZXMuY2xlYXIoKTsKLQkJCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGVtcGxveWVlcywgZS5zZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+KCk7Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXN1YmplY3RIb2xkZXIgPSBidWlsZFN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWlmICghc2hlbGwuaXNEaXNwb3NlZCgpKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCX0KLQotCQlzaGVsbCAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciA9IG51bGw7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIENoYW5nZSB0aGUgbGlzdCBvZiBFbXBsb3llZXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5jaGFuZ2VFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbXMgc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCW5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgVGFibGUgd2FzIHBvcHVsYXRlZAotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbXMgc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyB0aGVtIGFsbAotCQltYW5hZ2VyLnJlbW92ZUFsbEVtcGxveWVlcygpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBsaXN0IGhvbGRlciBzaG91bGQgaGF2ZSBiZWVuIGNsZWFyZWQiLCAwLCBsaXN0SG9sZGVyLnNpemUoKSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBUYWJsZSBzaG91bGQgaGF2ZSBiZWVuIGNsZWFyZWQiLCAwLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lICAgID0gIkRhbGkiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyID0gIldUUCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlICAgPSAicGx1Zy1pbiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZSwgZXhwZWN0ZWRUaXRsZSwgZXhwZWN0ZWRNYW5hZ2VyKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4LCBleHBlY3RlZE5hbWUsIGV4cGVjdGVkTWFuYWdlciwgZXhwZWN0ZWRUaXRsZSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVVcChlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDEpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleDIpOwotCi0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgc2hvdWxkIG5vdCBoYXZlIGJlZW4gbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgzKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MywgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgZG93biB0aGUgbGlzdAotCQltYW5hZ2VyLm1vdmVFbXBsb3llZURvd24oZW1wbG95ZWUxKTsKLQotCQlpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgc2hvdWxkIG5vdCBoYXZlIGJlZW4gbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgxKTsKLQotCQlpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleDIpOwotCi0JCWluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4LCBleHBlY3RlZE5hbWUsIGV4cGVjdGVkTWFuYWdlciwgZXhwZWN0ZWRUaXRsZSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQkvLyBOb3cgdGVzdCB0aGUgaXRlbSBiZWluZyByZW1vdmVkCi0JCW1hbmFnZXIucmVtb3ZlRW1wbG95ZWUoZW1wbG95ZWUpOwotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSB3YXMgbm90IHJlbW92ZWQgZnJvbSB0aGUgdGFibGUgbW9kZWwiLCAtMSwgaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMCIsIDAsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBtYW5hZ2VyLmFkZEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBjcmVhdGVkIiwgZW1wbG95ZWUxKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4MSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgxLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0KLQkJLy8gUmVwbGFjZSB0aGUgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCW1hbmFnZXIucmVwbGFjZShlbXBsb3llZTEsIGVtcGxveWVlMik7Ci0KLQkJaW50IGluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0U2FtZSgiVGhlIEVtcGxveWVlIHRoYXQgZ290IHJlcGxhY2VkIHNob3VsZCBiZSBhdCBpbmRleCAiICsgaW5kZXgxLCBpbmRleDEsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDIsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc0FkZGVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlSXRlbSB3YXMgY29ycmVjdGx5IHBvcHVsYXRlZAotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMCwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMSwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgMiwgZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRNYW5hZ2VyMywgZXhwZWN0ZWRUaXRsZTMpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1zTW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNCAgICA9ICJEYWxpXzQiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNCA9ICJXVFBfNCI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNCAgID0gInBsdWctaW5fNCI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTUgICAgPSAiRGFsaV81IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjUgPSAiV1RQXzUiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTUgICA9ICJwbHVnLWluXzUiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU2ICAgID0gIkRhbGlfNiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI2ID0gIldUUF82IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU2ICAgPSAicGx1Zy1pbl82IjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCQlFbXBsb3llZSBlbXBsb3llZTQgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lNCwgZXhwZWN0ZWRUaXRsZTQsIGV4cGVjdGVkTWFuYWdlcjQpOwotCQlFbXBsb3llZSBlbXBsb3llZTUgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRUaXRsZTUsIGV4cGVjdGVkTWFuYWdlcjUpOwotCQlFbXBsb3llZSBlbXBsb3llZTYgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lNiwgZXhwZWN0ZWRUaXRsZTYsIGV4cGVjdGVkTWFuYWdlcjYpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU0KTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTUpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNik7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBFbXBsb3llZXMgd2VyZSBhZGRlZCB0byB0aGUgVGFibGUKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDYiLCA2LCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSB1cCB0aGUgbGlzdAotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWU0KTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTUpOwotCQltYW5hZ2VyLm1vdmVFbXBsb3llZXMoZW1wbG95ZWVzLCAwKTsKLQotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJaW50IGluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlpbnQgaW5kZXg0ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNCk7Ci0JCWludCBpbmRleDUgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU1KTsKLQkJaW50IGluZGV4NiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTYpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAzLCBpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNCwgaW5kZXgyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDAsIGluZGV4Myk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA0IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAxLCBpbmRleDQpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMiwgaW5kZXg1KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDYgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDUsIGluZGV4Nik7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NCwgZXhwZWN0ZWROYW1lNCwgZXhwZWN0ZWRNYW5hZ2VyNCwgZXhwZWN0ZWRUaXRsZTQpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg1LCBleHBlY3RlZE5hbWU1LCBleHBlY3RlZE1hbmFnZXI1LCBleHBlY3RlZFRpdGxlNSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDYsIGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkTWFuYWdlcjYsIGV4cGVjdGVkVGl0bGU2KTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIGRvd24gdGhlIGxpc3QKLQkJZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTIpOwotCQltYW5hZ2VyLm1vdmVFbXBsb3llZXMoZW1wbG95ZWVzLCA0KTsKLQotCQlpbmRleDEgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCWluZGV4MyA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlpbmRleDQgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU0KTsKLQkJaW5kZXg1ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNSk7Ci0JCWluZGV4NiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTYpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA0LCBpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNSwgaW5kZXgyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDAsIGluZGV4Myk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA0IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAxLCBpbmRleDQpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMiwgaW5kZXg1KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDYgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDMsIGluZGV4Nik7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NCwgZXhwZWN0ZWROYW1lNCwgZXhwZWN0ZWRNYW5hZ2VyNCwgZXhwZWN0ZWRUaXRsZTQpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg1LCBleHBlY3RlZE5hbWU1LCBleHBlY3RlZE1hbmFnZXI1LCBleHBlY3RlZFRpdGxlNSk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDYsIGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkTWFuYWdlcjYsIGV4cGVjdGVkVGl0bGU2KTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc1JlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbXMgcmVwcmVzZW50aW5nIHRoZSBlbXBsb3llZXMKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDMiLCAzLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgpOwotCi0JCWluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMiwgaW5kZXgpOwotCi0JCS8vIFJlbW92ZSAyIGl0ZW1zCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMik7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQltYW5hZ2VyLnJlbW92ZUVtcGxveWVlcyhlbXBsb3llZXMpOwotCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBNYWtlIHN1cmUgaXQgd2FzIGFkZGVkIHRvIHRoZSBtb2RlbAotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBuZXcgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCS8vIE5hbWUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJZXhwZWN0ZWROYW1lID0gIkpwdCI7Ci0JCWVtcGxveWVlLnNldE5hbWUoZXhwZWN0ZWROYW1lKTsKLQotCQlhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCS8vIE1hbmFnZXIgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJZXhwZWN0ZWRNYW5hZ2VyID0gImJvc3MiOwotCQllbXBsb3llZS5zZXRNYW5hZ2VyKGV4cGVjdGVkTWFuYWdlcik7Ci0KLQkJYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQotCQkvLyBUaXRsZSBwcm9wZXJ0eQotCQlTdHJpbmcgYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCi0JCWV4cGVjdGVkVGl0bGUgPSAiRWNsaXBzZUxpbmsiOwotCQllbXBsb3llZS5zZXRUaXRsZShleHBlY3RlZFRpdGxlKTsKLQotCQlhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0FkZGVkUmVtb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcnMoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRBbGwoZW1wbG95ZWVzKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGFjdHVhbEVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgcmVtb3Zpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5yZW1vdmUoZW1wbG95ZWUxKTsKLQotCQlhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDEiLCAxLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3RlZEl0ZW1zQ2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcnMoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJc2VsZWN0ZWRJdGVtc0hvbGRlci5hZGRBbGwoZW1wbG95ZWVzKTsKLQotCQlDb2xsZWN0aW9uPEVtcGxveWVlPiBhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWFjdHVhbEVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuY2xlYXIoKTsKLQotCQlhY3R1YWxFbXBsb3llZXMgPSB0YWJsZU1vZGVsLnNlbGVjdGVkSXRlbXMoKTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBhY3R1YWxFbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlICIsIDAsIGFjdHVhbEVtcGxveWVlcy5zaXplKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpLAotCQkJYnVpbGRFbXBsb3llZUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJdGFibGVNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGVtcGxveWVlcykpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXRhYmxlLnNldFNlbGVjdGlvbihuZXcgaW50W10geyAwLCAyIH0pOwotCi0JCS8vIEl0IHNlZW1zIGEgbWFudWFsIHNlbGVjdGlvbiBkb2Vzbid0IHNlbmQgYW55IHNlbGVjdGlvbiBldmVudAotCQl0YWJsZU1vZGVsLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMiIsIDIsIGVtcGxveWVlcy5zaXplKCkpOwotCi0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW1zIHdhcyBub3QgcmV0cmlldmVkIGNvcnJlY3RseSIsIGVtcGxveWVlcy5pc0VtcHR5KCkpOwotCi0JCS8vIFRlc3QgYWRkaW5nIHNlbGVjdGVkIGl0ZW1zCi0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUxKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQl0YWJsZS5kZXNlbGVjdEFsbCgpOwotCi0JCS8vIEl0IHNlZW1zIGEgbWFudWFsIHNlbGVjdGlvbiBkb2Vzbid0IHNlbmQgYW55IHNlbGVjdGlvbiBldmVudAotCQl0YWJsZU1vZGVsLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChudWxsKTsKLQotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIGNvbGxlY3Rpb24gb2Ygc2VsZWN0ZWQgaXRlbXMgY2FuJ3QgYmUgbnVsbCIsIGVtcGxveWVlcyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBjb3VudCBvZiBzZWxlY3RlZCBpdGVtcyBzaG91bGQgYmUgMCIsIDAsIGVtcGxveWVlcy5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0VGFibGVJdGVtUHJvcGVydGllcyhUYWJsZSB0YWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWROYW1lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRUaXRsZSkKLQl7Ci0JCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0YWJsZS5nZXRJdGVtKGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIk5vIFRhYmxlSXRlbSB3YXMgZm91bmQgZm9yIHRoZSBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE5hbWUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTkFNRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlTdHJpbmcgYWN0dWFsTWFuYWdlciA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5NQU5BR0VSX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtNQU5BR0VSX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRNYW5hZ2VyLCBhY3R1YWxNYW5hZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVtcGxveWVlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFuYWdlcjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmcgdGl0bGU7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBNQU5BR0VSX1BST1BFUlRZID0gIm1hbmFnZXIiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEVfUFJPUEVSVFkgPSAidGl0bGUiOwotCi0JCUVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlzdXBlcigpOwotCi0JCQl0aGlzLm5hbWUgICAgPSBuYW1lOwotCQkJdGhpcy50aXRsZSAgID0gdGl0bGU7Ci0JCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl9Ci0KLQkJU3RyaW5nIGdldE1hbmFnZXIoKSB7Ci0JCQlyZXR1cm4gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCQlyZXR1cm4gdGl0bGU7Ci0JCX0KLQotCQl2b2lkIHNldE1hbmFnZXIoU3RyaW5nIG1hbmFnZXIpIHsKLQkJCVN0cmluZyBvbGRNYW5hZ2VyID0gdGhpcy5tYW5hZ2VyOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFOQUdFUl9QUk9QRVJUWSwgb2xkTWFuYWdlciwgbWFuYWdlcik7Ci0JCX0KLQotCQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JCX0KLQotCQl2b2lkIHNldFRpdGxlKFN0cmluZyB0aXRsZSkgewotCQkJU3RyaW5nIG9sZFRpdGxlID0gdGhpcy50aXRsZTsKLQkJCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVElUTEVfUFJPUEVSVFksIG9sZFRpdGxlLCB0aXRsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIExpc3Q8RW1wbG95ZWU+IGVtcGxveWVlczsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVNUExPWUVFU19MSVNUID0gImVtcGxveWVlcyI7Ci0KLQkJTWFuYWdlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCQllbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigpOwotCQl9Ci0KLQkJRW1wbG95ZWUgYWRkRW1wbG95ZWUoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoZW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQkJcmV0dXJuIGVtcGxveWVlOwotCQl9Ci0KLQkJRW1wbG95ZWUgYWRkRW1wbG95ZWUoU3RyaW5nIG5hbWUsIFN0cmluZyB0aXRsZSwgU3RyaW5nIG1hbmFnZXIpIHsKLQkJCUVtcGxveWVlIGVtcGxveWVlID0gbmV3IEVtcGxveWVlKG5hbWUsIHRpdGxlLCBtYW5hZ2VyKTsKLQkJCXJldHVybiBhZGRFbXBsb3llZShlbXBsb3llZSk7Ci0JCX0KLQotCQl2b2lkIGNoYW5nZUVtcGxveWVlcyhMaXN0PEVtcGxveWVlPiBuZXdFbXBsb3llZXMpIHsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0VtcGxveWVlcywgdGhpcy5lbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCUxpc3RJdGVyYXRvcjxFbXBsb3llZT4gZW1wbG95ZWVzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxFbXBsb3llZT4oZW1wbG95ZWVzKTsKLQkJfQotCi0JCWludCBlbXBsb3llZXNTaXplKCkgewotCQkJcmV0dXJuIGVtcGxveWVlcy5zaXplKCk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZURvd24oRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4ICsgMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcywgaW50IHRhcmdldEluZGV4KSB7Ci0KLQkJCWludCBzb3VyY2VJbmRleCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCQlmb3IgKEVtcGxveWVlIGVtcGxveWVlIDogZW1wbG95ZWVzKSB7Ci0JCQkJc291cmNlSW5kZXggPSBNYXRoLm1pbihzb3VyY2VJbmRleCwgdGhpcy5lbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSkpOwotCQkJfQotCi0JCQltb3ZlSXRlbXNJbkxpc3QoCi0JCQkJdGFyZ2V0SW5kZXgsCi0JCQkJc291cmNlSW5kZXgsCi0JCQkJZW1wbG95ZWVzLnNpemUoKSwKLQkJCQl0aGlzLmVtcGxveWVlcywKLQkJCQlFTVBMT1lFRVNfTElTVAotCQkJKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlVXAoRW1wbG95ZWUgZW1wbG95ZWUpIHsKLQkJCWludCBpbmRleCA9IGVtcGxveWVlcy5pbmRleE9mKGVtcGxveWVlKTsKLQkJCW1vdmVJdGVtSW5MaXN0KGluZGV4IC0gMSwgaW5kZXgsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVBbGxFbXBsb3llZXMoKSB7Ci0JCQljbGVhckxpc3QoZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoZW1wbG95ZWUsIGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZXMoQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21MaXN0KGVtcGxveWVlcy5pdGVyYXRvcigpLCB0aGlzLmVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZXBsYWNlKEVtcGxveWVlIG9sZEVtcGxveWVlLCBFbXBsb3llZSBuZXdFbXBsb3llZSkgewotCQkJcmVwbGFjZUl0ZW1Jbkxpc3Qob2xkRW1wbG95ZWUsIG5ld0VtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gewotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMzsKLQkJc3RhdGljIGZpbmFsIGludCBNQU5BR0VSX0NPTFVNTiA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IFRJVExFX0NPTFVNTiA9IDE7Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWFuYWdlckhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5NQU5BR0VSX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TWFuYWdlcigpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRNYW5hZ2VyKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihFbXBsb3llZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihFbXBsb3llZS5OQU1FX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGl0bGVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuVElUTEVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRUaXRsZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRUaXRsZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBob2xkZXJzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+WzNdOwotCQkJaG9sZGVyc1tOQU1FX0NPTFVNTl0gPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW1RJVExFX0NPTFVNTl0gPSBidWlsZFRpdGxlSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tNQU5BR0VSX0NPTFVNTl0gPSBidWlsZE1hbmFnZXJIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKGNvbHVtbkluZGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJRW1wbG95ZWUgZW1wbG95ZWUgPSAoRW1wbG95ZWUpIGVsZW1lbnQ7Ci0KLQkJCWlmIChjb2x1bW5JbmRleCA9PSBUYWJsZUNvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTikgewotCQkJCXJldHVybiBlbXBsb3llZS5nZXRUaXRsZSgpOwotCQkJfQotCi0JCQlyZXR1cm4gZW1wbG95ZWUuZ2V0TWFuYWdlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZU1vZGVsIGV4dGVuZHMgVGFibGVNb2RlbEFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkgICAgICBzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJICAgICAgdGFibGUsCi0JCQkgICAgICBjb2x1bW5BZGFwdGVyLAotCQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlUYWJsZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgVGFibGUgdGFibGUsCi0JCSAgICAgICAgICAgQ29sdW1uQWRhcHRlcjxFbXBsb3llZT4gY29sdW1uQWRhcHRlciwKLQkJICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQkJc3VwZXIobGlzdEhvbGRlciwKLQkJCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEVtcGxveWVlPihzZWxlY3RlZEl0ZW1Ib2xkZXIpLAotCQkJICAgICAgdGFibGUsCi0JCQkgICAgICBjb2x1bW5BZGFwdGVyLAotCQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBpbmRleE9mKEVtcGxveWVlIGl0ZW0pIHsKLQkJCXJldHVybiBzdXBlci5pbmRleE9mKGl0ZW0pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1zKCkgewotCQkJcmV0dXJuIHN1cGVyLnNlbGVjdGVkSXRlbXMoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB0YWJsZVNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwYzE1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRlZmF1bHRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgdHJpLXN0YXRlIGNoZWNrIGJveGVzLgotICovCi1wdWJsaWMgY2xhc3MgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdAotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcxSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub3RGbGFnMkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcySG9sZGVyID0gdGhpcy5idWlsZE5vdEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzFIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzEoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNGbGFnMigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROb3RGbGFnMih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgY2hlY2tCb3hQYW5lbCA9IHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKG1haW5QYW5lbCk7Ci0JCXRoaXMuYnVpbGRDb250cm9sUGFuZWwobWFpblBhbmVsLCBjaGVja0JveFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRDaGVja0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3gocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgImZsYWcgMSIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMuZmxhZzFIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgImZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMuZmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb3RGbGFnMkNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVHJpU3RhdGVDaGVja0JveCBjaGVja0JveCA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94KHBhcmVudCwgIm5leHQgZmxhZyAyIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuYXR0YWNoZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJ1bmF0dGFjaGVkIiwgRGVmYXVsdFdpZGdldEZhY3RvcnkuaW5zdGFuY2UoKSk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIGRlZmF1bHQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxpcEZsYWcxQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRGbGlwRmxhZzFBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IGZsYWcgMSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5uZXh0RmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0IGZsYWcgMSIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIG5leHRGbGFnMSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwubmV4dEZsYWcxKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInByaW50IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDE6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzTm90RmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIik7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzE7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMV9QUk9QRVJUWSA9ICJmbGFnMSI7Ci0JCXByaXZhdGUgQm9vbGVhbiBmbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcyX1BST1BFUlRZID0gImZsYWcyIjsKLQkJcHJpdmF0ZSBCb29sZWFuIG5vdEZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZMQUcyX1BST1BFUlRZID0gIm5vdEZsYWcyIjsKLQkKLQkJcHVibGljIFRlc3RNb2RlbChCb29sZWFuIGZsYWcxLCBCb29sZWFuIGZsYWcyKSB7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gdGhpcy5uZXh0KGZsYWcyKTsKLQkJfQotCQlwcml2YXRlIEJvb2xlYW4gbmV4dChCb29sZWFuIGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IEJvb2xlYW4uVFJVRSA6IGIuYm9vbGVhblZhbHVlKCkgPyBCb29sZWFuLkZBTFNFIDogbnVsbDsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc0ZsYWcxKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzE7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzEoQm9vbGVhbiBmbGFnMSkgewotCQkJQm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcxOwotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcxX1BST1BFUlRZLCBvbGQsIGZsYWcxKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCQl0aGlzLnNldEZsYWcxKHRoaXMubmV4dCh0aGlzLmZsYWcxKSk7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKEJvb2xlYW4gZmxhZzIpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0KLQkJCW9sZCA9IHRoaXMubm90RmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gdGhpcy5uZXh0KGZsYWcyKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT1RfRkxBRzJfUFJPUEVSVFksIG9sZCwgdGhpcy5ub3RGbGFnMik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcyKCkgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQodGhpcy5mbGFnMikpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihCb29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKHRoaXMubmV4dChmbGFnMikpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHROb3RGbGFnMigpIHsKLQkJCXRoaXMuc2V0Tm90RmxhZzIodGhpcy5uZXh0KHRoaXMubm90RmxhZzIpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzI5MDRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xBbGlnbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sQWxpZ25lclRlc3QgewotCi0JcHJpdmF0ZSBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQotCQljb250cm9sQWxpZ25lciA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCi0JCXNoZWxsICA9IG5ldyBTaGVsbChEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCXNoZWxsLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQotCQlpZiAoY29udHJvbEFsaWduZXIgIT0gbnVsbCkgewotCQkJY29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQkJY29udHJvbEFsaWduZXIgPSBudWxsOwotCQl9Ci0KLQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJCXNoZWxsID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBiZSAwLCIsCi0JCQkwLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBsYWJlbC5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdChleHBlY3RlZD1JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyVG9JdHNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyKTsKLQkJZmFpbCgiQSBDb250cm9sQWxpZ25lciBjYW4ndCBiZSBhZGRlZCB0byBpdHNlbGYiKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaWFsb2dfQWRkQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlmaW5hbCBpbnRbXSBtYXhpbXVtV2lkdGggPSBuZXcgaW50WzFdOwotCQlmaW5hbCBpbnRbXSBzaXplID0gbmV3IGludFsxXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTEVGVCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCXJldHVybiBwYXJlbnQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJvdW5kcygpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplQm91bmRzKCk7Ci0JCQkJc2l6ZVswXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemVbMF0gKyAiLCIsCi0JCQlzaXplWzBdLAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZXMgPSBuZXcgaW50WzJdOwotCi0JCVRpdGxlQXJlYURpYWxvZyBkaWFsb2cgPSBuZXcgVGl0bGVBcmVhRGlhbG9nKFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCi0JCQlwcml2YXRlIEJ1dHRvbiBidXR0b247Ci0JCQlwcml2YXRlIExhYmVsIGxhYmVsOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJCWxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCQkJYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVzWzBdID0gbGFiZWwuZ2V0U2l6ZSgpLng7Ci0JCQkJc2l6ZXNbMV0gPSBidXR0b24uZ2V0U2l6ZSgpLng7Ci0JCQkJbWF4aW11bVdpZHRoWzBdID0gY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuY2xvc2UoKTsKLQotCQlpbnQgbGFiZWxTaXplICA9IHNpemVzWzBdOwotCQlpbnQgYnV0dG9uU2l6ZSA9IHNpemVzWzFdOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLCBidXR0b25TaXplKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJbWF4aW11bVdpZHRoWzBdCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgdmVyeSBsb25nIHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWxhYmVsLmRpc3Bvc2UoKTsKLQotCQlQb2ludCBuZXdCdXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnROb3RTYW1lKAotCQkJIlRoZSBvbGQgbWF4IGFuZCBuZXcgbWF4IHNob3VsZCBub3QgYmUgdGhlIHNhbWUiLAotCQkJbWF4LAotCQkJbmV3QnV0dG9uU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbmV3QnV0dG9uU2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RIaWVyYXJjaHlPZkNvbnRyb2xBbGlnbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEFsaWduZXIxCi0JCS8vICBeCi0JCS8vICB8LUFsaWduZXIyCi0JCS8vICAgICBeCi0JCS8vICAgICB8LUFsaWduZXIzCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjMgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChjb250cm9sQWxpZ25lcjMpOwotCi0JCS8vIFRlc3QgMQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgbGFiZWwgd2lkZ2V0Iik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJaW50IGxhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQljb250cm9sQWxpZ25lcjMuYWRkKGxhYmVsMSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBsYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCi0JCS8vIFRlc3QgMgotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsMi5zZXRUZXh0KCJTaG9ydExhYmVsIik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlpbnQgbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCWludCBuZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBUZXN0IDMKLQkJTGFiZWwgbGFiZWwzID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDMuc2V0VGV4dCgiQSB2ZXJ5IGxvbmcgbGFiZWwgdGhhdCB0YWtlcyBhIGxvdCBvZiBob3Jpem9udGFsIHNwYWNlIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMyk7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBhbGwgdGhlIGxvY2tlZCBhcmUgcmVtb3ZlZAotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMgotCQlsYWJlbDIuc2V0VGV4dCgibW0iKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDMgPSBsYWJlbDMuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgyLCBuZXdMYWJlbFdpZHRoMyk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQotCQkvLyBDaGFuZ2UgdGhlIHRleHQgb2YgbGFiZWwxCi0JCWxhYmVsMS5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQlDb21wb3NpdGUgcGFyZW50MSA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDEuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCUxhYmVsIHRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQxLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KCJhIik7Ci0vLwkJcGFyZW50MS5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IHJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmV3TGFiZWxXaWR0aDEgPT0gcmVhbFdpZHRoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiWWVzIGFub3RoZXIgYmlnIGxvbmcgbG9uZyB0ZXh0IHNvIHRoYXQgYWxsIHRoZSBsYWJlbHMgd2lsbCBoYXZlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyBsYWJlbCB0byBtYWtlIHN1cmUgQ29udHJvbEFsaWduZXIgd29ya3MgY29ycmVjdGx5Iik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQkvLyBXZWlyZDogSXQgc2VlbXMgbm8gbm90aWZpY2F0aW9uIGlzIHNlbnQsIGZpcmUgb25lIG1hbnVhbGx5Ci0JCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQlldmVudC53aWRnZXQgPSBsYWJlbDE7Ci0JCWV2ZW50LnR5cGUgICA9IFNXVC5SZXNpemU7Ci0JCWxhYmVsMS5ub3RpZnlMaXN0ZW5lcnMoU1dULlJlc2l6ZSwgZXZlbnQpOwotCi0JCUNvbXBvc2l0ZSBwYXJlbnQyID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OVUxMKTsKLQkJcGFyZW50Mi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJdGVtcExhYmVsID0gbmV3IExhYmVsKHBhcmVudDIsIFNXVC5OVUxMKTsKLQkJdGVtcExhYmVsLnNldFRleHQobGFiZWwxLmdldFRleHQoKSk7Ci0JCXBhcmVudDIubGF5b3V0KHRydWUpOwotCi0JCXJlYWxXaWR0aCA9IHRlbXBMYWJlbC5nZXRTaXplKCkueDsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIG5ld0xhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKHJlYWxXaWR0aCwgbmV3TGFiZWxXaWR0aDEpOwotCi0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMywgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgc2l6ZS54ICsgIiwiLAotCQkJc2l6ZS54LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUoYnV0dG9uKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAwLCAiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gV2lkZ2V0IDEKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkvLyBXaWRnZXQgMgotCQlDb21wb3NpdGUgc3BhY2VyID0gbmV3IENvbXBvc2l0ZShwYW5lLCBTV1QuTlVMTCk7Ci0JCXNwYWNlci5zZXRMYXlvdXQoYnVpbGRTcGFjZXJMYXlvdXQoKSk7Ci0JCXVwZGF0ZUdyaWREYXRhKHNwYWNlcik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChzcGFjZXIpOwotCi0JCS8vIFdpZGdldCAzCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlNob3J0IHRleHQiKTsKLQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgMyB3aWRnZXRzIGhhdmUgdGhlIHNhbWUgd2lkdGgKLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgc3BhY2VyU2l6ZSA9IHNwYWNlci5nZXRTaXplKCk7Ci0JCVBvaW50IGJ1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgobGFiZWxTaXplLngsIGJ1dHRvblNpemUueCk7Ci0JCW1heCA9IE1hdGgubWF4KG1heCwgc3BhY2VyU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJc3BhY2VyU2l6ZS54Ci0JCSk7Ci0KLQkJLy8gUmVtb3ZlIHRoZSBsYWJlbCAodGhlIHdpZGVzdCB3aWRnZXQpIGFuZCBtYWtlIHN1cmUgdGhlIHdpZHRoIHdhcwotCQkvLyBjb3JyZWN0bHkgY2FsY3VsYXRlZAotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCXNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heDIgPSBNYXRoLm1heChzcGFjZXJTaXplLngsIGJ1dHRvblNpemUueCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW1heDIKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQltYXgyLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwYWNlcidzIHdpZHRoIHNob3VsZCBoYXZlIGJlZW4gYWRqdXN0ZWQiLAotCQkJbWF4MiwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsMSk7Ci0KLQkJd2lkdGggPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbEFsaWduZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbCBsYWJlbDIgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdXBkYXRlR3JpZERhdGEobGFiZWwxKTsKLQkJdXBkYXRlR3JpZERhdGEobGFiZWwyKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwxKTsKLQotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJLy8gVGVzdCAxCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCS8vIFRlc3QgMgotCQljb250cm9sQWxpZ25lcjIucmVtb3ZlKGxhYmVsMik7Ci0KLQkJd2lkdGggPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbnRyb2wgY29udHJvbCkgewotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQwNmExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbEVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIGVuYWJsZWQiLAotCQkJY29tYm8uaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTFiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sU3dpdGNoZXJUZXN0IHsKLQotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTE7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFuZTI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lMSgpIHsKLQotCQlpZiAocGFuZTEgPT0gbnVsbCkgewotCi0JCQlwYW5lMSA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQkJCXBhbmUxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lMSwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0VGV4dCgiJlRlc3QyOiIpOwotCi0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYW5lMSwgU1dULkJPUkRFUik7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYW5lMSwgU1dULkJPUkRFUik7Ci0KLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCi0JCXJldHVybiBwYW5lMTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFBhbmUyKCkgewotCi0JCWlmIChwYW5lMiA9PSBudWxsKSB7Ci0KLQkJCXBhbmUyID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5VTEwpOwotCQkJcGFuZTIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUyLCBTV1QuTlVMTCk7Ci0JCQlsYWJlbC5zZXRUZXh0KCImVGVzdDE6Iik7Ci0KLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhbmUyLCBTV1QuQk9SREVSKTsKLQkJCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFuZTI7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6ICh2YWx1ZSA/IHBhbmUxIDogcGFuZTIpOwotCQkJfQotCQl9OwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0KLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0KLQkJCXBhcmVudCAgID0gbnVsbDsKLQkJCXBhZ2VCb29rID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaCgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc3dpdGNoSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPigpOwotCQlUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiB0cmFuc2Zvcm1lciA9IGJ1aWxkVHJhbnNmb3JtZXIoKTsKLQotCQlwYW5lMSA9IGJ1aWxkUGFuZTEoKTsKLQkJcGFuZTEuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJcGFuZTIgPSBidWlsZFBhbmUyKCk7Ci0JCXBhbmUyLnNldFZpc2libGUoZmFsc2UpOwotCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoCi0JCQlzd2l0Y2hIb2xkZXIsCi0JCQl0cmFuc2Zvcm1lciwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJLy8gVGVzdCAxCi0JCXN3aXRjaEhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHBhZ2VCb29rLCAiY3VycmVudFBhZ2UiKTsKLQotCQlhc3NlcnROb3ROdWxsKAotCQkJIlRoZSBwYWdlIGJvb2sncyBwYWdlIHNob3VsZG4ndCBiZSBudWxsIiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlhc3NlcnRTYW1lKAotCQkJIlRoZSBjdXJyZW50IHBhbmUgc2hvdWxkIGJlIHBhbmUxIiwKLQkJCXBhbmUxLAotCQkJY29udHJvbAotCQkpOwotCi0JCVBvaW50IHBhbmUxU2l6ZSA9IHBhbmUxLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCVBvaW50IHBhZ2VCb29rU2l6ZSA9IHBhZ2VCb29rLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiBwYW5lMSIsCi0JCQlwYW5lMVNpemUueCwKLQkJCXBhZ2VCb29rU2l6ZS54Ci0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBoZWlnaHQgb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGVpZ2h0IG9mIHBhbmUxIiwKLQkJCXBhbmUxU2l6ZS55LAotCQkJcGFnZUJvb2tTaXplLnkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJc3dpdGNoSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQkJY29udHJvbCA9IChDb250cm9sKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShwYWdlQm9vaywgImN1cnJlbnRQYWdlIik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgKLQkJCSJUaGUgcGFnZSBib29rJ3MgcGFnZSBzaG91bGRuJ3QgYmUgbnVsbCIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJYXNzZXJ0U2FtZSgKLQkJCSJUaGUgY3VycmVudCBwYW5lIHNob3VsZCBiZSBwYW5lMiIsCi0JCQlwYW5lMiwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlQb2ludCBwYW5lMlNpemUgPSBwYW5lMi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlwYWdlQm9va1NpemUgPSBwYWdlQm9vay5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGggb2YgcGFuZTIiLAotCQkJcGFuZTJTaXplLngsCi0JCQlwYWdlQm9va1NpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgaGVpZ2h0IG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiBwYW5lMiIsCi0JCQlwYW5lMlNpemUueSwKLQkJCXBhZ2VCb29rU2l6ZS55Ci0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3OGVkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xWaXNpYmlsaXR5RW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbkhvbGRlciwgY29tYm8pOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIGJlIHZpc2libGUiLAotCQkJY29tYm8uaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKGZhbHNlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKGZhbHNlKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQljb21iby5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KcHRVaVV0aWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGYwMGQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGUuU3VpdGVDbGFzc2VzOwotCi1AU3VpdGVDbGFzc2VzCi0oewotCUNvbnRyb2xBbGlnbmVyVGVzdC5jbGFzcywKLQlDb250cm9sU3dpdGNoZXJUZXN0LmNsYXNzLAotCUNvbnRyb2xFbmFibGVyVGVzdC5jbGFzcywKLQlDb250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmNsYXNzLAotCUxhYmVsZWRCdXR0b25UZXN0LmNsYXNzLAotCUxhYmVsZWRMYWJlbFRlc3QuY2xhc3MsCi0JTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5jbGFzcywKLQlQYW5lRW5hYmxlclRlc3QuY2xhc3MsCi0JUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5jbGFzcywKLX0pCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLXB1YmxpYyBmaW5hbCBjbGFzcyBKcHRVaVV0aWxUZXN0cyB7Ci0KLQlwcml2YXRlIEpwdFVpVXRpbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlVdGlsVGVzdHMuY2xhc3MpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI1MTVhYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQnV0dG9uVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMigpIHsKLQkJbmV3IExhYmVsZWRCdXR0b24obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlsYWJlbGVkQnV0dG9uLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgQnV0dG9uIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJYnV0dG9uLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCQlidXR0b24uZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRCdXR0b24uc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIEJ1dHRvbiBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWJ1dHRvbi5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRCdXR0b24gbGFiZWxlZEJ1dHRvbiA9IG5ldyBMYWJlbGVkQnV0dG9uKGJ1dHRvbik7Ci0KLQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQotCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZEJ1dHRvbi5zZXRUZXh0KGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjM4ZGM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRDb250cm9sVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZExhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRDb250cm9sVXBkYXRlclRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KCk7Ci0JCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgbnVsbCwgaW1hZ2VIb2xkZXIpOwotCi0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWxhYmVsLmdldEltYWdlKCkKLQkJCSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZURpc3Bvc2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KCk7Ci0JCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgbnVsbCwgaW1hZ2VIb2xkZXIpOwotCi0JCQlsYWJlbC5kaXNwb3NlKCk7Ci0JCQlsYWJlbGVkTGFiZWwuc2V0SW1hZ2UoZXhwZWN0ZWQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dCgpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgdGV4dEhvbGRlcik7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJdGV4dEhvbGRlci5zZXRWYWx1ZShleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBMYWJlbCBkaWRuJ3QgcmVjZWl2ZSB0aGUgdGV4dCIsCi0JCQlleHBlY3RlZCwKLQkJCWxhYmVsLmdldFRleHQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHREaXNwb3NlKCkgewotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIobGFiZWxlZExhYmVsLCB0ZXh0SG9sZGVyKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJdGV4dEhvbGRlci5zZXRWYWx1ZShleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzYmNlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkTGFiZWxUZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdExhYmVsZWRCdXR0b24xKCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMigpIHsKLQkJbmV3IExhYmVsZWRMYWJlbChudWxsKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbWFnZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlsYWJlbC5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkID0gIlRoaXMgaXMgYSB0ZXN0IjsKLQkJbGFiZWxlZExhYmVsLnNldFRleHQoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlsYWJlbC5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRMYWJlbC5zZXRUZXh0KGV4cGVjdGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZmQ5OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFBhbmVFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCURpYWxvZ1BhbmU8Tm9kZT4gcGFuZSA9IG5ldyBEaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCW5ldyBQYW5lRW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGFjM2NlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVWaXNpYmlsaXR5RW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBQYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJRGlhbG9nUGFuZTxOb2RlPiBwYW5lID0gbmV3IERpYWxvZ1BhbmU8Tm9kZT4oCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE5vZGU+KCksCi0JCQlwYXJlbnQpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQl9Ci0JCX07Ci0KLQkJbmV3IFBhbmVWaXNpYmlsaXR5RW5hYmxlcihib29sZWFuSG9sZGVyLCBwYW5lKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChudWxsKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAodHJ1ZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIHBhbmUgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCXBhbmUuZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gRGlzcG9zZQotCQlwYW5lLmRpc3Bvc2UoKTsKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTY4YmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGJvb2xlYW4gc3RhdGUgY29udHJvbGxlcnMgKCdlbmFibGVkJyBhbmQgJ3Zpc2libGUnKS4KLSAqIDxwPgotICogTm90ZSB0aGUgYmVoYXZpb3Igb2YgY29tcG9zaXRlczo8dWw+Ci0gKiA8bGk+V2hlbiBhIGNvbXBvc2l0ZSBpcyBkaXNhYmxlZCwgaXRzIGNoaWxkcmVuIGFyZSBkaXNhYmxlZCBidXQgPGVtPm5vdDwvZW0+Ci0gKiAgICAgZ3JheWVkIG91dC4KLSAqIDxsaT5XaGVuIGEgY29tcG9zaXRlIGlzIG1hZGUgaW52aXNpYmxlLCBpdHMgY2hpbGRyZW4gYXJlIGFsc28gbWFkZQotICogICAgIGludmlzaWJsZS4KLSAqIDwvdWw+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdmlzaWJsZUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdFNlbGVjdGlvbkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy52aXNpYmxlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiByZXN1bHQgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ6ZXJvIik7Ci0JCXJlc3VsdC5hZGQoIm9uZSIpOwotCQlyZXN1bHQuYWRkKCJ0d28iKTsKLQkJcmVzdWx0LmFkZCgidGhyZWUiKTsKLQkJcmVzdWx0LmFkZCgiZm91ciIpOwotCQlyZXN1bHQuYWRkKCJmaXZlIik7Ci0JCXJlc3VsdC5hZGQoInNpeCIpOwotCQlyZXN1bHQuYWRkKCJzZXZlbiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg1MDAsIDE1MCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHdpZGdldFBhbmVsID0gdGhpcy5idWlsZFdpZGdldFBhbmVscyhtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgd2lkZ2V0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFdpZGdldFBhbmVscyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5WRVJUSUNBTCkpOwotCi0JCXRoaXMuYnVpbGRXaWRnZXRQYW5lbDEocGFuZWwpOwotCQl0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwyKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwxKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGVuYWJsZWRDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZEVuYWJsZWRDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmVuYWJsZWRIb2xkZXIsIGVuYWJsZWRDb21ib0JveENoZWNrQm94KTsKLQotCQlCdXR0b24gdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkVmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gocGFuZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudmlzaWJsZUhvbGRlciwgdmlzaWJsZUNvbWJvQm94Q2hlY2tCb3gpOwotCi0JCUxhYmVsIGNvbWJvQm94TGFiZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hMYWJlbChwYW5lbCk7Ci0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdFNlbGVjdGlvbkhvbGRlciwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuZW5hYmxlZEhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMudmlzaWJsZUhvbGRlciwgY29tYm9Cb3hMYWJlbCwgY29tYm9Cb3gpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkRW5hYmxlZENvbWJvQm94Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoZWNrQm94KHBhcmVudCwgImVuYWJsZWQiKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsICJ2aXNpYmxlIik7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgTGFiZWwgYnVpbGRDb21ib0JveExhYmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoImxpc3Q6Iik7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkV2lkZ2V0UGFuZWwyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KFNXVC5IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGNoZWNrQm94MSA9IHRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgIm9uZSIpOwotCQl0aGlzLmJ1aWxkQ2hlY2tCb3gocGFuZWwsICJ0d28iKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAidGhyZWUiKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAiZm91ciIpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5lbmFibGVkSG9sZGVyLCBwYW5lbCwgY2hlY2tCb3gxKTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB3aWRnZXRQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHdpZGdldFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyRW5hYmxlZE1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyVmlzaWJsZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROZXh0QnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckVuYWJsZWRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGVuYWJsZWQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJFbmFibGVkTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBlbmFibGVkIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJFbmFibGVkTW9kZWwoKSB7Ci0JCXRoaXMuZW5hYmxlZEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclZpc2libGVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHZpc2libGUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0LnRoaXMuY2xlYXJWaXNpYmxlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB2aXNpYmxlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJWaXNpYmxlTW9kZWwoKSB7Ci0JCXRoaXMudmlzaWJsZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIm51bGwgc2VsZWN0aW9uIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLnNldFNlbGVjdGlvbk1vZGVsTnVsbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIm51bGwgc2VsZWN0aW9uIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgc2V0U2VsZWN0aW9uTW9kZWxOdWxsKCkgewotCQl0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTmV4dEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGROZXh0QUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZE5leHRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJuZXh0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLm5leHQoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJuZXh0Iik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgbmV4dCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuZ2V0KHRoaXMuZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXROZXh0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldExpc3RTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWluZGV4Kys7Ci0JCXJldHVybiAoaW5kZXggPT0gdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgPyAwIDogaW5kZXg7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGlzdFNlbGVjdGlvbkluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmluZGV4T2YodGhpcy5nZXRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldExpc3RTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDIxMTAxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0NoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZpbGxMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNoZWNrIGJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdAotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcxSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub3RGbGFnMkhvbGRlcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IENoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm90RmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5OT1RfRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuYXR0YWNoZWRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KCJ1bmF0dGFjaGVkIik7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVuYXR0YWNoZWRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIGRlZmF1bHQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc2VsZWN0ZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjaGVja0JveFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3hQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkTm90RmxhZzJUb2dnbGVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxpcEZsYWcxQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZEZsaXBGbGFnMUFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRGbGlwRmxhZzFBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJmbGlwIGZsYWcgMSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiZmxpcCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBmbGlwRmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEZsYWcxKCAhIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJUb2dnbGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlRPR0dMRSk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5vdEZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXN0b3JlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFByaW50TW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJwcmludCBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInByaW50IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDE6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigibm90IGZsYWcgMjogIiArIHRoaXMudGVzdE1vZGVsLmlzTm90RmxhZzIoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqIik7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzE7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMV9QUk9QRVJUWSA9ICJmbGFnMSI7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcyX1BST1BFUlRZID0gImZsYWcyIjsKLQkJcHJpdmF0ZSBib29sZWFuIG5vdEZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZMQUcyX1BST1BFUlRZID0gIm5vdEZsYWcyIjsKLQkKLQkJcHVibGljIFRlc3RNb2RlbChib29sZWFuIGZsYWcxLCBib29sZWFuIGZsYWcyKSB7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gISBmbGFnMjsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZsYWcxKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzE7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzEoYm9vbGVhbiBmbGFnMSkgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcxOwotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcxX1BST1BFUlRZLCBvbGQsIGZsYWcxKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMuZmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RmxhZzIoYm9vbGVhbiBmbGFnMikgewotCQkJYm9vbGVhbiBvbGQgPSB0aGlzLmZsYWcyOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMQUcyX1BST1BFUlRZLCBvbGQsIGZsYWcyKTsKLQkKLQkJCW9sZCA9IHRoaXMubm90RmxhZzI7Ci0JCQl0aGlzLm5vdEZsYWcyID0gISBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT1RfRkxBRzJfUFJPUEVSVFksIG9sZCwgdGhpcy5ub3RGbGFnMik7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNOb3RGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLm5vdEZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5vdEZsYWcyKGJvb2xlYW4gbm90RmxhZzIpIHsKLQkJCXRoaXMuc2V0RmxhZzIoICEgbm90RmxhZzIpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuaXNGbGFnMSgpICsgIiAtICIgKyB0aGlzLmlzRmxhZzIoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFkMzdkOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmVhZC1vbmx5IGNvbWJvLWJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50YXNrTGlzdCA9IG5ldyBUYXNrTGlzdCgpOwotCQl0aGlzLnRhc2tMaXN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4odGhpcy50YXNrTGlzdCk7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygic3dpbSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soImJpa2UiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJydW4iKTsKLQkJVGFzayByZXN0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXN0Iik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicmVwZWF0Iik7Ci0JCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHJlc3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDMwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbF8ocGFuZWwpOyAgLy8gZmFsc2UgPSBuYXRpdmUgKENvbWJvKQotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUYXNrTGlzdFBhbmVsXyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHVuc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJwcmltaXRpdmUgc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAib2JqZWN0IHVuc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCBzb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCByZXZlcnNlIHNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IHZvaWQgYnVpbGRDb21ib0JveFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbU1vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBjb21ib0JveExhYmVsID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTEVGVCB8IFNXVC5WRVJUSUNBTCk7Ci0JCWNvbWJvQm94TGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMyk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMjApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWNvbWJvQm94TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJQ29tYm8gY29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3gocGFuZWwpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNvbWJvQm94TGFiZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJY29tYm9Cb3guc2V0TGF5b3V0RGF0YShmZCk7Ci0JCVNXVFRvb2xzLmJpbmQobW9kZWwsIHNlbGVjdGVkSXRlbU1vZGVsLCBjb21ib0JveCk7ICAvLyB1c2UgI3RvU3RyaW5nKCkKLQl9Ci0KLQlwcml2YXRlIENvbWJvIGJ1aWxkQ29tYm9Cb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IENvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5jb21wYXJlVG8odG8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS19OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS1NfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza0FkYXB0ZXIodGhpcy50YXNrTGlzdEhvbGRlcik7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByaW9yaXR5VGFza0FkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcikgewotCQkJc3VwZXIodGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tfUFJPUEVSVFkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVGFzayBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhUYXNrIHZhbHVlKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0UHJpb3JpdHlUYXNrKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza05hbWVBZGFwdGVyKHRoaXMudGFza0xpc3RIb2xkZXIpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcmlvcml0eVRhc2tOYW1lQWRhcHRlcgotCQlleHRlbmRzIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgU3RyaW5nPgotCXsKLQkJUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyKSB7Ci0JCQlzdXBlcih0YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UHJpb3JpdHlUYXNrTmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIHRhc2tMaXN0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXNrTGlzdFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBtaXNjID0gdGhpcy5idWlsZE1pc2NUYXNrUGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKHBhbmVsLCBtaXNjKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRNaXNjVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC00MDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQ2xlYXJMaXN0QUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTGlzdEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGxpc3QiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgYWxsIHRoZSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENoYW5nZVByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNoYW5nZSBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNoYW5nZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNoYW5nZSB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgcHJpb3JpdHkgdGFzayIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCBjbGVhckJ1dHRvbikgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2xlYXJCdXR0b24pOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgYWRkQnV0dG9uID0gdGhpcy5idWlsZEFkZEJ1dHRvbihwYW5lbCk7Ci0JCUNvbnRyb2wgcmVtb3ZlQnV0dG9uID0gdGhpcy5idWlsZFJlbW92ZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRUYXNrVGV4dEZpZWxkKHBhbmVsLCBhZGRCdXR0b24sIHJlbW92ZUJ1dHRvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDUwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQWRkQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgYWRkQnV0dG9uLCBDb250cm9sIHJlbW92ZUJ1dHRvbikgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24pOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVtb3ZlQnV0dG9uKTsKLQkJdGhpcy50YXNrVGV4dEZpZWxkLnNldExheW91dERhdGEoZmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRhc2tUZXh0RmllbGRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2tUZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QuYWRkVGFzayh0YXNrVGV4dCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJUYXNrcygpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRhc2tMaXN0KTsKLQl9Ci0KLQl2b2lkIGNoYW5nZVByaW9yaXR5VGFzaygpIHsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKFRhc2sgdGFzayA6IHRoaXMudGFza0xpc3QuZ2V0VGFza3MoKSkgewotCQkJaWYgKHRoaXMudGFza0xpc3QuZ2V0UHJpb3JpdHlUYXNrKCkgPT0gdGFzaykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKHRhc2spOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQlpZiAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayh0YXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFzaygpIHsKLQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSA9IG51bGw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLX05BTUVfUFJPUEVSVFkgPSAicHJpb3JpdHlUYXNrTmFtZSI7Ci0JCXByaXZhdGUgVGFzayBwcmlvcml0eVRhc2sgPSBudWxsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS19QUk9QRVJUWSA9ICJwcmlvcml0eVRhc2siOwotCQlwdWJsaWMgVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFRhc2s+IGdldFRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza3M7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJpb3JpdHlUYXNrTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza05hbWU7Ci0JCX0KLQkJcHVibGljIFRhc2sgZ2V0UHJpb3JpdHlUYXNrKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlUYXNrIHRhc2sgPSB0aGlzLnRhc2tzLmdldChpbmRleCk7Ci0JCQkJaWYgKHRhc2sgPT0gdGhpcy5wcmlvcml0eVRhc2spIHsKLQkJCQkJdGhpcy5zZXRQcmlvcml0eVRhc2sobnVsbCk7Ci0JCQkJfQotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UHJpb3JpdHlUYXNrTmFtZShTdHJpbmcgcHJpb3JpdHlUYXNrTmFtZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMucHJpb3JpdHlUYXNrTmFtZTsKLQkJCXRoaXMucHJpb3JpdHlUYXNrTmFtZSA9IHByaW9yaXR5VGFza05hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZLCBvbGQsIHByaW9yaXR5VGFza05hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFzayhUYXNrIHByaW9yaXR5VGFzaykgewotCQkJVGFzayBvbGQgPSB0aGlzLnByaW9yaXR5VGFzazsKLQkJCXRoaXMucHJpb3JpdHlUYXNrID0gcHJpb3JpdHlUYXNrOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU9SSVRZX1RBU0tfUFJPUEVSVFksIG9sZCwgcHJpb3JpdHlUYXNrKTsKLQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrTmFtZSgocHJpb3JpdHlUYXNrID09IG51bGwpID8gbnVsbCA6IHByaW9yaXR5VGFzay5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiMGQ1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgbGlzdCBib3hlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdAotCWV4dGVuZHMgQXBwbGljYXRpb25XaW5kb3cKLXsKLQlmaW5hbCBUYXNrTGlzdCB0YXNrTGlzdDsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcjsKLQlwcml2YXRlIFRleHQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlXaW5kb3cgd2luZG93ID0gbmV3IExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGFza0xpc3QgPSBuZXcgVGFza0xpc3QoKTsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KHRoaXMudGFza0xpc3QpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInN3aW0iKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJiaWtlIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicnVuIik7Ci0JCVRhc2sgcmVzdCA9IHRoaXMudGFza0xpc3QuYWRkVGFzaygicmVzdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXN0KTsKLQkJVGFzayByZXBlYXQgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlcGVhdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayhyZXBlYXQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIHRhc2tMaXN0UGFuZWwgPSB0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGFza0xpc3RQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRPYmplY3RUYXNrTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDUwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAicHJpbWl0aXZlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRMaXN0UGFuZWwocGFyZW50LCAib2JqZWN0IHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgPEU+IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QgYnVpbGRMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBMaXN0VmFsdWVNb2RlbDxFPiBtb2RlbCwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCi0JCUxhYmVsIGxpc3RMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQgfCBTV1QuVkVSVElDQUwpOwotCQlsaXN0TGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMyk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMjApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1KTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWxpc3RMYWJlbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGxpc3RCb3ggPSBuZXcgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdChwYW5lbCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUik7Ci0JCWZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGlzdExhYmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWxpc3RCb3guc2V0TGF5b3V0RGF0YShmZCk7Ci0JCVNXVFRvb2xzLmJpbmQobW9kZWwsIHNlbGVjdGVkSXRlbXNNb2RlbCwgbGlzdEJveCk7ICAvLyB1c2UgI3RvU3RyaW5nKCkKLQkJcmV0dXJuIGxpc3RCb3g7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21TdHJpbmdDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxUYXNrPiBidWlsZEN1c3RvbVRhc2tDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGFzaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVGFzayB0bzEsIFRhc2sgdG8yKSB7Ci0JCQkJcmV0dXJuIHRvMi5jb21wYXJlVG8odG8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS19OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4odGhpcy50YXNrTGlzdEhvbGRlciwgVGFza0xpc3QuVEFTS1NfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUYXNrPiBidWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKHRoaXMudGFza0xpc3RIb2xkZXIpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcmlvcml0eVRhc2tMaXN0QWRhcHRlcgotCQlleHRlbmRzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4KLQl7Ci0JCVByaW9yaXR5VGFza0xpc3RBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcikgewotCQkJc3VwZXIodGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmF0b3I8VGFzaz4gaXRlcmF0b3JfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcmlvcml0eVRhc2tzKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPFRhc2s+IHZhbHVlcykgewotCQkJdGhpcy5zdWJqZWN0LnNldFByaW9yaXR5VGFza3ModmFsdWVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIHRhc2tMaXN0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh0YXNrTGlzdFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBtaXNjID0gdGhpcy5idWlsZE1pc2NUYXNrUGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKHBhbmVsLCBtaXNjKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRNaXNjVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC00MDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkQ2xlYXJMaXN0QUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVtb3ZlUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhclByaW9yaXR5VGFza3NBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTGlzdEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIGxpc3QiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIGFsbCB0aGUgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc3RvcmVNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc3RvcmUgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSB0aGUgdGFzayBsaXN0IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZFByaW9yaXR5VGFza0FDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJhZGQgYSB0YXNrIHRvIHRoZSBwcmlvcml0eSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZW1vdmUgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVtb3ZlIGEgdGFzayBmcm9tIHRoZSBwcmlvcml0eSB0YXNrcyIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhclByaW9yaXR5VGFza3NBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhclByaW9yaXR5VGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2xlYXJCdXR0b24pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNsZWFyQnV0dG9uKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGFkZEJ1dHRvbiA9IHRoaXMuYnVpbGRBZGRCdXR0b24ocGFuZWwpOwotCQlDb250cm9sIHJlbW92ZUJ1dHRvbiA9IHRoaXMuYnVpbGRSZW1vdmVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkVGFza1RleHRGaWVsZChwYW5lbCwgYWRkQnV0dG9uLCByZW1vdmVCdXR0b24pOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1MCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEFkZEFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiYWRkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmFkZFRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJhZGQgYSB0YXNrIHdpdGggdGhlIG5hbWUgaW4gdGhlIGVudHJ5IGZpZWxkIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZFJlbW92ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNTApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVtb3ZlQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZW1vdmVBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZW1vdmUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSB0aGUgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRUYXNrVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgYWRkQnV0dG9uLCBDb250cm9sIHJlbW92ZUJ1dHRvbikgewotCQl0aGlzLnRhc2tUZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChhZGRCdXR0b24pOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocmVtb3ZlQnV0dG9uKTsKLQkJdGhpcy50YXNrVGV4dEZpZWxkLnNldExheW91dERhdGEoZmQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRhc2tUZXh0RmllbGRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrVGV4dCA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2tUZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QuYWRkVGFzayh0YXNrVGV4dCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy50YXNrVGV4dEZpZWxkVGV4dCgpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LnJlbW92ZVRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJUYXNrcygpOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRhc2tMaXN0KTsKLQl9Ci0KLQl2b2lkIGFkZFByaW9yaXR5VGFzaygpIHsKLQkJSXRlcmF0b3I8VGFzaz4gdGFza3MgPSB0aGlzLnRhc2tMaXN0LnRhc2tzKCk7Ci0JCXdoaWxlICh0YXNrcy5oYXNOZXh0KCkpIHsKLQkJCWlmICh0aGlzLnRhc2tMaXN0LmFkZFByaW9yaXR5VGFzayh0YXNrcy5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVQcmlvcml0eVRhc2soKSB7Ci0JCUl0ZXJhdG9yPFRhc2s+IHBUYXNrcyA9IHRoaXMudGFza0xpc3QucHJpb3JpdHlUYXNrcygpOwotCQlpZiAocFRhc2tzLmhhc05leHQoKSkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVQcmlvcml0eVRhc2socFRhc2tzLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNsZWFyUHJpb3JpdHlUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdC5jbGVhclByaW9yaXR5VGFza3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFza0xpc3QgKioqKioqKioqKgotCi0JLy8gbm90ZSBhYnNlbmNlIG9mIHZhbGlkYXRpb24uLi4KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2tMaXN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHRhc2tOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19OQU1FU19MSVNUID0gInRhc2tOYW1lcyI7Ci0JCXByaXZhdGUgZmluYWwgTGlzdDxUYXNrPiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8VGFzaz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tTX0xJU1QgPSAidGFza3MiOwotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248VGFzaz4gcHJpb3JpdHlUYXNrcyA9IG5ldyBIYXNoU2V0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OID0gInByaW9yaXR5VGFza3MiOwotCQlwdWJsaWMgVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUYXNrPiBwcmlvcml0eVRhc2tzKCkgewotCQkJcmV0dXJuIHRoaXMucHJpb3JpdHlUYXNrcy5pdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QodGFza05hbWUsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJVGFzayB0YXNrID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2ssIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJcmV0dXJuIHRhc2s7Ci0JCX0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuaW5kZXhPZih0YXNrTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJVGFzayByZW1vdmVkVGFzayA9IHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihyZW1vdmVkVGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclRhc2tzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWRkUHJpb3JpdHlUYXNrKFRhc2sgdGFzaykgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0YXNrLCB0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKFRhc2sgdGFzaykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24odGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnByaW9yaXR5VGFza3MsIFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFByaW9yaXR5VGFza3MoSXRlcmFibGU8VGFzaz4gdGFza3MpIHsKLQkJCXRoaXMucHJpb3JpdHlUYXNrcy5jbGVhcigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnByaW9yaXR5VGFza3MsIHRhc2tzKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFBSSU9SSVRZX1RBU0tTX0NPTExFQ1RJT04sIHRoaXMucHJpb3JpdHlUYXNrcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFzayAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIGludCBpbnN0YW5jZUNvdW50OwotCQlwcml2YXRlIHN0YXRpYyBpbnQgSU5TVEFOQ0VfQ09VTlQgPSAxOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuaW5zdGFuY2VDb3VudCA9IElOU1RBTkNFX0NPVU5UKys7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmluc3RhbmNlQ291bnQ7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oRGlzcGxheWFibGUgbykgewotCQkJcmV0dXJuIERFRkFVTFRfQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMsIG8pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlIGV4dGVuZHMgTW9kZWwsIENvbXBhcmFibGU8RGlzcGxheWFibGU+IHsKLQkKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcoKTsKLQkJCVN0cmluZyBESVNQTEFZX1NUUklOR19QUk9QRVJUWSA9ICJkaXNwbGF5U3RyaW5nIjsKLQkKLQkKLQkJLy8gKioqKioqKioqKiBoZWxwZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQkKLQkJQ29sbGF0b3IgREVGQVVMVF9DT0xMQVRPUiA9IENvbGxhdG9yLmdldEluc3RhbmNlKCk7Ci0JCi0JCUNvbXBhcmF0b3I8RGlzcGxheWFibGU+IERFRkFVTFRfQ09NUEFSQVRPUiA9Ci0JCQluZXcgQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERpc3BsYXlhYmxlIGQxLCBEaXNwbGF5YWJsZSBkMikgewotCQkJCQkvLyBkaXNhbGxvdyBkdXBsaWNhdGVzIGJhc2VkIG9uIG9iamVjdCBpZGVudGl0eQotCQkJCQlpZiAoZDEgPT0gZDIpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCi0JCQkJCS8vIGZpcnN0IGNvbXBhcmUgZGlzcGxheSBzdHJpbmdzIHVzaW5nIHRoZSBkZWZhdWx0IGNvbGxhdG9yCi0JCQkJCWludCByZXN1bHQgPSBERUZBVUxUX0NPTExBVE9SLmNvbXBhcmUoZDEuZGlzcGxheVN0cmluZygpLCBkMi5kaXNwbGF5U3RyaW5nKCkpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gdGhlbiBjb21wYXJlIHVzaW5nIG9iamVjdC1pZAotCQkJCQlyZXN1bHQgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMSkgLSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShkMik7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyBJdCdzIHVubGlrZWx5IHRoYXQgd2UgZ2V0IHRvIHRoaXMgcG9pbnQ7IGJ1dCwganVzdCBpbiBjYXNlLCB3ZSB3aWxsIHJldHVybiAtMS4KLQkJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBpbnRyb2R1Y2VzIHNvbWUgbWlsZCB1bnByZWRpY3RhYmlsaXR5IHRvIHRoZSBzb3J0IG9yZGVyCi0JCQkJCS8vICh1bmxlc3MgdGhlIG9iamVjdHMgYXJlIGFsd2F5cyBwYXNzZWQgaW50byB0aGlzIG1ldGhvZCBpbiB0aGUgc2FtZSBvcmRlcikuCi0JCQkJCXJldHVybiAtMTsJCS8vIGlmIGFsbCBlbHNlIGZhaWxzLCBpbmRpY2F0ZSB0aGF0IG8xIDwgbzIKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEaXNwbGF5YWJsZS5ERUZBVUxUX0NPTVBBUkFUT1IiOwotCQkJCX0KLQkJCX07Ci0JCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJkNmYxNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9UZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgZW50cnkgZmllbGRzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9OQU1FID0gIlNjb29ieSBEb28iOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGFsbENhcHNOYW1lSG9sZGVyOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QoKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0KCkgewotCQlzdXBlcihudWxsKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFsbENhcHNOYW1lSG9sZGVyID0gdGhpcy5idWlsZEFsbENhcHNOYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBbGxDYXBzTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lKCkudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0ZXh0RmllbGRQYW5lbCA9IHRoaXMuYnVpbGRUZXh0RmllbGRQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgdGV4dEZpZWxkUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRleHRGaWVsZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTM1KTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5uYW1lSG9sZGVyLCB0ZXh0RmllbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRBbGxDYXBzTmFtZVRleHRGaWVsZChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRleHQgdGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFKTsKLQkJdGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RUb29scy5iaW5kKHRoaXMuYWxsQ2Fwc05hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc2V0TmFtZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXNldE5hbWVBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzZXROYW1lQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzZXQgbmFtZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc2V0IG5hbWUiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDbGVhck1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicHJpbnQgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5uYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jbGFzc3BhdGggYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMTI4ZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiYTYxMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnByb2plY3QgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OThlMjMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4ZjljMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MjYgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiNWM0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTU6NTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzA1ZmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTljMDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTQ0N2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFV0aWxpdHkgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE3YjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4gPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UgPSAnXSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBQUklNSVRJVkVTOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8RmllbGQ+IHN0YWNrID0gbmV3IFN0YWNrPEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZEZpZWxkcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IEZpZWxkW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhbGxNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPE1ldGhvZD4gc3RhY2sgPSBuZXcgU3RhY2s8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZE1ldGhvZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBNZXRob2Rbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGllKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBJZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24obWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2RlZmF1bHRDb25zdHJ1Y3RvcigpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBmaWVsZChzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpZWxkKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBudWxsLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBzdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBDb252ZXJ0IGFsbCBvdGhlciBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJVGhyb3dhYmxlIGNhdXNlID0gaXRlLmdldENhdXNlKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpLCBpdGUpOwotCQkJfQotCQkJdGhyb3cgY2F1c2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kLCBudWxsLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gbWV0aG9kKHN1cGVyY2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8RmllbGQ+IHN0YWNrKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gZGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChmaWVsZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8TWV0aG9kPiBzdGFjaykgewotCQlNZXRob2RbXSBtZXRob2RzID0gZGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKG1ldGhvZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICogIk1lbWJlciIgY2xhc3NlcyB3aWxsIHJldHVybiBvbmx5IHRoZSBmaW5hbCBuYW1lOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAgICAgICAgID0+ICJOZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAiTG9jYWwiIGFuZCAiYW5vbnltb3VzIiBjbGFzc2VzIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBlbWJlZGRlZCAnJCdzOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc01lbWJlcihjbGFzc05hbWUpID8KLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKQotCQk6Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdFBlcmlvZCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzLAotCSAqIGZvbGxvd2VkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGUuZy4gIk9iamVjdCAoamF2YS5sYW5nKSIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZVdpdGhQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVXaXRoUGFja2FnZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChzaG9ydE5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCWlmICggISBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJc2IuYXBwZW5kKCIgKCIpOwotCQkJc2IuYXBwZW5kKHBhY2thZ2VOYW1lRm9yKGphdmFDbGFzcykpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50LCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlICJkZWNsYXJlZCIgaW4gY29kZTsKLQkgKiBpLmUuIGl0IGlzIGVpdGhlciBhICJ0b3AtbGV2ZWwiIGNsYXNzIG9yIGEgIm1lbWJlciIgY2xhc3MsIGJ1dCBpdAotCSAqIGlzIG5vdCBhbiAiYXJyYXkiIGNsYXNzLiBUaGlzIG1ldGhvZCByb2xscyB0b2dldGhlciBhbGwgdGhlIGNoZWNrcwotCSAqIGZyb20gdGhlIG90aGVyIG1ldGhvZHMgZm9yIGEgYml0IG9mIGEgcGVyZm9ybWFuY2UgdHdlYWsuCi0JICogQ2xhc3MjaXNEZWNsYXJhYmxlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzRGVjbGFyYWJsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUikgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gaXQgaXMgYW4gImFycmF5IiBjbGFzcwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7CQkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidG9wLWxldmVsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgIm1lbWJlciIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZG9lcyBOT1QgY29udGFpbiBhICckJzogIlRvcExldmVsQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc1RvcExldmVsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVG9wTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpID09IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibWVtYmVyIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgY29udGFpbnMgYXQgbGVhc3Qgb25lICckJyBhbmQgYWxsIHRoZSBuYW1lcyBiZXR3ZWVuCi0JICogZWFjaCAnJCcgYXJlIGxlZ2FsIGNsYXNzIG5hbWVzOgotCSAqICJUb3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIikuCi0JICogQ2xhc3MjaXNNZW1iZXIoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJsb2NhbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayAob3IgRWNsaXBzZSkgbmFtaW5nIGNvbnZlbnRpb25zLgotCSAqIEluIHRoZSBqZGssIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ublhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIuCi0JICogSW4gRWNsaXBzZSwgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uJFhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBzZXBhcmF0ZWQgZnJvbQotCSAqIHRoZSBsb2NhbCBjbGFzcyBuYW1lIGJ5IGFub3RoZXIgJyQnOiAiVG9wTGV2ZWxDbGFzcyQxJExvY2FsQ2xhc3MiLgotCSAqIENsYXNzI2lzTG9jYWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChkb2xsYXIgKyAxKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gZG9sbGFyICsgMjsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMgKGFub255bW91cykKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gImFub255bW91cyIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImxvY2FsIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGVuZHMgd2l0aCAnJG5ubicgd2hlcmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlCi0JICogbGFzdCAnJCcgYXJlIG51bWVyaWMgZGlnaXRzOiAiVG9wTGV2ZWxDbGFzcyQxIikuCi0JICogQ2xhc3MjaXNBbm9ueW1vdXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZG9sbGFyICsgMTsKLQkJZm9yIChpbnQgaSA9IGNsYXNzTmFtZS5sZW5ndGgoKTsgaS0tID4gc3RhcnQ7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LgotCSAqIE5vbi1hcnJheXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlkZXB0aCsrOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuIGFycmF5IHR5cGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0FycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIEEgbm9uLWFycmF5IHR5cGUgc2ltcGx5IHJldHVybnMgaXRzZWxmLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkuCi0JICogQSBub24tYXJyYXkgc2ltcGx5IHJldHVybnMgaXRzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKGphdmFDbGFzcykuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJqYXZhLmxhbmcuT2JqZWN0IiBvciAiaW50IgotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tMamF2YS5sYW5nLk9iamVjdDsiCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhkZXB0aCArIDEsIGxhc3QpOwkvLyBkcm9wIHRoZSB0cmFpbGluZyAnOycKLQkJfQotCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0kiCi0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKGNsYXNzTmFtZS5jaGFyQXQobGFzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyICd2b2lkJyBub3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gISBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ3ZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoY2xhc3NDb2RlKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBjb2Rlc1tpXS5qYXZhQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihjbGFzc0NvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKCggISBqYXZhQ2xhc3MuaXNBcnJheSgpKSAmJiAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YUNsYXNzLmdldE5hbWUoKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmICgoICEgY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgJiYgKGNsYXNzTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2xhc3NOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCQlyZXR1cm4gbmV3IFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIGpkayBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MjZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzYi50b1N0cmluZygpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gIltJIgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAxCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAxOwotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgY2xvc2UgPSBsYXN0OwotCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4pIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiciICsgVk9JRF9DTEFTU19OQU1FICsgIicgbXVzdCBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBwcmltaXRpdmVzKCkgewotCQlpZiAoUFJJTUlUSVZFUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIFBSSU1JVElWRVM7Ci0JfQotCQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIGJ1aWxkUHJpbWl0aXZlcygpIHsKLQkJUHJpbWl0aXZlW10gcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVs5XTsKLQkJcmVzdWx0WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJcmVzdWx0WzFdID0gbmV3IFByaW1pdGl2ZShDSEFSX0NPREUsIGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpOwotCQlyZXN1bHRbMl0gPSBuZXcgUHJpbWl0aXZlKERPVUJMRV9DT0RFLCBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKTsKLQkJcmVzdWx0WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlyZXN1bHRbNF0gPSBuZXcgUHJpbWl0aXZlKElOVF9DT0RFLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzcyk7Ci0JCXJlc3VsdFs1XSA9IG5ldyBQcmltaXRpdmUoTE9OR19DT0RFLCBqYXZhLmxhbmcuTG9uZy5jbGFzcyk7Ci0JCXJlc3VsdFs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJcmVzdWx0WzddID0gbmV3IFByaW1pdGl2ZShCT09MRUFOX0NPREUsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLQkJcmVzdWx0WzhdID0gbmV3IFByaW1pdGl2ZShWT0lEX0NPREUsIGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsKLQkJLy8gZS5nLiBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFID0+IGJvb2xlYW4uY2xhc3MKLQkJUHJpbWl0aXZlKGNoYXIgY29kZSwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzKSB7Ci0JCQl0aGlzLmNvZGUgPSBjb2RlOwotCQkJdGhpcy53cmFwcGVyQ2xhc3MgPSB3cmFwcGVyQ2xhc3M7Ci0JCQl0aGlzLmphdmFDbGFzcyA9IChDbGFzczw/Pikgc3RhdGljRmllbGRWYWx1ZSh3cmFwcGVyQ2xhc3MsIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBlbGVtZW50VHlwZU5hbWU7Ci0JCWZpbmFsIGludCBhcnJheURlcHRoOwotCQlUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWY4NDA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9BcnJheVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxKTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5MlsxXSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxLCA1KTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5Mls0XSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnRfRXhjZXB0aW9uKCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSBuZXcgU3RyaW5nWzJdOwotCQlPYmplY3RbXSBhcnJheTIgPSBBcnJheVRvb2xzLm5ld0FycmF5KGFycmF5MSwgNSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFycmF5MlsxXSA9IEludGVnZXIudmFsdWVPZig3KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5MikpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvbmVudFR5cGUoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1syXTsKLQkJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gamF2YUNsYXNzID0gQXJyYXlUb29scy5jb21wb25lbnRUeXBlKGFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlDbGFzc0ludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLm5ld0FycmF5KFN0cmluZy5jbGFzcywgNSk7Ci0JCWFycmF5WzBdID0gImZvbyI7Ci0JCWFycmF5WzRdID0gImJhciI7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfRXhjZXB0aW9uKCkgewotCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoU3RyaW5nLmNsYXNzLCA1KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXJyYXlbMV0gPSBJbnRlZ2VyLnZhbHVlT2YoNyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhhcnJheSkpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfUHJpbWl0aXZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoaW50LmNsYXNzLCA1KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludE9iamVjdEFycmF5KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eV9DbGVhckFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1s1XSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydE51bGwoYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBPYmplY3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksICJ0d2VudHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSwgInR3ZW50eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3ZW50eSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d2VudHkiLCBhW2EubGVuZ3RoLTFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdlbnR5IikpOwotCQlhc3NlcnRFcXVhbHMoInR3ZW50eSIsIGFbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9aZXJvKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWCIsICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzMsICJYIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksICdkJyk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUludENoYXJfWmVybygpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMzAgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsIDk5KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X1plcm8oKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOTksIDEsIDIsIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fU3RyaW5nX0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAzLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5X0V4Y2VwdGlvbigpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMywgYyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhuZXdBcnJheSkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9yX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmFibGUsIDMzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfT2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYTEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCU9iamVjdFtdIGEyID0gdGhpcy5idWlsZE9iamVjdEFycmF5MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgKE9iamVjdFtdKSBhMSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIChPYmplY3RbXSkgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCAoT2JqZWN0W10pIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFswXTsKLQkJT2JqZWN0W10gYTIgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X0VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiwgIlgiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X1plcm8oKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5QXJyYXkyKCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlFbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZEFsbChuZXcgY2hhclswXSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdYJywgJ1gnLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5X0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKG5ldyBpbnRbMF0sIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFtdIHsgOTksIDk5LCA5OSB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQsIDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMuY2xlYXIoYSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5jbGVhcihhKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uY2F0ZW5hdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlT2JqZWN0QXJyYXlBcnJheSgpIHsKLQkJU3RyaW5nW10gYUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCVN0cmluZ1tdIGVBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJlIiwgImYiLCAiZyIsICJoIiB9OwotCQlTdHJpbmdbXSBpQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiaSIsICJqIiwgImsiLCAibCIgfTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIgfTsKLQkJU3RyaW5nW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVPYmplY3RBcnJheUFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhQXJyYXkgPSBuZXcgU3RyaW5nW10geyAgfTsKLQkJU3RyaW5nW10gZUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gaUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyW10geyAnZScsICdmJywgJ2cnLCAnaCcgfTsKLQkJY2hhcltdIGlBcnJheSA9IG5ldyBjaGFyW10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQljaGFyW10gZXhwZWN0ZWQgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJyB9OwotCQljaGFyW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheV9FbXB0eSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gaUFycmF5ID0gbmV3IGNoYXJbMF07Ci0KLQkJY2hhcltdIGV4cGVjdGVkID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWN0dWFsLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlSW50QXJyYXlBcnJheSgpIHsKLQkJaW50W10gYUFycmF5ID0gbmV3IGludFtdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWludFtdIGVBcnJheSA9IG5ldyBpbnRbXSB7ICdlJywgJ2YnLCAnZycsICdoJyB9OwotCQlpbnRbXSBpQXJyYXkgPSBuZXcgaW50W10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcgfTsKLQkJaW50W10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVJbnRBcnJheUFycmF5X0VtcHR5KCkgewotCQlpbnRbXSBhQXJyYXkgPSBuZXcgaW50W10geyAgfTsKLQkJaW50W10gZUFycmF5ID0gbmV3IGludFswXTsKLQkJaW50W10gaUFycmF5ID0gbmV3IGludFswXTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJT2JqZWN0W10gYTIgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAneicpKTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNDaGFyQXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMTApKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuYWRkKGEsIDU1KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCA1NSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgdGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ3gnLCAneScgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgdGhpcy5idWlsZEludEFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgbmV3IGludFtdIHsgNDQ0LCA4ODggfSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmRW5kKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IG5ldyBTdHJpbmcoImEiKTsKLQkJU3RyaW5nIGJfID0gbmV3IFN0cmluZygiYiIpOwotCQlTdHJpbmcgY18gPSBuZXcgU3RyaW5nKCJjIik7Ci0JCVN0cmluZyBkXyA9IG5ldyBTdHJpbmcoImQiKTsKLQkJU3RyaW5nIGVfID0gbmV3IFN0cmluZygiZSIpOwotCQlhc3NlcnRUcnVlKChhICE9IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiICE9IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkICE9IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlICE9IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDIpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAwKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgZV8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjX18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMVtpXSA9IFN0cmluZy52YWx1ZU9mKGkgKiAxMDAwKTsKLQkJfQotCi0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFthMS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGEyLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMltpXSA9IGExW2ldOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCQlhMlsyXSA9ICIyMDAwIjsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfQm90aE51bGwoKSB7Ci0JCU9iamVjdFtdIGExID0gbnVsbDsKLQkJT2JqZWN0W10gYTIgPSBudWxsOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PbmVOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5X0RpZmZlcmVudExlbmd0aHMoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciJ9OwotCQlPYmplY3RbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUluZGV4T2ZPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nIGZvbyA9ICJmb28iOwotCQlTdHJpbmcgYmFyID0gImJhciI7Ci0JCVN0cmluZyBiYXogPSAiYmF6IjsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbM107Ci0JCWFbMF0gPSBmb287Ci0JCWFbMV0gPSBiYXI7Ci0JCWFbMl0gPSBiYXo7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5SW5kZXhPZihhLCBiYXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCVN0cmluZyBmb28gPSAiZm9vIjsKLQkJU3RyaW5nIGJhciA9ICJiYXIiOwotCQlTdHJpbmcgYmF6ID0gImJheiI7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzNdOwotCQlhWzBdID0gZm9vOwotCQlhWzFdID0gYmFyOwotCQlhWzJdID0gYmF6OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlJbmRleE9mKGEsIG5ldyBTdHJpbmcoImJhciIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnYicpKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJbnRBcnJheUludF9Ob3RGb3VuZCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZk9iamVjdEFycmF5Q29tcGFyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheU9iamVjdENvbXBhcmF0b3IoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscyg2LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGwoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ3onKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkludEFycmF5SW50X05vdEZvdW5kKCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbi9tYXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgQXJyYXlUb29scy5taW4odGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyIGMgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBjaGFyOiAiICsgYyk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluSW50QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLm1pbih0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBpbnQ6ICIgKyBpKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkxKCkgewotCQlhc3NlcnRFcXVhbHMoJ2MnLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICd4JywgJ2EnLCAnYicsICdjJyB9OwotCQlhc3NlcnRFcXVhbHMoJ3gnLCBBcnJheVRvb2xzLm1heChhcnJheSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXlfRXhjZXB0aW9uKCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhclswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhciBjID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgY2hhcjogIiArIGMpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5MSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheTIoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgNzcsIDMsIDEsIC0zIH07Ci0JCWFzc2VydEVxdWFscyg3NywgQXJyYXlUb29scy5tYXgoYXJyYXkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50QXJyYXlfRXhjZXB0aW9uKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWludCBpID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgaW50OiAiICsgaSk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMyIsICIyIiwgIjQiLCAiNSIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMywgMiwgNCwgNSwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2QnLCAnZScsICdjJywgJ2YnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2YnLCAnYScsICdiJywgJ2QnLCAnZScsICdjJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZicsICdhJywgJ2UnLCAnYicsICdkJywgJ2MnIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ2hhckFycmF5SW50SW50SW50KCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdiJywgJ2MnLCAnZCcsICdlJyB9OwotCi0JCWNoYXJbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2InLCAnZScgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2InLCAnYycsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdkJywgJ2InLCAnYycsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcsICdlJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdlJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZicpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdmJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNDApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNTApOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNTApKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdBJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRicsICdGJyB9LCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTEoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5X05vTWF0Y2hlcygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdYJywgJ1onIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAxLCAzLCAzLCA0LCA0LCA2LCA2IH0sIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eTEoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5X0VtcHR5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXlfTm9NYXRjaGVzKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1MiwgNjcgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPYmplY3RBcnJheU9iamVjdF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2EnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA1NSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0ludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMjIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoaSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9TaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X05vRHVwbGljYXRlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIsICJiYXoiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhhMSk7Ci0JCWFzc2VydEVxdWFscygzLCBhMi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleE9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleEludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVGaXJzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRmlyc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUZpcnN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNiwgNywgMzMsIDIsIDExIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVMYXN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUxhc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlTGFzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyIH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhPYmplY3RBcnJheUludEludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYTEsIDMsIDApOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleE9iamVjdEFycmF5SW50SW50X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleENoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X1plcm9MZW5ndGgoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGExLCAzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhMSwgMywgMCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXBsYWNlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X051bGwoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyBudWxsLCAiQiIsIG51bGwsICJDIiwgbnVsbCwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgbnVsbCwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5Q2hhckNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAnQScsICdaJyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1onLCAnQicsICdaJywgJ0MnLCAnWicsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDAsIDEsIDAsIDcsIDAsIDk5IH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgMCwgMTMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMTMsIDEsIDEzLCA3LCAxMywgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W10geyAiRSIsICJCIiwgbmV3IEludGVnZXIoNykgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTEoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhFbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fQWxsKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfUmV0YWluQWxsKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDIsIDIsIDUsIDUgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X0VtcHR5SW50QXJyYXkxKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9SZXRhaW5BbGwoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldmVyc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VDaGFyQXJyYXlfU2luZ2xldG9uKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yZXZlcnNlKGExKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb3RhdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheV9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGEyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhMlsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGEyWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA3KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9PbmUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyAgIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA4KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9aZXJvKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm9EaXN0YW5jZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIC0xKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjAwMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X09uZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjIpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9aZXJvKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X09uZSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3NyB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygxMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDMsIDIsIDEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfTmVnYXRpdmVEaXN0YW5jZSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfT25lKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDc3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDQ0KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaHVmZmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgKE9iamVjdFtdKSBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgImZvbyIgfTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIChPYmplY3RbXSkgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUodGhpcy5idWlsZENoYXJBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUNoYXJBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGNoYXJbXSB7ICdmJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5KCkgewotCQlpbnRbXSBhcnJheTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRJbnRBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYXJyYXkxID0gbmV3IGludFtdIHsgNyB9OwotCQlpbnRbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGludFtdIHsgNyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWFycmF5ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJBcnJheU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyIsICJqYXIiLCAiamF6In07Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImphciJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiam9vIiwgImphciIsICJqYXoifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0LCA5MDkwLCA0Mn07Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7NzcsIDk5LCAzMzMsIDR9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7OTA5MH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDQsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNSwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50W10gezQsIDkwOTAsIDQyfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhcltdIHsnZSd9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydkJywgJ2UnLCAnZid9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAzLCA2KSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzd2FwICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnN3YXAoYSwgMSwgMik7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXlfU2FtZUluZGljZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwQ2hhckFycmF5X1NhbWVJbmRpY2VzKCkgewotCQljaGFyW10gYTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhMiA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheV9TYW1lSW5kaWNlcygpIHsKLQkJaW50W10gYTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYTIgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFycmF5cyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCB0cnVlKTsKLQkJZm9yIChib29sZWFuIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlJbnRJbnRCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCBmYWxzZSk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYm9vbGVhbltdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4geCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRGYWxzZSh4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEJ5dGVBcnJheUJ5dGUoKSB7Ci0JCWJ5dGVbXSBhMSA9IG5ldyBieXRlWzldOwotCQlieXRlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIChieXRlKSA3Nyk7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQnl0ZUFycmF5SW50SW50Qnl0ZSgpIHsKLQkJYnl0ZVtdIGExID0gbmV3IGJ5dGVbOV07Ci0JCWJ5dGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKGJ5dGUpIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWJ5dGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIChieXRlKSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYycpOwotCQlmb3IgKGNoYXIgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoJ2MnLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlJbnRJbnRDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYScpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWNoYXJbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICdjJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoJ2EnLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCdjJywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheURvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcuNzcpOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3Ny43NywgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheUludEludERvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlkb3VibGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3Ljc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZG91YmxlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMuMywgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3LCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsRmxvYXRBcnJheUZsb2F0KCkgewotCQlmbG9hdFtdIGExID0gbmV3IGZsb2F0WzldOwotCQlmbG9hdFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCA3Ny43N2YpOwotCQlmb3IgKGZsb2F0IHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3ZiwgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxGbG9hdEFycmF5SW50SW50RmxvYXQoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbOV07Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuM2YpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWZsb2F0W10gYTMgPSBBcnJheVRvb2xzLmZpbGwoYTIsIGZyb20sIHRvLCA3Ny43N2YpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlmbG9hdCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLjNmLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcuNzdmLCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFs5XTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDc3KTsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJaW50IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1s5XTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICI3NyIpOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscygiNzciLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxPYmplY3RBcnJheUludEludE9iamVjdCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzldOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgIjMiKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICI3NyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoIjMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCI3NyIsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsTG9uZ0FycmF5TG9uZygpIHsKLQkJbG9uZ1tdIGExID0gbmV3IGxvbmdbOV07Ci0JCWxvbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcpOwotCQlmb3IgKGxvbmcgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExvbmdBcnJheUludEludExvbmcoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJbG9uZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3LCB4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSA3Nyk7Ci0JCWZvciAoc2hvcnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlJbnRJbnRTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlzaG9ydFtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgKHNob3J0KSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCXNob3J0IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVszXTsKLQkJYTFbMF0gPSAoYnl0ZSkgMzM7Ci0JCWExWzFdID0gKGJ5dGUpIDExOwotCQlhMVsyXSA9IChieXRlKSAyMjsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJYnl0ZSBsYXN0ID0gKGJ5dGUpIDA7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5SW50SW50KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVs5XTsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoYnl0ZSkgMyk7Ci0JCWEyWzNdID0gKGJ5dGUpIDMzOwotCQlhMls0XSA9IChieXRlKSAxMTsKLQkJYTJbNV0gPSAoYnl0ZSkgMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYnl0ZVtdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWJ5dGUgbGFzdCA9IChieXRlKSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbM107Ci0JCWExWzBdID0gJ3onOwotCQlhMVsxXSA9ICdiJzsKLQkJYTFbMl0gPSAnbSc7Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChjaGFyIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzldOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICdjJyk7Ci0JCWEyWzNdID0gJ3onOwotCQlhMls0XSA9ICdiJzsKLQkJYTJbNV0gPSAnbSc7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJY2hhcltdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJY2hhciB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygnYycsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydERvdWJsZUFycmF5KCkgewotCQlkb3VibGVbXSBhMSA9IG5ldyBkb3VibGVbM107Ci0JCWExWzBdID0gMzMuMzM7Ci0JCWExWzFdID0gMTEuMTE7Ci0JCWExWzJdID0gMjIuMjI7Ci0JCWRvdWJsZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RG91YmxlQXJyYXlJbnRJbnQoKSB7Ci0JCWRvdWJsZVtdIGExID0gbmV3IGRvdWJsZVs5XTsKLQkJZG91YmxlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuMyk7Ci0JCWEyWzNdID0gMzMuMzM7Ci0JCWEyWzRdID0gMTEuMTE7Ci0JCWEyWzVdID0gMjIuMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZG91YmxlW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEZsb2F0QXJyYXkoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbM107Ci0JCWExWzBdID0gMzMuMzNmOwotCQlhMVsxXSA9IDExLjExZjsKLQkJYTFbMl0gPSAyMi4yMmY7Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChmbG9hdCB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RmxvYXRBcnJheUludEludCgpIHsKLQkJZmxvYXRbXSBhMSA9IG5ldyBmbG9hdFs5XTsKLQkJZmxvYXRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zZik7Ci0JCWEyWzNdID0gMzMuMzNmOwotCQlhMls0XSA9IDExLjExZjsKLQkJYTJbNV0gPSAyMi4yMmY7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZmxvYXRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZmxvYXQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zZiwgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzNdOwotCQlhMVswXSA9IDMzOwotCQlhMVsxXSA9IDExOwotCQlhMVsyXSA9IDIyOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWludCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJYTJbM10gPSAzMzsKLQkJYTJbNF0gPSAxMTsKLQkJYTJbNV0gPSAyMjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlpbnQgbGFzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWludCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPCAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5Q29tcGFyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPiAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA8IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0T2JqZWN0QXJyYXlJbnRJbnRDb21wYXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0bywgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA+IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0TG9uZ0FycmF5KCkgewotCQlsb25nW10gYTEgPSBuZXcgbG9uZ1szXTsKLQkJYTFbMF0gPSAzMzsKLQkJYTFbMV0gPSAxMTsKLQkJYTFbMl0gPSAyMjsKLQkJbG9uZ1tdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJbG9uZyBsYXN0ID0gMDsKLQkJZm9yIChsb25nIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRMb25nQXJyYXlJbnRJbnQoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlhMlszXSA9IDMzOwotCQlhMls0XSA9IDExOwotCQlhMls1XSA9IDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlsb25nIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb25nIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydFNob3J0QXJyYXkoKSB7Ci0JCXNob3J0W10gYTEgPSBuZXcgc2hvcnRbM107Ci0JCWExWzBdID0gKHNob3J0KSAzMzsKLQkJYTFbMV0gPSAoc2hvcnQpIDExOwotCQlhMVsyXSA9IChzaG9ydCkgMjI7Ci0JCXNob3J0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlzaG9ydCBsYXN0ID0gKHNob3J0KSAwOwotCQlmb3IgKHNob3J0IHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRTaG9ydEFycmF5SW50SW50KCkgewotCQlzaG9ydFtdIGExID0gbmV3IHNob3J0WzldOwotCQlzaG9ydFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoc2hvcnQpIDMpOwotCQlhMlszXSA9IChzaG9ydCkgMzM7Ci0JCWEyWzRdID0gKHNob3J0KSAxMTsKLQkJYTJbNV0gPSAoc2hvcnQpIDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCXNob3J0W10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJc2hvcnQgbGFzdCA9IChzaG9ydCkgMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJc2hvcnQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShBcnJheVRvb2xzLmNsYXNzKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgYXQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIGNoYXJbXSBidWlsZENoYXJBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH07Ci0JfQotCi0JcHJpdmF0ZSBpbnRbXSBidWlsZEludEFycmF5KCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgMCwgMTAsIDIwIH07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZE9iamVjdEFycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFN0cmluZ0FycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBidWlsZE9iamVjdExpc3QxKCkgewotCQlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbGxlY3Rpb24xKENvbGxlY3Rpb248PyBzdXBlciBTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMihDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRTdHJpbmdWZWN0b3IxKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMSh2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGIzMmRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IG5ldyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IodGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCWNvbW1hbmRFeGVjdXRvci5zdGFydCgpOwotCQljb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKGNvbW1hbmQpOwotCQlUaHJlYWQuc2xlZXAoVFdPX1RJQ0tTKTsgIC8vIHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKLQkJY29tbWFuZEV4ZWN1dG9yLnN0b3AoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE4ZGZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfaXRlcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19zaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ191bmlxdWVJdGVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVJdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3VuaXF1ZUNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfY291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIEJhZy5FbXB0eS5pbnN0YW5jZSgpLmNvdW50KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VudHJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZW50cmllcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3JlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5yZW1vdmUoImZvbyIsIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfYWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJhZy5FbXB0eS5pbnN0YW5jZSgpLmFkZCgiZm9vIiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVxdWFscyhCYWcuRW1wdHkuaW5zdGFuY2UoKSkpOwotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5lcXVhbHMoImZvbyIpKTsKLQotCQlCYWc8T2JqZWN0PiBiYWcgPSBuZXcgSGFzaEJhZzxPYmplY3Q+KCk7Ci0JCWFzc2VydFRydWUoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCQliYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19oYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQmFnLkVtcHR5Lmluc3RhbmNlKCkuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmFnPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmFnLkVtcHR5Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJhZy5FbXB0eS5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQxNTY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJpZGlGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLmFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9yZXZlcnNlQWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCkucmV2ZXJzZUFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfYWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfcmV2ZXJzZUFjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCaWRpRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpRmlsdGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX3JldmVyc2VBY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQmlkaUZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlGaWx0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNDAwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpZGlTdHJpbmdDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpU3RyaW5nQ29udmVydGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLlRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLkZBTFNFKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgidHJ1ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJUUlVFIikpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmYWxzZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgieHh4eCIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJCaWRpU3RyaW5nQ29udmVydGVyX2NvbnZlcnRUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIjciLCBCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoSW50ZWdlci52YWx1ZU9mKDcpKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgiNyIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNmMTUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCaWRpVHJhbnNmb3JtZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl90cmFuc2Zvcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpLnRyYW5zZm9ybSgiZm9vIikpOwotCQlhc3NlcnROdWxsKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkudHJhbnNmb3JtKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS5yZXZlcnNlVHJhbnNmb3JtKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50cmFuc2Zvcm0obnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaVRyYW5zZm9ybWVyX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVRyYW5zZm9ybWVyX3RyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS50cmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VUcmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE5NDEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCaXRUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpdFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc09mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMTAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAwLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGQywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDIyMDQsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgMHgxMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZU9mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgzMzNFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweEZGRkUsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHg3MzczLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDA0MDAsIDB4MDAyMCwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgxMTAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAzLCBuZXcgaW50W10geyAweDAxMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZGRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAwMTAgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMjAwLCAweDAwMDMsIDB4MDAwMiB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDExLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5kRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDAwLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhvckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMCwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweEZGMTEsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSwgMHgwRjAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShCaXRUb29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzRhNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRSVUUgPSBCb29sZWFuLlRSVUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbiBGQUxTRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgQm9vbGVhblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5PVCgpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm90KFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5ub3QoRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QU5EKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5hbmQoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMuYW5kKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPUigpIHsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WE9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5BTkQoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5uYW5kKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubmFuZChGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tk9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYTk9SKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54bm9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhub3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54bm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJT2JqZWN0IGF0ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKEJvb2xlYW5Ub29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc05hbWVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDcwYjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsYXNzTmFtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENsYXNzTmFtZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0FycmF5KGphdmEubGFuZy5TdHJpbmdbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudFR5cGVOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFycmF5RGVwdGgoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50VHlwZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2ltcGxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W10iLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJT2JqZWN0IGFub25PYmplY3QgPSBuZXcgT2JqZWN0KCkgewotCQkJLy8gYW5vbnltb3VzIGNsYXNzCi0JCX07Ci0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCWNsYXNzIExvY2FsIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9Ci0JCUxvY2FsIGxvY2FsT2JqZWN0ID0gbmV3IExvY2FsKCk7Ci0JCWFzc2VydEVxdWFscygiTG9jYWwiLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShsb2NhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShqYXZhLmxhbmcuT2JqZWN0W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLk1hcC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCU9iamVjdCBhbm9uT2JqZWN0ID0gbmV3IE9iamVjdCgpIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9OwotCQlhc3NlcnRFcXVhbHMoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShhbm9uT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVG9wTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNUb3BMZXZlbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYWEkYWFhIikpOyAgLy8gbWVtYmVyIGluc2lkZSBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxJGFhYSIpKTsgIC8vIG1lbWJlciBpbnNpZGUgYW5vbnltb3VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7ICAvLyBtZW1iZXIgaW5zaWRlIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEyMzQ1JGIxMjM0NSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTG9jYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY2xhc3MgTG9jYWxDbGFzcyB7Ci0JCQl2b2lkIGZvbygpIHsKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImZvbyIpOwotCQkJfQotCQl9Ci0JCW5ldyBMb2NhbENsYXNzKCkuZm9vKCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNMb2NhbChDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMmFiYzEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkMTIzNGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbm9ueW1vdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cyhDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoaW50LmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgewotCQlhc3NlcnRUcnVlKHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShmbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3JhcHBlckNsYXNzTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0V3JhcHBlckNsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmltaXRpdmVDbGFzc05hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFByaW1pdGl2ZUNsYXNzTmFtZShqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcmVBdXRvYm94RXF1aXZhbGVudHMoKSB7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLCBTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGb3JDb2RlKCkgewotCQlhc3NlcnRFcXVhbHMoImJ5dGUiLCBDbGFzc05hbWUuZm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0MnKSk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0QnKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBDbGFzc05hbWUuZm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnSScpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0onKSk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ1onKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIENsYXNzTmFtZS5mb3JDb2RlKCdWJykpOwotCi0JCWFzc2VydE51bGwoQ2xhc3NOYW1lLmZvckNvZGUoJ1gnKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0InKSk7Ci0JCWFzc2VydEVxdWFscygiY2hhciIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdEJykpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0YnKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdKJykpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ1MnKSk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnVicpKTsKLQotCQlhc3NlcnROdWxsKENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdYJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2RlRm9yQ2xhc3NOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJieXRlIikpOwotCi0JCWFzc2VydEVxdWFscygoY2hhcikgMCwgQ2xhc3NOYW1lLmdldENvZGVGb3JDbGFzc05hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDbGFzc05hbWUuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQyNjYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWQoKSB7Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7O0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0Lmphcjs7OyIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCS8vIG5vIGNoYW5nZXMKLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFwuLlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpkazFcXGpkazJcXGpkazNcXC4uXFwuLlxcLi5cXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVTdHJpbmcoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgZmlsZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzRmlsZUNsYXNzKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlTmFtZSgpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmphdmEiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlU3RyaW5nKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVDbGFzcygpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBmaWxlID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvRmlsZU5hbWVCYXNlKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmciLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VSTHMoKSB7Ci0JCUl0ZXJhdG9yPFVSTD4gZW50cmllcyA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRVUkxzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvcnQuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2kxOG4uamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2phd3MuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovZm9vL2NsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9iYXIvYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRQYXRoKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJpZXMoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyOzsuO0M6XFxqZGtcXGkxOG4uamFyOzs7QzpcXGpka1xcamF3cy5qYXI7O0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcYmFyXFxiYXIuamFyOyIpKTsKLQkJSXRlcmF0b3I8Q2xhc3NwYXRoLkVudHJ5PiBlbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cmllcy5oYXNOZXh0KCkpOwotCi0JCWNwID0gY3AuY29tcHJlc3NlZCgpOwotCQllbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJ5Rm9yRmlsZU5hbWVkKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7cnQuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKCJydC5qYXIiKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGJlZ2lubmluZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBpbiB0aGUgbWlkZGxlCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGVuZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gbWlzc2luZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXRoIGVudHJ5IHNob3VsZCBub3QgYmUgZm91bmQiLCBudWxsLCBlbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cnlGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZCgiZm9vLmJhci5CYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uRm9yQ2xhc3MoKSB7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IENsYXNzcGF0aC5jbGFzczsKLQkJRmlsZSBlbnRyeSA9IG5ldyBGaWxlKENsYXNzcGF0aC5sb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKGVudHJ5LmlzRmlsZSgpIHx8IGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUoZW50cnkuZXhpc3RzKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGVudHJ5LCBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpKS5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnRKYXJOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBydEZpbGUgPSBuZXcgRmlsZShDbGFzc3BhdGgucnRKYXJOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJydC5qYXIgZG9lcyBub3QgZXhpc3QiLCBydEZpbGUuZXhpc3RzKCkpOwotCi0JCUphckZpbGUgcnRKYXJGaWxlID0gbmV3IEphckZpbGUocnRGaWxlKTsKLQkJSmFyRW50cnkgZW50cnkgPSBydEphckZpbGUuZ2V0SmFyRW50cnkoImphdmEvbGFuZy9PYmplY3QuY2xhc3MiKTsKLQkJcnRKYXJGaWxlLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoImJvZ3VzIHJ0LmphciIsIGVudHJ5ICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKUkVDbGFzc05hbWVzKCkgewotCQlhc3NlcnRUcnVlKCJWZWN0b3IgaXMgbWlzc2luZyBmcm9tIEpSRSBjbGFzcyBuYW1lcyIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldENsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0Q2xhc3NOYW1lcygpLCBqYXZhLmlvLkZpbGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBzdGRFeHREaXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IjsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBuYW1lIG1pc3Npbmc6ICIgKyBzdGRFeHREaXJOYW1lLCBBcnJheVRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSwgc3RkRXh0RGlyTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIHN0ZEV4dERpciA9IG5ldyBGaWxlKEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIpOwotCQlhc3NlcnRUcnVlKCJzdGFuZGFyZCBleHRlbnNpb24gZGlyIG1pc3Npbmc6ICIgKyBzdGRFeHREaXIuZ2V0UGFyZW50KCksIEFycmF5VG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpLCBzdGRFeHREaXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkNsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNiIpKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gamFyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUl0ZXJhYmxlPENsYXNzcGF0aC5FbnRyeT4gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCQkJZm9yIChDbGFzc3BhdGguRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQkJamFyTmFtZXMuYWRkKGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCQkJfQotCQkJU3RyaW5nIHN0ZEV4dEphck5hbWUgPSBKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiICsgc2VwICsgImRuc25zLmphciI7Ci0JCQlTdHJpbmcgbXNnID0gImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lOwotCQkJYm9vbGVhbiBqYXJQcmVzZW50ID0gamFyTmFtZXMuY29udGFpbnMoc3RkRXh0SmFyTmFtZSk7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSB8fCAoVG9vbHMuanZtSXNJQk0oKSAmJiBqZGsuc3RhcnRzV2l0aCgiMS42IikpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShtc2csIGphclByZXNlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmFpbCgid2UgbmVlZCB0byB1cGRhdGUgdGhpcyB0ZXN0IGZvciB0aGUgY3VycmVudCBqZGsiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpIHx8IGpkay5zdGFydHNXaXRoKCIxLjYiKSkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5kbnMuRE5TTmFtZVNlcnZpY2UiOwotCQkJU3RyaW5nIG1zZyA9ICJqZGsgMS40Lnggc3RhbmRhcmQgZXh0ZW5zaW9uIGNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWU7Ci0JCQlib29sZWFuIGNsYXNzUHJlc2VudCA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKTsKLQkJCWlmIChUb29scy5qdm1Jc1N1bigpIHx8IChUb29scy5qdm1Jc0lCTSgpICYmIGpkay5zdGFydHNXaXRoKCIxLjYiKSkpIHsKLQkJCQlhc3NlcnRUcnVlKG1zZywgY2xhc3NQcmVzZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzcGF0aENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkvLyBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlICJub3JtYWwiIGNsYXNzIGxvYWRlcjsKLQkJLy8gd2hlbiB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGFzIGFuIEFOVCB0YXNrLCB0aGV5IGFyZSBydW4gdW5kZXIKLQkJLy8gYW4gQU5UIGNsYXNzIGxvYWRlciBhbmQgdGhlICJKYXZhIiBjbGFzc3BhdGggZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzCi0JCWlmIChjbC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzdW4ubWlzYyIpKSB7Ci0JCQlhc3NlcnRUcnVlKCJjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlQ2xhc3NwYXRoQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgIm5vcm1hbCIgY2xhc3MgbG9hZGVyOwotCQkvLyB3aGVuIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgYXMgYW4gQU5UIHRhc2ssIHRoZXkgYXJlIHJ1biB1bmRlcgotCQkvLyBhbiBBTlQgY2xhc3MgbG9hZGVyIGFuZCB0aGUgIkphdmEiIGNsYXNzcGF0aCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY2xhc3MKLQkJaWYgKGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5taXNjIikpIHsKLQkJCWFzc2VydFRydWUoImNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguY29tcGxldGVDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aEZvckNsYXNzKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jbGFzc3BhdGhGb3IoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDbGFzc05hbWVzVG8oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEwMDApOwotCQlDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzKTsKLQkJYXNzZXJ0VHJ1ZShjbGFzc05hbWVzLmNvbnRhaW5zKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2dldENhbm9uaWNhbEZpbGUoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGF0aCgpLmVuZHNXaXRoKCIuamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9nZXRDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldENhbm9uaWNhbEZpbGVOYW1lKCk7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInJ0LmphciIpKTsKLQkJfSBlbHNlIGlmIChUb29scy5qdm1Jc0lCTSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInZtLmphciIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9lcXVhbHMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cnkuZXF1YWxzKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zQ2xhc3MoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5jb250YWlucyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zU3RyaW5nKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoZW50cnkuY29udGFpbnMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlfZ2V0Q2xhc3NOYW1lcygpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlbnRyeS5nZXRDbGFzc05hbWVzKCksIGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NsYXNzTmFtZXMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZW50cnkuY2xhc3NOYW1lcygpLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIG1vcnBoIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gcGF0aDsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJzsnLCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIFVSTCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaFVSTChTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSB1cmw7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM5N2Q4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbGxlY3Rpb25Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLCBsaXN0Mi5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gbGlzdDE7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLCBsaXN0MS5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZ1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVNldDxPYmplY3Q+IHNldDEgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Nb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdMaXN0RW1wdHlBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIG5ldyBTdHJpbmdbMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X1N0cmluZ1NldEVtcHR5QXJyYXkoKSB7Ci0JCVNldDxTdHJpbmc+IHNldCA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVNldDxPYmplY3Q+IHNldCA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5X0VtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX0VtcHR5SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvciwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIChPYmplY3RbXSkgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5X1ZhcmFyZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIG5ldyBPYmplY3RbXXsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoQmFnLkVtcHR5LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb25fT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+Y29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25PYmplY3RBcnJheSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjLCAoT2JqZWN0W10pIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQkJdi5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0VudW1lcmF0aW9uT2JqZWN0X09iamVjdCgpIHsKLQkJVmVjdG9yPE9iamVjdD4gYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmFibGVPYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBjOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEhhc2hCYWc8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnRMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmRW5kTGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlN0YXJ0TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLCBsaXN0MikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QxLnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0Mi5hZGQoU3RyaW5nLnZhbHVlT2YoKGkgKyAxKSAqIDEwMDApKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9EaWZmZXJlbnRTaXplcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMyk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVN0cmluZyBvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nIG8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGxpc3QuaXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlSXRlcmFibGUxKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbnVsbDsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUl0ZXJhYmxlMigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWludCBoYXNoQ29kZSA9IENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhsaXN0Lmhhc2hDb2RlKCksIGhhc2hDb2RlKTsKLQotCQlsaXN0LmFkZChudWxsKTsKLQkJaGFzaENvZGUgPSBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5oYXNoQ29kZSgpLCBoYXNoQ29kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmFibGVPYmplY3RfU3RyaW5nKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihpdGVyYWJsZSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZ19Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCAic2hhemFtIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCi0JCVN0cmluZyBvbmUgPSAiMSI7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlUmFuZG9tQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0Q29tcGFyYWJsZU5vblJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIikpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JSYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQSIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JOb25SYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSkpOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpcyBlbXB0eSAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHlJdGVyYWJsZSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaXRlcmFibGUvaXRlcmF0b3IgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEl0ZXJhYmxlMSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgQ29sbGVjdGlvblRvb2xzLmxhc3QoaXRlcmFibGUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDb2xsZWN0aW9uVG9vbHMubGFzdChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmFibGUyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5sYXN0KGl0ZXJhYmxlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMubGFzdChsaXN0Lml0ZXJhdG9yKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVJbnRPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAyMywgIm9uZSIpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihpdGVyYWJsZSwgNDIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvckludE9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIDMsICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCA0LCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JJbnRPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNDIsICJmb28iKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCA1NSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCksIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0R1cGxpY2F0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgKE9iamVjdFtdKSBhKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywoT2JqZWN0W10pICBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSkpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJDIiwgIkEiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KSk7Ci0JCXJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDAsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkQiLCAiRSIsICJGIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9FbXB0eSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNMaXN0X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlLCA3KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoYzIuc2l6ZSgpLCBjMS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYzIsIGMxKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzMuYWRkKCJ0aHJlZSIpOwotCQljMy5hZGQoImZvdXIiKTsKLQkJYzMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlDb2xsZWN0aW9uRW1wdHlJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpLCA5KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb25FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb25FbXB0eU9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yb3RhdGUoZXhwZWN0ZWQsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQotCQlhc3NlcnRFcXVhbHMoc2V0LCBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQobGlzdC5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfU3RyaW5nKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX0Nhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uTGlzdEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkxpc3RJdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNQcmV2aW91cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHNvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IGxpc3Q7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYWJsZTEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDc3KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IxID0gbGlzdC5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmF0b3IxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ZWQgc2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbGlzdDsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc3MyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvckludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3JfVHJlZVNldCgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzczEuYWRkKCIwIik7Ci0JCXNzMS5hZGQoIjIiKTsKLQkJc3MxLmFkZCgiMyIpOwotCQlzczEuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChzczEuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNldDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9iamVjdEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXlDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlTdHJpbmdbXSBhcnJheSA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChhcnJheSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9sZCBTY2hvb2wgVmVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGUtdXNlIGl0ZXJhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcl9OUEUoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gbnVsbEl0ZXJhdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShudWxsSXRlcmF0b3IpOwotCQkJZmFpbCgiaW52YWxpZCBpdGVyYWJsZTogIiArIGVtcHR5SXRlcmFibGUpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yX1RvU3RyaW5nKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXB0eUl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzcmMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGRlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IHNyYykgewotCQkJZGVzdC5hZGQocy50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmNvcHkoZGVzdCwgc3JjKTsKLQkJYXNzZXJ0U2FtZShkZXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChzcmMsIGRlc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExpc3RPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuZmlsbChsaXN0LCAiZm9vIik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogcmVzdWx0KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmluZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUxpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZShsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlTGlzdFJhbmRvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKGxpc3QsIG5ldyBSYW5kb20oKSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcExpc3RJbnRJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChsaXN0LCAwLCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlMaXN0PFN0cmluZz4gb3JpZ2luYWwgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmdldCgwKSwgcmVzdWx0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5nZXQoMSksIHJlc3VsdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZ2V0KDIpLCByZXN1bHQuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDb2xsZWN0aW9uVG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgaGFybmVzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2I5YzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIENvbW1hbmRFeGVjdXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kRXhlY3V0b3IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb21tYW5kRXhlY3V0b3Jfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yMSA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb21tYW5kRXhlY3V0b3IxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kRXhlY3V0b3IxLCBjb21tYW5kRXhlY3V0b3IyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcigpIHsKLQkJVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlc3RDb21tYW5kLmNvdW50KTsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKHRlc3RDb21tYW5kKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gbmV3IFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZEV4ZWN1dG9yLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciA9IG5ldyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpOwotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMSA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIDEpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMSk7Ci0JCXRocmVhZDEucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTIgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCAyKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTIpOwotCQl0aHJlYWQyLnJ1bigpOwotCi0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUzID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgMywgbnVsbCk7Ci0JCVRocmVhZCB0aHJlYWQzID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUzKTsKLQkJdGhyZWFkMy5ydW4oKTsKLQotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0JCXRocmVhZDMuam9pbigpOwotCi0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kLmNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RSdW5uYWJsZTEudGVzdENvbW1hbmRFeGVjdXRvci5jb3VudCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRlc3RSdW5uYWJsZTIudGVzdENvbW1hbmQuY291bnQpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFJ1bm5hYmxlMi50ZXN0Q29tbWFuZEV4ZWN1dG9yLmNvdW50KTsKLQotCQlhc3NlcnRFcXVhbHMoMywgdGVzdFJ1bm5hYmxlMy50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCWFzc2VydE51bGwodGVzdFJ1bm5hYmxlMy50ZXN0Q29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotCQlmaW5hbCBpbnQgZXhlY3V0aW9uQ291bnQ7Ci0JCWZpbmFsIFRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCWZpbmFsIFRlc3RDb21tYW5kRXhlY3V0b3IgdGVzdENvbW1hbmRFeGVjdXRvcjsKLQkJVGVzdFJ1bm5hYmxlKFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLQkJCXRoaXModGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGV4ZWN1dGlvbkNvdW50LCBuZXcgVGVzdENvbW1hbmRFeGVjdXRvcigpKTsKLQkJfQotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGludCBleGVjdXRpb25Db3VudCwgVGVzdENvbW1hbmRFeGVjdXRvciB0ZXN0Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciA9IHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotCQkJdGhpcy5leGVjdXRpb25Db3VudCA9IGV4ZWN1dGlvbkNvdW50OwotCQkJdGhpcy50ZXN0Q29tbWFuZEV4ZWN1dG9yID0gdGVzdENvbW1hbmRFeGVjdXRvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLnNldCh0aGlzLnRlc3RDb21tYW5kRXhlY3V0b3IpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4ZWN1dGlvbkNvdW50OyBpKyspIHsKLQkJCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUodGhpcy50ZXN0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kUnVubmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2IyYjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbW1hbmRSdW5uYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gY29tbWFuZEV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgQ29tbWFuZFJ1bm5hYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUobnVsbCk7Ci0JCQlmYWlsKCJib2d1czogIiArIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbW1hbmQoKSk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZEV4ZWN1dGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tbWFuZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW5uYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbW1hbmRSdW5uYWJsZVRlc3RzLnRoaXMuY29tbWFuZEV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViODM5Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVGhyZWFkTG9jYWxDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgQ29tbWFuZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCWNvbW1hbmQuZXhlY3V0ZSgpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZF90b1N0cmluZygpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmRfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kIGNvbW1hbmQxID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCUNvbW1hbmQgY29tbWFuZDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGNvbW1hbmQxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kMSwgY29tbWFuZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IENvbW1hbmQuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZF90b1N0cmluZygpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGNvbW1hbmQudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZF9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmQgY29tbWFuZDEgPSBDb21tYW5kLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCUNvbW1hbmQgY29tbWFuZDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGNvbW1hbmQxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kMSwgY29tbWFuZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW5uYWJsZUNvbW1hbmQoKSB7Ci0JCVNpbXBsZVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUgPSBuZXcgU2ltcGxlVGVzdFJ1bm5hYmxlKCk7Ci0JCWFzc2VydEZhbHNlKHRlc3RSdW5uYWJsZS5yYW4pOwotCQlDb21tYW5kIGNvbW1hbmQgPSBuZXcgUnVubmFibGVDb21tYW5kKHRlc3RSdW5uYWJsZSk7Ci0JCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQlhc3NlcnRUcnVlKHRlc3RSdW5uYWJsZS5yYW4pOwotCX0KLQotCXN0YXRpYyBjbGFzcyBTaW1wbGVUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWJvb2xlYW4gcmFuID0gZmFsc2U7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucmFuID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tYW5kUnVubmFibGUoKSB7Ci0JCVRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0ZXN0Q29tbWFuZCk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdENvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZExvY2FsQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kID0gbmV3IFRocmVhZExvY2FsQ29tbWFuZCgpOwotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMSA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kLCAxKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTEpOwotCQl0aHJlYWQxLnJ1bigpOwotCi0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUyID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmQsIDIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMik7Ci0JCXRocmVhZDIucnVuKCk7Ci0KLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kLmNvdW50KTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFJ1bm5hYmxlMi50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kOwotCQlmaW5hbCBpbnQgZXhlY3V0aW9uQ291bnQ7Ci0JCWZpbmFsIFRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCVRlc3RSdW5uYWJsZShUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kLCBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZCA9IHRocmVhZExvY2FsQ29tbWFuZDsKLQkJCXRoaXMuZXhlY3V0aW9uQ291bnQgPSBleGVjdXRpb25Db3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZC5zZXQodGhpcy50ZXN0Q29tbWFuZCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhlY3V0aW9uQ291bnQ7IGkrKykgewotCQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFiYzU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbW1hbmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbW1hbmRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlib29sZWFuIGNvbW1hbmQxRXhlY3V0ZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbW1hbmQyRXhlY3V0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBDb21wb3NpdGVDb21tYW5kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bigpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRoaXMuYnVpbGRDb21wb3NpdGVDb21tYW5kKCkpOwotCQlydW5uYWJsZS5ydW4oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbW1hbmQxRXhlY3V0ZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZDJFeGVjdXRlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbXBvc2l0ZUNvbW1hbmQoKSk7Ci0JCWFzc2VydE5vdE51bGwocnVubmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkQ29tcG9zaXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb21tYW5kKAotCQkJCQl0aGlzLmJ1aWxkQ29tbWFuZDEoKSwKLQkJCQkJdGhpcy5idWlsZENvbW1hbmQyKCkKLQkJCQkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbW1hbmQxKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbXBvc2l0ZUNvbW1hbmRUZXN0cy50aGlzLmNvbW1hbmQxRXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbW1hbmQyKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbXBvc2l0ZUNvbW1hbmRUZXN0cy50aGlzLmNvbW1hbmQyRXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA5N2YzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkV4Y2VwdGlvbkhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uSGFuZGxlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEV4Y2VwdGlvbkhhbmRsZXJUb1N0cmluZygpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZXhjZXB0aW9uSGFuZGxlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCUV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKG5wZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydFNhbWUobnBlLCBleC5nZXRDYXVzZSgpKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkhhbmRsZXJUb1N0cmluZygpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZXhjZXB0aW9uSGFuZGxlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODNiODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbGVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRmlsZSB0ZW1wRGlyOwotCi0JcHVibGljIEZpbGVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVtcERpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGhpcy5kZWxldGVEaXIodGhpcy50ZW1wRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMiwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDksIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnlDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBiZWVuIGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRlbnRzIG5vdCBkZWxldGVkIiwgZGlyLmxpc3RGaWxlcygpLmxlbmd0aCA9PSAwKTsKLQkJZGlyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvRmlsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSgidGhpcyB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZC4uLiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5VG9GaWxlKEZpbGUgZGVzdEZpbGUsIFN0cmluZyB3cml0ZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9EaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQlTdHJpbmcgd3JpdGVTdHJpbmcgPSAidGVzdENvcHlUb0RpcmVjdG9yeSI7Ci0KLQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGRpciIpOwotCQlkZXN0RGlyLm1rZGlyKCk7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQkJCi0JCUZpbGVUb29scy5jb3B5VG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgZGVzdERpcik7IC8vVHJ5IGFnYWluIHdpdGggdGhlIGRpcmVjdG9yeSBpcyBhbHJlYWR5IGNyZWF0ZWQKLQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlyZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByZWZpeCA9ICJYWFh0ZXN0RmlsZVhYWCI7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMSIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIHRlc3RGaWxlMiA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjIiKTsKLQkJdGVzdEZpbGUyLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlRmlsdGVyIGZpbHRlciA9IHRoaXMuYnVpbGRGaWxlRmlsdGVyKHByZWZpeCk7Ci0JCUl0ZXJhdG9yPEZpbGU+IGZpbHRlcmVkRmlsZXNJdGVyYXRvciA9IEZpbGVUb29scy5maWx0ZXIoRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyKSwgZmlsdGVyKTsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWx0ZXJlZEZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZmlsdGVyZWRGaWxlc0l0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkRmlsZXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMSkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUyKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlRmlsdGVyIGJ1aWxkRmlsZUZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLmJhciIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28seG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi4iLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcERpcjEgPSBGaWxlVG9vbHMudGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGVtcERpcjEsICJqdW5rIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSB0ZW1wRGlyMiA9IEZpbGVUb29scy5lbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlhc3NlcnRFcXVhbHModGVtcERpcjEsIHRlbXBEaXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wRGlyMi5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlbXBEaXIyLmxpc3RGaWxlcygpLmxlbmd0aCk7Ci0JCXRlbXBEaXIyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJmb28iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiZm9vIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXIiKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJheiIpOwotCQlGaWxlIGZpbGUzID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoZmlsZTEpOwotCQlhc3NlcnRFcXVhbHMoZmlsZTIsIGZpbGUzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0aEZpbGVzKCkgewotCQlGaWxlW10gZXhwZWN0ZWQ7Ci0JCUZpbGVbXSBhY3R1YWw7Ci0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCJDOi8iKSwgbmV3IEZpbGUoIkM6L2ZvbyIpLCBuZXcgRmlsZSgiQzovZm9vL2JhciIpLCBuZXcgRmlsZSgiQzovZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCQl9Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIi8iKSwgbmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIG5ldyBGaWxlKCIvZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoImZvbyIpLCBuZXcgRmlsZSgiZm9vL2JhciIpLCBuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoImZvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLi4iKSwgbmV3IEZpbGUoIi4uL2ZvbyIpLCBuZXcgRmlsZSgiLi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi4uL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLiIpLCBuZXcgRmlsZSgiLi9mb28iKSwgbmV3IEZpbGUoIi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEZpbGVbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicGF0aEZpbGVzIiwgRmlsZS5jbGFzcywgZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGFyZW50RmlsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgxKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDMpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgwKTsKLQkJCWZhaWwoImludmFsaWQgcmV0dXJuOiAiICsgZmlsZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4LmdldENhdXNlKCk7Ci0JCQkJaWYgKGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlyZXR1cm4gKEZpbGUpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKEZpbGVUb29scy5jbGFzcywgInJlbGF0aXZlUGFyZW50RmlsZSIsIGludC5jbGFzcywgbmV3IEludGVnZXIobGVuKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1JlbGF0aXZlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoIi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJkaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4iKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIHJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIHJlbGF0aXZlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0Fic29sdXRlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkM6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiLy4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQkvLyB0b28gbWFueSAiLi4iIGRpcmVjdG9yaWVzIHdpbGwgcmVzb2x2ZSB0byB0aGUgcm9vdDsKLQkJLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggV2luZG93cyBhbmQgTGludXggY29tbWFuZCBzaGVsbHMKLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIiksIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSXNSZXNlcnZlZCgpIHsKLQkJYm9vbGVhbiBleHBlY3RlZCA9IFRvb2xzLm9zSXNXaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09OIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNvbiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJjT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQVVYIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIkNPTTMiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiTFBUMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJuVUwiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiUHJuIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gVG9vbHMub3NJc1dpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiQzovQ09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiL2Nvbi9mb28iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJjOi90ZW1wL2NPTiIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImJhci8vYmF6Ly9BVVgiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDT00zLy90dHQiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJkOi9MUFQzL3h4eCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L215IGRvY3MgYW5kIHN0dWZmL3R1ZXNkYXkvblVMIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiUHJuIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lRmlsZSgpIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIkM6LyIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9ob21lIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZSIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGVJbnQoKSB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxUaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjgsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjYsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxXaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIkM6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMTm9uV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS9hZG1pbmlzdHJhdG9yLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkxJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzNCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYSBuZXcgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QsIHRvIHByZXZlbnQgYW55IGNyb3NzLXRlc3QgZWZmZWN0cwotCQlGaWxlIGRpciA9IEZpbGVUb29scy5uZXdUZW1wb3JhcnlEaXJlY3RvcnkodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQotCQlGaWxlIGZpbGUwYSA9IG5ldyBGaWxlKGRpciwgImZpbGUwYSIpOwotCQlmaWxlMGEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYiA9IG5ldyBGaWxlKGRpciwgImZpbGUwYiIpOwotCQlmaWxlMGIuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYyA9IG5ldyBGaWxlKGRpciwgImZpbGUwYyIpOwotCQlmaWxlMGMuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMSA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjEiKTsKLQkJc3ViZGlyMS5ta2RpcigpOwotCQlGaWxlIGZpbGUxYSA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWEiKTsKLQkJZmlsZTFhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMWIgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFiIik7Ci0JCWZpbGUxYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIyID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMiIpOwotCQlzdWJkaXIyLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTJhID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYSIpOwotCQlmaWxlMmEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUyYiA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmIiKTsKLQkJZmlsZTJiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjMgPSBuZXcgRmlsZShzdWJkaXIyLCAic3ViZGlyMyIpOwotCQlzdWJkaXIzLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTNhID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYSIpOwotCQlmaWxlM2EuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2IiKTsKLQkJZmlsZTNiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3YTBhMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShmaWx0ZXIsIFRlc3RUb29scy5zZXJpYWxpemUoZmlsdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCIiKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiYmFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGFxdWVGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShmaWx0ZXIsIFRlc3RUb29scy5zZXJpYWxpemUoZmlsdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEZpbHRlcl90b1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYTEwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCXRoaXMuYmFnLmFkZCgibWludXMzIiwgLTMpOwotCQl0aGlzLmJhZy5hZGQoInplcm8iLCAwKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIiwgNSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm1pbnVzMyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0KLQkJdGhpcy5iYWcuYWRkKCJ0aHJlZSIsIDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvIiArICJ1ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQliYWcyLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYmFnMikpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJhZyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxCYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlCYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHMoImZvdXIiKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaGluZ0Rpc3RyaWJ1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0KLQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBiaWdCYWcuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJ0YWJsZSIpOwotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlPYmplY3RbXSB0YWJsZSA9IChPYmplY3RbXSkgZmllbGQuZ2V0KGJpZ0JhZyk7Ci0JCWludCBidWNrZXRDb3VudCA9IHRhYmxlLmxlbmd0aDsKLQkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLQkJZm9yIChPYmplY3QgbyA6IHRhYmxlKSB7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLQkJCX0KLQkJfQotCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpIC8gKChmbG9hdCkgYnVja2V0Q291bnQpOwotCQlpZiAoKGxvYWRGYWN0b3IgPCAwLjIwKSB8fCAobG9hZEZhY3RvciA+IDAuODApKSB7Ci0JCQlTdHJpbmcgbXNnID0gInBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yOwotCQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCQlmYWlsKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24uLi4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpICsgIiAtICIgKyBtc2cpOwotCQkJCVRlc3RUb29scy5wcmludFN5c3RlbVByb3BlcnRpZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgib25lIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1sxMl07Ci0JCWFbMTFdID0gIm5vdCBudWxsIjsKLQkJU3RyaW5nW10gYiA9IHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCWFzc2VydEVxdWFscyhhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKGFbMTFdID09IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3MzhiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0JcHJpdmF0ZSBTdHJpbmcgb25lID0gIm9uZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHdvID0gInR3byI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGhyZWUgPSAidGhyZWUiOwotCXByaXZhdGUgU3RyaW5nIGZvdXIgPSAiZm91ciI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm9vID0gImZvbyI7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFyID0gImJhciI7Ci0KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5iYWcgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQobnVsbCk7Ci0JCXJlc3VsdC5hZGQodGhpcy5vbmUpOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnR3byk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gbG9jYWxCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGxvY2FsQmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZChmaXZlKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhmaXZlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3VudCgpIHsKLQkJU3RyaW5nIG1pbnVzMyA9ICJtaW51czMiOwotCQlTdHJpbmcgemVybyA9ICJ6ZXJvIjsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKG1pbnVzMywgLTMpOwotCQl0aGlzLmJhZy5hZGQoemVybywgMCk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhtaW51czMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoemVybykpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KHRoaXMudHdvKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KGZpdmUpKTsKLQotCQl0aGlzLmJhZy5hZGQodGhpcy50aHJlZSwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5iYWcuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFkIGNsb25lIiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNsb25lIiwgdGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpID09IGJhZzIuaGFzaENvZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQodGhpcy50d28pOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYy5hZGQodGhpcy5mb3VyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIXRoaXMuZm91ci5lcXVhbHMobmV4dCkpIHsKLQkJCW5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnLkVudHJ5PFN0cmluZz4+IGl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscyh0aGlzLmZvdXIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmlnQmFnID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0JCi0JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJT2JqZWN0W10gdGFibGUgPSAoT2JqZWN0W10pIGZpZWxkLmdldChiaWdCYWcpOwotCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0JCWludCBmaWxsZWRCdWNrZXRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgewotCQkJaWYgKHRhYmxlW2ldICE9IG51bGwpIHsKLQkJCQlmaWxsZWRCdWNrZXRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWZsb2F0IGxvYWRGYWN0b3IgPSAoKGZsb2F0KSBmaWxsZWRCdWNrZXRDb3VudCkgLyAoKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0JCWlmICgobG9hZEZhY3RvciA8IDAuMjApIHx8IChsb2FkRmFjdG9yID4gMC44MCkpIHsKLQkJCVN0cmluZyBtc2cgPSAicG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3I7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJCWZhaWwobXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcG9vciBsb2FkIGZhY3RvciBpcyBzZWVuIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IGZvciBzb21lIHJlYXNvbi4uLgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKyAiIC0gIiArIG1zZyk7Ci0JCQkJVGVzdFRvb2xzLnByaW50U3lzdGVtUHJvcGVydGllcygpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUobmV3IFN0cmluZyh0aGlzLnRocmVlKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ291bnQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSwgMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUsIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAtMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSwgMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQobmV3IFN0cmluZyhmaXZlKSk7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmFnMiA9IFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5iYWcpOwotCQotCQlhc3NlcnRUcnVlKCJzYW1lIG9iamVjdD8iLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBiYWcyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnLml0ZXJhdG9yKCkpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygiZm91ciIpKTsKLQkKLQkJaW50IG51bGxDb3VudCA9IDAsIG9uZUNvdW50ID0gMCwgdHdvQ291bnQgPSAwLCB0aHJlZUNvdW50ID0gMCwgZm91ckNvdW50ID0gMDsKLQkJZm9yIChTdHJpbmcgbmV4dCA6IGJhZzIpIHsKLQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJbnVsbENvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygib25lIikpCi0JCQkJb25lQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJ0d28iKSkKLQkJCQl0d29Db3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoInRocmVlIikpCi0JCQkJdGhyZWVDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoImZvdXIiKSkKLQkJCQlmb3VyQ291bnQrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgbnVsbENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHR3b0NvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRocmVlQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm91ckNvdW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZShhWzExXSA9PSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocy5zdGFydHNXaXRoKCJbIikpOwotCQlhc3NlcnRUcnVlKHMuZW5kc1dpdGgoIl0iKSk7Ci0JCWludCBjb21tYUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChzLmNoYXJBdChpKSA9PSAnLCcpIHsKLQkJCQljb21tYUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIG51bWJlciBvZiBjb21tYXMiLCAxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDMzMWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlTdHJpbmdXcml0ZXIgc3cxOwotCVN0cmluZ1dyaXRlciBzdzI7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MTsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcyOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3cxID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzEgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzEpOwotCQl0aGlzLnN3MiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cyLCAiICAgICIpOyAvLyBpbmRlbnQgd2l0aCA0IHNwYWNlcyBpbnN0ZWFkIG9mIGEgdGFiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUYWIoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRcdGZvbzIiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3MS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRTcGFjZXMoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICAgICAgZm9vMiIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3Mi50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzNDYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSkRCQ1R5cGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1R5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZXNTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgsIEpEQkNUeXBlLnR5cGVzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgamRiY1R5cGUubmFtZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5WQVJDSEFSLCBqZGJjVHlwZS5jb2RlKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLklOVEVHRVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoNTUpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoIlZBUkNIQVIyIik7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTA3YTAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKG51bGwsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKCIiLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJyYXlEZXB0aE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCAtMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZvaWRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSwgMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlKYXZhQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFDbGFzcywgamF2YVR5cGUuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaWJlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiMTgxYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uVXRpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9ucy5KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlcy5KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9ycy5KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLkpwdFV0aWxpdHlNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlLkpwdFV0aWxpdHlOb2RlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnMuSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0czsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25VdGlsaXR5VGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvbW1vblV0aWxpdHlUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlOb2RlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5zdWl0ZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpZGlGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQmlkaVRyYW5zZm9ybWVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQml0VG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVCb29sZWFuUmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NOYW1lVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZEV4ZWN1dG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFJ1bm5hYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbW1hbmRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGNlcHRpb25IYW5kbGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElkZW50aXR5SGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKREJDVHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEtleWVkU2V0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdGVuZXJMaXN0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kU2lnbmF0dXJlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmFtZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTm90TnVsbEZpbHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJhbmdlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGlvblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVBc3NvY2lhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVF1ZXVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlU3RhY2tUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZFN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYTUxTdHJpbmdFbmNvZGVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvbW1vblV0aWxpdHlUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvS2V5ZWRTZXRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0tleWVkU2V0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyN2U1ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvS2V5ZWRTZXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgS2V5ZWRTZXRUZXN0cwotCQlleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgU3RyaW5nPiBuaWNrbmFtZXM7Ci0JCi0JCi0JcHVibGljIEtleWVkU2V0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubmlja25hbWVzID0gdGhpcy5idWlsZE5pY2tuYW1lcygpOwotCX0KLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgU3RyaW5nPiBidWlsZE5pY2tuYW1lcygpIHsKLQkJS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+IGtzID0gbmV3IEtleWVkU2V0PFN0cmluZywgU3RyaW5nPigpOwotCQlrcy5hZGRJdGVtKCJKaW1teSIsICJKYW1lcyBTdWxsaXZhbiIpOwotCQlrcy5hZGRLZXkoIlN1bGx5IiwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWtzLmFkZEl0ZW0oIkJvYiIsICJSb2JlcnQgTWNLZW5uYSIpOwotCQlrcy5hZGRLZXkoIk1hYyIsICJSb2JlcnQgTWNLZW5uYSIpOwotCQlyZXR1cm4ga3M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW0oKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIlJvYmVydCBNY0tlbm5hIikpOwotCQkKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKb2huIFRlYXNkYWxlIikpOwotCQl0aGlzLm5pY2tuYW1lcy5hZGRJdGVtKCJKYWNrIiwgIkpvaG4gVGVhc2RhbGUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkpvaG4gVGVhc2RhbGUiKSk7Ci0JCQotCQl0aGlzLm5pY2tuYW1lcy5hZGRJdGVtKCJUZWFzZXIiLCAiSm9obiBUZWFzZGFsZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSm9obiBUZWFzZGFsZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiVGVhc2VyIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkS2V5KCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkJvYiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiTWFjIikpOwotCQkKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlJvYmJpZSIpKTsKLQkJdGhpcy5uaWNrbmFtZXMuYWRkS2V5KCJSb2JiaWUiLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiUm9iYmllIikpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25DYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMubmlja25hbWVzLmFkZEtleSgiVGVhc2VyIiwgIkpvaG4gVGVhc2RhbGUiKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJZXhjZXB0aW9uQ2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvbkNhdWdodCk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SXRlbSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIkppbW15IiksICJKYW1lcyBTdWxsaXZhbiIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiU3VsbHkiKSwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJCb2IiKSwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJNYWMiKSwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCWFzc2VydE51bGwodGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiSmFjayIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW0oKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVJdGVtKCJXaWxsaWFtIEdvbGRiZXJnIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlS2V5KCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMucmVtb3ZlS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVLZXkoIlN1bGx5IikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLnJlbW92ZUtleSgiQmlsbHkiKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0xpc3RlbmVyTGlzdFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMGY1Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdGVuZXJMaXN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJSXRlcmFibGU8TGlzdGVuZXI+IGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGxpc3RlbmVycykpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShsaXN0ZW5lcnMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJzLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5zaXplKCkpOwotCi0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWFzc2VydFRydWUobGlzdGVuZXJMaXN0LmlzRW1wdHkoKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRfbnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChudWxsKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZF9kdXBsaWNhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZV9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBsaXN0ZW5lciBsaXN0OiAiICsgbGlzdGVuZXJMaXN0KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX3VucmVnaXN0ZXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5jbGVhcigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjEpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCAoTGludXgvSUJNIFZNKSBmb3Igc29tZSByZWFzb24KLQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2VyaWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCi0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0MiA9IFRlc3RUb29scy5zZXJpYWxpemUobGlzdGVuZXJMaXN0KTsKLQkJYXNzZXJ0Tm90U2FtZShsaXN0ZW5lckxpc3QsIGxpc3RlbmVyTGlzdDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0Mi5zaXplKCkpOwotCi0JCUxpc3RlbmVyIGxpc3RlbmVyMyA9IG5ldyBOb25TZXJpYWxpemFibGVMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMyk7Ci0KLQkJbGlzdGVuZXJMaXN0MiA9IFRlc3RUb29scy5zZXJpYWxpemUobGlzdGVuZXJMaXN0KTsKLQkJYXNzZXJ0Tm90U2FtZShsaXN0ZW5lckxpc3QsIGxpc3RlbmVyTGlzdDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJMaXN0Mi5zaXplKCkpOwotCi0JfQotCi0JaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgc29tZXRoaW5nSGFwcGVuZWQoKTsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHZvaWQgc29tZXRoaW5nSGFwcGVuZWQoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIE5vblNlcmlhbGl6YWJsZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NZXRob2RTaWduYXR1cmVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL01ldGhvZFNpZ25hdHVyZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NThlMmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL01ldGhvZFNpZ25hdHVyZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1ldGhvZFNpZ25hdHVyZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE1ldGhvZFNpZ25hdHVyZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoKFN0cmluZykgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTmFtZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCIiKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChKYXZhVHlwZVtdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzVm9pZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUganQgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcy5nZXROYW1lKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IEphdmFUeXBlW10ge2p0fSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZU5hbWVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKFN0cmluZ1tdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IFN0cmluZ1sxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVySmF2YUNsYXNzZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoQ2xhc3M8Pz5bXSkgbnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVySmF2YUNsYXNzZXNOdWxsSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgbmV3IENsYXNzWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QwKCkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QxKGludCkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyKGludCwgamF2YS5sYW5nLlN0cmluZykiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpZ25hdHVyZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QzKGludCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdW10pIiwgbXMuZ2V0U2lnbmF0dXJlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDIiKSk7Ci0JCWFzc2VydEVxdWFscygibWV0aG9kMiIsIG1zLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFBhcmFtZXRlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1ldGhvZFNpZ25hdHVyZSBtcyA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCUphdmFUeXBlW10gZXhwZWN0ZWQgPSBuZXcgSmF2YVR5cGVbM107Ci0JCWV4cGVjdGVkWzBdID0gbmV3IFNpbXBsZUphdmFUeXBlKCJpbnQiKTsKLQkJZXhwZWN0ZWRbMV0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImphdmEubGFuZy5TdHJpbmciKTsKLQkJZXhwZWN0ZWRbMl0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImphdmEubGFuZy5PYmplY3QiLCAyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBtcy5nZXRQYXJhbWV0ZXJUeXBlcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgbXMxID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJT2JqZWN0IG1zMiA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczEpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLmhhc2hDb2RlKCksIG1zMi5oYXNoQ29kZSgpKTsKLQotCQlPYmplY3QgbXMzID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMyk7Ci0JCWFzc2VydEZhbHNlKG1zMS5lcXVhbHMobXMzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMyID0gKFNpbXBsZU1ldGhvZFNpZ25hdHVyZSkgbXMxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlTaW1wbGVNZXRob2RTaWduYXR1cmUgbXMyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShtczEpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMyKTsKLQkJYXNzZXJ0RXF1YWxzKG1zMSwgbXMyKTsKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2Qgbm90IGZvdW5kOiAiICsgbWV0aG9kTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWV0aG9kMCgpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZDEoaW50IGZvbykgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kMihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2QzKGludCBmb28sIFN0cmluZyBiYXIsIE9iamVjdFtdW10gYmF6KSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEEoaW50IGZvbywgU3RyaW5nIGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQShpbnQgZm9vLCBTdHJpbmcgYmFyLCBTdHJpbmcgYmF6KSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZEIoaW50IGZvbywgT2JqZWN0IGJhcikgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTXVsdGlUaHJlYWRlZFRlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTXVsdGlUaHJlYWRlZFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYWMzMTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL011bHRpVGhyZWFkZWRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRoaXMgdGVzdCBjYXNlIGhlbHBzIHNpbXBsaWZ5IHRoZSB0ZXN0aW5nIG9mIG11bHRpLXRocmVhZGVkIGNvZGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PFRocmVhZD4oKTsKLQkvKiBwcml2YXRlICovIGZpbmFsIFZlY3RvcjxUaHJvd2FibGU+IGV4Y2VwdGlvbnMgPSBuZXcgVmVjdG9yPFRocm93YWJsZT4oKTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0ICJ0aWNrIiBpcyBvbmUgc2Vjb25kLgotCSAqIFNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIHN5c3RlbSBwcm9wZXJ0eSB0byBvdmVycmlkZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSUNLX1NZU1RFTV9QUk9QRVJUWV9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy50aWNrIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElDSyA9IExvbmcuZ2V0TG9uZyhUSUNLX1NZU1RFTV9QUk9QRVJUWV9OQU1FLCAxMDAwKS5sb25nVmFsdWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVFdPX1RJQ0tTID0gMiAqIFRJQ0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFRIUkVFX1RJQ0tTID0gMyAqIFRJQ0s7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBNdWx0aVRocmVhZGVkVGVzdENhc2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTmFtZWQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE11bHRpVGhyZWFkZWRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgYWxsIHRoZSB0aHJlYWRzIGNvbnN0cnVjdGVkIGR1cmluZyB0aGUgdGVzdCBjYXNlLgotCSAqIElmIGFueSBleGNlcHRpb25zIHdlcmUgdGhyb3duIGJ5IHRoZSB0aHJlYWRzLCByZS10aHJvdyB0aGVtIGhlcmUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChUaHJlYWQgdGhyZWFkIDogdGhpcy50aHJlYWRzKSB7Ci0JCQlpZiAodGhyZWFkLmlzQWxpdmUoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRocmVhZCBpcyBzdGlsbCBhbGl2ZTogIiArIHRocmVhZCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCAhIHRoaXMuZXhjZXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCXRocm93IG5ldyBDb21wb3NpdGVFeGNlcHRpb24odGhpcy5leGNlcHRpb25zKTsKLQkJfQotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZCBidWlsZFRocmVhZChSdW5uYWJsZSBydW5uYWJsZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZCBidWlsZFRocmVhZChSdW5uYWJsZSBydW5uYWJsZSwgU3RyaW5nIG5hbWUpIHsKLQkJVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlV3JhcHBlcihydW5uYWJsZSkpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aHJlYWQuc2V0TmFtZShuYW1lKTsKLQkJfQotCQl0aGlzLnRocmVhZHMuYWRkKHRocmVhZCk7Ci0JCXJldHVybiB0aHJlYWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFRocmVhZEZhY3RvcnkgYnVpbGRUaHJlYWRGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFRlc3RUaHJlYWRGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFuZGxlcyB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259LgotCSAqLwotCXB1YmxpYyB2b2lkIHNsZWVwKGxvbmcgbWlsbGlzKSB7Ci0JCVRlc3RUb29scy5zbGVlcChtaWxsaXMpOwotCX0KLQotCi0JLyoqCi0JICogV3JhcCBhIHJ1bm5hYmxlIGFuZCBsb2cgYW55IGV4Y2VwdGlvbiBpdCB0aHJvd3MuCi0JICovCi0JcHVibGljIGNsYXNzIFRlc3RUaHJlYWRGYWN0b3J5IGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeSB7Ci0JCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJCXJldHVybiBNdWx0aVRocmVhZGVkVGVzdENhc2UudGhpcy5idWlsZFRocmVhZChyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbXBsaWZ5IHJ1bm5hYmxlcyB0aGF0IGV4ZWN1dGUgY2FsbCB0aGF0IHRocm93cyBjaGVja2VkIGV4Y2VwdGlvbnMuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIGZpbmFsIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnJ1bl8oKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGEgcnVubmFibGUgYW5kIGxvZyBhbnkgZXhjZXB0aW9uIGl0IHRocm93cy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFJ1bm5hYmxlV3JhcHBlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKLQkJUnVubmFibGVXcmFwcGVyKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ydW5uYWJsZSA9IHJ1bm5hYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5ydW5uYWJsZS5ydW4oKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBleCkgewotCQkJCU11bHRpVGhyZWFkZWRUZXN0Q2FzZS50aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9OYW1lVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ODZhYWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5hbWVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE5hbWVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBYnNlbnRJZ25vcmVDYXNlKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRhdXBlIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXVwZSIsIHJldHVybmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUHJlc2VudENhc2VEaWZmZXJzKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiZ3JlZW4iLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImdyZWVuIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50SWdub3JlQ2FzZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJU3RyaW5nIHJldHVybmVkID0gTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJncmVlbiIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZ3JlZW4yIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50V2l0aEFwcGVuZGljZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgicmVkMiIpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoInJlZCIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5yZW1vdmUoIlJlZDEiKTsKLQkJY29sb3JDb2xsZWN0aW9uLnJlbW92ZSgicmVkMiIpOwotCQlhc3NlcnRFcXVhbHMoInJlZDMiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDb2xvckNvbGxlY3Rpb24oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiUmVkIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIk9yYW5nZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJZZWxsb3ciKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiR3JlZW4iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiQmx1ZSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJJbmRpZ28iKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiVmlvbGV0Iik7Ci0JCXJldHVybiBjb2xvckNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9yQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncykpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIENvcnBvcmF0aW9uIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUxIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbCIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCi0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JJdGVyYXRvcjMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMiIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlMSIpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJPcmFjbGUiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiY2F0YWxvZy5zY2hlbWEubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgiY2F0YWxvZyIsICJzY2hlbWEiLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjYXRhbG9nLi5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCJjYXRhbG9nIiwgbnVsbCwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygic2NoZW1hLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUobnVsbCwgInNjaGVtYSIsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUobnVsbCwgbnVsbCwgIm5hbWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFSZXNlcnZlZFdvcmRzKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgImNsYXNzIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJDbGFzcyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTmFtZVRvb2xzLmphdmFSZXNlcnZlZFdvcmRzKCksICJwcml2YXRlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Rjb252ZXJ0VG9KYXZhSWRlbnRpZmllclN0cmluZygpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28xIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28xIikpOwotCQlhc3NlcnRFcXVhbHMoInByaXZhdGVfIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIikpOwotCQlhc3NlcnRFcXVhbHMoInRocm93XyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigidGhyb3ciKSk7Ci0JCWFzc2VydEVxdWFscygiX2ZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28lIikpOwotCQlhc3NlcnRFcXVhbHMoImZvb19fYmFyX18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyAgYmFyICAiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdGNvbnZlcnRUb0phdmFJZGVudGlmaWVyU3RyaW5nQ2hhcigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbzEiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcml2YXRlJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoInRocm93c3MiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInRocm93IiwgJ3MnKSk7Ci0JCWFzc2VydEVxdWFscygiJGZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiLCAnJCcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28kJGJhciQkIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJmb28gIGJhciAgIiwgJyQnKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoIjFmb28iLCAnNycpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJzcnKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiLCAnXicpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJ14nKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nIHMgPSBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiLCAnXicpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6IFwiIiArIHMgKyAiXCIiKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoJ14nKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoKSB7Ci0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImNsYXNzIikpOwotCQlhc3NlcnRUcnVlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImNsYXNTIikpOwotCi0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoIjdmb28iKSk7Ci0JCWFzc2VydEZhbHNlKE5hbWVUb29scy5zdHJpbmdJc0xlZ2FsSmF2YUlkZW50aWZpZXIoImZvb0BiYXIiKSk7Ci0JCWFzc2VydFRydWUoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiX2ZvbyIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmMDY3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTm90TnVsbEZpbHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5vdE51bGxGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBOb3ROdWxsRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdE51bGxGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IE5vdE51bGxGaWx0ZXIuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCIiKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQobnVsbCkpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBOb3ROdWxsRmlsdGVyLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SYW5nZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDk1OTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLQotcHVibGljIGNsYXNzIFJhbmdlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmFuZ2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZXMoKSB7Ci0JCVJhbmdlIHJhbmdlID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoLTU1KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDApKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoNCkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDUpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcyg2KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoMTYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNykpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygxOCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygyMDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDE3LCA1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQkJLy8gYWx0aG91Z2ggdGhleSBhcmUgdW5lcXVhbCwgdGhleSBjYW4gaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0KLQkJcmFuZ2UyID0gbmV3IFJhbmdlKDUsIDE1KTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UxLmVxdWFscyhyYW5nZTIpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UyLmVxdWFscyhyYW5nZTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IHJhbmdlMS5jbG9uZSgpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShyYW5nZTEpOwotCQlhc3NlcnROb3RTYW1lKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMSwgcmFuZ2UyKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMiwgcmFuZ2UxKTsKLQkJYXNzZXJ0RXF1YWxzKHJhbmdlMS5oYXNoQ29kZSgpLCByYW5nZTIuaGFzaENvZGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjEwY2IwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0U3RhdGljRmllbGQ7Ci0KLQlwdWJsaWMgUmVmbGVjdGlvblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0vLyB0aGlzIGlzIG5vIGxvbmdlciB0cnVlIC0gaXQgYXBwZWFycyB0aGUgSkxTIG5vdyBkZWZpbmVzIHRoZSBnZW5lcmF0ZWQgbmFtZXMuLi4KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgY2xhc3MgbmFtZS4gVGhlIEVjbGlwc2UgY29tcGlsZXIgZ2VuZXJhdGVzCi0vLwkgKiAibG9jYWwiIGNsYXNzZXMgd2l0aCBuYW1lcyBpbiB0aGUgZm9ybSAiY29tLmZvby5PdXRlciQxJExvY2FsIjsgd2hpbGUgdGhlCi0vLwkgKiBKREsgY29tcGlsZXIgZ2VuZXJhdGVzICJjb20uZm9vLk91dGVyJDFMb2NhbCIuIFRoZXJlIG1pZ2h0IGJlIG90aGVyCi0vLwkgKiBkaWZmZXJlbmNlcy4uLi4gfmJqdgotLy8JICovCi0vLwlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21waWxlckRlcGVuZGVudENsYXNzTmFtZUZvcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0vLwkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoIiQxJCIpOwotLy8JCWlmIChpbmRleCA9PSAtMSkgewotLy8JCQlyZXR1cm4gY2xhc3NOYW1lOwotLy8JCX0KLS8vCQl0cnkgewotLy8JCQlDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0vLwkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotLy8JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBpbmRleCArIDIpICsgY2xhc3NOYW1lLnN1YnN0cmluZyhpbmRleCArIDMpOwotLy8JCX0KLS8vCQlyZXR1cm4gY2xhc3NOYW1lOwotLy8JfQotLy8KLS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBtdW5nZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0vLwkJcmV0dXJuIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKGNsYXNzTmFtZSk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmllbGRzKCkgewotCQlpbnQgZmllbGRDb3VudCA9IDA7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJSXRlcmFibGU8RmllbGQ+IGZpZWxkcyA9IFJlZmxlY3Rpb25Ub29scy5nZXRBbGxGaWVsZHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhmaWVsZENvdW50LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShmaWVsZHMpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJtb2RDb3VudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJzZXJpYWxWZXJzaW9uVUlEIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgImNhcGFjaXR5SW5jcmVtZW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgImVsZW1lbnRDb3VudCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5maWVsZE5hbWVzKGZpZWxkcyksICJlbGVtZW50RGF0YSIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZHMuaXRlcmF0b3IoKS5uZXh0KCkuaXNBY2Nlc3NpYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxNZXRob2RzKCkgewotCQlpbnQgbWV0aG9kQ291bnQgPSAwOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0TGlzdC5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJSXRlcmFibGU8TWV0aG9kPiBtZXRob2RzID0gUmVmbGVjdGlvblRvb2xzLmdldEFsbE1ldGhvZHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RDb3VudCwgQ29sbGVjdGlvblRvb2xzLnNpemUobWV0aG9kcykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm1ldGhvZE5hbWVzKG1ldGhvZHMpLCAid2FpdCIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5tZXRob2ROYW1lcyhtZXRob2RzKSwgImFkZEVsZW1lbnQiKSk7Ci0JCWFzc2VydFRydWUobWV0aG9kcy5pdGVyYXRvcigpLm5leHQoKS5pc0FjY2Vzc2libGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3MoKSB7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NPYmplY3QoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIGludC5jbGFzcywgbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KSk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzc0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGludC5jbGFzczsKLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0WzFdOwotCQlwYXJtc1swXSA9IG5ldyBJbnRlZ2VyKGluaXRpYWxDYXBhY2l0eSk7Ci0JCVZlY3Rvcjw/PiB2ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIHBhcm1UeXBlcywgcGFybXMpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0KLQkJcGFybXNbMF0gPSBuZXcgSW50ZWdlcigtMSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJSdW50aW1lRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJcGFybVR5cGVzWzBdID0gamF2YS5sYW5nLlN0cmluZy5jbGFzczsKLQkJcGFybXNbMF0gPSAiZm9vIjsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZFZhbHVlKCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlWZWN0b3I8Pz4gdiA9IG5ldyBWZWN0b3I8T2JqZWN0Pihpbml0aWFsQ2FwYWNpdHkpOwotCQlPYmplY3RbXSBlbGVtZW50RGF0YSA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIik7Ci0JCWFzc2VydEVxdWFscyhpbml0aWFsQ2FwYWNpdHksIGVsZW1lbnREYXRhLmxlbmd0aCk7Ci0KLQkJLy8gdGVzdCBpbmhlcml0ZWQgZmllbGQKLQkJSW50ZWdlciBtb2RDb3VudEludGVnZXIgPSAoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUodiwgIm1vZENvdW50Iik7Ci0JCWludCBtb2RDb3VudCA9IG1vZENvdW50SW50ZWdlci5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbW9kQ291bnQpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzRmllbGRWYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c0ZpZWxkVmFsdWUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiYm9ndXNGaWVsZCIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaEZpZWxkRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c0ZpZWxkVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZygpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlpbnQgc2l6ZSA9ICgoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgInNpemUiKSkuaW50VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNpemUpOwotCi0JCXYuYWRkRWxlbWVudCgiZm9vIik7Ci0JCXNpemUgPSAoKEludGVnZXIpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJzaXplIikpLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygxLCBzaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZCIsIE9iamVjdC5jbGFzcywgImZvbyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShib29sZWFuUmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0JCU9iamVjdCB2b2lkUmVzdWx0ID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZEVsZW1lbnQiLCBPYmplY3QuY2xhc3MsICJiYXIiKTsKLQkJYXNzZXJ0TnVsbCh2b2lkUmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU1ldGhvZE9iamVjdFN0cmluZ0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gamF2YS5sYW5nLk9iamVjdC5jbGFzczsKLQkJT2JqZWN0W10gcGFybXMgPSBuZXcgT2JqZWN0WzFdOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlib29sZWFuIGJvb2xlYW5SZXN1bHQgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJhZGQiLCBwYXJtVHlwZXMsIHBhcm1zKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoYm9vbGVhblJlc3VsdCk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHYsICJib2d1c01ldGhvZCIsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZVN0YXRpY01ldGhvZENsYXNzU3RyaW5nKCkgewotCQlEb3VibGUgcmFuZG9tT2JqZWN0ID0gKERvdWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLk1hdGguY2xhc3MsICJyYW5kb20iKTsKLQkJYXNzZXJ0Tm90TnVsbChyYW5kb21PYmplY3QpOwotCQlkb3VibGUgcmFuZG9tID0gcmFuZG9tT2JqZWN0LmRvdWJsZVZhbHVlKCk7Ci0JCWFzc2VydFRydWUocmFuZG9tID49IDApOwotCQlhc3NlcnRUcnVlKHJhbmRvbSA8IDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc09iamVjdCgpIHsKLQkJU3RyaW5nIHMgPSAoU3RyaW5nKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidmFsdWVPZiIsIGJvb2xlYW4uY2xhc3MsIEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmdDbGFzc0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBib29sZWFuLmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gQm9vbGVhbi5UUlVFOwotCQlTdHJpbmcgcyA9IChTdHJpbmcpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ2YWx1ZU9mIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCWFzc2VydE5vdE51bGwocyk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIHMpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBudWxsOwotCQl0cnkgewotCQkJYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJib2d1c1N0YXRpY01ldGhvZCIsIHBhcm1UeXBlcywgcGFybXMpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hNZXRob2RFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUsIGV4Q2F1Z2h0KTsKLQotCQkvLyB0ZXN0IG5vbi1zdGF0aWMgbWV0aG9kCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInRvU3RyaW5nIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGaWVsZFZhbHVlKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCU9iamVjdFtdIG5ld0VsZW1lbnREYXRhID0gbmV3IE9iamVjdFs1XTsKLQkJbmV3RWxlbWVudERhdGFbMF0gPSAiZm9vIjsKLQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUodiwgImVsZW1lbnREYXRhIiwgbmV3RWxlbWVudERhdGEpOwotCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudENvdW50IiwgbmV3IEludGVnZXIoMSkpOwotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWlucygiZm9vIikpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5zZXRGaWVsZFZhbHVlKHYsICJib2d1c0ZpZWxkIiwgImZvbyIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE5vU3VjaEZpZWxkRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEZpZWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFN0YXRpY0ZpZWxkVmFsdWUoKSB7Ci0JCVJlZmxlY3Rpb25Ub29scy5zZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgInRlc3RTdGF0aWNGaWVsZCIsICJuZXcgdmFsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKHRlc3RTdGF0aWNGaWVsZCwgIm5ldyB2YWx1ZSIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5zZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0Q2xhc3MoKSwgImJvZ3VzU3RhdGljRmllbGQiLCAibmV3IHZhbHVlIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoRmllbGRFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJWZWN0b3IiLCBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRW50cnkiLCBqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaW50LmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBpbnRbXS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCBpbnRbXVtdLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIHZvaWQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsIiwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwiLCBqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aCh2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGludFtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVGb3IoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoamF2YS51dGlsLlZlY3Rvci5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUodm9pZC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShpbnRbXVtdW10uY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkZsb2F0LmNsYXNzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGludC5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Wb2lkLmNsYXNzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkZsb2F0LmNsYXNzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcih2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGludC5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVyQ2xhc3MoKSB7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuVm9pZC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyh2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuSW50ZWdlci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5GbG9hdC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhmbG9hdC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRXcmFwcGVyQ2xhc3MoYm9vbGVhbi5jbGFzcykpOwotCi0JCWFzc2VydE51bGwoUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W11bXVtdLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJ2b2lkIiwgMCkpOwotCQl0cnkgewotCQkJUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCAxKTsKLQkJCWZhaWwoInNob3VsZCBub3QgZ2V0IGhlcmUuLi4iKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2RlRm9yQ2xhc3MoKSB7Ci0JCWFzc2VydEVxdWFscygnSScsIFJlZmxlY3Rpb25Ub29scy5nZXRDb2RlRm9yQ2xhc3MoaW50LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIFJlZmxlY3Rpb25Ub29scy5nZXRDb2RlRm9yQ2xhc3MoYnl0ZS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0kiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQgWyBdIFsgXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0XHRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuT2JqZWN0OyIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdXHRbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQgWyBdIikpOwotCQlhc3NlcnRFcXVhbHMoMywgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W10iKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50W11bXVtdIikpOwotCi0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IFsgXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0W10gW10gW10iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZ0ludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMCkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAxKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE9iamVjdC5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhPYmplY3RbXVtdW10uY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigidm9pZCIsIDApKTsKLQkJdHJ5IHsKLQkJCVJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24odm9pZC5jbGFzcy5nZXROYW1lKCksIDEpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZmllbGROYW1lcyhJdGVyYWJsZTxGaWVsZD4gZmllbGRzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxGaWVsZCwgU3RyaW5nPihmaWVsZHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRmllbGQgZmllbGQpIHsKLQkJCQlyZXR1cm4gZmllbGQuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBtZXRob2ROYW1lcyhJdGVyYWJsZTxNZXRob2Q+IG1ldGhvZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE1ldGhvZCwgU3RyaW5nPihtZXRob2RzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gbWV0aG9kLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjg3ODY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZXZlcnNlQ29tcGFyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IG5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvcjsKLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBjdXN0b21Db21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbVJldmVyc2VDb21wYXJhdG9yOwotCi0JcHVibGljIFJldmVyc2VDb21wYXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpOwotCQl0aGlzLmN1c3RvbUNvbXBhcmF0b3IgPSB0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpOwotCQl0aGlzLmN1c3RvbVJldmVyc2VDb21wYXJhdG9yID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4odGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJU3RyaW5nIGxvd2VyMSA9IHMxLnRvTG93ZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIGxvd2VyMiA9IHMyLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaW50IHJlc3VsdCA9IGxvd2VyMS5jb21wYXJlVG8obG93ZXIyKTsKLQkJCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQkJcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7IC8vIHVzZSBjYXNlIHRvIGRpZmZlcmVudGlhdGUgImVxdWFsIiBzdHJpbmdzCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRVbnNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiVCIpOwotCQlyZXN1bHQuYWRkKCJaIik7Ci0JCXJlc3VsdC5hZGQoIlkiKTsKLQkJcmVzdWx0LmFkZCgiTSIpOwotCQlyZXN1bHQuYWRkKCJtIik7Ci0JCXJlc3VsdC5hZGQoImEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJiIik7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkTGlzdCgpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCwgdGhpcy5jdXN0b21Db21wYXJhdG9yKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hdHVyYWwoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMubmF0dXJhbFJldmVyc2VDb21wYXJhdG9yKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMuYnVpbGROYXR1cmFsbHlTb3J0ZWRMaXN0KCksIGxpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFVuc29ydGVkTGlzdCgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIHRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZEN1c3RvbVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoTGlzdDxTdHJpbmc+IG5vcm1hbCwgTGlzdDxTdHJpbmc+IHJldmVyc2UpIHsKLQkJaW50IHNpemUgPSBub3JtYWwuc2l6ZSgpOwotCQlpbnQgbWF4ID0gc2l6ZSAtIDE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobm9ybWFsLmdldChpKSwgcmV2ZXJzZS5nZXQobWF4IC0gaSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmUxNjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlQXNzb2NpYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUFzc29jaWF0aW9uVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2M7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNpbXBsZUFzc29jaWF0aW9uVGVzdHMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmFzc29jID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJhciIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0S2V5KCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYXNzb2MuZ2V0S2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCQl0aGlzLmFzc29jLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFzc29jLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKCJmb28iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYXNzb2MsIHRoaXMuY29weSh0aGlzLmFzc29jKSk7Ci0KLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oImZvbyIsICJiYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hc3NvYy5lcXVhbHMoYXNzb2MyKSk7Ci0KLQkJYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9wIiwgImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MzID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jNCA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4obnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhc3NvYzMsIGFzc29jNCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5oYXNoQ29kZSgpLCB0aGlzLmNvcHkodGhpcy5hc3NvYykuaGFzaENvZGUoKSk7Ci0KLQkJU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFzc29jMiA9IG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4obnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhc3NvYzIuaGFzaENvZGUoKSwgdGhpcy5jb3B5KGFzc29jMikuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYXNzb2MudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQl0aGlzLnZlcmlmeUNsb25lKHRoaXMuYXNzb2MsIHRoaXMuYXNzb2MuY2xvbmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZCwgQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGFjdHVhbCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCWFzc2VydE5vdFNhbWUoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRLZXkoKSwgYWN0dWFsLmdldEtleSgpKTsKLQkJYXNzZXJ0U2FtZShleHBlY3RlZC5nZXRLZXkoKSwgYWN0dWFsLmdldEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldFZhbHVlKCksIGFjdHVhbC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U2FtZShleHBlY3RlZC5nZXRWYWx1ZSgpLCBhY3R1YWwuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoImNhc3QiKQotCQlBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gKEFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPikgVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmFzc29jKTsKLQotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgYXNzb2MyKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLCBhc3NvYzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5nZXRLZXkoKSwgYXNzb2MyLmdldEtleSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLmdldEtleSgpLCBhc3NvYzIuZ2V0S2V5KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYy5nZXRWYWx1ZSgpLCBhc3NvYzIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUodGhpcy5hc3NvYy5nZXRWYWx1ZSgpLCBhc3NvYzIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gY29weShTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gc2EpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4oc2EuZ2V0S2V5KCksIHNhLmdldFZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGMwNmRkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlQm9vbGVhblJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVEZWZhdWx0KCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXModHJ1ZSkpOwotCQlhc3NlcnRGYWxzZShici5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRGYWxzZShici5pc05vdCh0cnVlKSk7Ci0JCWFzc2VydFRydWUoYnIuaXNOb3QoZmFsc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNUcnVlKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuaXNUcnVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZhbHNlKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzRmFsc2UoKSk7Ci0JCWJyLnNldEZhbHNlKCk7Ci0JCWFzc2VydFRydWUoYnIuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxpcCgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShici5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShici5mbGlwKCkpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RCb29sZWFuKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0Tm90KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JCWJyLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmFsc2UoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgY2xvbmUgPSBici5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKGNsb25lLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBicjEgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJbdHJ1ZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JCWJyMS5zZXRGYWxzZSgpOwotCQlhc3NlcnRFcXVhbHMoIltmYWxzZV0iLCBicjEudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY1NzBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVJbnRSZWZlcmVuY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUludFJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZUludFJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ycygpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEVxdWFscyg3LCBpci5nZXRWYWx1ZSgpKTsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC03LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscygwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscyg3KSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmVxdWFscyg3KSk7Ci0JCWFzc2VydEZhbHNlKGlyLmVxdWFscygwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5ub3RFcXVhbCgwKSk7Ci0JCWFzc2VydFRydWUoaXIubm90RXF1YWwoNykpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIubm90RXF1YWwoNykpOwotCQlhc3NlcnRUcnVlKGlyLm5vdEVxdWFsKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNaZXJvKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzWmVybygpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzWmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RaZXJvKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc05vdFplcm8oKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90WmVybygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbkludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW4oMCkpOwotCQlhc3NlcnRGYWxzZShpci5pc0dyZWF0ZXJUaGFuKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbk9yRXF1YWxJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNHcmVhdGVyVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW5PckVxdWFsKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbkludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNMZXNzVGhhbigtMSkpOwotCQlhc3NlcnRGYWxzZShpci5pc0xlc3NUaGFuKDApKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0xlc3NUaGFuKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbk9yRXF1YWxJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTGVzc1RoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNMZXNzVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRUcnVlKGlyLmlzTGVzc1RoYW5PckVxdWFsKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNQb3NpdGl2ZSgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRGYWxzZShpci5pc1Bvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc1Bvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0VHJ1ZShpci5pc1Bvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFBvc2l0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3RQb3NpdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdFBvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOb3RQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOZWdhdGl2ZSgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRUcnVlKGlyLmlzTmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5pc05lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE5lZ2F0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTm90TmVnYXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5zZXRWYWx1ZSg0KSk7Ci0JCWFzc2VydEVxdWFscyg0LCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5hYnMoKSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmFicygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEVxdWFscygtMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5uZWcoKSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5uZWcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFplcm8oKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5zZXRaZXJvKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgdmFsdWU7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5hZGQoMyk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZSk7Ci0KLQkJaXIuc2V0VmFsdWUoMyk7Ci0JCXZhbHVlID0gaXIuYWRkKC03KTsKLQkJYXNzZXJ0RXF1YWxzKC00LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY3JlbWVudCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgdmFsdWU7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdmFsdWUgPSBpci5pbmNyZW1lbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJ0cmFjdEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpbnQgY291bnQ7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0KLQkJY291bnQgPSBpci5zdWJ0cmFjdCgzKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBjb3VudCk7Ci0KLQkJaXIuc2V0VmFsdWUoLTMpOwotCQljb3VudCA9IGlyLnN1YnRyYWN0KC03KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCBjb3VudDsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLmRlY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbHlJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDMpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBpci5tdWx0aXBseSgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpdmlkZUludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMjQpOwotCQlhc3NlcnRFcXVhbHMoMjQsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgaXIuZGl2aWRlKDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtYWluZGVySW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgyNSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBpci5yZW1haW5kZXIoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDI1KTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm1pbigzKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIubWluKDMzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLm1heCgzKSk7Ci0JCWFzc2VydEVxdWFscygzMCwgaXIubWF4KDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBvd0ludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpci5wb3coMikgPT0gMjVMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyZVRvSW50UmVmZXJlbmNlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIxID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg0NCk7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDQ0KTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPT0gMCk7Ci0JCWlyMiA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNTUpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA8IDApOwotCQlpcjIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDMzKTsKLQkJYXNzZXJ0VHJ1ZShpcjEuY29tcGFyZVRvKGlyMikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjEgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDQ0KTsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMiA9IGlyMS5jbG9uZSgpOwotCQlhc3NlcnRFcXVhbHMoNDQsIGlyMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShpcjEsIGlyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMSA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNDQpOwotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShpcjEpOwotCQlhc3NlcnRFcXVhbHMoNDQsIGlyMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShpcjEsIGlyMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKCJbNV0iLCBpci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVPYmplY3RSZWZlcmVuY2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTFhYzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVPYmplY3RSZWZlcmVuY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0TnVsbChvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9yLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVxdWFsc09iamVjdCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZUVxdWFscyhudWxsKSk7Ci0JCWFzc2VydEZhbHNlKG9yLnZhbHVlRXF1YWxzKCJmb28iKSk7Ci0KLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZUVxdWFscyhudWxsKSk7Ci0JCWFzc2VydFRydWUob3IudmFsdWVFcXVhbHMoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOb3RFcXVhbE9iamVjdCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVOb3RFcXVhbChudWxsKSk7Ci0JCWFzc2VydFRydWUob3IudmFsdWVOb3RFcXVhbCgiZm9vIikpOwotCi0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZU5vdEVxdWFsKG51bGwpKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVOb3RFcXVhbCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc051bGwoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydFRydWUob3IuaXNOdWxsKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9yLmlzTnVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROdWxsKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShvci5pc05vdE51bGwoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShvci5pc05vdE51bGwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGwoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydE51bGwob3IuZ2V0VmFsdWUoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0TnVsbCgpOwotCQlhc3NlcnROdWxsKG9yLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oImZvbyIpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IGNsb25lID0gKFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KSBvci5jbG9uZSgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsb25lLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKG9yLCBjbG9uZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoIltudWxsXSIsIG9yLnRvU3RyaW5nKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiW2Zvb10iLCBvci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlUXVldWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI5OWRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVF1ZXVlVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCi0JcHVibGljIFNpbXBsZVF1ZXVlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JUXVldWU8U3RyaW5nPiBidWlsZFF1ZXVlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVF1ZXVlPFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlhc3NlcnRUcnVlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlhc3NlcnRGYWxzZShxdWV1ZS5pc0VtcHR5KCkpOwotCQlxdWV1ZS5kZXF1ZXVlKCk7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmRlcXVldWUoKTsKLQkJYXNzZXJ0VHJ1ZShxdWV1ZS5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlQW5kRGVxdWV1ZSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnF1ZXVlQW5kUGVlaygpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlRdWV1ZUV4Y2VwdGlvblBlZWsoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXF1ZXVlLmVucXVldWUoZmlyc3QpOwotCQlxdWV1ZS5lbnF1ZXVlKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXF1ZXVlLnBlZWsoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVF1ZXVlRXhjZXB0aW9uRGVxdWV1ZSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcXVldWUuZGVxdWV1ZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gKFNpbXBsZVF1ZXVlPFN0cmluZz4pIHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlxdWV1ZS5lbnF1ZXVlKCJmaXJzdCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJzZWNvbmQiKTsKLQkJcXVldWUuZW5xdWV1ZSgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHF1ZXVlLCBxdWV1ZS5jbG9uZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUocXVldWUsIFRlc3RUb29scy5zZXJpYWxpemUocXVldWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoUXVldWU8U3RyaW5nPiBvcmlnaW5hbCwgUXVldWU8U3RyaW5nPiBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5pc0VtcHR5KCksIGNsb25lLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5kZXF1ZXVlKCksIGNsb25lLmRlcXVldWUoKSk7Ci0JCWFzc2VydFRydWUob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQotCQlvcmlnaW5hbC5lbnF1ZXVlKCJmb3VydGgiKTsKLQkJYXNzZXJ0RmFsc2Uob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJLy8gY2xvbmUgc2hvdWxkIHN0aWxsIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUoY2xvbmUuaXNFbXB0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlU3RhY2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzNkODYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW1wdHlTdGFja0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVN0YWNrVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBTaW1wbGVTdGFja1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCVN0YWNrPFN0cmluZz4gYnVpbGRTdGFjaygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJYXNzZXJ0VHJ1ZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnBvcCgpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1c2hBbmRQb3AoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFB1c2hBbmRQZWVrKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdGFjay5wZWVrKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja0V4Y2VwdGlvblBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0YWNrLnBvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVTdGFjazxTdHJpbmc+IHN0YWNrID0gKFNpbXBsZVN0YWNrPFN0cmluZz4pIHRoaXMuYnVpbGRTdGFjaygpOwotCQlzdGFjay5wdXNoKCJmaXJzdCIpOwotCQlzdGFjay5wdXNoKCJzZWNvbmQiKTsKLQkJc3RhY2sucHVzaCgidGhpcmQiKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKHN0YWNrLCBzdGFjay5jbG9uZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlzdGFjay5wdXNoKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoc3RhY2ssIFRlc3RUb29scy5zZXJpYWxpemUoc3RhY2spKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoU3RhY2s8U3RyaW5nPiBvcmlnaW5hbCwgU3RhY2s8U3RyaW5nPiBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydFRydWUob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQotCQlvcmlnaW5hbC5wdXNoKCJmb3VydGgiKTsKLQkJYXNzZXJ0RmFsc2Uob3JpZ2luYWwuaXNFbXB0eSgpKTsKLQkJLy8gY2xvbmUgc2hvdWxkIHN0aWxsIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUoY2xvbmUuaXNFbXB0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3RyaW5nVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdiNTUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJpbmdUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN0cmluZ1Rvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IFN0cmluZyhhY3R1YWwpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKCJmcmVkIiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZyIiwgU3RyaW5nVG9vbHMucGFkKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT25TdHJpbmdCdWlsZGVyKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKCJmcmVkIiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQgICIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnZicsICdyJywgJ2UnLCAnZCcgfSwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiZnIiLCAiZnJlZCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCIsICJmcmVkIiwgNCk7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgU3RyaW5nVG9vbHMuemVyb1BhZCgiMTIzNCIsIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RXF1YWxzKCIxMiIsIFN0cmluZ1Rvb2xzLnplcm9QYWQobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25Xcml0ZXIoKSB7Ci0JCVdyaXRlciB3cml0ZXI7Ci0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCAyLCB3cml0ZXIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVmZmVyKCkgewotCQlTdHJpbmdCdWZmZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZSgiMTIzNCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiMDAxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICcxJywgJzInLCAnMycsICc0JyB9LCA2KSk7Ci0JCWFzc2VydEVxdWFscygiMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIzNCIsICIxMjM0IiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMTIzNCIsICIxMjM0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzZXBhcmF0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZVN0cmluZ0NoYXJJbnQoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuc2VwYXJhdGUoc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPblN0cmluZ0NoYXJJbnRTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZUNoYXJBcnJheUNoYXJJbnQoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheSgiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheSgiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuc2VwYXJhdGUoc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uQ2hhckFycmF5Q2hhckludFdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlT25DaGFyQXJyYXlDaGFySW50U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA2LCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDMsICIwMTItMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50TGVuZ3RoLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPbkNoYXJBcnJheUNoYXJJbnRTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0KCkgewotCQl0aGlzLnZlcmlmeURlbGltaXQoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXQoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdCgiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXRPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPbldyaXRlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25Xcml0ZXIoIiIsICIxMjMiLCAiMTIzMTIzIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURlbGltaXRPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1ZmZlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0T25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIjEyMyIsICIxMjNFbXBsb3llZTEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPblN0cmluZ0J1aWxkZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmRlbGltaXRPbihzdHJpbmcsIGRlbGltaXRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZSgpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGUoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5xdW90ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UXVvdGVPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIxMjMiLCAiXCIxMjNcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWlsZGVyKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZpbmcgY2hhcmFjdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZShzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxvJnllZSYiLCAnJicsICJFbXBsb3llZSYiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICZGb28iLCAnJicsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCImRW1wbG95ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhzdHJpbmcsIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheSgiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZy50b0NoYXJBcnJheSgpLCBjaGFyVG9SZW1vdmUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIEZyZWRcdCIsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2UoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2Uoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlKHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJcdEVtcGxveWVlICBcbiIsICIgRW1wbG95ZWUgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbW1vbiBwcmVmaXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbW1vblByZWZpeExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvb0JCQiIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vWlpaIiwgImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFN0cmluZ1Rvb2xzLmNvbW1vblByZWZpeExlbmd0aCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoTWF4KCkgewotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIiwgMikpOwotCQlhc3NlcnRFcXVhbHMoMiwgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIiwgMikpOwotCX0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVDaGFyQXJyYXkoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplU3RyaW5nKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBDOWNvbGUiLCAiXHUwMEU5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPblN0cmluZ1dyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIkEiLCAiYSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5hcGl0YWxpemVDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBFOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBDOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJvcmFjbGUiLCAiT3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJPUkFDTEUiLCAiT1JBQ0xFIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiYSIsICJBIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIlx1MDBFOWNvbGUiLCAiXHUwMEM5Y29sZSIpOyAvLyDvv71jb2xlLT7vv71DT0xFCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogI3RvU3RyaW5nKCkgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkVG9TdHJpbmdDbGFzc05hbWVfYW5vbnltb3VzKCkgewotCQlPYmplY3QgbyA9IG5ldyBPYmplY3QoKXsvKmFub255bW91cyBzdWJjbGFzcyBvZiBPYmplY3QqL307Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0IiwgU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShvLmdldENsYXNzKCkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KChjaGFyW10pIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KCIgICAgICBcdFx0ICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIgKyBTdHJpbmdUb29scy5DUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgoU3RyaW5nKSBudWxsLCAoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIiwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIsICJhc2RmIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLCAiQVNERiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgoY2hhcltdKSBudWxsLCAoY2hhcltdKSBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgoY2hhcltdKSBudWxsLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIkFTREYiLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChTdHJpbmcpIG51bGwsIChTdHJpbmcpIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShudWxsLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGYiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJBU0RGIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFTIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJBIikpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImJzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGciKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIiwgImFzZGZnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZ2dnZ2dnIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhUyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmIi50b0NoYXJBcnJheSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJic2RmIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGZnZ2dnZ2ciLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdhJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdBJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ0EnLCAnYScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ0EnKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdiJykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ2InKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzVXBwZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGT08iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZSgiRk9PMiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKCJGIE8gTyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1VwcGVyY2FzZSgiRm9vIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzVXBwZXJjYXNlKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0xvd2VyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoImZvbzIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZSgiZiBvIG8iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNMb3dlcmNhc2UoIkZvbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0xvd2VyY2FzZSgiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNMb3dlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgY2FtZWwtY2FzZSB0byBhbGwtY2FwcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygpIHsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVEVTVCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RURVNUVGVzdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0VCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1QiLCAidGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1aWxkZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoKCkgewotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgNDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVMiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0IiwgMykpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJURVNUIiwgNSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVEVTVCIsIDIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFUyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgOCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgNikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA1KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IiwgOSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RUZXN0IiwgMTEwMCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF8iLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VEVTVFRlc3QiLCAxMCkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0IiwgMTQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVF9UIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0VCIsIDE2KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRFU1RUZXN0VCIsIDE1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAidGVzdCIsIDQ0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAidGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTIiwgInRlc3QiLCAzKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAiVEVTVCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEUiLCAiVEVTVCIsIDIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFUyIsICJ0ZXN0VGVzdCIsIDgpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9UIiwgInRlc3RUZXN0IiwgNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUXyIsICJ0ZXN0VGVzdCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVCIsICJ0ZXN0VGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCAxMTAwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF8iLCAidGVzdFRFU1RUZXN0IiwgMTApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0IiwgMTQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIiwgMTYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUX1RFU1RfIiwgIlRlc3RURVNUVGVzdFQiLCAxNSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBtYXgpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKHN0cmluZywgbWF4LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0IiwgNDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVMiLCAidGVzdCIsIDMpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJURVNUIiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURSIsICJURVNUIiwgMik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTIiwgInRlc3RUZXN0IiwgOCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1QiLCAidGVzdFRlc3QiLCA2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfIiwgInRlc3RUZXN0IiwgNSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3RUZXN0IiwgNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCA5KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDExMDApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUXyIsICJ0ZXN0VEVTVFRlc3QiLCAxMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiLCAxNCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiLCAxNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVF8iLCAiVGVzdFRFU1RUZXN0VCIsIDE1KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IG1heCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIG1heCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydCB1bmRlcnNjb3JlcyB0byBhbGwtY2FwcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoKSB7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfX19fIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJUZVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfX19URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlTG93ZXJjYXNlKCkgewotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0XyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X19fXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X19fdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX190ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVEVTVF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdCIsICJURVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJUZVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJURVNUX19fVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdCIsICJURVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXJMb3dlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0X19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0IiwgInRlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgInRlc3RfX190ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oc3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRFU1RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVEVTVF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdCIsICJURVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJUZVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgIlRFU1RfVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJURVNUX19fVEVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdCIsICJURVNUX1RFU1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3QiLCAiVEVTVF9URVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJURVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXJMb3dlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdF8iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0X19fXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0IiwgInRlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAidGVzdF90ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgInRlc3RfX190ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdCIsICJ0ZXN0X3Rlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl90ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihzdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNRdW90ZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1F1b3RlZCgiXCJmb29cIiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1F1b3RlZCgiXCJcIiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCJcIiIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzUXVvdGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNRdW90ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKGZvbykiKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiKCkiKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIigiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1BhcmVudGhldGljYWwoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1BhcmVudGhldGljYWwocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUGFyZW50aGV0aWNhbChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1BhcmVudGhldGljYWwocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1BhcmVudGhldGljYWwocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQnJhY2tldGVkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoIltmb29dIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2tldGVkKCJbXSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCJbIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNCcmFja2V0ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0JyYWNlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2VkKCJ7Zm9vfSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNlZCgie30iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgieyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQnJhY2VkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNCcmFjZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNDaGV2cm9uZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0NoZXZyb25lZCgiPGZvbz4iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNDaGV2cm9uZWQoIjw+Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoInsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0NoZXZyb25lZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRGVsaW1pdGVkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiZm9vIiwgJz8nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZCgiP2Zvbz8iLCAnPycpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCIiLCAnPycpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKCJcIlwiIiwgJyInKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZCgiP3h4PyIsICc/Jyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCI/eHhdIiwgJz8nKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiXCIiLCAnIicpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiICIsICcgJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCInJyIsICciJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkKCInZm9vJyIsICc/Jyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkKFN0cmluZyBzLCBjaGFyIGMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBjKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocy50b0NoYXJBcnJheSgpLCBjKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgcywgY2hhciBjKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIGMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocy50b0NoYXJBcnJheSgpLCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRGVsaW1pdGVkMigpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCJmb28iLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJ7Zm9vfSIsICd7JywgJ30nKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIiIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIltdIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigiW3h4XSIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCI/eHhdIiwgJ1snLCAnXScpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiXCIiLCAnWycsICddJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiICIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCInJyIsICdbJywgJ10nKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCInZm9vJyIsICdbJywgJ10nKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKFN0cmluZyBzLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIHN0YXJ0LCBlbmQpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIHN0YXJ0LCBlbmQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzRGVsaW1pdGVkMihTdHJpbmcgcywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgc3RhcnQsIGVuZCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLnRvQ2hhckFycmF5KCksIHN0YXJ0LCBlbmQpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVuZGVsaW1pdGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCInZm9vJyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJcIlwiZm9vXCIiLCAiXCJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiYmFyXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXQoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRJbnQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0SW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRJbnQoIlwiXCJmb29cIlwiIiwgMiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdEludCgiJ2ZvbyciLCAyLCAibyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRJbnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMsIGNvdW50KSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMudW5kZWxpbWl0KHMudG9DaGFyQXJyYXkoKSwgY291bnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0SW50RXhjZXB0aW9uKCkgewotCQl0aGlzLmRlbnlVbmRlbGltaXRJbnQoIlwiXCIiLCAyKTsKLQkJdGhpcy5kZW55VW5kZWxpbWl0SW50KCInbyciLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVVuZGVsaW1pdEludChTdHJpbmcgcywgaW50IGNvdW50KSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBib2d1cyA9IFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzLCBjb3VudCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogIiArIGJvZ3VzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNoYXJbXSBib2d1cyA9IFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzLnRvQ2hhckFycmF5KCksIGNvdW50KTsKLQkJCWZhaWwoImludmFsaWQgc3RyaW5nOiAiICsgbmV3IFN0cmluZyhib2d1cykpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCInZm9vJyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJcIlwiZm9vXCIiLCAiXCJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcImZvb1wiYmFyXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIidmb28nIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcIlwiXCJmb29cIiIsICJcImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCJiYXJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25Xcml0ZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlckNvdW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPbldyaXRlckNvdW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCBjb3VudCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWZmZXJDb3VudCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KCJYWGZvb1hYIiwgMiwgImZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlckNvdW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMsIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoIlwiZm9vXCIiLCAyLCAibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCJcIlwiXCJcIiIsIDIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgiWFhmb29YWCIsIDIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoU3RyaW5nIHMsIGludCBjb3VudCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVydGluZyB0byBKYXZhIHN0cmluZyBsaXRlcmFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIidmb28nIiwgIlwiJ2ZvbydcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cImJhciIsICJcImZvb1xcXCJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCIiLCAiXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiJ2ZvbyciLCAiXCInZm9vJ1wiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXGJiYXIiLCAiXCJmb29cXGJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1wiYmFyIiwgIlwiZm9vXFxcImJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiZm9vXFxiYXIiLCAiXCJmb29cXFxcYmFyXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkQm9vbGVhblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDdiZjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkQm9vbGVhbiBzYjsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zYiA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc05vdCh0cnVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsaXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmZsaXAoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZmxpcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm90VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldE5vdChmYWxzZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldEZhbHNlKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFRydWUoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4VGhpcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKHRoaXMuc2IsIHRoaXMuc2IuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4T2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKG11dGV4KTsKLQkJYXNzZXJ0U2FtZShtdXRleCwgc3luY0Jvb2wuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxUcnVlKDApOyAgLy8gMCA9IGluZGVmaW5pdGUgd2FpdAotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byB0cnVlIGJ5IHQxCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsVHJ1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFRydWVDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIGZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gZmFsc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0RmFsc2VUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1NldEZhbHNlKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MUNvbW1hbmQsIHRoaXMuc2IsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQyQ29tbWFuZCwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgewotCQkJCXN5bmNCb29sLnNldFRydWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY0Jvb2wud2FpdFVudGlsVHJ1ZSh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0RmFsc2VDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gICEgc3luY0Jvb2wud2FpdFRvU2V0RmFsc2UodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wsIGZpbmFsIGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bl8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChkZWxheSAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jQm9vbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZGY5NTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkSW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJbnRUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRJbnQgc2k7Ci0Jdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgaW50IHZhbHVlID0gNzsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgaW50IHNJbnRWYWx1ZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZEludFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2kgPSBuZXcgU3luY2hyb25pemVkSW50KCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5zSW50VmFsdWUgPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5lcXVhbHMoMCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuZXF1YWxzKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFsKDcpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFsKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1plcm8oKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFplcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDcpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbk9yRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDcpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCg4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbk9yRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCg3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCg4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1Bvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFBvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90UG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3ROZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1plcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFicygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC10aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuYWJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kubmVnKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKC10aGlzLnZhbHVlLCB0aGlzLnNpLm5lZygpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtdGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLm5lZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0WmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFplcm8oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleFRoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0U2FtZSh0aGlzLnNpLCB0aGlzLnNpLmdldE11dGV4KCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybygwKTsgIC8vIDAgPSBpbmRlZmluaXRlIHdhaXQKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMCBieSB0MgotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byAwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFplcm9UaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybyhUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byAwIGJ5IHQxCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VW50aWxaZXJvKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0WmVyb0NvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMDsKLQkgKiB0aGVuIHQyIHdpbGwgc2V0IHRoZSB2YWx1ZSB0byA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUSUNLICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gemVybyBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFplcm9Db21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoNDIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgwKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRHZXRWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgVElDSyk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JCWFzc2VydEVxdWFscyg0MiwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQyLCB0aGlzLnNJbnRWYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRXT19USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA+IFRXT19USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zaSwgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNpLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXRaZXJvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgewotCQkJCXNJbnQuc2V0WmVybygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNJbnQud2FpdFVudGlsWmVybyh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc0ludC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXNJbnQuZXhlY3V0ZSgKLQkJCQkJbmV3IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kKCkgewotCQkJCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJCQkvLyBwcmV0ZW5kIHRvIHBlcmZvcm0gc29tZSBsb25nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQkJc0ludC5zZXRWYWx1ZSg0Mik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEdldFZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc0ludFZhbHVlID0gc0ludC5nZXRWYWx1ZSgpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50LCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc0ludCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmU5OTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkT2JqZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPYmplY3RUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIE9iamVjdCBzb1ZhbHVlOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zbyA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PigpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc29WYWx1ZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldE51bGwoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQlhc3NlcnRTYW1lKHRoaXMuc28sIHRoaXMuc28uZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxOdWxsKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIGJ5IHQyCi0JCWFzc2VydE51bGwodGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGxUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbChUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byBudWxsIGJ5IHQxCi0JCWFzc2VydE51bGwodGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsTnVsbChsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIG51bGw7Ci0JICogdGhlbiB0MiB3aWxsIHNldCB0aGUgdmFsdWUgdG8gYW4gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUSUNLICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoImZvbyIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zbywgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0IG9mIDEwMCBtcwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkR2V0VmFsdWVDb21tYW5kKCksIHRoaXMuc28sIFRJQ0spOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zb1ZhbHVlKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVFdPX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVFdPX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodDFDb21tYW5kLCB0aGlzLnNvLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MkNvbW1hbmQsIHRoaXMuc28sIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFNldE51bGxDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHsKLQkJCQlzT2JqZWN0LnNldE51bGwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNPYmplY3Qud2FpdFVudGlsTnVsbCh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzT2JqZWN0LndhaXRUb1NldFZhbHVlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudmFsdWUsIHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzT2JqZWN0LmV4ZWN1dGUoCi0JCQkJCW5ldyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCQkJLy8gcHJldGVuZCB0byBwZXJmb3JtIHNvbWUgbG9uZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJCQkJCX0KLQkJCQkJCQlzT2JqZWN0LnNldFZhbHVlKCJmb28iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNvVmFsdWUgPSBzT2JqZWN0LmdldFZhbHVlKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHNPYmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkNzY4Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRRdWV1ZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkUXVldWVUZXN0cyBleHRlbmRzIFNpbXBsZVF1ZXVlVGVzdHMgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzcTsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgT2JqZWN0IGRlcXVldWVkT2JqZWN0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzEgPSBuZXcgU3RyaW5nKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzIgPSBuZXcgU3RyaW5nKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJLy8gc3luY2hyb25pemVkIHF1ZXVlIGlzIG5vdCBjbG9uZWFibGUKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNxID0gbmV3IFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLmRlcXVldWVkT2JqZWN0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGZpcnN0IHdpdGggYW4gdW5zeW5jaHJvbml6ZWQgcXVldWUsCi0JICogdGhlbiB3aXRoIGEgc3luY2hyb25pemVkIHF1ZXVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U2ltcGxlUXVldWU8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpLCAic2Vjb25kIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MoU2xvd1F1ZXVlPFN0cmluZz4gc2xvd1F1ZXVlLCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotCQlzbG93UXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJc2xvd1F1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCi0JCVRocmVhZCB0aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShzbG93UXVldWUpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCVRocmVhZC5zbGVlcChUV09fVElDS1MpOwotCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2xvd1F1ZXVlLmRlcXVldWUoKSk7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCWFzc2VydFRydWUoc2xvd1F1ZXVlLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dRdWV1ZTxTdHJpbmc+IHNsb3dRdWV1ZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dRdWV1ZS5zbG93RGVxdWV1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1F1ZXVlPEU+IGV4dGVuZHMgUXVldWU8RT4gewotCQlPYmplY3Qgc2xvd0RlcXVldWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTaW1wbGVRdWV1ZTxFPiBleHRlbmRzIFNpbXBsZVF1ZXVlPEU+IGltcGxlbWVudHMgU2xvd1F1ZXVlPEU+IHsKLQkJU2xvd1NpbXBsZVF1ZXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IHNsb3dEZXF1ZXVlKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1N5bmNocm9uaXplZFF1ZXVlPEU+IGV4dGVuZHMgU3luY2hyb25pemVkUXVldWU8RT4gaW1wbGVtZW50cyBTbG93UXVldWU8RT4gewotCQlTbG93U3luY2hyb25pemVkUXVldWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNsb3dEZXF1ZXVlKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiB3YWl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRGVxdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0RlcXVldWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gc2hvdWxkIGhhdmUgYmVlbiBkZXF1ZXVlZCBieSB0Mi4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgc2hvdWxkIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUodGhpcy5zcS5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0RlcXVldWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRGVxdWV1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgd2FzIG5ldmVyIGRlcXVldWVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBpdCBzdGlsbCBob2xkcyB0aGUgaXRlbQotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5zcS5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9EZXF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRFbnF1ZXVlQ29tbWFuZCgpLCB0aGlzLnNxLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvRGVxdWV1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc3EsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9FbnF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRW5xdWV1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIGdldHMgZGVxdWV1ZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBlbnF1ZXVlZCBvbiB0byB0aGUgcXVldWUgYnkgdDIKLQkJYXNzZXJ0RmFsc2UodGhpcy5zcS5pc0VtcHR5KCkpOwotCQlhc3NlcnRTYW1lKElURU1fMiwgdGhpcy5zcS5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0VucXVldWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRW5xdWV1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgaXMgZXZlbnR1YWxseSBkZXF1ZXVlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIGVucXVldWVkIG9uIHRvIHRoZSBxdWV1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc3EuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvRW5xdWV1ZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNxLmVucXVldWUoSVRFTV8xKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZERlcXVldWVDb21tYW5kKCksIHRoaXMuc3EsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9FbnF1ZXVlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcSwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkRW5xdWV1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgewotCQkJCXN5bmNocm9uaXplZFF1ZXVlLmVucXVldWUoSVRFTV8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9EZXF1ZXVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl0cnkgewotCQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuZGVxdWV1ZWRPYmplY3QgPSBzeW5jaHJvbml6ZWRRdWV1ZS53YWl0VG9EZXF1ZXVlKHRpbWVvdXQpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRydWU7Ci0JCQkJfQotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkRGVxdWV1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5kZXF1ZXVlZE9iamVjdCA9IHN5bmNocm9uaXplZFF1ZXVlLmRlcXVldWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9FbnF1ZXVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzeW5jaHJvbml6ZWRRdWV1ZS53YWl0VG9FbnF1ZXVlKElURU1fMiwgdGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kLCBmaW5hbCBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlLCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHN5bmNocm9uaXplZFF1ZXVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlsb25nIGNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2I2MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZFN0YWNrOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGFja1Rlc3RzCi0JZXh0ZW5kcyBTaW1wbGVTdGFja1Rlc3RzCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHNzOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQl2b2xhdGlsZSBPYmplY3QgcG9wcGVkT2JqZWN0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzEgPSBuZXcgU3RyaW5nKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzIgPSBuZXcgU3RyaW5nKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdGFjazxTdHJpbmc+IGJ1aWxkU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJLy8gc3luY2hyb25pemVkIHN0YWNrIGlzIG5vdCBjbG9uZWFibGUKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNzID0gbmV3IFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLnBvcHBlZE9iamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBmaXJzdCB3aXRoIGFuIHVuc3luY2hyb25pemVkIHN0YWNrLAotCSAqIHRoZW4gd2l0aCBhIHN5bmNocm9uaXplZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1NpbXBsZVN0YWNrPFN0cmluZz4oKSwgInNlY29uZCIpOwotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCksICJmaXJzdCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb25jdXJyZW50QWNjZXNzKFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaywgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2xvd1N0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXNsb3dTdGFjay5wdXNoKCJzZWNvbmQiKTsKLQotCQlUaHJlYWQgdGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoc2xvd1N0YWNrKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQlUaHJlYWQuc2xlZXAoVFdPX1RJQ0tTKTsKLQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNsb3dTdGFjay5wb3AoKSk7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCWFzc2VydFRydWUoc2xvd1N0YWNrLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dTdGFjay5zbG93UG9wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIGludGVyZmFjZSBTbG93U3RhY2s8RT4gZXh0ZW5kcyBTdGFjazxFPiB7Ci0JCU9iamVjdCBzbG93UG9wKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U2ltcGxlU3RhY2s8RT4gZXh0ZW5kcyBTaW1wbGVTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTaW1wbGVTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBzbG93UG9wKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U3luY2hyb25pemVkU3RhY2s8RT4gZXh0ZW5kcyBTeW5jaHJvbml6ZWRTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiB3YWl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIHNob3VsZCBoYXZlIGJlZW4gcG9wcGVkIGJ5IHQyLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgc2hvdWxkIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9Qb3AoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHdhcyBuZXZlciBwb3BwZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBpdCBzdGlsbCBob2xkcyB0aGUgaXRlbQotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5zcy5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9Qb3AobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFB1c2hDb21tYW5kKCksIHRoaXMuc3MsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9Qb3BDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNzLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBnZXRzIHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0U2FtZShJVEVNXzIsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9QdXNoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIGlzIGV2ZW50dWFsbHkgcG9wcGVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2sgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1B1c2gobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zcy5wdXNoKElURU1fMSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQb3BDb21tYW5kKCksIHRoaXMuc3MsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9QdXNoQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUHVzaENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgewotCQkJCXN5bmNocm9uaXplZFN0YWNrLnB1c2goSVRFTV8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9Qb3BDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXRyeSB7Ci0JCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5wb3BwZWRPYmplY3QgPSBzeW5jaHJvbml6ZWRTdGFjay53YWl0VG9Qb3AodGltZW91dCk7Ci0JCQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQb3BDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMucG9wcGVkT2JqZWN0ID0gc3luY2hyb25pemVkU3RhY2sucG9wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUHVzaENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY2hyb25pemVkU3RhY2sud2FpdFRvUHVzaChJVEVNXzIsIHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaywgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jaHJvbml6ZWRTdGFjayk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZjMxYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotLyoqCi0gKiB2YXJpb3VzIHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdCBjYXNlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhbmRsZXMge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhbiBvYmplY3QncyBpbXBsZW1lbnRhdGlvbiBvZiBTZXJpYWxpemFibGUgYnkgc2VyaWFsaXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCB0byBhIGJ5dGUgYXJyYXk7IHRoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGJ5dGUgYXJyYXkgYW5kCi0JICogcmV0dXJuaW5nIHRoZSByZXN1bHRhbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBzZXJpYWxpemUoVCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFPdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDIwMDApOwotCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYU91dFN0cmVhbSk7Ci0JCW91dFN0cmVhbS53cml0ZU9iamVjdChvKTsKLQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFJblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYU91dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFJblN0cmVhbSk7Ci0JCVQgbzIgPSByZWFkT2JqZWN0KGluU3RyZWFtKTsKLQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gbzI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChPYmplY3RJbnB1dCBvYmplY3RJbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChUKSBvYmplY3RJbnB1dC5yZWFkT2JqZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0JCXJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiByZWRpcmVjdCBzdGQgb3V0IGFuZCBzdGQgZXJyIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKFByaW50U3RyZWFtIHByaW50U3RyZWFtKSB7Ci0JCVN5c3RlbS5zZXRPdXQocHJpbnRTdHJlYW0pOwotCQlTeXN0ZW0uc2V0RXJyKHByaW50U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGFuZCBwcmludCBvdXQgYWxsIHRoZSBjdXJyZW50IEphdmEgU3lzdGVtIHByb3BlcnRpZXMgb24gdGhlCi0JICogY29uc29sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXByaW50U3lzdGVtUHJvcGVydGllc09uKFN5c3RlbS5vdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydCBhbmQgcHJpbnQgb3V0IGFsbCB0aGUgY3VycmVudCBKYXZhIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZQotCSAqIHNwZWNpZmllZCBwcmludCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3lzdGVtUHJvcGVydGllc09uKFByaW50U3RyZWFtIHN0cmVhbSkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzb3J0ZWRLZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7Ci0JCWZvciAoT2JqZWN0IGtleSA6IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLQkJCXNvcnRlZEtleXMuYWRkKChTdHJpbmcpIGtleSk7Ci0JCX0KLQkJZm9yIChTdHJpbmcga2V5IDogc29ydGVkS2V5cykgewotCQkJc3RyZWFtLnByaW50KGtleSk7Ci0JCQlzdHJlYW0ucHJpbnQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyZWFtLnByaW50KFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCXN0cmVhbS5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgdGVzdCBhbmQgcmV0dXJuIGEgdGV4dCBvdXRwdXQgb2YgaXRzIHJlc3VsdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkgewotCQkJd3JpdGVyLnByaW50bG4oIk9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSBudWxsOwotCQkJaWYgKHJlc3VsdC5mYWlsdXJlcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJZmFpbHVyZSA9IHJlc3VsdC5mYWlsdXJlcygpLm5leHRFbGVtZW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCWZhaWx1cmUgPSByZXN1bHQuZXJyb3JzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCWZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50KCJlbGFwc2VkIHRpbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgZWxhcHNlZCA9IGVuZCAtIHN0YXJ0OwotCQl3cml0ZXIucHJpbnQoZWxhcHNlZCAvIDEwMDBMKTsKLQkJd3JpdGVyLnByaW50bG4oIiBzZWMuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENsZWFyIG91dCBhbGwgdGhlIGluc3RhbmNlIHZhcmlhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdGVzdCBjYXNlLCBhbGxvd2luZwotCSAqIHRoZSB2YXJpb3VzIHRlc3QgZml4dHVyZXMgdG8gYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuIFR5cGljYWxseSB0aGlzIGlzCi0JICogY2FsbGVkIGluIHRoZSAjdGVhckRvd24oKSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKFRlc3RDYXNlIHRlc3RDYXNlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogPSB0ZXN0Q2FzZS5nZXRDbGFzcygpOyBjbGF6eiAhPSBUZXN0Q2FzZV9jbGFzczsgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWZvciAoRmllbGQgZmllbGQgOiBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpKSB7Ci0JCQkJLy8gbGVhdmUgcHJpbWl0aXZlcyBhbG9uZSAtIHRoZXkgZG9uJ3QgZ2V0IGdhcmJhZ2UtY29sbGVjdGVkLCBhbmQgd2UgY2FuJ3Qgc2V0IHRoZW0gdG8gbnVsbC4uLgotCQkJCWlmIChmaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gbGVhdmUgc3RhdGljIGZpZWxkcyBhbG9uZSAoPykKLQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJCWZpZWxkLnNldCh0ZXN0Q2FzZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczxUZXN0Q2FzZT4gVGVzdENhc2VfY2xhc3MgPSBUZXN0Q2FzZS5jbGFzczsKLQotCS8qKgotCSAqIFdvcmthcm91bmQgZm9yIGEgSlVuaXQgYnVnOiBKVW5pdCBkb2VzIG5vdCBjb25maWd1cmUgdGhlIHRlc3RpbmcgVGhyZWFkCi0JICogd2l0aCBhIGNvbnRleHQgY2xhc3MgbG9hZGVyLiBUaGlzIHNob3VsZCBwcm9iYWJseSBoYXBwZW4gaW4KLQkgKiBUZXN0UnVubmVyLmRvUnVuVGVzdChUZXN0KSwganVzdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBKVW5pdFRocmVhZENvbnRleHRDbGFzc0xvYWRlcigpIHsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoVGVzdFRvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIHN1cHByZXNzZWQgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRlc3RUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZmNiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwyKCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVFcXVhbDMoKSB7Ci0JCWFzc2VydEZhbHNlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKCJmb28iLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWw1KCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MSgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MygpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxMzEzYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvWE1MU3RyaW5nRW5jb2RlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuWE1MU3RyaW5nRW5jb2RlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWE1MU3RyaW5nRW5jb2RlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFhNTFN0cmluZ0VuY29kZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIj9mb28/IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCi0JCXMgPSAiP2ZvbyYxMjMiOwotCQlleHBlY3RlZCA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVWYWxpZEZpbGVOYW1lKCkgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQotCQlTdHJpbmcgcyA9ICJmb28iOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiMTIzZm9vMTIzIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVub3JtYWxpemVJbnZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gIiYjeDNmO2ZvbyYjeDNmOyI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICI/Zm9vPyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCi0JCXMgPSAiJiN4M2Y7Zm9vJiN4MjY7MTIzIjsKLQkJZXhwZWN0ZWQgPSAiP2ZvbyYxMjMiOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGVuY29kZXIuZGVjb2RlKHMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwTm9DaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIjEyM2ZvbzQ1NiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBDaGFyYWN0ZXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vPyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiP2ZvbyYxMjMmJiYmJiY+Pj4+Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJvdW5kVHJpcChTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGVuY29kZXIuZW5jb2RlKHMpOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUoYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mIyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2UzKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiN4Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTQoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3gzIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTUoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3g7Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTYoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mQSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhcmFjdGVyU2VxdWVuY2U3KCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZm9vJiNBIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTgoKSB7Ci0JCVN0cmluZyBzID0gImZvbyYjeFpaWlo7IjsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXMgPSBlbmNvZGVyLmRlY29kZShzKTsKLQkJCWZhaWwocyk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvRW1wdHlFbnVtZXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZmM5YzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5RW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlmb3IgKEVudW1lcmF0aW9uPE9iamVjdD4gc3RyZWFtID0gRW1wdHlFbnVtZXJhdGlvbi5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2Y2JhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkl0ZXJhdG9yRW51bWVyYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc01vcmVFbGVtZW50cygpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb25VcGNhc3QoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0RWxlbWVudCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHRFbGVtZW50KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uKHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCh0aGlzLmJ1aWxkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248U3RyaW5nPihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxPYmplY3Q+IGJ1aWxkRW51bWVyYXRpb25VcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEl0ZXJhdG9yRW51bWVyYXRpb248T2JqZWN0PihpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZmIwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlFbnVtZXJhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzZlMmRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Ykl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDM7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgyKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKHN0YXJ0LCBsZW5ndGgpOwotCQkJZmFpbCgiYm9ndXMgaXRlcmFibGU6ICIgKyBpdGVyYWJsZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKDApOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihhcnJheSwgc3RhcnQpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiB9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjZDQwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDE7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKCk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgSW50ZWdlci5wYXJzZUludChzdHJlYW0ucHJldmlvdXMoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1Ykl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDM7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgyKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgSW50ZWdlci5wYXJzZUludChzdHJpbmcpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKHN0YXJ0LCBsZW5ndGgpOwotCQkJZmFpbCgiYm9ndXMgaXRlcmFibGU6ICIgKyBpdGVyYWJsZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSgwKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoaW50IHN0YXJ0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCkgewotCQlyZXR1cm4gKHN0YXJ0ID09IDApID8KLQkJCQluZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihhcnJheSkgOgotCQkJCW5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4NDIzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hhaW5JdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gVkVDVE9SX0hJRVJBUkNIWSA9IHsgVmVjdG9yLmNsYXNzLCBBYnN0cmFjdExpc3QuY2xhc3MsIEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcywgT2JqZWN0LmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRMaW5rKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogOiB0aGlzLmJ1aWxkSXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFlbaSsrXSwgY2xhenopOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpbmtlcigpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKENsYXNzPD8+IGNsYXp6IDogbmV3IENoYWluSXRlcmFibGU8Q2xhc3M8Pz4+KFZlY3Rvci5jbGFzcywgdGhpcy5idWlsZExpbmtlcigpKSkgewotCQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFlbaSsrXSwgY2xhenopOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKLQkJSXRlcmFibGU8Q2xhc3M8Pz4+IGl0ZXJhYmxlID0gbmV3IENoYWluSXRlcmFibGU8Q2xhc3M8Pz4+KFZlY3Rvci5jbGFzcyk7Ci0JCUl0ZXJhdG9yPENsYXNzPD8+PiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzPD8+IGNsYXp6ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgY2xhc3M6ICIgKyBjbGF6eik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDbGFzczw/Pj4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGFpbkl0ZXJhYmxlKFZlY3Rvci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxDbGFzczw/Pj4gYnVpbGRDaGFpbkl0ZXJhYmxlKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhYmxlPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBidWlsZExpbmtlcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjkyZWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlOwotCi0JcHVibGljIENsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCIwIik7Ci0JCWMuYWRkKCIxIik7Ci0JCWMuYWRkKCIyIik7Ci0JCWMuYWRkKCIzIik7Ci0JCWFzc2VydEVxdWFscyg0LCBjLnNpemUoKSk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoYyk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuaXRlcmFibGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJCWMucmVtb3ZlKCIzIik7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDQsIGkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVyKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGVXaXRoUmVtb3Zlcihjb2xsZWN0aW9uKTsKLQotCQlPYmplY3QgcmVtb3ZlZCA9ICJ0aHJlZSI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIHJlbW92ZWQpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1JlbW92ZXIoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJCWZhaWwoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKTsKLQotCWFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKExpc3Q8U3RyaW5nPiBjKTsKLQotCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGJ1aWxkUmVtb3ZlcihmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+IGJ1aWxkTXV0YXRvcihmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LmFkZChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCQlsaXN0LnNldChpbmRleCwgc3RyaW5nKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDU1MTZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCBjMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDEoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGMxLCAiNCIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQyKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KCIwIiwgYzEpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2ZJdGVyYWJsZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQ29sbGVjdGlvbjxJdGVyYWJsZTxTdHJpbmc+PiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxJdGVyYWJsZTxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChjMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKGMyKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjb2xsZWN0aW9uKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21wb3NpdGUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjA2Y2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMxLCAiNCIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQyKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPigiMCIsIGMxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PExpc3RJdGVyYWJsZTxTdHJpbmc+PigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKSk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzIpKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oY29sbGVjdGlvbik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZS50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWZlMjMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoU3RyaW5nIHMgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGl0ZXJhYmxlLCBUZXN0VG9vbHMuc2VyaWFsaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE1NTVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogRW1wdHlMaXN0SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwoRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShpdGVyYWJsZSwgVGVzdFRvb2xzLnNlcmlhbGl6ZShpdGVyYWJsZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9GaWx0ZXJpbmdJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExYjU2MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHMuY29udGFpbnMoUFJFRklYKSk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IHRoaXMuYnVpbGRGaWx0ZXIoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCksIGZpbHRlcikpIHsKLQkJCWFzc2VydFRydWUocy5jb250YWlucyhQUkVGSVgpKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsdGVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JCXRyeSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJCWZhaWwoImJvZ3VzIGl0ZXJhdG9yOiAiICsgaXRlcmF0b3IpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyaW5nSXRlcmFibGUodGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEZpbHRlcmluZ0l0ZXJhYmxlKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoUFJFRklYKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChQUkVGSVggKyAiMSIpOwotCQljLmFkZChQUkVGSVggKyAiMiIpOwotCQljLmFkZChQUkVGSVggKyAiMyIpOwotCQljLmFkZCgiNCIpOwotCQljLmFkZChQUkVGSVggKyAiNSIpOwotCQljLmFkZChQUkVGSVggKyAiNiIpOwotCQljLmFkZChQUkVGSVggKyAiNyIpOwotCQljLmFkZCgiOCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM5YzQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkdyYXBoSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248R3JhcGhOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JcHVibGljIEdyYXBoSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5laWdoYm9yczEoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGUxKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzMigpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTIoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpLCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnMzKCkgewotCQlmb3IgKEdyYXBoTm9kZSBnbiA6IHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMygpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmFibGUzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPihuZXcgR3JhcGhOb2RlW10geyB0aGlzLmJ1aWxkR3JhcGhSb290KCkgfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzNCgpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTQoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlNCgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4obmV3IEdyYXBoTm9kZVtdIHsgdGhpcy5idWlsZEdyYXBoUm9vdCgpIH0sIHRoaXMuYnVpbGRNaXN0ZXJSb2dlcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTWlzdGVyUm9nZXJzKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlmb3IgKEdyYXBoTm9kZSBnbiA6IG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKSkgewotCQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQkJfQotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+IGJ1aWxkTWlzdGVyUm9nZXJzKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBidWlsZEdyYXBoUm9vdCgpIHsKLQkJR3JhcGhOb2RlIG5jTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk5vcnRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSB2YU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJWaXJnaW5pYSIpOwotCQlHcmFwaE5vZGUgc2NOb2RlID0gbmV3IEdyYXBoTm9kZSgiU291dGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIGdhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkdlb3JnaWEiKTsKLQkJR3JhcGhOb2RlIGZsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkZsb3JpZGEiKTsKLQkJR3JhcGhOb2RlIGFsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkFsYWJhbWEiKTsKLQkJR3JhcGhOb2RlIG1zTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk1pc3Npc3NpcHBpIik7Ci0JCUdyYXBoTm9kZSB0bk5vZGUgPSBuZXcgR3JhcGhOb2RlKCJUZW5uZXNzZWUiKTsKLQotCQluY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgc2NOb2RlLCBnYU5vZGUsIHRuTm9kZSB9KTsKLQkJdmFOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHRuTm9kZSB9KTsKLQkJc2NOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIGdhTm9kZSB9KTsKLQkJZ2FOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHNjTm9kZSwgZmxOb2RlLCBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJZmxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUgfSk7Ci0JCWFsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlLCBtc05vZGUsIHRuTm9kZSB9KTsKLQkJbXNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJdG5Ob2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIG5jTm9kZSwgZ2FOb2RlLCBhbE5vZGUsIG1zTm9kZSB9KTsKLQotCQlyZXR1cm4gbmNOb2RlOwotCX0KLQotCXB1YmxpYyBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhYmxlVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTU2MGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmFwaEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUXVldWVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGFja0l0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmZkZTdmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlzdXBlci50ZXN0SXRlcmF0b3IoKTsKLQkJLy8gaXRlcmFibGUgc2hvdWxkIG5vdyByZXR1cm4gb25seSAzIHN0cmluZ3MgKHNpbmNlIGl0J3MgImxpdmUiKQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLml0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmVyKCk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIG5vIGxvbmdlciBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInRocmVlIikpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoZmluYWwgTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZFJlbW92ZXIoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDcwYzAwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBMaXZlQ2xvbmVJdGVyYWJsZVRlc3RzIHsKLQotCXB1YmxpYyBMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQkvLyAibGl2ZSIgY2xvbmUgaXRlcmFibGUgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IGFkZGVkIHRvIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yQWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0d28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yU2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3Iuc2V0KGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJYy5yZW1vdmUoaW5kZXgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMsIHRoaXMuYnVpbGRNdXRhdG9yKGMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQ5OTJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5QZWVrYWJsZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCVBlZWthYmxlSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpOwotCQlQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGl0ZXJhdG9yLnBlZWsoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUifTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDlmMzM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUXVldWVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUXVldWVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFF1ZXVlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoKTsKLQkJZm9yIChTdHJpbmcgcyA6IGl0ZXJhYmxlKSB7Ci0JCQlhc3NlcnROb3ROdWxsKHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFF1ZXVlSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkUXVldWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCVF1ZXVlPFN0cmluZz4gcSA9IG5ldyBTaW1wbGVRdWV1ZTxTdHJpbmc+KCk7Ci0JCXEuZW5xdWV1ZSgiZm9vIik7Ci0JCXEuZW5xdWV1ZSgiYmFyIik7Ci0JCXEuZW5xdWV1ZSgiYmF6Iik7Ci0JCXJldHVybiBxOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxN2IzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsICI0Iik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KCIwIiwgbGkxKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk9mSXRlcmFibGVzKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMSA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEpOwotCi0JCUxpc3Q8U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkyID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMik7Ci0KLQkJTGlzdDxMaXN0SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKGxpMik7Ci0JCUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4gbGkgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8U3RyaW5nPj4oY29sbGVjdGlvbik7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihsaTEsIGxpMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTk4NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFJlYWRPbmx5SXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTIzZmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5TGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkVmVjdG9yKCkpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwNjFkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmluZyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaW5nbGVFbGVtZW50KCkgewotCQlyZXR1cm4gInNpbmdsZSBlbGVtZW50IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExNTIwZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmluZyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnNpbmdsZUVsZW1lbnQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBzaW5nbGVFbGVtZW50KCkgewotCQlyZXR1cm4gInNpbmdsZSBlbGVtZW50IjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDAwNmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIENsb25lSXRlcmFibGVUZXN0cyB7Ci0KLQlwdWJsaWMgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlzdXBlci50ZXN0SXRlcmF0b3IoKTsKLQkJLy8gInNuYXBzaG90IiBpdGVyYWJsZSBzaG91bGQgc3RpbGwgcmV0dXJuIDQgc3RyaW5ncyAoc2luY2UgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2FzIGNsb25lZCkKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5pdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JCWFzc2VydEVxdWFscyg0LCBpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlzdXBlci50ZXN0UmVtb3ZlKCk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBzdGlsbCBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmVyKCk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBzdGlsbCBjb250YWluIHRoZSBlbGVtZW50IHJlbW92ZWQgZnJvbSB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoZmluYWwgTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJCWMucmVtb3ZlKGN1cnJlbnQpOwotCQkJCX0KLQkJCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlV2l0aFJlbW92ZXIoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjLCB0aGlzLmJ1aWxkUmVtb3ZlcihjKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjNWMxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQkvLyAic25hcHNob3QiIGNsb25lIGl0ZXJhYmxlIG5vdCB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNdXRhdG9yQWRkKCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoY29sbGVjdGlvbik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5pdGVyYWJsZS50b1N0cmluZygpKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlmaW5hbCBMaXN0PFN0cmluZz4gY29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSB0aGlzLmJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQotCQlTdHJpbmcgYWRkZWQgPSAieHh4eCI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidHdvIikpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidHdvIikpIHsKLQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoY29sbGVjdGlvbi5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgd2lsbCBub3QgYmUgY2hhbmdlZAotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInR3byIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQkJYy5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJCWMucmVtb3ZlKGluZGV4KTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0KGludCBpbmRleCwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQkJYy5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlV2l0aFJlbW92ZXIoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZE11dGF0b3IoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU3RhY2tJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTk1YmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdGFja0l0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3RhY2tJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBpdGVyYXRvci5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgaXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU3RhY2tJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGRTdGFjaygpKTsKLQl9Ci0KLQlwcml2YXRlIFN0YWNrPFN0cmluZz4gYnVpbGRTdGFjaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0JCXN0YWNrLnB1c2goIm9uZSIpOwotCQlzdGFjay5wdXNoKCJ0d28iKTsKLQkJc3RhY2sucHVzaCgidGhyZWUiKTsKLQkJcmV0dXJuIHN0YWNrOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1NjA4ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckl0ZXJhYmxlV3JhcHBlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiZm9vIik7Ci0JCWxpc3QuYWRkKCJiYXIiKTsKLQkJbGlzdC5hZGQoImJheiIpOwotCQlTdHJpbmcgY29uY2F0ID0gIiI7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0KSB7Ci0JCQljb25jYXQgKz0gczsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0KLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IG5ldyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxPYmplY3Q+KGxpc3QpOwotCQljb25jYXQgPSAiIjsKLQkJZm9yIChPYmplY3QgcyA6IGl0ZXJhYmxlKSB7Ci0JCQljb25jYXQgKz0gczsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlJdGVyYWJsZTxPYmplY3Q+IGl0ZXJhYmxlID0gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPE9iamVjdD4oQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMTZkZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtMSgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IHRoaXMuYnVpbGRJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYWJsZTEodGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMShJdGVyYWJsZTxTdHJpbmc+IG5lc3RlZEl0ZXJhYmxlKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmFibGUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUyKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYWJsZSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIyIik7Ci0JCWMuYWRkKCIzMzMiKTsKLQkJYy5hZGQoIjQ0NDQiKTsKLQkJYy5hZGQoIjU1NTU1Iik7Ci0JCWMuYWRkKCI2NjY2NjYiKTsKLQkJYy5hZGQoIjc3Nzc3NzciKTsKLQkJYy5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdUcmFuc2Zvcm1lcigpIHsKLQkJSXRlcmFibGU8SW50ZWdlcj4gaXRlcmFibGUgPSBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiBpdGVyYWJsZSkgewotCQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzZhMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTEoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUxKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMSh0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUxKExpc3Q8U3RyaW5nPiBuZXN0ZWRMaXN0KSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZExpc3QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0yKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTIodGhpcy5idWlsZE5lc3RlZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMihMaXN0PFN0cmluZz4gbmVzdGVkTGlzdCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRMaXN0LCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmVzdGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIyIik7Ci0JCWMuYWRkKCIzMzMiKTsKLQkJYy5hZGQoIjQ0NDQiKTsKLQkJYy5hZGQoIjU1NTU1Iik7Ci0JCWMuYWRkKCI2NjY2NjYiKTsKLQkJYy5hZGQoIjc3Nzc3NzciKTsKLQkJYy5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdUcmFuc2Zvcm1lcigpIHsKLQkJSXRlcmFibGU8SW50ZWdlcj4gaXRlcmFibGUgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiBpdGVyYWJsZSkgewotCQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMzUzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyZWVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPFRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcjEoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiB0aGlzLmJ1aWxkVHJlZUl0ZXJhYmxlMSgpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcjIoKSB7Ci0JCWZvciAoVHJlZU5vZGUgdG4gOiB0aGlzLmJ1aWxkVHJlZUl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaWR3aWZlMSgpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaWR3aWZlMigpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KG5ldyBUcmVlTm9kZVtdIHsgdGhpcy5idWlsZFRyZWUoKSB9LCB0aGlzLmJ1aWxkTWlkd2lmZSgpKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFRyZWVJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ01pZHdpZmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZvciAoVHJlZU5vZGUgdG4gOiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSkgewotCQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQkJfQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmFibGUxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhYmxlMigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KG5ldyBUcmVlTm9kZVtdIHsgdGhpcy5idWlsZFRyZWUoKSB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4gYnVpbGRNaWR3aWZlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHVibGljIGNsYXNzIFRyZWVOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRyZWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQkJcHVibGljIFRyZWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJVHJlZUl0ZXJhYmxlVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyZWVOb2RlKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzhjZGEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGkrKywgSW50ZWdlci5wYXJzZUludChzdHJlYW0ubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCkgewotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oLTEsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oOCwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCAtMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigwLCA5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY3MoKSB7Ci0JCUludGVnZXJbXSBpbnRlZ2VycyA9IG5ldyBJbnRlZ2VyWzNdOwotCQlpbnRlZ2Vyc1swXSA9IG5ldyBJbnRlZ2VyKDApOwotCQlpbnRlZ2Vyc1sxXSA9IG5ldyBJbnRlZ2VyKDEpOwotCQlpbnRlZ2Vyc1syXSA9IG5ldyBJbnRlZ2VyKDIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkR2VuZXJpY0l0ZXJhdG9yKGludGVnZXJzKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGludGVnZXJzLmxlbmd0aCwgaSk7Ci0JfQotCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZEdlbmVyaWNJdGVyYXRvcihJbnRlZ2VyW10gaW50ZWdlcnMpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYXJhcmdzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVmFyQXJnSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDMsIGkpOwotCX0KLQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPE51bWJlcj4obmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSk7Ci0JfQotCi0Jdm9pZCB0cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcihzdGFydCwgbGVuZ3RoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJlYW0sIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUxNzYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIEFycmF5SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQXJyYXkoKS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBpLS0sIEludGVnZXIucGFyc2VJbnQoc3RyZWFtLnByZXZpb3VzKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uQWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCIzLjUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uU2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJ0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4oaW50ZWdlcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRWYXJBcmdJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMikpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTGlzdEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8U3RyaW5nPihhcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGNkY2YxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYWluSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIFZFQ1RPUl9ISUVSQVJDSFkgPSB7IFZlY3Rvci5jbGFzcywgQWJzdHJhY3RMaXN0LmNsYXNzLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MsIE9iamVjdC5jbGFzcyB9OwotCi0JcHVibGljIENoYWluSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhWRUNUT1JfSElFUkFSQ0hZLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBsaW5rIiwgVkVDVE9SX0hJRVJBUkNIWVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlqYXZhQ2xhc3MgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgamF2YUNsYXNzLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkgPT0gQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzLCB0aGlzLmJ1aWxkTGlua2VyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckNoYWluSXRlcmF0b3IoVmVjdG9yLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBidWlsZENoYWluSXRlcmF0b3IoQ2xhc3M8Pz4gc3RhcnRMaW5rLCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gbGlua2VyKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxDbGFzczw/Pj4oc3RhcnRMaW5rLCBsaW5rZXIpOwotCX0KLQotCXByaXZhdGUgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGJ1aWxkTGlua2VyKCkgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4oKSB7Ci0JCQlwdWJsaWMgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSW5uZXJDaGFpbkl0ZXJhdG9yKENsYXNzPD8+IHN0YXJ0TGluaykgewotCQkvLyBjaGFpbiB1cCB0aGUgY2xhc3MncyBoaWVyYXJjaHkKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihzdGFydExpbmspIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENsYXNzPD8+IG5leHRMaW5rKENsYXNzPD8+IGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYWluSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPENsYXNzPD8+PiBpdGVyYXRvciA9IG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihWZWN0b3IuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDbGFzczw/PiBjID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBjbGFzczogIiArIGMuZ2V0TmFtZSgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljNDVkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JQ29sbGVjdGlvbjxTdHJpbmc+IG9yaWdpbmFsQ29sbGVjdGlvbjsKLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGNvbmN1cnJlbnRDb2xsZWN0aW9uOwotCi0JcHVibGljIENsb25lSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsaW1pbmF0b3IoKSB7Ci0JCUNsb25lSXRlcmF0b3IuUmVtb3ZlcjxTdHJpbmc+IGVsaW1pbmF0b3IgPSBuZXcgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGVsZW1lbnQpIHsKLQkJCQlDbG9uZUl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbENvbGxlY3Rpb24ucmVtb3ZlKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLCBlbGltaW5hdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVN1YmNsYXNzKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZShuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoY3VycmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTbG93Q29sbGVjdGlvbjxTdHJpbmc+IHNsb3cgPSBuZXcgU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGNvbGxlY3Rpb24gd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vCQl0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbiA9IHNsb3c7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkQ29sbGVjdGlvbihzbG93KTsKLQotCQl0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVRocmVhZCB0aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZSgpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCXdoaWxlICggISBzbG93Lmhhc1N0YXJ0ZWRDbG9uZSgpKSB7Ci0JCQkvLyB3YWl0IGZvciB0aGUgb3RoZXIgdGhyZWFkIHRvIHN0YXJ0IHRoZSBjbG9uZS4uLgotCQkJVGhyZWFkLnlpZWxkKCk7Ci0JCX0KLQkJLy8gLi4udGhlbiBzbmVhayBpbiBhbiBleHRyYSBlbGVtZW50Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgic2V2ZW50ZWVuIik7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24uYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJLy8gdHJ5IHRvIHJlbW92ZSB0d2ljZQotCQkJCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcih0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPihjKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZEVtcHR5Q29sbGVjdGlvbigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihjKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZEVtcHR5Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgic2l4Iik7Ci0JCWMuYWRkKCJzZXZlbiIpOwotCQljLmFkZCgiZWlnaHQiKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb2xsZWN0aW9uICoqKioqKioqKioKLQlzdGF0aWMgY2xhc3MgU2xvd0NvbGxlY3Rpb248RT4gZXh0ZW5kcyBBcnJheUxpc3Q8RT4gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBTbG93Q29sbGVjdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQl0aGlzLnNldEhhc1N0YXJ0ZWRDbG9uZSh0cnVlKTsKLQkJCS8vIHRha2UgYSBsaXR0bGUgc25vb3plIGJlZm9yZSByZXR1cm5pbmcgdGhlIGFycmF5Ci0JCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQkJCXJldHVybiBzdXBlci50b0FycmF5KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBzZXRIYXNTdGFydGVkQ2xvbmUoYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUpIHsKLQkJCXRoaXMuaGFzU3RhcnRlZENsb25lID0gaGFzU3RhcnRlZENsb25lOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzU3RhcnRlZENsb25lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjNhODQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JTGlzdDxTdHJpbmc+IG9yaWdpbmFsTGlzdDsKLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGNvbmN1cnJlbnRMaXN0OwotCi0JcHVibGljIENsb25lTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbFNpemUsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gY2xvbmVMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IDc7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5lc3RlZExpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImZvbyIpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCW9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCS8vIHNob3VsZCBhbGxvdyBjb25jdXJyZW50IG1vZGlmaWNhdGlvbgotCQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJiYXIiKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRUcnVlKG9yaWdpbmFsU2l6ZSAhPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlZmF1bHQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoInRocmVlIGFuZCBhIGhhbGYiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImFub3RoZXIgdGhyZWUiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGF0b3JOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvclByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0LCB0aGlzLmJ1aWxkTXV0YXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4gYnVpbGRNdXRhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5hZGQoaW5kZXgsIG8pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoaW5kZXgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGluZGV4LCBvKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3ViY2xhc3NOZXh0KCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeU5leHQodGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc1ByZXZpb3VzKCkgewotCQl0aGlzLnZlcmlmeU1vZGlmeVByZXZpb3VzKHRoaXMuYnVpbGRTdWJjbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3ViY2xhc3MoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgY3VycmVudEluZGV4KSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5yZW1vdmUoY3VycmVudEluZGV4KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGN1cnJlbnRJbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnNldChjdXJyZW50SW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlNb2RpZnlOZXh0KExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQWZ0ZXIgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmaXZlIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQWZ0ZXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQkvLyB0cnkgdG8gcmVtb3ZlIGJlZm9yZSBjYWxsaW5nICNuZXh0KCkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscyhhZGRlZEFmdGVyKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeVByZXZpb3VzKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyByZW1vdmVkID0gInRocmVlIjsKLQkJU3RyaW5nIGFkZGVkQmVmb3JlID0gImZpdmUiOwotCQlTdHJpbmcgYWRkZWQgPSAiZm91ciBhbmQgYSBoYWxmIjsKLQkJU3RyaW5nIHJlcGxhY2VkID0gInNldmVuIjsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gImFub3RoZXIgc2V2ZW4iOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZEJlZm9yZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoYWRkZWRCZWZvcmUpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZXBsYWNlZCkpIHsKLQkJCQlpdGVyYXRvci5zZXQocmVwbGFjZW1lbnQpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZXBsYWNlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENsb25lTGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKHRoaXMub3JpZ2luYWxMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsTGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZEVtcHR5TGlzdCgpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTGlzdChMaXN0PFN0cmluZz4gbGlzdCkgewotCQlsaXN0LmFkZCgiemVybyIpOwotCQlsaXN0LmFkZCgib25lIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInRocmVlIik7Ci0JCWxpc3QuYWRkKCJmb3VyIik7Ci0JCWxpc3QuYWRkKCJmaXZlIik7Ci0JCWxpc3QuYWRkKCJzaXgiKTsKLQkJbGlzdC5hZGQoInNldmVuIik7Ci0JCWxpc3QuYWRkKCJlaWdodCIpOwotCQlsaXN0LmFkZCgibmluZSIpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRFbXB0eUxpc3QoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGNvbmN1cnJlbnQgYWNjZXNzOiBGaXJzdCBidWlsZCBhIGNsb25lIGl0ZXJhdG9yIGluIGEgc2VwYXJhdGUgdGhyZWFkCi0JICogdGhhdCBoYW5ncyBtb21lbnRhcmlseSBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbjsgdGhlbiBtb2RpZnkgdGhlIHNoYXJlZAotCSAqIGNvbGxlY3Rpb24gaW4gdGhpcyB0aHJlYWQuIFRoaXMgd291bGQgY2F1c2UgYQotCSAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gaW4gdGhlIG90aGVyIHRocmVhZCBpZiB0aGUgY2xvbmUgaXRlcmF0b3IKLQkgKiB3ZXJlIG5vdCBzeW5jaHJvbml6ZWQgb24gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQ2xvbmVJdGVyYXRvclRlc3RzLlNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlTGlzdChzbG93KTsKLQkJLy8gdXNpbmcgdGhlIHVuc3luY2hyb25pemVkIGxpc3Qgd2lsbCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsCi0JCS8vIHRoaXMub3JpZ2luYWxMaXN0ID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbExpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKCkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJd2hpbGUgKCAhIHNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbExpc3QuYWRkKCJzZXZlbnRlZW4iKTsKLQkJdGhyZWFkLmpvaW4oKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLmxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBjbG9uZSBpdGVyYXRvciB0byBsb29wIG92ZXIgdGhlICJzbG93IiBjb2xsZWN0aW9uIGFuZCBjb3B5IGl0cwotCSAqIGNvbnRlbnRzIHRvIHRoZSBjb25jdXJyZW50IGNvbGxlY3Rpb24KLQkgKi8KLQl2b2lkIGxvb3BXaXRoQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQl0aGlzLmNvbmN1cnJlbnRMaXN0LmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3ZGJkNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDgsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKGludCBleHBlY3RlZCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIzKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJdGhpcy52ZXJpZnlBbm90aGVyKDEsIHN0cmVhbSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKGludCBzdGFydCwgSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGluZGV4ID0gc3RhcnQ7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSwgc3RyZWFtLm5leHQoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoImxhc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpIC0gMSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjg4ODg4ODg4IikpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiNjY2NjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmcgaXRlbSA9ICIwIjsKLQkJdGhpcy52ZXJpZnlIYXNBbm90aGVyKDksIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihpdGVtLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSkpOwotCQl0aGlzLnZlcmlmeUFub3RoZXIoMCwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGl0ZW0sIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQl0aGlzLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIYXNBbm90aGVyMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUhhc0Fub3RoZXIodGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEl0ZXJhdG9ycygpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMSgpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZEVtcHR5SXRlcmF0b3JzMigpKTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlQ29tcG9zaXRlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9ycygpKTsKLQl9Ci0KLQkvLyBsZWF2ZSB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIGluIHN1YmNsYXNzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4oaXRlcmF0b3JzKTsKLQl9Ci0KLQkvLyB1c2UgdmFyYXJnIGNvbnN0cnVjdG9yCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCS8vIHVzZSB2YXJhcmcgY29uc3RydWN0b3IKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4obmV3IEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvcnMxKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVtcHR5SXRlcmF0b3JJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEVtcHR5SXRlcmF0b3JzMigpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcnMoKSB7Ci0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMSgpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMygpKTsKLQkJcmV0dXJuIGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDEoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MigpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gKG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQkJbGlzdC5hZGQoIjIyIik7Ci0JCWxpc3QuYWRkKCIzMzMiKTsKLQkJbGlzdC5hZGQoIjQ0NDQiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjU1NTU1Iik7Ci0JCWxpc3QuYWRkKCI2NjY2NjYiKTsKLQkJbGlzdC5hZGQoIjc3Nzc3NzciKTsKLQkJbGlzdC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QxKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDEoKSk7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDIoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MigpKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QzKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTQ0ZTg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQkvLyBwb3NpdGlvbiB0byBlbmQgb2Ygc3RyZWFtCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLnJlbW92ZSgpOwotCi0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAxIiwgdGhpcy5idWlsZExpc3QxKCkuc2l6ZSgpIC0gMiwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjEiKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgLSAxLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZmlyc3QgZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucyhmaXJzdEVsZW1lbnQzKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI2NjY2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudDMgPSBsaXN0My5nZXQoMCk7Ci0KLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZChsaXN0MS5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QyLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDMubGlzdEl0ZXJhdG9yKCkpOwotCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjMuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIGFkZCB0byB0aGUgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJzb21ldGhpbmcgaW4gMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoImZpbmFsZSIpOwotCQlib29sZWFuIGNoZWNrRm9yRmluYWxlID0gdHJ1ZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChjaGVja0ZvckZpbmFsZSkgewotCQkJCWNoZWNrRm9yRmluYWxlID0gZmFsc2U7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAiZmluYWxlIiwgcHJldmlvdXMpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIyLjUiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAocHJldmlvdXMuZXF1YWxzKGZpcnN0RWxlbWVudDMpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc1ByZXZpb3VzKCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uYWRkKCJvbGQgc3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0JCXN0cmVhbS5hZGQoInByZWx1ZGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRlZCBlbGVtZW50IGRyb3BwZWQiLCAicHJlbHVkZSIsIHN0cmVhbS5wcmV2aW91cygpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgKyAzLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICJwcmVsdWRlIiwgbGlzdDEuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMi41IiwgbGlzdDEuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCAiMy41IiwgbGlzdDEuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnRzIG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgKyAzLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJzb21ldGhpbmcgaW4gMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgIm9sZCBzdGFydCBvZiAzIiwgbGlzdDMuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAiZmluYWxlIiwgbGlzdDMuZ2V0KGxpc3QzLnNpemUoKSAtIDEpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGZyb250Ci0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBtaWRkbGUKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5uZXh0KCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydFRydWUoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ucHJldmlvdXMoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJLy8gYWRkIHRvIHRoZSBlbmQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5oYXNOZXh0KCkpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0uc2V0KCIzMzNhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgiZW5kIG9mIDEiKTsKLQkJCX0KLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscygiMjIiKSkgewotCQkJCXN0cmVhbS5zZXQoIjIyYSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5zZXQoInN0YXJ0IG9mIDMiKTsKLQkJCX0KLQkJfQotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudChzKSBhZGRlZCB0byBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCksIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICIyMmEiLCBsaXN0MS5nZXQoMSkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIyMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjMzM2EiLCBsaXN0MS5nZXQoMikpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMSIsICJlbmQgb2YgMSIsIGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMobGFzdEVsZW1lbnQxKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSwgbGlzdDMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgInN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBub3Qgc2V0IGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4UHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBuZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWlmIChuZXh0LmVxdWFscygiMzMzIikpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJaS0tOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKCI3Nzc3Nzc3IikpIHsKLQkJCQlzdHJlYW0uYWRkKCI3LjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgOCwgaSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCI2NjY2NjYiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkvLyByZW1vdmluZyBhIHByZXZpb3VzIGVsZW1lbnQsIGRvZXMgbm90IGNoYW5nZSB0aGUgY3Vyc29yCi0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMS41Iik7Ci0JCQkJaSsrOwotCQkJfQotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDAsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpOwotCX0KLQotCS8vIHVuY2hlY2tlZCBzbyB3ZSBjYW4gb3ZlcnJpZGUgdGhlIHVuY2hlY2tlZCBtZXRob2QgaW4gc3VwZXJjbGFzcwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvciBpdGVyYXRvcnMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPigoTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxTdHJpbmc+PikgaXRlcmF0b3JzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4obmV3IExpc3RJdGVyYXRvcltdIHsgdGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSB9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWU0ODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPE51bWJlcj4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTI0MTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKExpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAobmV4dCk6ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24gKHByZXZpb3VzKTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAocmVtb3ZlKSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuc2V0KG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoc2V0KSIsIGV4Q2F1Z2h0KTsKLQkJdHJ5IHsKLQkJCUVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCkuYWRkKG5ldyBPYmplY3QoKSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biAoYWRkKSIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M3ZDI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVudW1lcmF0aW9uSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yKHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxTdHJpbmc+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5lbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkRW51bWVyYXRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uSXRlcmF0b3I8T2JqZWN0PihlbnVtZXJhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmU5MjBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gInByZWZpeCI7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscyhQUkVGSVggKyAiMyIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRBY2NlcHRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlamVjdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVqZWN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEZhbHNlKCJib2d1cyByZWplY3QiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm90aEhhc05leHQoKSB7Ci0JCS8vIGlmIGJvdGggYWNjZXB0KCkgYW5kIHJlamVjdCgpIGFyZSBvdmVycmlkZGVuLCBhY2NlcHQoKSBpcyB1c2VkCi0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRCb3RoSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkTmV4dCgpIHsKLQkJLy8gbG9hZE5leHQoKSB1c2VkIHRvIGNhdXNlIGEgTlBFIHdoZW4gZXhlY3V0aW5nIGR1cmluZyB0aGUKLQkJLy8gY29uc3RydWN0b3IgYmVjYXVzZSB0aGUgIm91dGVyIiBjbGFzcyBpcyBub3QgYm91bmQgdW50aWwgY29tcGxldGlvbgotCQkvLyBvZiB0aGUgY29uc3RydWN0b3IKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yMigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRmlsdGVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydFRydWUoImJvZ3VzIGFjY2VwdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvciwgZmlsdGVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCVN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBQUkVGSVg7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKEZpbHRlcmluZ0l0ZXJhdG9yVGVzdHMudGhpcy5nZXRQcmVmaXgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQWNjZXB0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEFjY2VwdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JLy8gdGhpcyBpbm5lciBpdGVyYXRvciB3aWxsIGNhbGwgdGhlICJvdXRlciIgb2JqZWN0Ci0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSW5uZXJJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yMih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEZpbHRlckZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQWNjZXB0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVqZWN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFJlamVjdEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkUmVqZWN0RmlsdGVyKFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVGaWx0ZXI8U3RyaW5nLCBTdHJpbmc+KHByZWZpeCkgewotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gcmVqZWN0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCh0aGlzLmNyaXRlcmlvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gdXNlIGFub255bW91cyBpbm5lciBGaWx0ZXIKLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyRmlsdGVyKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgocHJlZml4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRCb3RoSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRmlsdGVyZWRJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZEJvdGhGaWx0ZXIoUFJFRklYKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEJvdGhGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpbHRlcmluZ0l0ZXJhdG9yKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQkJCVN0cmluZyBzID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBzKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMGYyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHcmFwaEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxHcmFwaE5vZGU+KCk7Ci0KLQlwdWJsaWMgR3JhcGhJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQyKCkgewotCQl0aGlzLnZlcmlmeUhhc05leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQyKCkgewotCQl0aGlzLnZlcmlmeU5leHQodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24yKCkgewotCQl0aGlzLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24odGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTEoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUyKCkgewotCQl0aGlzLnZlcmlmeVNpemUodGhpcy5idWlsZEdyYXBoSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaXplKEl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGl0ZXJhdG9yU2l6ZSA9IENvbGxlY3Rpb25Ub29scy5zaXplKGl0ZXJhdG9yKTsKLQkJaW50IGFjdHVhbFNpemUgPSB0aGlzLm5vZGVzLnNpemUoKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIGZldyBpdGVtcyBpbiBpdGVyYXRvci4iLCBpdGVyYXRvclNpemUgPj0gYWN0dWFsU2l6ZSk7Ci0JCWFzc2VydFRydWUoIlRvbyBtYW55IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA8PSBhY3R1YWxTaXplKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEdyYXBoSXRlcmF0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCQlJdGVyYXRvcjxHcmFwaE5vZGU+IGl0ZXJhdG9yID0gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpOwotCQkJR3JhcGhOb2RlIGduID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBncmFwaCBub2RlOiAiICsgZ24pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIGdyYXBoIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlzdGVyUm9nZXJzCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjEoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSwgdGhpcy5idWlsZE1pc3RlclJvZ2VycygpKTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4gYnVpbGRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBvdmVycmlkZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmF0b3I8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHcmFwaE5vZGUgYnVpbGRHcmFwaFJvb3QoKSB7Ci0JCUdyYXBoTm9kZSBuY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJOb3J0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgdmFOb2RlID0gbmV3IEdyYXBoTm9kZSgiVmlyZ2luaWEiKTsKLQkJR3JhcGhOb2RlIHNjTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlNvdXRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSBnYU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJHZW9yZ2lhIik7Ci0JCUdyYXBoTm9kZSBmbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJGbG9yaWRhIik7Ci0JCUdyYXBoTm9kZSBhbE5vZGUgPSBuZXcgR3JhcGhOb2RlKCJBbGFiYW1hIik7Ci0JCUdyYXBoTm9kZSBtc05vZGUgPSBuZXcgR3JhcGhOb2RlKCJNaXNzaXNzaXBwaSIpOwotCQlHcmFwaE5vZGUgdG5Ob2RlID0gbmV3IEdyYXBoTm9kZSgiVGVubmVzc2VlIik7Ci0KLQkJbmNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIHNjTm9kZSwgZ2FOb2RlLCB0bk5vZGUgfSk7Ci0JCXZhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCB0bk5vZGUgfSk7Ci0JCXNjTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBnYU5vZGUgfSk7Ci0JCWdhTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgbmNOb2RlLCBzY05vZGUsIGZsTm9kZSwgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCWZsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlIH0pOwotCQlhbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSwgbXNOb2RlLCB0bk5vZGUgfSk7Ci0JCW1zTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgYWxOb2RlLCB0bk5vZGUgfSk7Ci0JCXRuTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBuY05vZGUsIGdhTm9kZSwgYWxOb2RlLCBtc05vZGUgfSk7Ci0KLQkJcmV0dXJuIG5jTm9kZTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgR3JhcGhOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCQlwcml2YXRlIENvbGxlY3Rpb248R3JhcGhOb2RlPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCQlwdWJsaWMgR3JhcGhOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJR3JhcGhJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQl2b2lkIHNldE5laWdoYm9ycyhHcmFwaE5vZGVbXSBuZWlnaGJvcnMpIHsKLQkJCXRoaXMubmVpZ2hib3JzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmVpZ2hib3JzKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycygpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZWlnaGJvcnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJHcmFwaE5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0pwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGZiMjc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlJdGVyYXRvcnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFpbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENsb25lTGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdyYXBoSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZWVrYWJsZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEwNTZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVla2FibGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidGhyZWUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3VyIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZml2ZSIsIHN0cmVhbS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrKCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZWVrVXBjYXN0KCkgewotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCWZvciAoUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3QgcGVlayA9IHN0cmVhbS5wZWVrKCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBwcmVtYXR1cmVseSBpZGVudGljYWwiLCBwZWVrICE9IG5leHQpOwotCQkJbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJwZWVrIGFuZCBuZXh0IGFyZSBub3QgaWRlbnRpY2FsIiwgcGVlayA9PSBuZXh0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUGVla2FibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8T2JqZWN0PiBidWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlyZXR1cm4gYy5pdGVyYXRvcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxZWVhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlIYXNBbm90aGVyKHN0cmVhbSk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlBbm90aGVyKHN0cmVhbSk7Ci0JCWludCBpID0gODsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBTdHJpbmcudmFsdWVPZihpLS0pLCBzdHJlYW0yLnByZXZpb3VzKCkuc3Vic3RyaW5nKDAsIDEpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCAwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXNJbmRleCgpIHsKLQkJLy8gVE9ETwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtMi5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oc3RyZWFtKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBzdHJpbmcgPSBzdHJlYW0yLnByZXZpb3VzKCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0yLnNldCgianVuayIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeUVtcHR5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlFbXB0eUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8U3RyaW5nPj4pIGl0ZXJhdG9ycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUxpc3RJdGVyYXRvcihTdHJpbmcgc3RyaW5nLCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmllZE5lc3RlZEl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig0MikpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoMTExKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcig3NykpOwotCi0JCUxpc3Q8RmxvYXQ+IGZsb2F0TGlzdCA9IG5ldyBBcnJheUxpc3Q8RmxvYXQ+KCk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDQyLjQyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgyMi4yMmYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoMTExLjExMWYpKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNzcuNzdmKSk7Ci0KLQkJTGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0PD8gZXh0ZW5kcyBOdW1iZXI+PigpOwotCQlsaXN0LmFkZChpbnRlZ2VyTGlzdCk7Ci0JCWxpc3QuYWRkKGZsb2F0TGlzdCk7Ci0JCUxpc3RJdGVyYXRvcjxOdW1iZXI+IGxpID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPE51bWJlcj4obGlzdCk7Ci0JCXdoaWxlIChsaS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydFRydWUobGkubmV4dCgpLmludFZhbHVlKCkgPiAwKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMDQxNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWFkT25seUl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkVmVjdG9yKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXYuYWRkRWxlbWVudCgib25lIik7Ci0JCXYuYWRkRWxlbWVudCgidHdvIik7Ci0JCXYuYWRkRWxlbWVudCgidGhyZWUiKTsKLQkJdi5hZGRFbGVtZW50KCJmb3VyIik7Ci0JCXYuYWRkRWxlbWVudCgiZml2ZSIpOwotCQl2LmFkZEVsZW1lbnQoInNpeCIpOwotCQl2LmFkZEVsZW1lbnQoInNldmVuIik7Ci0JCXYuYWRkRWxlbWVudCgiZWlnaHQiKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDgxYTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91c1VwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91c1VwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEluZGV4QW5kUHJldmlvdXNJbmRleFVwY2FzdCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgiYm9ndXMiKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4obmVzdGVkTGlzdEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8T2JqZWN0PihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIm9uZSIpOwotCQlsLmFkZCgidHdvIik7Ci0JCWwuYWRkKCJ0aHJlZSIpOwotCQlsLmFkZCgiZm91ciIpOwotCQlsLmFkZCgiZml2ZSIpOwotCQlsLmFkZCgic2l4Iik7Ci0JCWwuYWRkKCJzZXZlbiIpOwotCQlsLmFkZCgiZWlnaHQiKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2U1YTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkzYTY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDEsIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygyLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5wcmV2aW91cygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMCwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQoImZvbyIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJmb28iKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI2ZGM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1cGVySXRlcmF0b3JXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCVN0cmluZyBjb25jYXQgPSAiIjsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQljb25jYXQgKz0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImZvb2JhcmJheiIsIGNvbmNhdCk7Ci0KLQkJSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvciA9IG5ldyBTdXBlckl0ZXJhdG9yV3JhcHBlcjxPYmplY3Q+KGxpc3QpOwotCQljb25jYXQgPSAiIjsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoImJhciIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWNvbmNhdCArPSBuZXh0OwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmF6IiwgY29uY2F0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdC5jb250YWlucygiYmFyIikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMjM4Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TeW5jaHJvbml6ZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhbiB1bnN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgY29ycnVwdCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBhbGxvd2luZyB0aHJlYWQgMiB0byBzbmVhayBpbiBhbmQKLQkgKiByZWFkIHRoZSBzYW1lIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWROZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gYm90aCB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhhdCBhIHN5bmNocm9uaXplZCBpdGVyYXRvciB3aWxsIHByb2R1Y2UgdmFsaWQgb3V0cHV0OwotCSAqIHRocmVhZCAxIHdpbGwgcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvcgotCSAqIGFuZCB0aGVuIHNsZWVwIGZvciBhIGJpdCwgYnV0IHRocmVhZCAyIHdpbGwgYmUgbG9ja2VkIG91dCBhbmQKLQkgKiB3YWl0IHRvIHJlYWQgdGhlIHNlY29uZCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgY29ycmVjdCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLm5leHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBsYXN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBydW5uYWJsZTIuaGFzTmV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc05leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IEhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgbGFzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmF6IiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNOZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlSZW1vdmVUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgd3JvbmcgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFJlbW92ZVRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGNvcnJlY3QgZWxlbWVudCB3YXMgcmVtb3ZlZCA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRGYWxzZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCVRlc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0SXRlcmF0b3I8U3RyaW5nPihkZWxheSwgdGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCVN0cmluZ1tdIGJ1aWxkQXJyYXkoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9OwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0KLQkvKioKLQkgKiBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCUUgbmV4dDsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBuZXh0IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgSGFzTmV4dFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzTmV4dDsKLQotCQlIYXNOZXh0VGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNOZXh0ID0gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHJlbW92ZSBydW5uYWJsZQotCSAqLwotCWNsYXNzIFJlbW92ZVRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQkJUmVtb3ZlVGVzdFJ1bm5hYmxlKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGVzdCBpdGVyYXRvcjogSWYge0BsaW5rICNuZXh0KCl9IGlzIGNhbGxlZCB3aGlsZSBleGVjdXRpbmcgb24gdGhlCi0JICoge0BsaW5rIHNsb3dUaHJlYWR9LCB0aGUgaXRlcmF0b3Igd2lsbCBkZWxheSBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlmaW5hbCBsb25nIGRlbGF5OwotCQlmaW5hbCBBcnJheUxpc3Q8RT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJaW50IG5leHRJbmRleCA9IDA7Ci0JCWludCBsYXN0SW5kZXggPSAtMTsKLQkJVGhyZWFkIHNsb3dUaHJlYWQ7Ci0KLQkJVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXksIEUuLi4gYXJyYXkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGF5ID0gZGVsYXk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSB0aGlzLmxpc3Quc2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCWlmICh0aGlzLmhhc05leHQoKSkgewotCQkJCUUgbmV4dCA9IHRoaXMubGlzdC5nZXQodGhpcy5uZXh0SW5kZXgpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubGFzdEluZGV4ID0gdGhpcy5uZXh0SW5kZXgrKzsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0SW5kZXggPT0gLTEpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHRoaXMubGFzdEluZGV4KTsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA8IHRoaXMubmV4dEluZGV4KSB7ICAvLyBjaGVjayBuZWNlc3NhcnkgZm9yIExpc3RJdGVyYXRvcgotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQl9Ci0JCQl0aGlzLmxhc3RJbmRleCA9IC0xOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZjBhYzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMKLQlleHRlbmRzIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMKLXsKLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyBib3RoIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgc2FtZSBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yIDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUyLnByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB0aHJlYWRzIHNob3VsZCBoYXZlIHJlYWQgdGhlIGNvcnJlY3QgZWxlbWVudHMgZnJvbSB0aGUgaXRlcmF0b3IgOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTIucHJldmlvdXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlcmUgYXJlIG1vcmUgInByZXZpb3VzIiBlbGVtZW50cyBvbiB0aGUgaXRlcmF0b3IgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEhhc1ByZXZpb3VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbm8gbW9yZSAicHJldmlvdXMiIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJ1bm5hYmxlMi5oYXNQcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIHN0aWxsIDAgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMCwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZE5leHRJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIDEgOi0pCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRFcXVhbHMoMSwgcnVubmFibGUyLm5leHRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkUHJldmlvdXNJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyBzdGlsbCAwIDotKAotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygwLCBydW5uYWJsZTIucHJldmlvdXNJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFByZXZpb3VzSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBhbmQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGUgbmV4dCBpbmRleCBpcyAtMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHJ1bm5hYmxlMi5wcmV2aW91c0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJU2V0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFNldFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB3cm9uZyBlbGVtZW50IHdhcyBzZXQgOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVNldFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBTZXRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgcmlnaHQgZWxlbWVudCB3YXMgc2V0IDotKQotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlBZGRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgQWRkVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IsICJ4eHgiKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIGVsZW1lbnQgd2FzIGFkZGVkIGF0IHRoZSB3cm9uZyBpbmRleCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXRlcmF0b3IubGlzdC5pbmRleE9mKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZEFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUFkZFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBBZGRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgZWxlbWVudCB3YXMgYWRkZWQgYXQgdGhlIGNvcnJlY3QgaW5kZXggOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEl0ZXJhdG9yLmxpc3QuaW5kZXhPZigieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmF6IikpOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8U3RyaW5nPikgbmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFRlc3RJdGVyYXRvcihsb25nIGRlbGF5KSB7Ci0JCXJldHVybiBuZXcgVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+KGRlbGF5LCB0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogcHJldmlvdXMgcnVubmFibGUKLQkgKi8KLQljbGFzcyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlFIHByZXZpb3VzOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXMgPSB0aGlzLml0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGhhcyBwcmV2aW91cyBydW5uYWJsZQotCSAqLwotCWNsYXNzIEhhc1ByZXZpb3VzVGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWJvb2xlYW4gaGFzUHJldmlvdXM7Ci0KLQkJSGFzUHJldmlvdXNUZXN0UnVubmFibGUoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5oYXNQcmV2aW91cyA9IHRoaXMuaXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogbmV4dCBpbmRleCBydW5uYWJsZQotCSAqLwotCWNsYXNzIE5leHRJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgbmV4dEluZGV4OwotCi0JCU5leHRJbmRleFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLm5leHRJbmRleCA9IHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHByZXZpb3VzIGluZGV4IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlpbnQgcHJldmlvdXNJbmRleDsKLQotCQlQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucHJldmlvdXNJbmRleCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBzZXQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBTZXRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCVNldFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnNldCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBBZGRUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJZmluYWwgRSBlbGVtZW50OwotCi0JCUFkZFRlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IsIEUgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLmFkZCh0aGlzLmVsZW1lbnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGl0ZXJhdG9yOiBJZiB7QGxpbmsgI25leHQoKX0gb3Ige0BsaW5rICNwcmV2aW91cygpfSBpcyBjYWxsZWQKLQkgKiB3aGlsZSBleGVjdXRpbmcgb24gdGhlIHtAbGluayBzbG93VGhyZWFkfSwgdGhlIGl0ZXJhdG9yIHdpbGwgZGVsYXkKLQkgKiBmb3IgdGhlIGNvbmZpZ3VyZWQgdGltZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RJdGVyYXRvcjxFPiBleHRlbmRzIFRlc3RJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPiB7Ci0KLQkJVGVzdExpc3RJdGVyYXRvcihsb25nIGRlbGF5LCBFLi4uIGFycmF5KSB7Ci0JCQlzdXBlcihkZWxheSwgYXJyYXkpOwotCQl9Ci0KLQkJcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleCAhPSAwOwotCQl9Ci0KLQkJcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCQlpZiAodGhpcy5oYXNQcmV2aW91cygpKSB7Ci0JCQkJRSBwcmV2aW91cyA9IHRoaXMubGlzdC5nZXQodGhpcy5wcmV2aW91c0luZGV4KCkpOwotCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IHRoaXMuc2xvd1RocmVhZCkgewotCQkJCQlUZXN0VG9vbHMuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfQotCQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCQkJdGhpcy5sYXN0SW5kZXggPSB0aGlzLm5leHRJbmRleDsKLQkJCQlyZXR1cm4gcHJldmlvdXM7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4IC0gMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA9PSAtMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5zZXQodGhpcy5sYXN0SW5kZXgsIGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQkJdGhpcy5saXN0LmFkZCh0aGlzLmxhc3RJbmRleCwgZSk7Ci0JCQl0aGlzLmxhc3RJbmRleCsrOwotCQkJdGhpcy5sYXN0SW5kZXggPSAtMTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3MTg1YS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksICgoSW50ZWdlcikgc3RyZWFtLm5leHQoKSkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgdHJhbnNmb3JtYXRpb24iLCArK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25JdGVyYXRvcihjLml0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZENvbGxlY3Rpb24oKS5zaXplKCkgLSAxLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24iLCBjLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGMuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPE9iamVjdCwgT2JqZWN0PihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oT2JqZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoKChTdHJpbmcpIG5leHQpLmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLml0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTQzODA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0QW5kSGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzKCkuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJOZXh0QW5kUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IC0xOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoKytpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKGwubGlzdEl0ZXJhdG9yKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSB0aGlzLmJ1aWxkTGlzdCgpOwotCQlmb3IgKExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSA9PSAzKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygibm90aGluZyByZW1vdmVkIiwgdGhpcy5idWlsZExpc3QoKS5zaXplKCkgLSAxLCBsLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IHN0aWxsIGluIGxpc3QiLCBsLmNvbnRhaW5zKCIzMzMiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCIsIGwuY29udGFpbnMoIjIyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uQWRkKCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5hZGQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbk9uU2V0KCkgewotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbS5zZXQobmV3IEludGVnZXIoMCkpOwotCQkJZmFpbCgiZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJSW50ZWdlciBpbnRlZ2VyID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGludGVnZXIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWludCBpID0gc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGkgPT0gMykgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5idWlsZEl0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkSXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVXBjYXN0KExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbC5hZGQoIjEiKTsKLQkJbC5hZGQoIjIyIik7Ci0JCWwuYWRkKCIzMzMiKTsKLQkJbC5hZGQoIjQ0NDQiKTsKLQkJbC5hZGQoIjU1NTU1Iik7Ci0JCWwuYWRkKCI2NjY2NjYiKTsKLQkJbC5hZGQoIjc3Nzc3NzciKTsKLQkJbC5hZGQoIjg4ODg4ODg4Iik7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPih0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJSW50ZWdlciBpbnRlZ2VyID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbCgiaW52YWxpZCBpbnRlZ2VyOiAiICsgaW50ZWdlcik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODAwZTEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJlZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxUcmVlTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JcHVibGljIFRyZWVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMubm9kZXMuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDEoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TmV4dChJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgZWxlbWVudCIsIHRoaXMubm9kZXMuY29udGFpbnMoaXRlcmF0b3IubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmUoSXRlcmF0b3I8VHJlZU5vZGU+IGl0ZXJhdG9yKSB7Ci0JCVN0cmluZyBwYXJlbnROYW1lID0gImNoaWxkIDIiOwotCQlTdHJpbmcgY2hpbGROYW1lID0gImdyYW5kY2hpbGQgMkEiOwotCQlpbnQgc3RhcnRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlpbnQgZW5kU2l6ZSA9IHRoaXMuY2hpbGRyZW5TaXplKHBhcmVudE5hbWUpOwotCQlhc3NlcnRFcXVhbHMoc3RhcnRTaXplIC0gMSwgZW5kU2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2hpbGRyZW5TaXplKFN0cmluZyBub2RlTmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlPiBzdHJlYW0gPSB0aGlzLm5vZGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlUcmVlTm9kZSBub2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMobm9kZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG5vZGUuY2hpbGRyZW5TaXplKCk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihub2RlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gZXhwbGljaXQgbWlkd2lmZQotCSAqLwotCXByaXZhdGUgSXRlcmF0b3I8VHJlZU5vZGU+IGJ1aWxkVHJlZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCksIHRoaXMuYnVpbGRNaWR3aWZlKCkpOwotCX0KLQotCXByaXZhdGUgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+IGJ1aWxkTWlkd2lmZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4oKSB7Ci0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgdHJlZSBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKFRyZWVOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJlZUl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IgPSBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJVHJlZU5vZGUgdG4gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHRyZWUgbm9kZTogIiArIHRuKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTm9kZSBidWlsZFRyZWUoKSB7Ci0JCVRyZWVOb2RlIHJvb3QgPSBuZXcgVHJlZU5vZGUoInJvb3QiKTsKLQkJVHJlZU5vZGUgY2hpbGQxID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAxIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDEsICJncmFuZGNoaWxkIDFBIik7Ci0JCVRyZWVOb2RlIGNoaWxkMiA9IG5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMiIpOwotCQluZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQSIpOwotCQlUcmVlTm9kZSBncmFuZGNoaWxkMkIgPSBuZXcgVHJlZU5vZGUoY2hpbGQyLCAiZ3JhbmRjaGlsZCAyQiIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjEiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQiwgImdyZWF0LWdyYW5kY2hpbGQgMkIyIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQyA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJDIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkMsICJncmVhdC1ncmFuZGNoaWxkIDJDMSIpOwotCQluZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDMiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUcmVlTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlTm9kZT4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRyZWVOb2RlPigpOwotCi0JCXB1YmxpYyBUcmVlTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCVRyZWVJdGVyYXRvclRlc3RzLnRoaXMubm9kZXMuYWRkKHRoaXMpOyAvLyBsb2cgbm9kZQotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzKG5hbWUpOwotCQkJcGFyZW50LmFkZENoaWxkKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDaGlsZChUcmVlTm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUcmVlTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNjY4MjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0NoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0VGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVE9fU1RSSU5HID0gInRoaXMgaXMgYSB0ZXN0IjsKLQotCUNoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyID0gbmV3IEFkYXB0ZXIoKTsKLQotCVN0YXRlQ2hhbmdlRXZlbnQgc3RhdGVDaGFuZ2VFdmVudDsKLQlib29sZWFuIHN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCi0JUHJvcGVydHlDaGFuZ2VFdmVudCBwcm9wZXJ0eUNoYW5nZUV2ZW50OwotCWJvb2xlYW4gcHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE9MRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBORVdfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9MRF9JTlRfVkFMVUUgPSBuZXcgSW50ZWdlcigyNyk7Ci0Jc3RhdGljIGZpbmFsIEJvb2xlYW4gT0xEX0JPT0xFQU5fVkFMVUUgPSBCb29sZWFuLlRSVUU7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgTkVXX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDQyKTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBORVdfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlDb2xsZWN0aW9uRXZlbnQgY29sbGVjdGlvbkV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9OQU1FID0gImNvbGxlY3Rpb25OYW1lIjsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IEFEREVEX09CSkVDVF9WQUxVRV8yID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIGludCBUQVJHRVRfSU5ERVggPSA3OwotCXN0YXRpYyBmaW5hbCBpbnQgU09VUkNFX0lOREVYID0gMjI7Ci0KLQlMaXN0RXZlbnQgbGlzdEV2ZW50OwotCWJvb2xlYW4gaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBpdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX05BTUUgPSAibGlzdE5hbWUiOwotCXN0YXRpYyBmaW5hbCBpbnQgQUREX0lOREVYID0gMzsKLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRV9JTkRFWCA9IDU7Ci0Jc3RhdGljIGZpbmFsIGludCBSRVBMQUNFX0lOREVYID0gMjsKLQotCVRyZWVFdmVudCB0cmVlRXZlbnQ7Ci0JYm9vbGVhbiBub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIG5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiB0cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gdHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRSRUVfTkFNRSA9ICJ0cmVlTmFtZSI7Ci0Jc3RhdGljIGZpbmFsIExpc3Q8T2JqZWN0PiBPQkpFQ1RfUEFUSCA9IEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0KCksIG5ldyBPYmplY3QoKSwgbmV3IFN0cmluZygpfSk7Ci0KLQotCXB1YmxpYyBDaGFuZ2VTdXBwb3J0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU291cmNlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDaGFuZ2VTdXBwb3J0IGNzID0gbmV3IENoYW5nZVN1cHBvcnQobnVsbCk7Ci0JCQlmYWlsKCJib2d1cyBjaGFuZ2Ugc3VwcG9ydDogIiArIGNzKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQl0aGlzLnN0YXRlQ2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVTdGF0ZUNoYW5nZSgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3RhdGVDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5zdGF0ZUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVyc0R1cGxpY2F0ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsU3RhdGVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNTdGF0ZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihuZXcgU3RhdGVDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KG51bGwsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfSU5UX1ZBTFVFLCBORVdfSU5UX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9CT09MRUFOX1ZBTFVFLCBORVdfQk9PTEVBTl9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcihudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXJOYW1lKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnRlc3RNb2RlbCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQUk9QRVJUWV9OQU1FLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk1peGVkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRV8yKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQyKFJFTU9WRURfT0JKRUNUX1ZBTFVFLCAiZm9vIiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JLy8gY29sbGVjdGlvbiBjbGVhcmVkLi4uCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjEoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRUcnVlKGNzbC5pdGVtc1JlbW92ZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNoYW5nZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLmFkZGVkSXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoY3NsLmFkZGVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImpvbyIsICJqYXIifSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY3NsLnJlbW92ZWRJdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjc2wucmVtb3ZlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydEZhbHNlKGNzbC5pdGVtc0FkZGVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLml0ZW1zUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2hhbmdlZCk7Ci0JCWFzc2VydFRydWUoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuYWRkZWRJdGVtcy5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGNzbC5yZW1vdmVkSXRlbXMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMygpIHsKLQkJQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgY3NsID0gbmV3IENvbGxlY3Rpb25TeW5jaExpc3RlbmVyKCk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNzbCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjMoKSk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuaXRlbXNSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DaGFuZ2VkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DbGVhcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNzbC5hZGRlZEl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGNzbC5hZGRlZEl0ZW1zLCBuZXcgT2JqZWN0W10geyJqb28iLCAiamFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydFRydWUoY3NsLnJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpOwotCX0KLQotCWNsYXNzIENvbGxlY3Rpb25TeW5jaExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCWJvb2xlYW4gaXRlbXNBZGRlZCA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1zUmVtb3ZlZCA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWQgPSB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc0FkZGVkID0gdHJ1ZTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5hZGRlZEl0ZW1zLCBldmVudC5nZXRJdGVtcygpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWQgPSB0cnVlOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLnJlbW92ZWRJdGVtcywgZXZlbnQuZ2V0SXRlbXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0NvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25FdmVudChPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmNvbGxlY3Rpb25FdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDT0xMRUNUSU9OX05BTUUsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgdGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Pz4gZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoT2JqZWN0Li4uIGl0ZW1zKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5sZW5ndGgsIHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXMoKSwgaXRlbSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0Q29sbGVjdGlvbkV2ZW50SXRlbXNTaXplKCkgewotCQlpZiAodGhpcy5jb2xsZWN0aW9uRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5jb2xsZWN0aW9uRXZlbnQpLmdldEl0ZW1zU2l6ZSgpOwotCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbU1vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZUV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMywgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDEsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkl0ZW1zSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgwLCAiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbUluTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlcGxhY2VJdGVtSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoMSwgInh4eCIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTZXRJdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc0luTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCgyLCA0LCAyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdE1vdmVJdGVtc0luTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoMiwgNCwgMik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdENsZWFyRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbExpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBudWxsKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQm9ndXNMaXN0TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0QWRkRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdJdGVtLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZEl0ZW0sICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIDEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0TW92ZUV2ZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YXJnZXRJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2VJbmRleCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0U291cmNlSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhsZW5ndGgsICgoTGlzdE1vdmVFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENsZWFyRXZlbnQoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0Q2xlYXJFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RDaGFuZ2VFdmVudC5jbGFzcywgdGhpcy5saXN0RXZlbnQuZ2V0Q2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChPQkpFQ1RfUEFUSCk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1RyZWVMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVRyZWVFdmVudChMaXN0PD8+IHBhdGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy50cmVlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFJFRV9OQU1FLCB0aGlzLnRyZWVFdmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhdGgsIHRoaXMuZ2V0TGlzdFBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PD8+IGdldExpc3RQYXRoKCkgewotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IHRoaXMuZ2V0UGF0aCgpOwotCQlyZXR1cm4gKGl0ZXJhYmxlID09IG51bGwpICA/IG51bGwgOiBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRQYXRoKCkgewotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlQWRkRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVBZGRFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlpZiAodGhpcy50cmVlRXZlbnQgaW5zdGFuY2VvZiBUcmVlUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKFRyZWVSZW1vdmVFdmVudCkgdGhpcy50cmVlRXZlbnQpLmdldFBhdGgoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRXF1YWwoYzEsIGMyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCJmb28iKTsKLQkJYzEuYWRkKCJiYXIiKTsKLQkJYzEuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiYmF6Iik7Ci0JCWMyLmFkZCgiYmFyIik7Ci0JCWMyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50KGMxLCBjMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbChudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWwzKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDQoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkNSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKCJiYXIiLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZDUoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxDbG9uZSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoYXQgdGhlIGNsb25lIGRvZXMgbm90IGhhdmUgYW55IGxpc3RlbmVycwotCQlUZXN0TW9kZWwgY2xvbmUgPSB0aGlzLnRlc3RNb2RlbC5jbG9uZSgpOwotCQlhc3NlcnRGYWxzZShjbG9uZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCWNsb25lLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJLy8gY2hlY2sgb3JpZ2luYWwKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IG9yaWdpbmFsCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCS8vIG5vdyB0ZXN0IGV2ZW50cyBmaXJlZCBieSBjbG9uZQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCWNsb25lLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChjbG9uZSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxUb1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50b1N0cmluZygpLmNvbnRhaW5zKCcoJyArIFRFU1RfVE9fU1RSSU5HICsgJyknKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0KLQljbGFzcyBBZGFwdGVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5zdGF0ZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IGU7Ci0JCX0KLQkKLQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuY29sbGVjdGlvbkV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmxpc3RFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLm5vZGVBZGRlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy50cmVlRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBzdGF0ZQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVN0YXRlQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQkvLyAqKioqKiBwcm9wZXJ0eQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLCBQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBPTERfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgT0xEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfSU5UX1ZBTFVFLmludFZhbHVlKCksIE5FV19JTlRfVkFMVUUuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW4oKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCksIE5FV19CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgT0xEX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJLy8gKioqKiogY29sbGVjdGlvbgotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKENPTExFQ1RJT05fTkFNRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENPTExFQ1RJT05fTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oQURERURfT0JKRUNUX1ZBTFVFLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKEFEREVEX09CSkVDVF9WQUxVRSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRERFRF9PQkpFQ1RfVkFMVUUpLCBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKSwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFEREVEX09CSkVDVF9WQUxVRSksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7QURERURfT0JKRUNUX1ZBTFVFLCBBRERFRF9PQkpFQ1RfVkFMVUVfMn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbigiZm9vIiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJmb28iKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb25zLnNpbmdsZXRvbigiZm9vIiksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihuZXcgT2JqZWN0W10geyJmb28iLCAiYmFyIn0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIiLCBSRU1PVkVEX09CSkVDVF9WQUxVRX0sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0Q2xlYXJDb2xsZWN0aW9uKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiam9vIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiamFyIik7Ci0JCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24zKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqb28iKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqYXIiKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvLyAqKioqKiBsaXN0Ci0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IExpc3RBZGRFdmVudCh0aGlzLCBMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFEREVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX05BTUUsIEFERF9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9OQU1FLCBSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQobmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcywgTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBRERFRF9PQkpFQ1RfVkFMVUUpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYLCAxKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQobmV3IExpc3RNb3ZlRXZlbnQodGhpcywgTElTVF9OQU1FLCBTT1VSQ0VfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKExJU1RfTkFNRSwgU09VUkNFX0lOREVYLCBTT1VSQ0VfSU5ERVgsIDEpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtTW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbU1vdmVkKExJU1RfTkFNRSwgVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQobmV3IExpc3RDbGVhckV2ZW50KHRoaXMsIExJU1RfTkFNRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDbGVhcmVkKExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX05BTUUsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KDIsICJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KCJqb28iLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJqb28iKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdCgyLCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiam9vIiksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoMSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoImJhciIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4KCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgxLCAxLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCgyLCAwLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImJhciIpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXRhaW5JdGVtc0luTGlzdChuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0sIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZXBsYWNlSXRlbUluTGlzdCgiYmFyIiwgInh4eCIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5zZXRJdGVtc0luTGlzdCgxLCBuZXcgU3RyaW5nW10geyJ4eHgifSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNJbkxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJbGlzdC5hZGQoInh4eCIpOwotCQkJbGlzdC5hZGQoInl5eSIpOwotCQkJbGlzdC5hZGQoInp6eiIpOwotCQkJdGhpcy5tb3ZlSXRlbXNJbkxpc3QoMiwgNCwgMiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RDbGVhckxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5jbGVhckxpc3QobGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gb2xkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJb2xkTGlzdC5hZGQoImZvbyIpOwotCQkJb2xkTGlzdC5hZGQoImJhciIpOwotCQkJb2xkTGlzdC5hZGQoImJheiIpOwotCQkJb2xkTGlzdC5hZGQoInh4eCIpOwotCQkJb2xkTGlzdC5hZGQoInl5eSIpOwotCQkJb2xkTGlzdC5hZGQoInp6eiIpOwotCQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCW5ld0xpc3QuYWRkKCJmb28iKTsKLQkJCW5ld0xpc3QuYWRkKCJwcHAiKTsKLQkJCW5ld0xpc3QuYWRkKCJiYXoiKTsKLQkJCW5ld0xpc3QuYWRkKCJ4eHgiKTsKLQkJCW5ld0xpc3QuYWRkKCJxcXEiKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIG9sZExpc3QsIExJU1RfTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3TGlzdCwgb2xkTGlzdCk7Ci0JCX0KLQotCQkvLyAqKioqKiB0cmVlCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKG5ldyBUcmVlQWRkRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlKCkgewotCQkJdGhpcy5maXJlTm9kZUFkZGVkKFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKG5ldyBUcmVlUmVtb3ZlRXZlbnQodGhpcywgVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWUoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChUUkVFX05BTUUsIE9CSkVDVF9QQVRIKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLCBUUkVFX05BTUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNsZWFyZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChUUkVFX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQobmV3IFRyZWVDaGFuZ2VFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQkvLyAqKioqKiBtaXNjCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgVGVzdE1vZGVsIGNsb25lKCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFRlc3RNb2RlbCkgc3VwZXIuY2xvbmUoKTsKLQkJCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RWYWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5lbGVtZW50c0FyZURpZmZlcmVudChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0RWxlbWVudHNBcmVFcXVhbChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZChURVNUX1RPX1NUUklORyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXJpYWxpemF0aW9uIHRlc3QgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJLy8gVGhpcyB0ZXN0IGRvZXNuJ3QgcGFzcyBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCAoTGludXgvSUJNIEpWTSkgZm9yIHNvbWUgcmVhc29uCi0JCQl0aGlzLnZlcmlmeVNlcmlhbGl6YXRpb24oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXJpYWxpemF0aW9uKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlMb2NhbE1vZGVsIG1vZGVsMSA9IG5ldyBMb2NhbE1vZGVsKCk7Ci0JCUZvbyBmb28xID0gbmV3IEZvbygpOwotCQlCYXIgYmFyMSA9IG5ldyBCYXIoKTsKLQkJSm9vIGpvbzEgPSBuZXcgSm9vKCk7Ci0JCUphciBqYXIxID0gbmV3IEphcigpOwotCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihmb28xKTsKLQkJbW9kZWwxLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoYmFyMSk7Ci0JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGpvbzEpOwotCQltb2RlbDEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBqYXIxKTsKLQotCQlJdGVyYWJsZTxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnMxID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwxLCBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBudWxsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzQXJyYXkxID0gQXJyYXlUb29scy5hcnJheShsaXN0ZW5lcnMxKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGxpc3RlbmVyc0FycmF5MS5sZW5ndGgpOwotCQkvLyB0aGUgb3JkZXIgb2YgdGhlc2UgY291bGQgY2hhbmdlLi4uCi0JCWFzc2VydEVxdWFscyhGb28uY2xhc3MsIGxpc3RlbmVyc0FycmF5MVswXS5nZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJhci5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzFdLmdldENsYXNzKCkpOwotCi0JCWxpc3RlbmVyczEgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDEsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQlsaXN0ZW5lcnNBcnJheTEgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczEpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJzQXJyYXkxLmxlbmd0aCk7Ci0JCS8vIHRoZSBvcmRlciBvZiB0aGVzZSBjb3VsZCBjaGFuZ2UuLi4KLQkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzBdLmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoSmFyLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMV0uZ2V0Q2xhc3MoKSk7Ci0KLQkJTG9jYWxNb2RlbCBtb2RlbDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1vZGVsMSk7Ci0KLQkJSXRlcmFibGU8RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzMiA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMiwgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgbnVsbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVyc0FycmF5MiA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMik7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnNBcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkyWzBdLmdldENsYXNzKCkpOwotCi0JCWxpc3RlbmVyczIgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDIsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQlsaXN0ZW5lcnNBcnJheTIgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczIpOwotCQlhc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXJzQXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhKb28uY2xhc3MsIGxpc3RlbmVyc0FycmF5MlswXS5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVycyhMb2NhbE1vZGVsIG1vZGVsLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KG1vZGVsLCBsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKS5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RlbmVyTGlzdDxFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckxpc3QoTG9jYWxNb2RlbCBtb2RlbCwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCUNoYW5nZVN1cHBvcnQgY2hhbmdlU3VwcG9ydCA9IChDaGFuZ2VTdXBwb3J0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImNoYW5nZVN1cHBvcnQiKTsKLQkJcmV0dXJuIChMaXN0ZW5lckxpc3Q8RXZlbnRMaXN0ZW5lcj4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNoYW5nZVN1cHBvcnQsICJnZXRMaXN0ZW5lckxpc3RfIiwgbmV3IENsYXNzPD8+W10ge0NsYXNzLmNsYXNzLCBTdHJpbmcuY2xhc3N9LCBuZXcgT2JqZWN0W10ge2xpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWV9KTsKLQl9Ci0KLQkvLyB3ZSBoYXZlIHRvIG1hbnVhbGx5IGhhbmRsZSAnY2hhbmdlU3VwcG9ydCcgc2luY2UgQWJzdHJhY3RNb2RlbCBpcyBub3QgU2VyaWFsaXphYmxlCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlMb2NhbE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJCXMud3JpdGVPYmplY3QodGhpcy5jaGFuZ2VTdXBwb3J0KTsKLQkgICAgfQotCQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCQkJdGhpcy5jaGFuZ2VTdXBwb3J0ID0gKENoYW5nZVN1cHBvcnQpIHMucmVhZE9iamVjdCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRm9vIGltcGxlbWVudHMgU2VyaWFsaXphYmxlLCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJRm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmFyIGltcGxlbWVudHMgU3RhdGVDaGFuZ2VMaXN0ZW5lciB7Ci0JCUJhcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEpvbyBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLQkJSm9vKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEphciBleHRlbmRzIExpc3RDaGFuZ2VBZGFwdGVyIHsKLQkJSmFyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBidWcoPykgdGVzdCAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNFX01FU1NBR0UgPSAidGhpcyBvYmplY3QgaXMgbm8gbG9uZ2VyIGxpc3RlbmluZyB0byBsb2NhbEEiOwotCi0JLyoqCi0JICogVGVzdCB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbjoKLQkgKiAJLSBib3RoIEIgYW5kIEMgYXJlIGxpc3RlbmluZyB0byBBCi0JICogCS0gQyBpcyBhbHNvIGxpc3RlbmluZyB0byBCCi0JICogCS0gd2hlbiBCIHJlY2VpdmVzIGFuIGV2ZW50IGZyb20gQSwgaXQgd2lsbCBmaXJlIGFuIGV2ZW50IHRvIEMKLQkgKiAJLSB3aGVuIEMgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBCLCBpdCB3aWxsIFNUT1AgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSB0aGUgZXZlbnQgZnJvbSBCIHRvIEMgbWF5IGJlIHByZWNlZGVkIG9yIGZvbGxvd2VkIChkZXBlbmRpbmcgb24KLQkgKiAJCXRoZSBoYXNoIHBvc2l0aW9ucyBvZiBsaXN0ZW5lcnMpIGJ5IGFuIGV2ZW50IGZyb20gQSB0byBDOgotCSAqIAkJLSBpZiB0aGUgQSB0byBDIGV2ZW50IGNvbWVzIGZpcnN0LCBubyBwcm9ibGVtCi0JICogCQktIGJ1dCBpZiB0aGUgQSB0byBCIGV2ZW50IGNvbWVzIGZpcnN0LCB0aGUgQSB0byBDIGV2ZW50IHNob3VsZCBOT1QgaGFwcGVuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlU3RhdGVMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUxpc3RMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUxpc3RMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlVHJlZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5VHJlZUxpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKE5vdGlmeUNvbW1hbmQgY29tbWFuZCkgewotCQlMb2NhbEEgbG9jYWxBID0gbmV3IExvY2FsQSgpOwotCQlMb2NhbEIgbG9jYWxCID0gbmV3IExvY2FsQihsb2NhbEEpOwotCi0JCS8vIGJ1aWxkIGEgYnVuY2ggb2YgTG9jYWxDcyBzbyBhdCBsZWFzdCBvbmUgb2YgdGhlbSBpcyBub3RpZmllZCBBRlRFUiB0aGUgTG9jYWxCOwotCQkvLyB1c2luZyAxMDAwIHNlZW1lZCB0byBmYWlsIHZlcnkgY29uc2lzdGVudGx5IGJlZm9yZSBDaGFuZ2VTdXBwb3J0IHdhcyBmaXhlZAotCQlMb2NhbENbXSBsb2NhbENzID0gbmV3IExvY2FsQ1sxMDAwXTsKLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxvY2FsQ3NbaV0gPSBuZXcgTG9jYWxDKGxvY2FsQSwgbG9jYWxCKTsKLQkJfQotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWNvbW1hbmQubm90aWZ5TGlzdGVuZXJzKGxvY2FsQSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKSA9PSBJU0VfTUVTU0FHRSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoZXhDYXVnaHQpOwotCi0JCWZvciAoaW50IGkgPSBsb2NhbENzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlhc3NlcnRGYWxzZShsb2NhbENzW2ldLmlzTGlzdGVuaW5nVG9Mb2NhbEEoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBOb3RpZnlDb21tYW5kIHsKLQkJdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgc2ltcGx5IGZpcmVzIGEgc3RhdGUgY2hhbmdlIGV2ZW50LiBCb3RoIExvY2FsQiBhbmQgTG9jYWxDCi0JICogd2lsbCBiZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxBIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxvY2FsQSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgbm90aWZ5UHJvcGVydHlMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImZvbyIsIDEsIDIpOwotCQl9Ci0JCXZvaWQgbm90aWZ5Q29sbGVjdGlvbkxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQl2b2lkIG5vdGlmeUxpc3RMaXN0ZW5lcnMoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiZm9vIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0JCXZvaWQgbm90aWZ5VHJlZUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgZmlyZSBzdGF0ZSBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIGl0IHJlY2VpdmVzCi0JICogYSBzdGF0ZSBjaGFuZ2UgZXZlbnQgZnJvbSBsb2NhbEEuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxCCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi0JewotCQlMb2NhbEIoTG9jYWxBIGxvY2FsQSkgewotCQkJc3VwZXIoKTsKLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoImJhciIsIDEsIDIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJiYXIiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCB3aWxsIGxpc3RlbiB0byB0d28gb3RoZXIgb2JqZWN0cywgbG9jYWxBIGFuZCBsb2NhbEIuCi0JICogSWYgdGhpcyBvYmplY3QgcmVjZWl2ZXMgbm90aWZpY2F0aW9uIGZyb20gbG9jYWxCLCBpdCB3aWxsIHN0b3AgbGlzdGVuaW5nIHRvCi0JICogbG9jYWxBLiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEEsIGl0IHdpbGwgY2hlY2sgdG8KLQkgKiBzZWUgd2hldGhlciBpdCBzdGlsbCBsaXN0ZW5pbmcgdG8gbG9jYWxBLiBJZiB0aGlzIG9iamVjdCBpcyBubyBsb25nZXIKLQkgKiBsaXN0ZW5pbmcgdG8gbG9jYWxBLCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IHJlY2VpdmluZyB0aGUgZXZlbnQgYW5kCi0JICogdGhyb3cgYW4gZXhjZXB0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsQwotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBMb2NhbEEgbG9jYWxBOwotCQlwcml2YXRlIExvY2FsQiBsb2NhbEI7Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5pbmdUb0xvY2FsQTsKLQotCQlMb2NhbEMoTG9jYWxBIGxvY2FsQSwgTG9jYWxCIGxvY2FsQikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubG9jYWxBID0gbG9jYWxBOwotCQkJdGhpcy5sb2NhbEIgPSBsb2NhbEI7Ci0KLQkJCWxvY2FsQS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSB0cnVlOwotCi0JCQlsb2NhbEIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJYm9vbGVhbiBpc0xpc3RlbmluZ1RvTG9jYWxBKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEE7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdFV0aWxpdHlNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmNjRlZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5zdWl0ZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5ld0V2ZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL05ld0V2ZW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlNGFjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIHRlc3Qgd2hhdCBpdCB0YWtlcyB0byBhZGQgYSBuZXcgdHlwZSBvZiBldmVudCB0bwotICogbW9kZWwgYW5kIGNoYW5nZSBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXdFdmVudFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRm9vIGZvbzsKLQotCXB1YmxpYyBOZXdFdmVudFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBGb28oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5mb28ucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCXRoaXMuZm9vLmFkZEZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuZm9vLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlRm9vQ2hhbmdlRXZlbnQoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmZvby5mb28oKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0ZW5lci5yZWNlaXZlZEZvb0V2ZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGFybmVzcyBjbGFzc2VzICoqKioqKioqKioKLQotCWNsYXNzIEZvbyBleHRlbmRzIEFic3RyYWN0Rm9vTW9kZWwgewotCQlGb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgZm9vKCkgewotCQkJdGhpcy5maXJlRm9vQ2hhbmdlRXZlbnQoKTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgaW1wbGVtZW50cyBGb29DaGFuZ2VMaXN0ZW5lciB7Ci0JCWJvb2xlYW4gcmVjZWl2ZWRGb29FdmVudCA9IGZhbHNlOwotCQlMb2NhbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmb29DaGFuZ2VkKEZvb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLnJlY2VpdmVkRm9vRXZlbnQgPSB0cnVlOwotCQl9Ci0JfQotCi0JaW50ZXJmYWNlIEZvb01vZGVsIGV4dGVuZHMgTW9kZWwgewotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0JfQotCi0JaW50ZXJmYWNlIEZvb0NoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0JCXZvaWQgZm9vQ2hhbmdlZChGb29DaGFuZ2VFdmVudCBldmVudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZUV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHVibGljIEZvb0NoYW5nZUV2ZW50KEZvb01vZGVsIHNvdXJjZSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJfQotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCQlyZXR1cm4gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgbmV3U291cmNlKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBBYnN0cmFjdEZvb01vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIEZvb01vZGVsIHsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRm9vQ2hhbmdlU3VwcG9ydCBnZXRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIChGb29DaGFuZ2VTdXBwb3J0KSBzdXBlci5nZXRDaGFuZ2VTdXBwb3J0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgRm9vQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRGb29DaGFuZ2VMaXN0ZW5lcihGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgZmlyZUZvb0NoYW5nZUV2ZW50KCkgewotCQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUZvb0NoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEZvb0NoYW5nZVN1cHBvcnQgZXh0ZW5kcyBDaGFuZ2VTdXBwb3J0IHsKLQkJRm9vQ2hhbmdlU3VwcG9ydChGb29Nb2RlbCBzb3VyY2UpIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxGb29DaGFuZ2VMaXN0ZW5lcj4gRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IEZvb0NoYW5nZUxpc3RlbmVyLmNsYXNzOwotCQl2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmFkZExpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUxpc3RlbmVyKEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUyk7Ci0JCX0KLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGdldEZvb0NoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQkJfQotCQlwcml2YXRlIEl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBnZXRGb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCQlMaXN0ZW5lckxpc3Q8Rm9vQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGhhc0Zvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmaXJlRm9vQ2hhbmdlZCgpIHsKLQkJCUl0ZXJhYmxlPEZvb0NoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldEZvb0NoYW5nZUxpc3RlbmVycygpOwotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJRm9vQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQkJCWZvciAoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQkJaWYgKHRoaXMuaGFzRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpKSB7Ci0JCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJCS8vIGhlcmUncyB0aGUgcmVhc29uIGZvciB0aGUgZHVwbGljYXRlIGNvZGUuLi4KLQkJCQkJCQlldmVudCA9IG5ldyBGb29DaGFuZ2VFdmVudCgoRm9vTW9kZWwpIHRoaXMuc291cmNlKTsKLQkJCQkJCX0KLQkJCQkJCWxpc3RlbmVyLmZvb0NoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZGFlMDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL1NpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFByb3BlcnR5VGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IENvbGxlY3Rpb25UZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTGlzdENoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgTGlzdFRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFRyZWVDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUcmVlQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBUcmVlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRyZWVDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCBtb2RlbHMgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIFN0YXRlVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVN0YXRlVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIG51bGwpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFByb3BlcnR5VGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVByb3BlcnR5VGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUNvbGxlY3Rpb25UZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgTGlzdFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlMaXN0VGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRyZWVUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJVHJlZVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBUcmVlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZTNmNzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFlNWMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRaZXJvQXJndW1lbnQiLCAiaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQiLCAiY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpID09IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbi5jbGFzcykgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgImNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7Q29sbGVjdGlvbkNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQkvLyBidWlsZCBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBMSVNUIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiYm9ndXMgbGlzdCIsIChMaXN0Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlTGlzdCgpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfQ09MTEVDVElPTiA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIHMpIHsKLQkJCQkJVGVzdE1vZGVsLnRoaXMucmVtb3ZlU3RyaW5nKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGRTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgcmVtb3ZlU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0cmluZywgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgY2xlYXJTdHJpbmdzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5zdHJpbmdzLCBTVFJJTkdTX0NPTExFQ1RJT04pOwotCQl9Ci0JCXZvaWQgcmVwbGFjZVN0cmluZ3MoU3RyaW5nW10gbmV3U3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuc3RyaW5ncywgbmV3U3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VMaXN0KCkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImJvZ3VzIGxpc3QiLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWU7Ci0JCVN0cmluZyBzdHJpbmc7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25FdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7Ci0JCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZERvdWJsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlICsgIiBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY2YzliLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQiLCAiaXRlbU1vdmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50IiwgImxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJpdGVtQWRkZWRTaW5nbGVBcmd1bWVudCIsICJpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50IiwgImxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVwbGFjZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gImZvbyI7Ci0JCVN0cmluZyBuZXdTdHJpbmcgPSAiYmFyIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhvbGRTdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG5ld1N0cmluZywgMCwgb2xkU3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmcob2xkU3RyaW5nLCBuZXdTdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwubW92ZVN0cmluZygwLCAyKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtTW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygiemVybyIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJvbmUiKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidHdvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoInRocmVlIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgMCwgMik7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlQWxsU3RyaW5ncyhuZXcgU3RyaW5nW10geyJiYXIiLCAiYmF6In0pOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAibGlzdENoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtMaXN0Q2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCS8vIGJ1aWxkIGEgTElTVCBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJsaXN0RXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJib2d1cyBjb2xsZWN0aW9uIiwgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VDb2xsZWN0aW9uKCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19MSVNUID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3Qoc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodGhpcy5zdHJpbmdzLmluZGV4T2Yoc3RyaW5nKSwgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVwbGFjZVN0cmluZyhTdHJpbmcgb2xkU3RyaW5nLCBTdHJpbmcgbmV3U3RyaW5nKSB7Ci0JCQl0aGlzLnNldEl0ZW1Jbkxpc3QodGhpcy5zdHJpbmdzLmluZGV4T2Yob2xkU3RyaW5nKSwgbmV3U3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBtb3ZlU3RyaW5nKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgY2xlYXJTdHJpbmdzKCkgewotCQkJdGhpcy5jbGVhckxpc3QodGhpcy5zdHJpbmdzLCBTVFJJTkdTX0xJU1QpOwotCQl9Ci0JCXZvaWQgcmVwbGFjZUFsbFN0cmluZ3MoU3RyaW5nW10gbmV3U3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuc3RyaW5ncywgbmV3U3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChTVFJJTkdTX0xJU1QsIHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJvZ3VzIGNvbGxlY3Rpb24iLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBsaXN0TmFtZTsKLQkJU3RyaW5nIHN0cmluZzsKLQkJaW50IGluZGV4OwotCQlTdHJpbmcgcmVwbGFjZWRTdHJpbmc7Ci0JCWludCBzb3VyY2VJbmRleDsKLQkJYm9vbGVhbiBpdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0RXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBsaXN0TmFtZSwgU3RyaW5nIHN0cmluZywgaW50IGluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCQl0aGlzLnN0cmluZyA9IHN0cmluZzsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJfQotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgsIFN0cmluZyByZXBsYWNlZFN0cmluZykgewotCQkJdGhpcyh0ZXN0TW9kZWwsIGxpc3ROYW1lLCBzdHJpbmcsIGluZGV4KTsKLQkJCXRoaXMucmVwbGFjZWRTdHJpbmcgPSByZXBsYWNlZFN0cmluZzsKLQkJfQotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCQkJdGhpcy5pbmRleCA9IHRhcmdldEluZGV4OwotCQkJdGhpcy5zb3VyY2VJbmRleCA9IHNvdXJjZUluZGV4OwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50KExpc3RBZGRFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmluZGV4LCBlLmdldEluZGV4KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50KExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnN0cmluZywgZS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnJlcGxhY2VkU3RyaW5nLCBlLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtTW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0VGFyZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2VJbmRleCwgZS5nZXRTb3VyY2VJbmRleCgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBsaXN0Q2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCQl2b2lkIGxpc3RDaGFuZ2VkRG91YmxlQXJndW1lbnQoTGlzdENoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQkJdm9pZCBsaXN0RXZlbnRTaW5nbGVBcmd1bWVudChMaXN0RXZlbnQgZSkgewotCQkJdGhpcy5saXN0RXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMjdkNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnROYW1lZFByb3BlcnR5KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50TmFtZWRQcm9wZXJ0eSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnROYW1lZFByb3BlcnR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQyIiwgbmV3IENsYXNzW10ge09iamVjdC5jbGFzc30pOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJLy8gYnVpbGQgYSBQUk9QRVJUWSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKChTdGF0ZUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLnNldFZhbHVlKDk5KTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkRG91YmxlQXJndW1lbnQiLCBuZXcgQ2xhc3NbXSB7UHJvcGVydHlDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtZXRob2QudG9TdHJpbmcoKSkpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBpbnQgdmFsdWUgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOwotCQlUZXN0TW9kZWwoaW50IHZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl9Ci0JCXZvaWQgc2V0VmFsdWUoaW50IHZhbHVlKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCQlpZiAob2xkICE9IHZhbHVlKSB7Ci0JCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lOwotCQlPYmplY3Qgb2xkVmFsdWU7Ci0JCU9iamVjdCBuZXdWYWx1ZTsKLQkJYm9vbGVhbiB6ZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gc2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JCQl0aGlzLm9sZFZhbHVlID0gbmV3IEludGVnZXIob2xkVmFsdWUpOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ldyBJbnRlZ2VyKG5ld1ZhbHVlKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJvcGVydHlOYW1lLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQkJdm9pZCBwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIoT2JqZWN0IG8pIHsKLQkJCVByb3BlcnR5Q2hhbmdlRXZlbnQgZSA9IChQcm9wZXJ0eUNoYW5nZUV2ZW50KSBvOwotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0eU5hbWUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZERvdWJsZUFyZ3VtZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzk5ZTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvQXJndW1lbnQoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkWmVyb0FyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IG1ldGhvZCB0aGF0IGhhcyBtb3JlIGdlbmVyYWwgbWV0aG9kIHBhcmFtZXRlciB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpKTsKLQkJdGVzdE1vZGVsLmNoYW5nZVN0YXRlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJLy8gYnVpbGQgYSBTVEFURSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIFBST1BFUlRZIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJ2YWx1ZSIsIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZVByb3BlcnR5KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQxKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJzdGF0ZUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtTdGF0ZUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgY2hhbmdlU3RhdGUoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQl2b2lkIGNoYW5nZVByb3BlcnR5KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKCJ2YWx1ZSIsIDU1LCA0Mik7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuemVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQyKE9iamVjdCBlKSB7Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCAoKFN0YXRlQ2hhbmdlRXZlbnQpIGUpLmdldFNvdXJjZSgpKTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmRiZmU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAibm9kZUFkZGVkWmVyb0FyZ3VtZW50IiwgIm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50IiwgInRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRTaW5nbGVBcmd1bWVudCIsICJub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50IiwgInRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVOb2RlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgiY2hpbGQiLCAiZ3JhbmRjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbMF0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclRyZWUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlQ2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImFub3RoZXIgY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZXBsYWNlTm9kZSgiY2hpbGQiLCAiYW5vdGhlciBjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1tdeyJyb290IiwgImNoaWxkIn0pOwotCQkvLyBidWlsZCBhIFRSRUUgY2hhbmdlIGxpc3RlbmVyIGFuZCBoYWNrIGl0IHNvIHdlCi0JCS8vIGNhbiBhZGQgaXQgYXMgYSBDT0xMRUNUSU9OIGNoYW5nZSBsaXN0ZW5lcgotCQlPYmplY3QgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAidHJlZUV2ZW50U2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiYm9ndXMgY29sbGVjdGlvbiIsIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlQ29sbGVjdGlvbigpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHJvb3Q7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxTdHJpbmc+PiBjaGlsZHJlbkxpc3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+KCk7Ci0JCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJlbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX1RSRUUgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbChTdHJpbmcgcm9vdCkgewotCQkJc3VwZXIoKTsKLQkJCWlmIChyb290ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KHJvb3QsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQocm9vdCwgbnVsbCk7Ci0JCX0KLQkJU3RyaW5nIGdldFJvb3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290OwotCQl9Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHBhdGgoU3RyaW5nIG5vZGUpIHsKLQkJCVN0cmluZyB0ZW1wID0gbm9kZTsKLQkJCUxpc3Q8U3RyaW5nPiByZXZlcnNlUGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZG8gewotCQkJCXJldmVyc2VQYXRoLmFkZCh0ZW1wKTsKLQkJCQl0ZW1wID0gdGhpcy5wYXJlbnRzLmdldCh0ZW1wKTsKLQkJCX0gd2hpbGUgKHRlbXAgIT0gbnVsbCk7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnJldmVyc2UocmV2ZXJzZVBhdGgpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY2hpbGRyZW5MaXN0cy5rZXlTZXQoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVOb2RlKHMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJdm9pZCBhZGROb2RlKFN0cmluZyBwYXJlbnQsIFN0cmluZyBjaGlsZCkgewotCQkJaWYgKChwYXJlbnQgPT0gbnVsbCkgfHwgKGNoaWxkID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRvIGEgbm9uLWV4aXN0ZW50IHBhcmVudCIpOwotCQkJfQotCi0JCQlpZiAodGhpcy5jaGlsZHJlbkxpc3RzLmdldChjaGlsZCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBhZGQgYSBjaGlsZCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIHRyZWUiKTsKLQkJCX0KLQkJCQotCQkJY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQoY2hpbGQsIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCXRoaXMucGFyZW50cy5wdXQoY2hpbGQsIHBhcmVudCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoU1RSSU5HU19UUkVFLCB0aGlzLnBhdGgoY2hpbGQpKTsKLQkJfQotCQl2b2lkIHJlbW92ZU5vZGUoU3RyaW5nIG5vZGUpIHsKLQkJCWlmIChub2RlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChub2RlKTsKLQkJCWlmIChjaGlsZHJlbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IHBhdGggPSB0aGlzLnBhdGgobm9kZSk7Ci0JCQlmb3IgKFN0cmluZyBzIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnJlbW92ZShub2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFNUUklOR1NfVFJFRSwgcGF0aCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlTm9kZShTdHJpbmcgb2xkTm9kZSwgU3RyaW5nIG5ld05vZGUpIHsKLQkJCWlmICgob2xkTm9kZSA9PSBudWxsKSB8fCAobmV3Tm9kZSA9PSBudWxsKSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgbm9kZSBpcyBub3QgaW4gdHJlZSIpOwotCQkJfQotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChuZXdOb2RlLCBjaGlsZHJlbik7Ci0JCQlmb3IgKFN0cmluZyBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgbmV3Tm9kZSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwYXJlbnQgPSB0aGlzLnBhcmVudHMucmVtb3ZlKG9sZE5vZGUpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChuZXdOb2RlLCBwYXJlbnQpOwotCi0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChuZXdOb2RlKSk7Ci0JCX0KLQkJdm9pZCBjbGVhclRyZWUoKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMuY2xlYXIoKTsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLmNsZWFyKCk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KHJvb3QsIG51bGwpOwotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQoU1RSSU5HU19UUkVFKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIHRyZWVOYW1lOwotCQlMaXN0PFN0cmluZz4gcGF0aDsKLQkJYm9vbGVhbiBub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgdHJlZU5hbWUsIFN0cmluZ1tdIHBhdGgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMudHJlZU5hbWUgPSB0cmVlTmFtZTsKLQkJCXRoaXMucGF0aCA9IEFycmF5cy5hc0xpc3QocGF0aCk7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbm9kZUFkZGVkU2luZ2xlQXJndW1lbnQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgbm9kZVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wYXRoLCBDb2xsZWN0aW9uVG9vbHMubGlzdChlLmdldFBhdGgoKSkpOwotCQl9Ci0JCXZvaWQgdHJlZUNsZWFyZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50KFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIHRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgdHJlZUV2ZW50U2luZ2xlQXJndW1lbnQoVHJlZUV2ZW50IGUpIHsKLQkJCXRoaXMudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoVHJlZUNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIC0gb2JqZWN0OiAiICsgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlZTQwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZW1wbG95ZWVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBlbXBsb3llZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gaGlyZURhdGVBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgYWRhcHRlckV2ZW50OwotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIgdHJpZ2dlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVmZmVyZWRJREhvbGRlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWZmZXJlZE5hbWVIb2xkZXI7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGJ1ZmZlcmVkSGlyZURhdGVIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBidWZmZXJlZEV2ZW50OwotCi0JcHVibGljIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCi0JCXRoaXMuZW1wbG95ZWUgPSBuZXcgRW1wbG95ZWUoMTcsICJGcmVkZHkiLCBuZXcgRGF0ZSgpKTsKLQkJdGhpcy5lbXBsb3llZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+KHRoaXMuZW1wbG95ZWUpOwotCi0JCXRoaXMudHJpZ2dlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIoKTsKLQotCQl0aGlzLmlkQWRhcHRlciA9IHRoaXMuYnVpbGRJREFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHRoaXMuaWRBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIodGhpcy5lbXBsb3llZUhvbGRlcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5hbWVBZGFwdGVyLCB0aGlzLnRyaWdnZXIpOwotCi0JCXRoaXMuaGlyZURhdGVBZGFwdGVyID0gdGhpcy5idWlsZEhpcmVEYXRlQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4odGhpcy5oaXJlRGF0ZUFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZElEQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIEludGVnZXI+KGVIb2xkZXIsIEVtcGxveWVlLklEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0SUQoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldElEKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgU3RyaW5nPihlSG9sZGVyLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBidWlsZEhpcmVEYXRlQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIERhdGU+KGVIb2xkZXIsIEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEhpcmVEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhEYXRlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEhpcmVEYXRlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgdGVtcCA9IHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoMzIzKSk7Ci0JCWFzc2VydEVxdWFscygxNywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5pZEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlckFjY2VwdCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCi0JCWFzc2VydEVxdWFscygzMjMsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzMjMpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyaWdnZXJSZXNldCgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm5hbWVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5oaXJlRGF0ZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSURfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBhZGFwdGVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQWRhcHRlckxpc3RlbmVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGFkYXB0ZXJMaXN0ZW5lcik7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBlbXBsb3llZUxpc3RlbmVyID0gdGhpcy5idWlsZEVtcGxveWVlTGlzdGVuZXIoKTsKLQkJdGhpcy5lbXBsb3llZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVtcGxveWVlLk5BTUVfUFJPUEVSVFksIGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGFkYXB0ZXJMaXN0ZW5lciA9IHRoaXMuYnVpbGRBZGFwdGVyTGlzdGVuZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihhZGFwdGVyTGlzdGVuZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZENoYW5nZUxpc3RlbmVyKGVtcGxveWVlTGlzdGVuZXIpOwotCi0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiRnJlZGR5IiwgIlJpcGxleSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkNoYXJsaWUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJSaXBsZXkiLCAiQ2hhcmxpZSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQlhc3NlcnROdWxsKHRoaXMuYnVmZmVyZWRFdmVudCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGFwdGVyRXZlbnQsIHRoaXMubmFtZUFkYXB0ZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkZyZWRkeSIsICJDaGFybGllIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5lbXBsb3llZUV2ZW50LCB0aGlzLmVtcGxveWVlLCBFbXBsb3llZS5OQU1FX1BST1BFUlRZLCAiRnJlZGR5IiwgIkNoYXJsaWUiKTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJKYXNvbiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkNoYXJsaWUiLCAiSmFzb24iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJpZ2dlci5yZXNldCgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIkphc29uIiwgIkNoYXJsaWUiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFkYXB0ZXJFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5lbXBsb3llZUV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2luZyB0aGUgdmFsdWUgc2hvdWxkIHRyaWdnZXIgYnVmZmVyaW5nCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR0aW5nIHRvIHRoZSBzYW1lIHZhbHVlIHNob3VsZCBub3QgdHJpZ2dlciBidWZmZXJpbmcgKD8pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmluZzIoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiRnJlZGR5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogc2V0dGluZyB0byB0aGUgb3JpZ2luYWwgdmFsdWUgc2hvdWxkIG5vdCB0cmlnZ2VyIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nMygpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJGcmVkZHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBiYWNrLWRvb3IgY2hhbmdlcyBhcmUgaWdub3JlZCAtICJMYXN0IE9uZSBJbiBXaW5zIgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb25mbGljdDEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgiSmFzb24iKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKYXNvbiIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkvLyAiSmFzb24iIGlzIGRyb3BwZWQgb24gdGhlIGZsb29yLi4uCi0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogYmFjay1kb29yIGNoYW5nZXMgY2FuIGRlLWFjdGl2YXRlIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ29uZmxpY3QyKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCi0JCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuZW1wbG95ZWUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVmZmVyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZEFkYXB0ZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRhcHRlckV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZW1wbG95ZWVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByb3BlcnR5TmFtZSwgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCBpZDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1BST1BFUlRZID0gImlkIjsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBoaXJlRGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhJUkVfREFURV9QUk9QRVJUWSA9ICJoaXJlRGF0ZSI7Ci0KLQkJRW1wbG95ZWUoaW50IGlkLCBTdHJpbmcgbmFtZSwgRGF0ZSBoaXJlRGF0ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaWQgPSBpZDsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7Ci0JCX0KLQkJaW50IGdldElEKCkgewotCQkJcmV0dXJuIHRoaXMuaWQ7Ci0JCX0KLQkJdm9pZCBzZXRJRChpbnQgaWQpIHsKLQkJCWludCBvbGQgPSB0aGlzLmlkOwotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElEX1BST1BFUlRZLCBvbGQsIGlkKTsKLQkJfQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCURhdGUgZ2V0SGlyZURhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oaXJlRGF0ZTsKLQkJfQotCQl2b2lkIHNldEhpcmVEYXRlKERhdGUgaGlyZURhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmhpcmVEYXRlOwotCQkJdGhpcy5oaXJlRGF0ZSA9IGhpcmVEYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhJUkVfREFURV9QUk9QRVJUWSwgb2xkLCBoaXJlRGF0ZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3ZjI2NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPihuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uLCBQZXJzb24+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPigpIHsKLQkJCXB1YmxpYyBQZXJzb24gdHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUGVyc29uIHJldmVyc2VUcmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRDaGlsZCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbi5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24xID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24xKTsKLQkJUGVyc29uIHBhcmVudDIgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24xLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjEuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQyLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMyA9IG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjMpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uMy5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50MyA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQzLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMy5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDMsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIGthcmVuID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIHBlZ2d5UGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gcGVnZ3kgPSBuZXcgUGVyc29uKCJQZWdneSIsICJNYXJpYW4iLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVnZ3kpOwotCQlQZXJzb24gbWFyaWFuUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBrYXJlbiwgcGVnZ3kpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgcGVnZ3lQYXJlbnQsIG1hcmlhblBhcmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCVBlcnNvbiBtYXR0ID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJUGVyc29uIG1pdGNoUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBwZWdneSwgbWF0dCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBtYXJpYW5QYXJlbnQsIG1pdGNoUGFyZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG1hdHQsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbWl0Y2hQYXJlbnQsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShtYXR0KTsKLQkJbWl0Y2hQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsIG1hdHQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgbWl0Y2hQYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCQotCWNsYXNzIFBlcnNvbiBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgcGFyZW50TmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkVOVF9OQU1FX1BST1BFUlRZID0gInBhcmVudE5hbWUiOwotCQkKLQkJcHJpdmF0ZSBQZXJzb24gY2hpbGQ7Ci0JCQotCQlwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyZW50TmFtZSwgUGVyc29uIGNoaWxkKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKLQkJCXRoaXMuY2hpbGQgPSBjaGlsZDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgewotCQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNvbih0aGlzLnBhcmVudE5hbWUsIG51bGwsIHRoaXMpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRQYXJlbnROYW1lKFN0cmluZyBuZXdQYXJlbnROYW1lKSB7Ci0JCQlTdHJpbmcgb2xkUGFyZW50TmFtZSA9IHRoaXMucGFyZW50TmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IG5ld1BhcmVudE5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBUkVOVF9OQU1FX1BST1BFUlRZLCBvbGRQYXJlbnROYW1lLCBuZXdQYXJlbnROYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIFBlcnNvbiBnZXRDaGlsZCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYwZjRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiB0cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHRyYW5zZm9ybWF0aW9uRXZlbnQ7Ci0KLQlwdWJsaWMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPihuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24sIFBlcnNvbj4odGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlUcmFuc2Zvcm1lcjxQZXJzb24sIFBlcnNvbj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+KCkgewotCQkJcHVibGljIFBlcnNvbiB0cmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXB1YmxpYyBQZXJzb24gcmV2ZXJzZVRyYW5zZm9ybShQZXJzb24gcCkgewotCQkJCXJldHVybiAocCA9PSBudWxsKSA/IG51bGwgOiBwLmdldENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24uZ2V0TmFtZSgpKTsKLQkJUGVyc29uIHBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudC5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMSA9IG5ldyBQZXJzb24oIk1hdHQiLCAiTWl0Y2giLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMSk7Ci0JCVBlcnNvbiBwYXJlbnQyID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMS5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24xLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjMgPSBuZXcgUGVyc29uKCJLYXJlbiIsICJQZWdneSIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24zKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbjMuZ2V0TmFtZSgpKTsKLQkJUGVyc29uIHBhcmVudDMgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24zLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50My5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjMuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQzLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigiQ2hyaXMiLCAiTm9lbCIsIG51bGwpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbi5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24sIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24yID0gbmV3IFBlcnNvbigiSm9uIiwgIkVsaXphYmV0aCIsIG51bGwpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjIuZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24yLmdldFBhcmVudCgpLmdldE5hbWUoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24uZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbi5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbi5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQlQZXJzb24gb2xkUGVyc29uID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIG9sZFBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJUGVyc29uIG5ld1BlcnNvbiA9IG5ldyBQZXJzb24oIkthcmVuIiAsICJQZWdneSIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShuZXdQZXJzb24pOwotCQlQZXJzb24gbmV3UGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBvbGRQZXJzb24sIG5ld1BlcnNvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBvbGRQYXJlbnQsIG5ld1BhcmVudCk7Ci0KLS8vCi0vLwkJdGhpcy5ldmVudCA9IG51bGw7Ci0vLwkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRm9vIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJGb28iKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBWiIsICJGT08iKTsKLS8vCi0vLwkJdGhpcy5ldmVudCA9IG51bGw7Ci0vLwkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiRk9PIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZvbyIsICJGT08iKTsKLS8vCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCk7Ci0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0vLwotLy8JCXRoaXMuZXZlbnQgPSBudWxsOwotLy8JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0vLwkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgIkJBUiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JCi0JY2xhc3MgUGVyc29uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBwYXJlbnROYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX05BTUVfUFJPUEVSVFkgPSAicGFyZW50TmFtZSI7Ci0JCQotCQlwcml2YXRlIFBlcnNvbiBjaGlsZDsKLQkJCi0JCXB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBQZXJzb24gY2hpbGQpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotCQkJdGhpcy5jaGlsZCA9IGNoaWxkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgUGVyc29uIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBuZXcgUGVyc29uKHRoaXMucGFyZW50TmFtZSwgbnVsbCwgdGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudE5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIG5ld1BhcmVudE5hbWUpIHsKLQkJCVN0cmluZyBvbGRQYXJlbnROYW1lID0gdGhpcy5wYXJlbnROYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gbmV3UGFyZW50TmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFSRU5UX05BTUVfUFJPUEVSVFksIG9sZFBhcmVudE5hbWUsIG5ld1BhcmVudE5hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgUGVyc29uIGdldENoaWxkKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1NDJmOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIENvbGxlY3Rpb25FdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgU3RyaW5nIGV2ZW50MVR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWVzKHRoaXMuc3ViamVjdDJOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MkRlc2NyaXB0aW9ucygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDEgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJOYW1lcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJlc3VsdC5hZGQoImJhbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QyIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihzdWJqZWN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBBREQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgUkVNT1ZFKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBDTEVBUik7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENIQU5HRSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKENvbGxlY3Rpb25FdmVudCBlLCBTdHJpbmcgZXZlbnRUeXBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQkJdGhpcy5ldmVudDFUeXBlID0gZXZlbnRUeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFtIiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMuYWRkKCJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5hZGRBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJqYXoiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNQbHVzLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEucmVtb3ZlTmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzTWludXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLmFhMS5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJiYXIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBSRU1PVkUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIENIQU5HRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoImphbSIpOwotCQluYW1lc1BsdXMyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfQ09MTEVDVElPTiA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGRlc2NyaXB0aW9uczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX0NPTExFQ1RJT04gPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5uYW1lcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25zID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUpKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXdoaWxlIChuZXdOYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZE5hbWUobmV3TmFtZXMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3TmFtZXMpIHsKLQkJCXRoaXMuYWRkTmFtZXMobmV3TmFtZXMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCWlmICh0aGlzLm5hbWVzLmFkZChuYW1lMSkgfCB0aGlzLm5hbWVzLmFkZChuYW1lMikpIHsKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChOQU1FU19DT0xMRUNUSU9OLCB0aGlzLm5hbWVzKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5yZW1vdmUobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChOQU1FU19DT0xMRUNUSU9OLCBuYW1lKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBkZXNjcmlwdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMuYWRkKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfQ09MTEVDVElPTiwgZGVzY3JpcHRpb24pOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhDb2xsZWN0aW9uPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMuaXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlpZiAodGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGRlc2NyaXB0aW9uKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQlwcml2YXRlIGNsYXNzIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiB7Ci0KLQkJTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yXygpIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5kZXNjcmlwdGlvbnMoKTsKLQkJCX0KLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0pIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZERlc2NyaXB0aW9uKGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfQ09MTEVDVElPTikgewotCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVEZXNjcmlwdGlvbigoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQl0aGlzLnJlbW92ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMGExNTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uSG9sZGVyOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uOwotCi0JcHVibGljIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUhhc2hCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWJhZy5hZGQoImZvbyIpOwotCQliYWcuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMoYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUhhc2hCYWc8U3RyaW5nPiBiYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKGJhZyk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OWMxMjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uSG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IExvY2FsQWRhcHRlcih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLCAiNjY2Iik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMTExIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIyMjIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCI2NjYiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50RmlyaW5nKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIxMTEiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiMjIyIik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHJ1ZSwgZmFsc2UpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5jbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5hZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIHRoZSB2YWx1ZSBpcyB0cnVlIGlmIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIHNwZWNpZmllZCBpdGVtLAotCSAqIG90aGVyd2lzZSB0aGUgdmFsdWUgaXMgZmFsc2UKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxBZGFwdGVyCi0JCWV4dGVuZHMgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KLQkJaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdHJpbmcgaXRlbTsKLQotCQlMb2NhbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyLCBTdHJpbmcgaXRlbSkgewotCQkJc3VwZXIoY29sbGVjdGlvbkhvbGRlcik7Ci0JCQl0aGlzLml0ZW0gPSBpdGVtOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCS8qKgotCQkgKiBhbHdheXMgcmV0dXJuIGEgQm9vbGVhbgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQkJQm9vbGVhbiByZXN1bHQgPSBzdXBlci5nZXRWYWx1ZSgpOwotCQkJcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDogcmVzdWx0OwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlpZiAodGhpcy5ib29sZWFuVmFsdWUoKSkgewotCQkJCWlmICggISB0aGlzLmJvb2xlYW5WYWx1ZU9mKHZhbHVlKSkgewotCQkJCQkvLyB0aGUgdmFsdWUgaXMgY2hhbmdpbmcgZnJvbSB0cnVlIHRvIGZhbHNlCi0JCQkJCSgoU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPikgdGhpcy5jb2xsZWN0aW9uTW9kZWwpLnJlbW92ZSh0aGlzLml0ZW0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuYm9vbGVhblZhbHVlT2YodmFsdWUpKSB7Ci0JCQkJCS8vIHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBmcm9tIGZhbHNlIHRvIHRydWUKLQkJCQkJKChTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmNvbGxlY3Rpb25Nb2RlbCkuYWRkKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb2xsZWN0aW9uTW9kZWwuaXRlcmF0b3IoKSwgdGhpcy5pdGVtKSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlT2YodGhpcy52YWx1ZSk7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGJvb2xlYW5WYWx1ZU9mKE9iamVjdCBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBmYWxzZSA6ICgoQm9vbGVhbikgYikuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Q0YmIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcHZtMTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm0zOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcHZtNDsKLQlwcml2YXRlIENvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGNvbGxlY3Rpb247Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY3ZtOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGNvbXBvc2l0ZVBWTTsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHZtMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5wdm0yID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLnB2bTMgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMucHZtNCA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4oKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTEpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0zKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTQpOwotCQl0aGlzLmN2bSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4odGhpcy5jb2xsZWN0aW9uKTsKLQkJCi0JCXRoaXMuY29tcG9zaXRlUFZNID0gdGhpcy5idWlsZENvbXBvc2l0ZVBWTShjdm0pOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29tcG9zaXRlUFZNKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBwdm1zKSB7Ci0JCXJldHVybiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmFuZChwdm1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCkpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUFuZExpc3RlbmVyczIoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsgIC8vIG5vIGNoYW5nZQotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnB2bTIuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsgIC8vIG5vIGNoYW5nZQotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnB2bTEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy52ZXJpZnlFdmVudChmYWxzZSwgdHJ1ZSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtNC5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm0gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLmN2bS5hZGQocHZtKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnJlbW92ZShwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0uY2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChCb29sZWFuLlRSVUUsIG51bGwpOwotCi0JCUNvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IGMyID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4oKTsKLQkJYzIuYWRkKHRoaXMucHZtMSk7Ci0JCWMyLmFkZCh0aGlzLnB2bTIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0uc2V0VmFsdWVzKGMyKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBCb29sZWFuLlRSVUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nMSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nMigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlFdmVudChCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQm9vbGVhbiBvbGRWYWx1ZSwgQm9vbGVhbiBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb21wb3NpdGVQVk0sIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwYzc0Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE5laWdoYm9yaG9vZCBuZWlnaGJvcmhvb2Q7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IG5laWdoYm9yaG9vZEhvbGRlcjsKLQotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubmVpZ2hib3Job29kID0gbmV3IE5laWdoYm9yaG9vZCgiSGFubmEtQmFyYmVyYSIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPih0aGlzLm5laWdoYm9yaG9vZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDEoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2gyKCkgewotCQl0aGlzLnZlcmlmeVN5bmNoKHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlMih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTeW5jaChDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+IGNvbXBvc2l0ZUNWTSkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQkJQmFnPEZhbWlseT4gZmFtaWxpZXNTeW5jaCA9IG5ldyBDb29yZGluYXRlZEJhZzxGYW1pbHk+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpKTsKLQkJQmFnPE1lbWJlcj4gbWVtYmVyc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPE1lbWJlcj4oY29tcG9zaXRlQ1ZNKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZCh0aGlzLm5laWdoYm9yaG9vZCk7Ci0KLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWpldHNvbnMucmVtb3ZlTWVtYmVyKGpldHNvbnMubWVtYmVyTmFtZWQoIkFzdHJvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiSnVkeSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWpldHNvbnMuYWRkTWVtYmVyKCJGaWRvIik7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLm5laWdoYm9yaG9vZC5yZW1vdmVGYW1pbHkoamV0c29ucyk7Ci0JCWFzc2VydEVxdWFscygyLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJRmFtaWx5IGJlYXJzID0gdGhpcy5uZWlnaGJvcmhvb2QuYWRkRmFtaWx5KCJCZWFyIik7Ci0JCQliZWFycy5hZGRNZW1iZXIoIllvZ2kiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoOCwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQliZWFycy5hZGRNZW1iZXIoIkJvby1Cb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoOSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlOZWlnaGJvcmhvb2QgbjIgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIDIiKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIuc2V0VmFsdWUobjIpOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKG4yKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShuMi5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcobjIuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1RyYW5zZm9ybWVyKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHN1YkNWTTEgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHN1YkNWTTIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uPENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTEpOwotCQljb2xsZWN0aW9uLmFkZChzdWJDVk0yKTsKLQkJQmFnPFN0cmluZz4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPihuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihjb2xsZWN0aW9uKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHN5bmNoQmFnLnNpemUoKSk7Ci0KLQkJc3ViQ1ZNMS5hZGQoImZvbyIpOwotCQlzdWJDVk0xLmFkZCgiYmFyIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHN5bmNoQmFnLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImZvbyIpKTsKLQotCQlzdWJDVk0yLmFkZCgiam9vIik7Ci0JCXN1YkNWTTIuYWRkKCJqYXIiKTsKLQkJc3ViQ1ZNMi5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJqYXoiKSk7Ci0KLQkJc3ViQ1ZNMS5yZW1vdmUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3luY2hCYWcuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlSXRlbSgpIHsKLQkJQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPih0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5uZWlnaGJvcmhvb2QuYWRkRmFtaWx5KHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5pbmRleE9mKCJkdXBsaWNhdGUgY29tcG9uZW50IikgIT0gLTEpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCWFzc2VydEVxdWFscygxMiwgc3luY2hCYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4gY29tcG9zaXRlQ1ZNID0gdGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUodGhpcy5uZWlnaGJvcmhvb2RIb2xkZXIpOwotCQlDb29yZGluYXRlZEJhZzxNZW1iZXI+IHN5bmNoQmFnID0gbmV3IENvb3JkaW5hdGVkQmFnPE1lbWJlcj4oY29tcG9zaXRlQ1ZNKTsKLQkJdGhpcy5wb3B1bGF0ZU5laWdoYm9yaG9vZCh0aGlzLm5laWdoYm9yaG9vZCk7Ci0JCUZhbWlseSBqZXRzb25zID0gdGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpOwotCi0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQotCQljb21wb3NpdGVDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hCYWcpOwotCQlhc3NlcnRGYWxzZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQotCQljb21wb3NpdGVDVk0uYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hCYWcpOwotCQlhc3NlcnRUcnVlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGpldHNvbnMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhGYW1pbHkuTUVNQkVSU19DT0xMRUNUSU9OKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlTmVpZ2hib3Job29kKE5laWdoYm9yaG9vZCBuKSB7Ci0JCUZhbWlseSBmYW1pbHkxID0gbi5hZGRGYW1pbHkoIkZsaW50c3RvbmUiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJGcmVkIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiV2lsbWEiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJQZWJibGVzIik7Ci0JCQlmYW1pbHkxLmFkZE1lbWJlcigiRGlubyIpOwotCQlGYW1pbHkgZmFtaWx5MiA9IG4uYWRkRmFtaWx5KCJSdWJibGUiKTsKLQkJCWZhbWlseTIuYWRkTWVtYmVyKCJCYXJuZXkiKTsKLQkJCWZhbWlseTIuYWRkTWVtYmVyKCJCZXR0eSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhbW0tQmFtbSIpOwotCQlGYW1pbHkgZmFtaWx5MyA9IG4uYWRkRmFtaWx5KCJKZXRzb24iKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJHZW9yZ2UiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKYW5lIik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiSnVkeSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkVscm95Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiQXN0cm8iKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseT4gYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPE5laWdoYm9yaG9vZCwgRmFtaWx5Pihjb21tdW5lSG9sZGVyLCBOZWlnaGJvcmhvb2QuRkFNSUxJRVNfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8RmFtaWx5PiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5mYW1pbGllcygpOwotCQkJfQotCQl9OwotCX0KLQotCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gYnVpbGRNZW1iZXJzQWRhcHRlcihGYW1pbHkgZmFtaWx5KSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8RmFtaWx5LCBNZW1iZXI+KEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04sIGZhbWlseSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TWVtYmVyPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5tZW1iZXJzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4gYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gb3ZlcnJpZGUgI3RyYW5zZm9ybShPYmplY3QpCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoY29tbXVuZUhvbGRlcikpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gdHJhbnNmb3JtKEZhbWlseSBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1aWxkTWVtYmVyc0FkYXB0ZXIoZmFtaWx5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlMihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCS8vIGJ1aWxkIGEgY3VzdG9tIFRyYW5zZm9ybWVyCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5LCBNZW1iZXI+KHRoaXMuYnVpbGRGYW1pbGllc0FzcGVjdEFkYXB0ZXIoY29tbXVuZUhvbGRlciksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxGYW1pbHksIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4+KCkgewotCQkJcHVibGljIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gdHJhbnNmb3JtKEZhbWlseSBmYW1pbHkpIHsKLQkJCQlyZXR1cm4gQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJ1aWxkTWVtYmVyc0FkYXB0ZXIoZmFtaWx5KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkxvY2FsIFRyYW5zZm9ybWVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIGlubmVyIGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIE5laWdoYm9yaG9vZCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEZhbWlseT4gZmFtaWxpZXMgPSBuZXcgQXJyYXlMaXN0PEZhbWlseT4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMSUVTX0NPTExFQ1RJT04gPSAiZmFtaWxpZXMiOwotCQotCQlwdWJsaWMgTmVpZ2hib3Job29kKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxGYW1pbHk+IGZhbWlsaWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZmFtaWxpZXMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShTdHJpbmcgZmFtaWx5TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuYWRkRmFtaWx5KG5ldyBGYW1pbHkoZmFtaWx5TmFtZSkpOwotCQl9Ci0KLQkJLy8gYmFja2Rvb3IgdG8gYWxsb3cgZHVwbGljYXRlcwotCQlwdWJsaWMgRmFtaWx5IGFkZEZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBmYW1pbHk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVGYW1pbHkoRmFtaWx5IGZhbWlseSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oZmFtaWx5LCB0aGlzLmZhbWlsaWVzLCBGQU1JTElFU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgRmFtaWx5IGZhbWlseU5hbWVkKFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlmb3IgKEZhbWlseSBmYW1pbHkgOiB0aGlzLmZhbWlsaWVzKSB7Ci0JCQkJaWYgKGZhbWlseS5nZXROYW1lKCkuZXF1YWxzKGZhbWlseU5hbWUpKSB7Ci0JCQkJCXJldHVybiBmYW1pbHk7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmYW1pbHlOYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBhbGxNZW1iZXJzKCkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxNZW1iZXI+KHRoaXMubWVtYmVyc0l0ZXJhdG9ycygpKTsKLQkJfQotCQotCQlwcml2YXRlIEl0ZXJhdG9yPEl0ZXJhdG9yPE1lbWJlcj4+IG1lbWJlcnNJdGVyYXRvcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmFtaWx5LCBJdGVyYXRvcjxNZW1iZXI+Pih0aGlzLmZhbWlsaWVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmF0b3I8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCQlyZXR1cm4gZmFtaWx5Lm1lbWJlcnMoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgbWVtYmVyTmFtZWQoU3RyaW5nIGZhbWlseU5hbWUsIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbHlOYW1lZChmYW1pbHlOYW1lKS5tZW1iZXJOYW1lZChtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRmFtaWx5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248TWVtYmVyPiBtZW1iZXJzID0gbmV3IEFycmF5TGlzdDxNZW1iZXI+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU1CRVJTX0NPTExFQ1RJT04gPSAibWVtYmVycyI7Ci0JCi0JCXB1YmxpYyBGYW1pbHkoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPE1lbWJlcj4gbWVtYmVycygpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlcnMuaXRlcmF0b3IoKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIGFkZE1lbWJlcihTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJTWVtYmVyIG1lbWJlciA9IG5ldyBNZW1iZXIobWVtYmVyTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gbWVtYmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVNZW1iZXIoTWVtYmVyIG1lbWJlcikgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obWVtYmVyLCB0aGlzLm1lbWJlcnMsIE1FTUJFUlNfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkJZm9yIChNZW1iZXIgbWVtYmVyIDogdGhpcy5tZW1iZXJzKSB7Ci0JCQkJaWYgKG1lbWJlci5nZXROYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0JCQkJCXJldHVybiBtZW1iZXI7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZW1iZXJOYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQkKLQl9Ci0KLQotCS8qKgotCSAqIGlubmVyIGNsYXNzCi0JICovCi0JcHVibGljIGNsYXNzIE1lbWJlciBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgTWVtYmVyKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZjUzMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMDsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0xOwotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTI7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMzsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiB1YmVyTFZNOwotCXByaXZhdGUgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+IGNvbXBvc2l0ZUxWTTsKLQotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5sdm0wID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTAuYWRkKCJhYWEiKTsKLQkJdGhpcy5sdm0wLmFkZCgiYmJiIik7Ci0JCXRoaXMubHZtMC5hZGQoImNjYyIpOwotCi0JCXRoaXMubHZtMSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0xLmFkZCgiZGRkIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZSIpOwotCi0JCXRoaXMubHZtMiA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5sdm0yLmFkZCgiZmZmIik7Ci0KLQkJdGhpcy5sdm0zID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTMuYWRkKCJnZ2ciKTsKLQkJdGhpcy5sdm0zLmFkZCgiaGhoIik7Ci0JCXRoaXMubHZtMy5hZGQoImlpaSIpOwotCQl0aGlzLmx2bTMuYWRkKCJqamoiKTsKLQkJdGhpcy5sdm0zLmFkZCgia2trIik7Ci0KLQkJdGhpcy51YmVyTFZNID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMCk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0xKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTIpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMyk7Ci0KLQkJdGhpcy5jb21wb3NpdGVMVk0gPSBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KChMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KSB0aGlzLnViZXJMVk0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiYmJiIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCBjb29yZExpc3QuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjY2MiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMikpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIGNvb3JkTGlzdC5nZXQoMikpOwotCi0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCi0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIHRoaXMuY29tcG9zaXRlTFZNLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb29yZExpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBjb29yZExpc3QuaXRlcmF0b3IoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSB0aGlzLmNvbXBvc2l0ZUxWTS5pdGVyYXRvcigpOyBzdHJlYW0yLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCQlhc3NlcnRGYWxzZShzdHJlYW0xLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBjb29yZExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheSgpIHsKLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgY29vcmRMaXN0KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5sdm0wLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0gPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQoMCwgbHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm0uYWRkKCJ4eHgiKTsKLQkJbHZtLmFkZCgieXl5Iik7Ci0JCWx2bS5hZGQoInp6eiIpOwotCQl0aGlzLnViZXJMVk0uYWRkKDIsIGx2bSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1BID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQiA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQi5hZGQoInBwcCIpOwotCQlsdm1CLmFkZCgicXFxIik7Ci0JCWx2bUIuYWRkKCJycnIiKTsKLQkJQ29sbGVjdGlvbjxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGMgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJYy5hZGQobHZtQSk7Ci0JCWMuYWRkKGx2bUIpOwotCQl0aGlzLnViZXJMVk0uYWRkQWxsKDIsIGMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAicHBwIiwgInFxcSIsICJycnIiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ucmVtb3ZlKDIsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlZWUiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQS5hZGQoInh4eCIpOwotCQlsdm1BLmFkZCgieXl5Iik7Ci0JCWx2bUEuYWRkKCJ6enoiKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUIgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUIuYWRkKCJwcHAiKTsKLQkJbHZtQi5hZGQoInFxcSIpOwotCQlsdm1CLmFkZCgicnJyIik7Ci0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGx2bUEpOwotCQlsaXN0LmFkZChsdm1CKTsKLQkJdGhpcy51YmVyTFZNLnNldCgyLCBsaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgInBwcCIsICJxcXEiLCAicnJyIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygicXFxIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxcXEiLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMCwgMiwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgxKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2VzX01pZGRsZSgpIHsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgxLCAzLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImxsbCIsICJtbW0iLCAiZGRkIiwgImVlZSIsICJmZmYiLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfRW5kKCkgewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDAsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlKCkgewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDMsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDE0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyU291cmNlcygpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczEoKSB7Ci0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJbmV3TGlzdC5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uc2V0TGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXMyKCkgewotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm01ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm01LmFkZCgibm5uIik7Ci0JCWx2bTUuYWRkKCJvb28iKTsKLQkJbHZtNS5hZGQoInBwcCIpOwotCQlsdm01LmFkZCgicXFxIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAibGxsIiwgIm1tbSIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzMygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQluZXdMaXN0LmFkZChsdm00KTsKLQotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0KLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0wKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0xKTsKLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0yKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczYoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTApOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTEpOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJbmV3TGlzdC5hZGQodGhpcy5sdm0zKTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jaGFuZ2VMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAibGxsIiwgIm1tbSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkKDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5hZGQoMSwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmFkZCg1LCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuYWRkQWxsKDAsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuYWRkQWxsKDEsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg5KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuYWRkQWxsKDUsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnJlbW92ZSgwLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoMSwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImtrayIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMucmVtb3ZlKDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTIuc2V0KDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoNCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLnNldCgwLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAieHh4IiwgInl5eSIsICJ6enoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEwKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgY29vcmRMaXN0LmdldCgxMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXQoMywgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJ5eXkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgyLCAwKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJiYmIiLCAiY2NjIiwgImFhYSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5tb3ZlKDAsIDEpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImVlZSIsICJkZGQiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLm1vdmUoMCwgNCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAia2trIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAubW92ZSgxLCAwLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJjY2MiLCAiYWFhIiwgImJiYiIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMSIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMiIpOwotCQl0aGlzLmx2bTEuYWRkKCJlZWUuMyIpOwotCQl0aGlzLmx2bTEubW92ZSgxLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlLjEiLCAiZWVlLjIiLCAiZWVlLjMiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMubW92ZSgwLCAyLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJpaWkiLCAiampqIiwgImtrayIsICJnZ2ciLCAiaGhoIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNsZWFyKCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNCkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luMSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuc2V0TGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUxKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAieHh4IiwgInl5eSIsICJ6enoiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQxKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgInl5eSIsICJ6enoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IEVycm9yTGlzdGVuZXIoKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiwgImJiYiIsICJjY2MiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgRXJyb3JMaXN0ZW5lcigpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZGQiLCAiZWVlIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiaGhoIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDIoKSB7Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IEVycm9yTGlzdGVuZXIoKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhYWEiLCAiYmJiIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAieHh4IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJ4eHgiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJoaGgiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19FbmQzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAieHh4IiwgImtrayIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgInh4eCIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgInh4eCIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfTWlkZGxlNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiwgImVlZSIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDQoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19CZWdpbjUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpaWkiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGU1KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImRkZCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiaWlpIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JY2xhc3MgRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJZmFpbCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBMb2NhbExpc3RWYWx1ZU1vZGVsPEU+IGV4dGVuZHMgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RT4gewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdFZhbHVlcykgewotCQkJaWYgKGxpc3RWYWx1ZXMgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMubGlzdCwgbGlzdFZhbHVlcyk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5saXN0KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhMjQxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bTE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm0yOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMzsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bTQ7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PiBjb2xsZWN0aW9uOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGN2bTsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBjb21wb3NpdGVQVk07Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCi0JcHVibGljIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHZtMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJdGhpcy5wdm0yID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoMikpOwotCQl0aGlzLnB2bTMgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZigzKSk7Ci0JCXRoaXMucHZtNCA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDQpKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4oKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTEpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0zKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTQpOwotCQl0aGlzLmN2bSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4odGhpcy5jb2xsZWN0aW9uKTsKLQkJCi0JCXRoaXMuY29tcG9zaXRlUFZNID0gdGhpcy5idWlsZENvbXBvc2l0ZVBWTShjdm0pOwotCX0KLQotCXByaXZhdGUgPFQgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZENvbXBvc2l0ZVBWTShDb2xsZWN0aW9uVmFsdWVNb2RlbDxUPiBwdm1zKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KHB2bXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZSgpIHsKLQkJCQlpbnQgc3VtID0gMDsKLQkJCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBlYWNoIDogdGhpcy5nZXRDb2xsZWN0aW9uTW9kZWwoKSkgewotCQkJCQlzdW0gKz0gZWFjaC5nZXRWYWx1ZSgpLmludFZhbHVlKCk7Ci0JCQkJfQotCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yoc3VtKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8UHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PiBnZXRDb2xsZWN0aW9uTW9kZWwoKSB7Ci0JCQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KSBzdXBlci5nZXRDb2xsZWN0aW9uTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMxKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMyKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCAxNCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtNC5zZXRWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDE0LCAxMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm0gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZig3NykpOwotCQl0aGlzLmN2bS5hZGQocHZtKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgxMCwgODcpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5yZW1vdmUocHZtKTsKLQkJdGhpcy52ZXJpZnlFdmVudCg4NywgMTApOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5jbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCAwKTsKLQotCQlDb2xsZWN0aW9uPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PiBjMiA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+KCk7Ci0JCWMyLmFkZCh0aGlzLnB2bTEpOwotCQljMi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnNldFZhbHVlcyhjMik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMCwgMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChpbnQgb2xkVmFsdWUsIGludCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb21wb3NpdGVQVk0sIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihvbGRWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkQmFnLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4YTRkNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgY29sbGVjdGlvbiBpbiBzeW5jaCB3aXRoIHRoZQotICogY29sbGVjdGlvbiBoZWxkIGJ5IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLSAqLwotY2xhc3MgQ29vcmRpbmF0ZWRCYWc8RT4gaW1wbGVtZW50cyBCYWc8RT4sIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPigpOwotCi0JQ29vcmRpbmF0ZWRCYWcoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY3ZtKSB7Ci0JCWN2bS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZEFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJldGFpbkFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheShhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFnIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY291bnQoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvdW50KG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkKG8sIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8sIGNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChFIGl0ZW0gOiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMuYmFnLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChFIGl0ZW0gOiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMuYmFnLnJlbW92ZShpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsICgoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4pIGV2ZW50LmdldFNvdXJjZSgpKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmVxdWFscyhvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5iYWcudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZExpc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVjZjAyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0aGF0IGtlZXBzIGFuIGludGVybmFsIGxpc3QgaW4gc3luY2ggd2l0aCB0aGUKLSAqIGxpc3QgaGVsZCBieSBhIGxpc3QgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb29yZGluYXRlZExpc3Q8RT4gaW1wbGVtZW50cyBMaXN0PEU+LCBMaXN0Q2hhbmdlTGlzdGVuZXIsIExpc3REYXRhTGlzdGVuZXIgewotCXByaXZhdGUgTGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCi0JcHVibGljIENvb3JkaW5hdGVkTGlzdChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0VmFsdWVNb2RlbCkgewotCQlsaXN0VmFsdWVNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMpOwotCQlmb3IgKEl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZU1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJbGlzdE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIodGhpcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdE1vZGVsLmdldFNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsaXN0TW9kZWwsIGkpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aGlzLmxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoaW5kZXgsIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxhc3RJbmRleE9mKG8pOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7Ci0JfQotCi0JcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKG8pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJldGFpbkFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zZXQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIExpc3Q8RT4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZSkpIHsKLQkJCXRoaXMubGlzdC5hZGQoaSsrLCBpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQlpbnQgYmFzZSA9IGUuZ2V0SW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IGUuZ2V0SXRlbXNTaXplKCk7IGktLSA+IDA7ICkgewotCQkJdGhpcy5saXN0LnJlbW92ZShiYXNlICsgaSk7ICAvLyByZW1vdmUgZnJvbSBlbmQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0TmV3SXRlbXMoZSkpIHsKLQkJCXRoaXMubGlzdC5zZXQoaSsrLCBpdGVtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMubGlzdCwgZS5nZXRUYXJnZXRJbmRleCgpLCBlLmdldFNvdXJjZUluZGV4KCksIGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCB0aGlzLmdldFNvdXJjZShlKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdERhdGFMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCQlMaXN0TW9kZWwgbG0gPSAoTGlzdE1vZGVsKSBlLmdldFNvdXJjZSgpOwotCQlpbnQgc2l6ZSA9IGxtLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMubGlzdC5hZGQoaSwgdGhpcy5nZXRFbGVtZW50QXQobG0sIGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGludGVydmFsQWRkZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZSkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQgKyAxOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJdGhpcy5saXN0LnJlbW92ZShzdGFydCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5lcXVhbHMobyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgRSBnZXRFbGVtZW50QXQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoRSkgbGlzdE1vZGVsLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzLj0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEU+IGdldFNvdXJjZShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChMaXN0VmFsdWVNb2RlbDxFPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZlMWEyNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBleHRlbmRlZExpc3RIb2xkZXI7Ci0JTGlzdEV2ZW50IGV2ZW50OwotCVN0cmluZyBldmVudFR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyID0gdGhpcy5idWlsZEV4dGVuZGVkTGlzdEhvbGRlcih0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJBIik7Ci0JCXJlc3VsdC5hZGQoIkIiKTsKLQkJcmVzdWx0LmFkZCgiQyIpOwotCQlyZXN1bHQuYWRkKCJEIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRFeHRlbmRlZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZXh0ZW5kZWRMaXN0LmFkZEFsbCh0aGlzLmJ1aWxkUHJlZml4KCkpOwotCQlleHRlbmRlZExpc3QuYWRkQWxsKHRoaXMuYnVpbGRMaXN0KCkpOwotCQlleHRlbmRlZExpc3QuYWRkQWxsKHRoaXMuYnVpbGRTdWZmaXgoKSk7Ci0JCXJldHVybiBleHRlbmRlZExpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRQcmVmaXgoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBwcmVmaXggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcHJlZml4LmFkZCgieCIpOwotCQlwcmVmaXguYWRkKCJ5Iik7Ci0JCXByZWZpeC5hZGQoInoiKTsKLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFN1ZmZpeCgpIHsKLQkJTGlzdDxTdHJpbmc+IHN1ZmZpeCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdWZmaXguYWRkKCJpIik7Ci0JCXN1ZmZpeC5hZGQoImoiKTsKLQkJcmV0dXJuIHN1ZmZpeDsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFeHRlbmRlZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJcmV0dXJuIG5ldyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmVmaXgoKSwgbHZtLCB0aGlzLmJ1aWxkU3VmZml4KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEV4dGVuZGVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEV4dGVuZGVkTGlzdCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEV4dGVuZGVkTGlzdCgpLnNpemUoKSwgdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRMaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5kZWRMaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoZXh0ZW5kZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotLy8JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLS8vCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotLy8JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLS8vCQkJaWYgKGV4dGVuZGVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotLy8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiRSIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCAiRSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoIkUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZDIoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEFkZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhZGRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFkZExpc3QuYWRkKCJFIik7Ci0JCWFkZExpc3QuYWRkKCJGIik7Ci0JCXJldHVybiBhZGRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCg0LCB0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZTEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiQiIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoIkIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnMoIkIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJCIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlR2VuZXJpYygpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZU5hbWVkKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgIkUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDcsICJFIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg1LCBudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDgsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCA4LCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgNywgIkUiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgIkFBIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJBIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJBQSIpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHR5cGUpOwotCQlpZiAodHlwZSA9PSBBREQpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IFJFTU9WRSkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJLyoKLQkJICogYWRkaW5nIGxpc3RlbmVycyB0byB0aGUgZXh0ZW5kZWQgbGlzdCB3aWxsIGNhdXNlIGxpc3RlbmVycwotCQkgKiB0byBiZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0OwotCQkgKiBsaWtld2lzZSwgcmVtb3ZpbmcgbGlzdGVuZXJzIGZyb20gdGhlIGV4dGVuZGVkIGxpc3Qgd2lsbAotCQkgKiBjYXVzZSBsaXN0ZW5lcnMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QKLQkJICovCi0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjA3ODdmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgYWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IHJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IGNvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBmaWx0ZXJlZEFkZEV2ZW50OwotCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBmaWx0ZXJlZFJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IGZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oYnVpbGRDb2xsZWN0aW9uKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciA9IG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGhpcy5idWlsZEZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8U3RyaW5nPiBidWlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXJWYWx1ZSA9IHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25Ib2xkZXJWYWx1ZS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbGxlY3Rpb25Ib2xkZXJWYWx1ZS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3Q29sbGVjdGlvbik7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBjb2xsZWN0aW9uVmFsdWVzID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm94IiwgY29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbGxlY3Rpb25WYWx1ZXMubmV4dCgpKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMgPSB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXJlZENvbGxlY3Rpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9CQkKLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEZpbHRlcmVkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXZlbnRzKCkgewotCQl0aGlzLmFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5yZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRBZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpIHsKLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiB0ZW1wQ29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRBZGRFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCk7Ci0KLQotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0KLQotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJiYXIiKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkQWRkRXZlbnQpOwotCi0KLQkJY2xlYXJFdmVudHMoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKG5ld0NvbGxlY3Rpb24pOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCQkKLQkJdGVtcENvbGxlY3Rpb24ucmVtb3ZlKCJmb28iKTsKLQkJdGVtcENvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQkKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkUmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQWRkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25BZGRFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IGl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcywgQ29sbGVjdGlvblRvb2xzLnZlY3RvcihldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IGl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcywgQ29sbGVjdGlvblRvb2xzLnZlY3RvcihldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpbHRlcmVkSXRlbSgpIHsKLQkJLy8gYnVpbGQgY29sbGVjdGlvbiB3aXRoIFRlc3RJdGVtcwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4gdGlIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+KHRoaXMuYnVpbGRDb2xsZWN0aW9uMigpKTsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+IGZpbHRlcmVkVElIb2xkZXIgPSBuZXcgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdEl0ZW0+KHRpSG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyMigpKTsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQlmaWx0ZXJlZFRJSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEVxdWFscygwLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0KLQkJdGlIb2xkZXIuYWRkKG5ldyBUZXN0SXRlbSgiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCi0JCVRlc3RJdGVtIGJheiA9IG5ldyBUZXN0SXRlbSgiYmF6Iik7Ci0JCXRpSG9sZGVyLmFkZChiYXopOwotCQlhc3NlcnRFcXVhbHMoMiwgZmlsdGVyZWRUSUhvbGRlci5zaXplKCkpOwotCQkvLyBiZWZvcmUgcmVtb3ZpbmcgaXQsIGNoYW5nZSB0aGUgaXRlbSBzbyB0aGF0IGl0IGlzIGZpbHRlcmVkCi0JCWJhei5uYW1lID0gImpheiI7Ci0JCXRpSG9sZGVyLnJlbW92ZShiYXopOwotCQkvLyB0aGlzIHdvdWxkIGZhaWwgYmVjYXVzZSB0aGUgaXRlbSB3YXMgbm90IHJlbW92ZWQgZnJvbQotCQkvLyB0aGUgZmlsdGVyZWQgY29sbGVjdGlvbiBjYWNoZS4uLiBidXQgd2UndmUgZml4ZWQgaXQgbm93Ci0JCWFzc2VydEVxdWFscygxLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFRlc3RJdGVtPiBidWlsZENvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uPFRlc3RJdGVtPiBjb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxUZXN0SXRlbT4oKTsKLQkJY29sbGVjdGlvbi5hZGQobmV3IFRlc3RJdGVtKCJmb28iKSk7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFRlc3RJdGVtPiBidWlsZEZpbHRlcjIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFRlc3RJdGVtPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUZXN0SXRlbSB0aSkgewotCQkJCXJldHVybiB0aS5uYW1lLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGVzdEl0ZW0gaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0SXRlbSB7Ci0JCVN0cmluZyBuYW1lOwotCQlUZXN0SXRlbShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGRiN2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGZpbHRlcmVkT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZmlsdGVyZWRFdmVudDsKLQotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIgPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZEZpbHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlGaWx0ZXI8U3RyaW5nPiBidWlsZEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzICE9IG51bGwpICYmIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXIiLCAiYmF6Iik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsICJiYXoiLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvcCIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImZvcCIpOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRFdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9wIiwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEV2ZW50LCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLCBudWxsLCAiYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkRmlsdGVyZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGU5ZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5mb28gPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoImJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJiYXoiKTsKLQkJdGhpcy5qb28gPSBuZXcgSnVuaygiam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoImphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJqYXoiKTsKLQotCQl0aGlzLnRvbSA9IG5ldyBKdW5rKCJ0b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoImRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJoYXJyeSIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoImJhciIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigienp6Iik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigienp6Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0NPTExFQ1RJT04gPSAic3R1ZmYiOwotCQkJCi0JCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2NmVjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoImJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJqb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygiamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoImpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygiZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoImhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigiYmFyIik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJ6enoiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJ6enoiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSwgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfTElTVCA9ICJzdHVmZiI7Ci0JCQkKLQkKLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1BZGRlZChTVFVGRl9MSVNULCB0aGlzLnN0dWZmLmluZGV4T2Yoc3R1ZmZJdGVtKSwgc3R1ZmZJdGVtKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5zdHVmZi5pbmRleE9mKHN0dWZmSXRlbSk7Ci0JCQl0aGlzLnN0dWZmLnJlbW92ZShzdHVmZkl0ZW0pOwotCQkJZmlyZUl0ZW1SZW1vdmVkKFNUVUZGX0xJU1QsIGluZGV4LCBzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0b1N0cmluZygpOwotCQl9Ci0JCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKEp1bmsgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmY2UyYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJLy8gdGVzdCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBleGNlcHRpb24KLQkJbGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKHRoaXMuYnVpbGRMaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8obzEuZGlzcGxheVN0cmluZygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvblNvcnQoQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBjb21wYXJhdG9yKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyLCBjb21wYXJhdG9yKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPEp1bms+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODczMDczLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJ0aGlzLmZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJ0aGlzLmJhciIpOwotCQl0aGlzLmJheiA9IG5ldyBKdW5rKCJ0aGlzLmJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJ0aGlzLmpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJ0aGlzLmphciIpOwotCQl0aGlzLmpheiA9IG5ldyBKdW5rKCJ0aGlzLmpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRoaXMudG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJ0aGlzLmRpY2siKTsKLQkJdGhpcy5oYXJyeSA9IG5ldyBKdW5rKCJ0aGlzLmhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCg3LCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCg4LCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5nZXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8SnVuaz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SnVuaz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSnVuayBvMSwgSnVuayBvMikgewotCQkJCXJldHVybiBvMi5jb21wYXJlVG8obzEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy50b20pOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmRpY2spOwotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmVTb3J0KExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QsIENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTb3J0ZWRTZXQ8SnVuaz4gc3MgPSBuZXcgVHJlZVNldDxKdW5rPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJc3MuYWRkKGxpc3RWYWx1ZU1vZGVsLmdldChpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHNzLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPEp1bms+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDApKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgienp6Iik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIuc2V0TmFtZSgidGhpcy5iYXIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBqKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhqLm5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEyZGQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLkpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLnN1aXRlKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RBc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RDdXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy5UcmFuc2Zvcm1lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVMaXN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmM2ZkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0QXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGFhMTsKLQlwcml2YXRlIExpc3RFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBMaXN0QXNwZWN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lcyh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDFEZXNjcmlwdGlvbnMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZXModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QyRGVzY3JpcHRpb25zKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmVzdWx0LmFkZCgiYmFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJlc3VsdC5hZGQoImphbSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyRGVzY3JpcHRpb25zKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbExpc3RBc3BlY3RBZGFwdGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKExpc3RFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZSgiamFtIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc1BsdXMuYWRkKDIsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJqb28iKTsKLQkJaXRlbXMuYWRkKCJqYXIiKTsKLQkJaXRlbXMuYWRkKCJqYXoiKTsKLQkJaXRlbXMuYWRkKCJqYW0iKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbCgyLCBpdGVtcyk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7CQkvLyBvbmx5IHRoZSBsYXN0ICJhZGQiIGV2ZW50IHdpbGwgc3RpbGwgYmUgdGhlcmUKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGRBbGwoMiwgaXRlbXMpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVOYW1lKDApOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWROYW1lLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQlPYmplY3QgcmVtb3ZlZEl0ZW0gPSB0aGlzLmFhMS5yZW1vdmUoMCk7CQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZEl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlMaXN0PFN0cmluZz4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJaXRlbXMuYWRkKCJiYXIiKTsKLQkJaXRlbXMuYWRkKCJiYXoiKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZSgxLCAyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsJCS8vIG9ubHkgdGhlIGxhc3QgInJlbW92ZSIgZXZlbnQgd2lsbCBzdGlsbCBiZSB0aGVyZQotCQlhc3NlcnRFcXVhbHMoImJheiIsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJbmFtZXNQbHVzLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDAsICJqZWxseSIpOwkvLyBzaG91bGQgYmUgImZvbyIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiamVsbHkiLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXROZXdJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlcGxhY2VkTmFtZSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc0NoYW5nZWQgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgwLCAiamVsbHkiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzQ2hhbmdlZCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXJlcGxhY2VkTmFtZSA9IHRoaXMuc3ViamVjdDEuc2V0TmFtZSgxLCAicm9sbCIpOwkvLyBzaG91bGQgYmUgImJhciIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygicm9sbCIsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRPbGRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNDaGFuZ2VkID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMCwgImplbGx5Iik7Ci0JCW5hbWVzQ2hhbmdlZC5zZXQoMSwgInJvbGwiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzQ2hhbmdlZCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKCJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1czIgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzMi5hZGQoMCwgImpheiIpOwotCQluYW1lc1BsdXMyLmFkZCgwLCAiamFtIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMyLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuYWExLmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0U3ViamVjdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBuYW1lczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfTElTVCA9ICJuYW1lcyI7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IGRlc2NyaXB0aW9uczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05TX0xJU1QgPSAiZGVzY3JpcHRpb25zIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KCkgewotCQkJdGhpcy5uYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5kZXNjcmlwdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZXMuYWRkKGluZGV4LCBuYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChOQU1FU19MSVNULCBpbmRleCwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGROYW1lKHRoaXMubmFtZXMuc2l6ZSgpLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJd2hpbGUgKG5ld05hbWVzLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkTmFtZShuZXdOYW1lcy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3Q8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJdGhpcy5hZGROYW1lcyhuZXdOYW1lcy5saXN0SXRlcmF0b3IoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJCXRoaXMubmFtZXMuYWRkKDAsIG5hbWUyKTsKLQkJCXRoaXMubmFtZXMuYWRkKDAsIG5hbWUxKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKE5BTUVTX0xJU1QsIHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlTmFtZShpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyByZW1vdmVkTmFtZSA9IHRoaXMubmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKE5BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkTmFtZSk7Ci0JCQlyZXR1cm4gcmVtb3ZlZE5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBzZXROYW1lKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyByZXBsYWNlZE5hbWUgPSB0aGlzLm5hbWVzLnNldChpbmRleCwgbmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoTkFNRVNfTElTVCwgaW5kZXgsIG5hbWUsIHJlcGxhY2VkTmFtZSk7Ci0JCQlyZXR1cm4gcmVwbGFjZWROYW1lOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBkZXNjcmlwdGlvbnMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5kZXNjcmlwdGlvbnMpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbnMuZ2V0KGluZGV4KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihpbnQgaW5kZXgsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJdGhpcy5kZXNjcmlwdGlvbnMuYWRkKGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9uKHRoaXMuZGVzY3JpcHRpb25zLnNpemUoKSwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXdoaWxlIChuZXdEZXNjcmlwdGlvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbnMubmV4dCgpKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbnMoTGlzdDxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJdGhpcy5hZGREZXNjcmlwdGlvbnMobmV3RGVzY3JpcHRpb25zLmxpc3RJdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZURlc2NyaXB0aW9uKGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlbW92ZWREZXNjcmlwdGlvbiA9IHRoaXMuZGVzY3JpcHRpb25zLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIHJlbW92ZWREZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm4gcmVtb3ZlZERlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgc2V0RGVzY3JpcHRpb24oaW50IGluZGV4LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCVN0cmluZyByZXBsYWNlZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbnMuc2V0KGluZGV4LCBkZXNjcmlwdGlvbik7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQoREVTQ1JJUFRJT05TX0xJU1QsIGluZGV4LCBkZXNjcmlwdGlvbiwgcmVwbGFjZWREZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm4gcmVwbGFjZWREZXNjcmlwdGlvbjsKLQkJfQotCX0KLQotCi0JLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JY2xhc3MgTG9jYWxMaXN0QXNwZWN0QWRhcHRlciBleHRlbmRzIExpc3RBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbExpc3RBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfTElTVCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZXMoKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXRoaXMuc3ViamVjdC5hZGREZXNjcmlwdGlvbihpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gaXRlbXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCQl0aGlzLmFkZChpbmRleCArIGksIGl0ZW1zLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5yZW1vdmVOYW1lKGluZGV4KTsKLQkJCX0gZWxzZSBpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKGluZGV4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJTGlzdDxTdHJpbmc+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihsZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCXJlbW92ZWRJdGVtcy5hZGQodGhpcy5yZW1vdmUoaW5kZXgpKTsKLQkJCX0KLQkJCXJldHVybiByZW1vdmVkSXRlbXM7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IHJlcGxhY2UoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnNldE5hbWUoaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24oaW5kZXgsIChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OTlhZDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRMaXN0SG9sZGVyOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHdyYXBwZWRMaXN0OwotCi0JcHVibGljIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0KTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRMaXN0SG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMud3JhcHBlZExpc3QuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWVzKCkgewotCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSGFzaEJhZzxTdHJpbmc+KCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMywgImpvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg0LCAiamFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDUsICJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZExpc3Quc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsIHRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiamF6IikpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2goKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkTGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscygiZm9vIiwgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5pdGVyYXRvcigpLCAiam9vIikpOwotCQkJCWFzc2VydEVxdWFscygyLCBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImpvbyIsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0KDAsICJqb28iKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHN5bmNoQ29sbGVjdGlvbik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobGlzdCk7Ci0JCWFzc2VydEVxdWFscygyLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RDdXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhMjU3My4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEN1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdEN1cmF0b3JUZXN0cyAKLQlleHRlbmRzIFRlc3RDYXNlIAotewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBjdXJhdG9yOwotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQlwcml2YXRlIExpc3RFdmVudCBldmVudDE7Ci0JCi0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MjsKLQotCXB1YmxpYyBMaXN0Q3VyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdDEgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0MU5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuY3VyYXRvciA9IHRoaXMuYnVpbGRMaXN0Q3VyYXRvcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmN1cmF0b3IuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QodGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MU5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJhbHBoYSIpOwotCQlsaXN0LmFkZCgiYnJhdm8iKTsKLQkJbGlzdC5hZGQoImNoYXJsaWUiKTsKLQkJbGlzdC5hZGQoImRlbHRhIik7Ci0JCXJldHVybiBsaXN0OwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJlY2hvIik7Ci0JCWxpc3QuYWRkKCJmb3h0cm90Iik7Ci0JCWxpc3QuYWRkKCJnbG92ZSIpOwotCQlsaXN0LmFkZCgiaG90ZWwiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdEN1cmF0b3I8VGVzdFN1YmplY3QsIFN0cmluZz4gYnVpbGRMaXN0Q3VyYXRvcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yRm9yUmVjb3JkKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3RyaW5ncygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoTGlzdEV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDJOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXJhdG9yLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFN0cmluZygiZWNobyIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImVjaG8iLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gc3RyaW5nc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJc3RyaW5nc1BsdXMuYWRkKCJlY2hvIik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLmFkZFN0cmluZygwLCAienVsdSIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6dWx1IiwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJc3RyaW5nc1BsdXMuYWRkKDAsICJ6dWx1Iik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzUGx1cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZW1vdmVkU3RyaW5nID0gdGhpcy5zdWJqZWN0MS5yZW1vdmVTdHJpbmcoMCk7CS8vIHNob3VsZCBiZSAiYWxwaGEiCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZFN0cmluZywgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IHN0cmluZ3NNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQlzdHJpbmdzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXJlbW92ZWRTdHJpbmcgPSB0aGlzLnN1YmplY3QxLnJlbW92ZVN0cmluZygyKTsJLy8gc2hvdWxkIGJlICJkZWx0YSIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlzdHJpbmdzTWludXMucmVtb3ZlKDIpOwotCQlhc3NlcnRFcXVhbHMoc3RyaW5nc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlTGlzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCQotCQl0aGlzLnN1YmplY3QxLnNldFN0cmluZ3ModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlMaXN0PFN0cmluZz4gbmV3U3RyaW5ncyA9IHRoaXMuc3ViamVjdDJOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMobmV3U3RyaW5ncywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsTGlzdENoYW5nZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN0YXJ0aW5nTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgc3RhcnRpbmdMaXN0KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCQotCQlTdHJpbmcgaWRlbnRpY2FsU3RyaW5nID0gc3RhcnRpbmdMaXN0LmdldCgxKTsgIC8vIHNob3VsZCBiZSAiYnJhdm8iCi0JCVN0cmluZyBub25pZGVudGljYWxTdHJpbmcgPSBzdGFydGluZ0xpc3QuZ2V0KDApOyAvLyBzaG91bGQgYmUgImFscGhhIgotCQlMaXN0PFN0cmluZz4gbmV3U3RyaW5ncyA9IENvbGxlY3Rpb25Ub29scy5saXN0KG5ldyBTdHJpbmdbXSB7bmV3IFN0cmluZygiYnJhdm8iKSwgbmV3IFN0cmluZygiYWxwaGEiKSwgImVjaG8iLCAiZGVsdGEiLCAiZm94dHJvdCJ9KTsKLQkJdGhpcy5zdWJqZWN0MS5zZXRTdHJpbmdzKG5ld1N0cmluZ3MpOwotCQkKLQkJTGlzdDxTdHJpbmc+IGZpbmFsTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdTdHJpbmdzLCBmaW5hbExpc3QpOwotCQlhc3NlcnRUcnVlKGlkZW50aWNhbFN0cmluZyA9PSBmaW5hbExpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0VHJ1ZShub25pZGVudGljYWxTdHJpbmcgIT0gZmluYWxMaXN0LmdldCgxKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnN1YmplY3QxLnN0cmluZ3MoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuZ2V0KDApLCB0aGlzLnN1YmplY3QxLmdldFN0cmluZygwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuY3VyYXRvci5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5zdHJpbmdzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIHRoaXMuY3VyYXRvci5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5jdXJhdG9yLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmN1cmF0b3IuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMuY3VyYXRvci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQkKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKiogSW5uZXIgQ2xhc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0cmluZ3M7Ci0JCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLnN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfQotCQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KExpc3Q8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCQl0aGlzKCk7Ci0JCQl0aGlzLnNldFN0cmluZ3Moc3RyaW5ncyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuc3RyaW5ncy5nZXQoaW5kZXgpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRTdHJpbmcoaW50IGluZGV4LCBTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnN0cmluZ3MuYWRkKGluZGV4LCBzdHJpbmcpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZFN0cmluZyh0aGlzLnN0cmluZ3Muc2l6ZSgpLCBzdHJpbmcpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZVN0cmluZyhpbnQgaW5kZXgpIHsKLQkJCVN0cmluZyBzdHJpbmcgPSB0aGlzLnN0cmluZ3MuZ2V0KGluZGV4KTsKLQkJCXRoaXMucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5zdHJpbmdzLnJlbW92ZShzdHJpbmcpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZ3MoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzdHJpbmdzKTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHN0cmluZ3MpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZiZDkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBjb2xsZWN0aW9uSG9sZGVyOwotCi0JcHVibGljIE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlciA9IG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYmE0YWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPYmplY3Q+IGxpc3RIb2xkZXI7Ci0KLQlwdWJsaWMgTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMubGlzdEhvbGRlci5nZXQoMCk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmNjQyMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbFByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbFByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCXB1YmxpYyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBOdWxsUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWE0ZWM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGFhMTsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQxOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IG11bHRpcGxlVmFsdWVFdmVudDsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjdXN0b21WYWx1ZUV2ZW50OwotCi0KLQlwdWJsaWMgUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgiZm9vIiwgInRlc3Qgc3ViamVjdCAxIik7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiAodGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCJiYXIiLCAidGVzdCBzdWJqZWN0IDIiKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCS8vIHRoaXMgaXMgbm90IGEgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5wcm9wZXJ0eU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLnByb3BlcnR5TmFtZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfSBlbHNlIGlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldERlc2NyaXB0aW9uKHZhbHVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5wcm9wZXJ0eU5hbWVzWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB2YWx1ZTFDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUoImJheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYWExLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLmFhMS5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCXRoaXMuYWExLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzcGVjdEFkYXB0ZXIoKSB7Ci0JCVRlc3RTdWJqZWN0IHRlc3RTdWJqZWN0ID0gbmV3IFRlc3RTdWJqZWN0KCJmcmVkIiwgImh1c2JhbmQiKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHRlc3RTdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGVzdFN1YmplY3QpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRlc3RBQSA9IHRoaXMuYnVpbGRNdWx0aXBsZUFzcGVjdEFkYXB0ZXIodGVzdFN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRNdWx0aXBsZVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGVzdEFBLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0ZXN0TGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQ6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IG51bGw7Ci0JCXRlc3RTdWJqZWN0LnNldE5hbWUoIndpbG1hIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0KLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBudWxsOwotCQl0ZXN0U3ViamVjdC5zZXREZXNjcmlwdGlvbigid2lmZSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0ZXN0QUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOndpZmUiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNdWx0aXBsZUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFksIFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCkgKyAiOiIgKyB0aGlzLnN1YmplY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRNdWx0aXBsZVZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLm11bHRpcGxlVmFsdWVDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgbXVsdGlwbGVWYWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gZTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgYnVnIHdoZXJlIHdlIHdvdWxkIGNhbGwgI2J1aWxkVmFsdWUoKSBpbgotCSAqICNlbmdhZ2VOb25OdWxsU3ViamVjdCgpLCB3aGVuIHdlIG5lZWRlZCB0byBjYWxsCi0JICogaXQgaW4gI2VuZ2FnZVN1YmplY3QoKSwgc28gdGhlIGNhY2hlZCB2YWx1ZSB3b3VsZAotCSAqIGJlIHJlYnVpbHQgd2hlbiB0aGUgdGhpcy5zdWJqZWN0IHdhcyBzZXQgdG8gbnVsbAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21CdWlsZFZhbHVlV2l0aE51bGxTdWJqZWN0KCkgewotCQlUZXN0U3ViamVjdCBjdXN0b21TdWJqZWN0ID0gbmV3IFRlc3RTdWJqZWN0KCJmcmVkIiwgImxhYm9yZXIiKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IGN1c3RvbVN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PihjdXN0b21TdWJqZWN0KTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBjdXN0b21BQSA9IHRoaXMuYnVpbGRDdXN0b21Bc3BlY3RBZGFwdGVyKGN1c3RvbVN1YmplY3RIb2xkZXIpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGN1c3RvbUxpc3RlbmVyID0gdGhpcy5idWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJY3VzdG9tQUEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGN1c3RvbUxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gbnVsbDsKLQkJY3VzdG9tU3ViamVjdC5zZXROYW1lKCJ3aWxtYSIpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYSIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBudWxsOwotCQljdXN0b21TdWJqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0aGlzIHdvdWxkIGZhaWwgLSB0aGUgdmFsdWUgd291bGQgYmUgbnVsbC4uLgotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIGN1c3RvbUFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjx1bm5hbWVkPiIsIHRoaXMuY3VzdG9tVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGEgYnVnOgotCSAqIElmIHR3byBsaXN0ZW5lcnMgd2VyZSBhZGRlZCB0byBhbiBhc3BlY3QgYWRhcHRlciwgb25lIHdpdGggYW4KLQkgKiBhc3BlY3QgbmFtZSBhbmQgb25lIHdpdGhvdXQsIHRoZSBhc3BlY3QgYWRhcHRlciB3b3VsZCBhZGQgaXRzCi0JICogJ3N1YmplY3RDaGFuZ2VMaXN0ZW5lcicgdG8gaXRzICdzdWJqZWN0SG9sZGVyJyB0d2ljZS4gQXMgYSByZXN1bHQsCi0JICogdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgdHJpZ2dlciBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiBpZiB0aGUgYnVnIGlzIHByZXNlbnQ7IG90aGVyd2lzZSwgaXQgY29tcGxldGVzIHNpbGVudGx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVMaXN0ZW5lcigpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDdXN0b21Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0U3ViamVjdCwgU3RyaW5nPihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/ICI8dW5uYW1lZD4iIDogdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDdXN0b21WYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy5jdXN0b21WYWx1ZUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBjdXN0b21WYWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgbW9kZWwgKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvbiI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdChTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5kZXNjcmlwdGlvbjsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY0Y2RkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkVmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MGNmZTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZFZhbHVlSG9sZGVyOwotCi0JcHVibGljIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hZGFwdGVyLmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkxKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlPYmplY3RbXSBhcnJheSA9IHRoaXMuYWRhcHRlci50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXJyYXlbMF0pOwotCQlhc3NlcnRFcXVhbHMoMSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTIoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSk7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlMaXN0PFN0cmluZz4gYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCksIGFkYXB0ZXJMaXN0KTsKLQotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZExpc3QoKSwgYWRhcHRlckxpc3QpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJMaXN0Lml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZW1DaGFuZ2VkKCkgewotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCQkKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMSwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0RWxlbWVudEF0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlzdGF0aWMgY2xhc3MgVGVzdExpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOGY2ZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzIAotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCQotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZXJPYmplY3RIb2xkZXI7Ci0JCi0JUHJvcGVydHlDaGFuZ2VFdmVudCB3cmFwcGVyRXZlbnQ7Ci0JCi0JCi0JcHVibGljIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyID0gbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5vYmplY3RIb2xkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlib29sZWFuIGV4Y2VwdGlvbk9jY3VycmVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKLQkJCWV4Y2VwdGlvbk9jY3VycmVkID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25PY2N1cnJlZCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IGJ1aWxkV3JhcHBlckxpc3RlbmVyKCk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkV3JhcHBlckxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRXcmFwcGVyTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLndyYXBwZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMud3JhcHBlckV2ZW50LCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy53cmFwcGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJiYXIiLCBudWxsKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy53cmFwcGVyRXZlbnQsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlciwgImJhciIsIG51bGwpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMud3JhcHBlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImZvbyIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLndyYXBwZXJFdmVudCwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLCBudWxsLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRXcmFwcGVyTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy53cmFwcGVyRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZGZiN2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IGFkZEV2ZW50OwotCUNvbGxlY3Rpb25SZW1vdmVFdmVudCByZW1vdmVFdmVudDsKLQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBjb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBjb2xsZWN0aW9uQ2hhbmdlZEV2ZW50OwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHNldEhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgc2V0QWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IHNldFJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IHNldENsZWFyZWRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgc2V0Q2hhbmdlZEV2ZW50OwotCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCXRoaXMuc2V0SG9sZGVyID0gbmV3IFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iLCAiZm9vIiwgImJhciIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNldEhvbGRlci5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWxrQ2hhbmdlKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3Q29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZveCIsICJmb3giLCAiYmF0Iik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm94IiwgImJhdCIpOwotCX0JCQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLnNldEhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFdmVudHMxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50czIoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkU2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckV2ZW50cygpIHsKLQkJdGhpcy5hZGRFdmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRSZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRDaGFuZ2VkRXZlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudHMoKSB7Ci0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zZXRBZGRFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJiYXIiKTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0UmVtb3ZlRXZlbnQpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiYmFyIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRBZGRFdmVudCk7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnJlbW92ZUV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldFJlbW92ZUV2ZW50LCB0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zZXRBZGRFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5jbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldENsZWFyZWRFdmVudCwgdGhpcy5zZXRIb2xkZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3Q29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb3giLCAiZm94IiwgImJhdCIsICJiYXQiLCAiYmF0Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5zZXRDaGFuZ2VkRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiZm94IiwgImJhdCIpOwotCQkKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYWRkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5yZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0QWRkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0UmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldENsZWFyZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldENoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRBZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldFJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldENsZWFyZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeShDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGN2bSwgU3RyaW5nLi4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJQmFnPFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLmJhZyhjdm0pOwotCQlCYWc8U3RyaW5nPiBleHBlY3RlZCA9IENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0Li4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyksIENvbGxlY3Rpb25Ub29scy5iYWcoZXZlbnQuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdC4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGV2ZW50LmdldENvbGxlY3Rpb24oKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTRhNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYmFnSG9sZGVyOwotCUNvbGxlY3Rpb25FdmVudCBiYWdFdmVudDsKLQlTdHJpbmcgYmFnRXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHNldEhvbGRlcjsKLQlDb2xsZWN0aW9uRXZlbnQgc2V0RXZlbnQ7Ci0JU3RyaW5nIHNldEV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQkKLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZ0hvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZFNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQmFnKCkgewotCQlCYWc8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkSXRlbXNUbyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU2V0PFN0cmluZz4gYnVpbGRTZXQoKSB7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEl0ZW1zVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWMuYWRkKCJiYXoiKTsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkQWRkSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEJhZzxTdHJpbmc+IGJ1aWxkUmVtb3ZlSXRlbXMoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQmFnKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTZXQoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2V0SG9sZGVyQ29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJhZ0hvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlCYWc8U3RyaW5nPiBiYWcgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKGJhZy5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnNldEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogaXRlbXMpIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyaW5nKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlcygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuc2V0VmFsdWVzKHRoaXMuYnVpbGRBZGRJdGVtcygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuc2V0VmFsdWVzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImphciIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZXRIb2xkZXJDb250YWlucygiamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMSgpIHsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTIoKSB7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRCYWdMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlCYWdDaGFuZ2UoKTsKLQotCQl0aGlzLnNldEhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJ1aWxkU2V0TGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0NoYW5nZSgpIHsKLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJmb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkQmFnKCksIENvbGxlY3Rpb25Ub29scy5iYWcoKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuYmFnRXZlbnQpLmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0Q2hhbmdlKCkgewotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChBREQsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsICJqb28iKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoUkVNT1ZFLCBudWxsKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZFNldCgpKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkU2V0KCkpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQmFnTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGV2ZW50VHlwZSwgdGhpcy5iYWdFdmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWdIb2xkZXIsIHRoaXMuYmFnRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmJhZ0V2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlCYWdFdmVudChTdHJpbmcgZXZlbnRUeXBlLCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KGV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldEJhZ0V2ZW50SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRCYWdFdmVudEl0ZW1zKCkgewotCQlpZiAodGhpcy5iYWdFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmJhZ0V2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuYmFnRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5iYWdFdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGV2ZW50VHlwZSwgdGhpcy5zZXRFdmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zZXRIb2xkZXIsIHRoaXMuc2V0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLnNldEV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRFdmVudChTdHJpbmcgZXZlbnRUeXBlLCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeVNldEV2ZW50KGV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldFNldEV2ZW50SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRTZXRFdmVudEl0ZW1zKCkgewotCQlpZiAodGhpcy5zZXRFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLnNldEV2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuc2V0RXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5zZXRFdmVudCkuZ2V0SXRlbXMoKTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYjgxMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCUxpc3RFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCQotCXB1YmxpYyBTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRSZW1vdmVMaXN0KCkgewotLy8JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLS8vCQlyZXN1bHQuYWRkKCJmb28iKTsKLS8vCQlyZXN1bHQuYWRkKCJiYXIiKTsKLS8vCQlyZXR1cm4gcmVzdWx0OwotLy8JfQotLy8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKDEpKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigxKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJU2V0PFN0cmluZz4gc2V0ID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzZXQuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRPYmplY3QoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDAsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNPYmplY3QoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWlucygiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJmb28iKTsKLQkJYy5hZGQoImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0KLQkJYy5hZGQoImpvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnNBbGwoYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKSwgdGhpcy5saXN0SG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQWRkTGlzdCgpKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyhuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKS5oYXNoQ29kZSgpLCB0aGlzLmxpc3RIb2xkZXIuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImpvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZPYmplY3QoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXoiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJqb28iKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0xpc3QuYWRkKCJqb28iKTsKLQkJbmV3TGlzdC5hZGQoImphciIpOwotCQluZXdMaXN0LmFkZCgiamF6Iik7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXdMaXN0KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3RWYWx1ZXMobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlMSgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UyKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsICJqb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCAiam9vIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQ0hBTkdFKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJqb28iKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBlKSB7Ci0JCWFzc2VydEVxdWFscyhlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZSk7Ci0JCWlmIChlID09IEFERCkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9IGVsc2UgaWYgKGUgPT0gUkVNT1ZFKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjYxZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCQotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigiZm9vIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoImJhciIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgImJheiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NjA3ZTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJldmVyc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbkhvbGRlcjsKLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbjsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbik7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCkgewotCQl0aGlzLnZlcmlmeUxpc3QoZXhwZWN0ZWQsIGFjdHVhbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkLCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGFjdHVhbCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY29tcGFyYXRvcik7Ci0JCXNvcnRlZFNldC5hZGRBbGwoZXhwZWN0ZWQpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNvcnRlZFNldCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYWN0dWFsLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYWRhcHRlci5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBhcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJQmFnPFN0cmluZz4gc3luY2hDb2xsZWN0aW9uID0gbmV3IENvb3JkaW5hdGVkQmFnPFN0cmluZz4odGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkQ29sbGVjdGlvbi5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLnNldENvbXBhcmF0b3IobmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZyZWQiKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuc2V0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjRmOTQ1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBsaXN0OwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0TW9kZWw7Ci0JcHJpdmF0ZSBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPiBzb3J0ZWRMaXN0TW9kZWw7Ci0KLQkKLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMubGlzdE1vZGVsID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5saXN0KTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdChleHBlY3RlZCwgYWN0dWFsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsLCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChleHBlY3RlZCk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc29ydGVkU2V0KTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRMaXN0LCBhY3R1YWxMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5zb3J0ZWRMaXN0TW9kZWwuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW0oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy5saXN0LnNpemUoKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCgzLCAidHR0Iik7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCg0LCAieHh4Iik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2goKSB7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbXBhcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5zZXRDb21wYXJhdG9yKG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzb3J0ZWRTeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmcmVkIik7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLmxpc3RNb2RlbC5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5zb3J0ZWRMaXN0TW9kZWwuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCX0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIwZjU3ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gQ09MTEVDVElPTiA9IGJ1aWxkQ29sbGVjdGlvbigpOwotCXByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQotCi0JcHVibGljIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyhidWlsZENvbGxlY3Rpb24oKS5zaXplKCksIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMGE0YWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTElTVCA9IGJ1aWxkTGlzdCgpOwotCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyOwotCi0KLQlwdWJsaWMgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihMSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gYnVpbGRMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5saXN0SG9sZGVyLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0KGkpLCB0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNWE3MDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBPQkpFQ1RfSE9MREVSID0gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQotCQotCXB1YmxpYyBTdGF0aWNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBPQkpFQ1RfSE9MREVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKHRoaXMub2JqZWN0SG9sZGVyLnRvU3RyaW5nKCkuaW5kZXhPZigiZm9vIikgPj0gMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTYzYmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdEhvbGRlcjsKLQlMaXN0RXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcih0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gdHJhbnNmb3JtKExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGlzdC5zaXplKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBsaXN0KSB7Ci0JCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkKG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKHN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZFJlbW92ZUxpc3QoKSB7Ci0vLwkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuYnVpbGRSZW1vdmVMaXN0KCkpOwotLy8JfQotLy8KLQlMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4obHZtKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtSXRlbV8oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YWxlVmFsdWVzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUxpc3Q8U3RyaW5nPiB0cmFuc2Zvcm1lZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHRyYW5zZm9ybWVkTGlzdC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJKT08iKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkpPTyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgwLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zQW55KHRoaXMuYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDIsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKCJCQVIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUodGhpcy5idWlsZExpc3QoKS5pbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkJBUiIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyYW5zZm9ybWVkTGlzdENvbnRhaW5zKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZUdlbmVyaWMoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VOYW1lZCgpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsICJqb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQsIDEsICJKT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDEsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCAxLCAiSk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZEFsbCgwLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChBREQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFRyYW5zZm9ybWVkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCgoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKSkpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFUExBQ0UpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXROZXdJdGVtcygpLCAiRk9PIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJKT08iKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlKSB7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCB0aGlzLmV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0eXBlKTsKLQkJaWYgKHR5cGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCS8qCi0JCSAqIGFkZGluZyBsaXN0ZW5lcnMgdG8gdGhlIHRyYW5zZm9ybWVkIGxpc3Qgd2lsbCBjYXVzZSBsaXN0ZW5lcnMKLQkJICogdG8gYmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdDsKLQkJICogbGlrZXdpc2UsIHJlbW92aW5nIGxpc3RlbmVycyBmcm9tIHRoZSB0cmFuc2Zvcm1lZCBsaXN0IHdpbGwKLQkJICogY2F1c2UgbGlzdGVuZXJzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBsaXN0Ci0JCSAqLwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzYW1lIHNldCBvZiB0ZXN0cyBhZ2FpbiwgYnV0IGJ5IHBhc3NpbmcgYSBUcmFuc2Zvcm1lciB0byB0aGUgYWRhcHRlcgotCSAqIChhcyBvcHBvc2VkIHRvIG92ZXJyaWRpbmcgI3RyYW5zZm9ybUl0ZW0oT2JqZWN0KSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRyYW5zZm9ybWVyVGVzdHMgZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMgewotCQlwdWJsaWMgVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxTdHJpbmcsIFN0cmluZz4obHZtLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JCX0KLQkJcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0OTE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciA9IG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZywgU3RyaW5nPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaVRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIHJldmVyc2VUcmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgPT0gbnVsbCkgPyBudWxsIDogcy50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJGT08iLCAiQkFSIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVIiLCAiQkFaIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJheiIsICJGb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJCQVoiLCAiRk9PIik7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGT08iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZvbyIsICJGT08iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG51bGwsICJCQVIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZmZiNTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmVlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJlZUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4gYWExOwotCXByaXZhdGUgVHJlZUV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JCi0JcHVibGljIFRyZWVBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQlUZXN0Tm9kZSByb290LCBub2RlOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGROYW1lKHJvb3QsICJuYW1lIDEuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QxLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAxLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4yIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjMiKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4odGhpcy5zdWJqZWN0MSk7Ci0JCXRoaXMuYWExID0gdGhpcy5idWlsZEFzcGVjdEFkYXB0ZXIodGhpcy5zdWJqZWN0SG9sZGVyMSk7Ci0JCXRoaXMubGlzdGVuZXIxID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0KLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCgpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3ROYW1lTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4xLjEiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjIuMSIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGROYW1lKHJvb3QsICJuYW1lIDIuMyIpOwotCi0JCXJvb3QgPSB0aGlzLnN1YmplY3QyLmdldFJvb3REZXNjcmlwdGlvbk5vZGUoKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKG5vZGUsICJkZXNjcmlwdGlvbiAyLjEuMiIpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4yIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjMiKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4gYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBMaXN0PFRlc3ROb2RlPj4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSB0eXBpY2FsIGFzcGVjdCBhZGFwdGVyIC0gdGhlIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGFzcGVjdCBuYW1lCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gbm9kZXNfKCkgewotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19UUkVFKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZVBhdGhzKCk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLnRyZWVOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfVFJFRSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9uUGF0aHMoKTsKLQkJCQl9Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMudHJlZU5hbWVzWzBdKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoVHJlZUV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZVN0cnVjdHVyZUNoYW5nZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcyh0aGlzLnN1YmplY3QxLmdldFJvb3ROYW1lTm9kZSgpLCAiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYW0iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5jb250YWluc05hbWVOb2RlKCJqYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVzKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLnN1YmplY3QxLm5hbWVQYXRocygpKSwgdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmFhMS5ub2RlcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29udmVydFRvTmFtZXMoSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IG5hbWVQYXRocykgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl3aGlsZSAobmFtZVBhdGhzLmhhc05leHQoKSkgewotCQkJTGlzdDxUZXN0Tm9kZT4gcGF0aCA9IG5hbWVQYXRocy5uZXh0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoJ1snKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aC5zaXplKCk7IGkrKykgewotCQkJCXNiLmFwcGVuZChwYXRoLmdldChpKS5nZXRUZXh0KCkpOwotCQkJCWlmIChpIDwgcGF0aC5zaXplKCkgLSAxKSB7Ci0JCQkJCXNiLmFwcGVuZCgnOicpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZCgnXScpOwotCQkJcmVzdWx0LmFkZChzYi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCXRoaXMuYWExLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfVFJFRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuYWExLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgVGVzdE5vZGUgcm9vdE5hbWVOb2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19UUkVFID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSByb290RGVzY3JpcHRpb25Ob2RlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfVFJFRSA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLnJvb3ROYW1lTm9kZSA9IG5ldyBUZXN0Tm9kZSgicm9vdCBuYW1lIik7Ci0JCQl0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUgPSBuZXcgVGVzdE5vZGUoInJvb3QgZGVzY3JpcHRpb24iKTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgZ2V0Um9vdE5hbWVOb2RlKCkgewotCQkJcmV0dXJuIHRoaXMucm9vdE5hbWVOb2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gbmFtZU5vZGVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMucm9vdE5hbWVOb2RlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbihUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8TGlzdDxUZXN0Tm9kZT4+IG5hbWVQYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgTGlzdDxUZXN0Tm9kZT4+KHRoaXMubmFtZU5vZGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdDxUZXN0Tm9kZT4gdHJhbnNmb3JtKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGFkZE5hbWUoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQkJdGhpcy5maXJlTm9kZUFkZGVkKE5BTUVTX1RSRUUsIGNoaWxkLmdldFBhdGgoKSk7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVHdvTmFtZXMoVGVzdE5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMSkpOwotCQkJcGFyZW50LmFkZENoaWxkKG5ldyBUZXN0Tm9kZShuYW1lMikpOwotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoTkFNRVNfVFJFRSwgcGFyZW50LmdldFBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTmFtZU5vZGUoVGVzdE5vZGUgbmFtZU5vZGUpIHsKLQkJCW5hbWVOb2RlLmdldFBhcmVudCgpLnJlbW92ZUNoaWxkKG5hbWVOb2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKE5BTUVTX1RSRUUsIG5hbWVOb2RlLmdldFBhdGgoKSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnNOYW1lTm9kZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHRoaXMubmFtZU5vZGUobmFtZSkgIT0gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgbmFtZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VGVzdE5vZGU+IHN0cmVhbSA9IHRoaXMubmFtZU5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5vZGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFJvb3REZXNjcmlwdGlvbk5vZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290RGVzY3JpcHRpb25Ob2RlOwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gZGVzY3JpcHRpb25Ob2RlcygpIHsKLQkJCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRlc3ROb2RlPih0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGNoaWxkcmVuKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gZGVzY3JpcHRpb25QYXRocygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxUZXN0Tm9kZSwgTGlzdDxUZXN0Tm9kZT4+KHRoaXMuZGVzY3JpcHRpb25Ob2RlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3Q8VGVzdE5vZGU+IHRyYW5zZm9ybShUZXN0Tm9kZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBuZXh0LmdldFBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBhZGREZXNjcmlwdGlvbihUZXN0Tm9kZSBwYXJlbnQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJVGVzdE5vZGUgY2hpbGQgPSBuZXcgVGVzdE5vZGUoZGVzY3JpcHRpb24pOwotCQkJcGFyZW50LmFkZENoaWxkKGNoaWxkKTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChERVNDUklQVElPTlNfVFJFRSwgY2hpbGQuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbk5vZGUoVGVzdE5vZGUgZGVzY3JpcHRpb25Ob2RlKSB7Ci0JCQlkZXNjcmlwdGlvbk5vZGUuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoZGVzY3JpcHRpb25Ob2RlKTsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKERFU0NSSVBUSU9OU19UUkVFLCBkZXNjcmlwdGlvbk5vZGUuZ2V0UGF0aCgpKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0Rlc2NyaXB0aW9uTm9kZShTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUZXN0Tm9kZT4gc3RyZWFtID0gdGhpcy5kZXNjcmlwdGlvbk5vZGVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVRlc3ROb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChub2RlLmdldFRleHQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCWNsYXNzIFRlc3ROb2RlIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGV4dDsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0Tm9kZT4gY2hpbGRyZW47Ci0JCi0JCXB1YmxpYyBUZXN0Tm9kZShTdHJpbmcgdGV4dCkgewotCQkJdGhpcy50ZXh0ID0gdGV4dDsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0Tm9kZT4oKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXh0OwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldFBhcmVudChUZXN0Tm9kZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMuY2hpbGRyZW4pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFRlc3ROb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGVzdE5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKLQkJfQotCQlwdWJsaWMgTGlzdDxUZXN0Tm9kZT4gZ2V0UGF0aCgpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZEFudGlQYXRoKCkpOwotCQl9Ci0JCXByaXZhdGUgSXRlcmF0b3I8VGVzdE5vZGU+IGJ1aWxkQW50aVBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGUgbmV4dExpbmsoVGVzdE5vZGUgY3VycmVudExpbmspIHsKLQkJCQkJcmV0dXJuIGN1cnJlbnRMaW5rLmdldFBhcmVudCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3ROb2RlKCIgKyB0aGlzLnRleHQgKyAiKSI7Ci0JCX0KLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNmMyYzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkFkZCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25SZW1vdmUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfQ09MTEVDVElPTiA9ICJzdHVmZiI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5zdHVmZiArICIpIjsKLQkJfQotCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ0N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVmFsdWVMaXN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0JCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUxpc3RBZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9MSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0QWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVtb3ZlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZW1vdmVTdHVmZigiZm9vIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0UmVwbGFjZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsucmVwbGFjZVN0dWZmKCJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHVmZjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUVUZGX0xJU1QgPSAic3R1ZmYiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgYWRkU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KHN0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVwbGFjZVN0dWZmKFN0cmluZyBvbGRTdHVmZkl0ZW0sIFN0cmluZyBuZXdTdHVmZkl0ZW0pIHsKLQkJCXRoaXMucmVwbGFjZUl0ZW1Jbkxpc3Qob2xkU3R1ZmZJdGVtLCBuZXdTdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0xJU1QpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNmNWJlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVQcm9wZXJ0eUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVByb3BlcnR5QWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByb3BlcnR5KCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIzNTgxMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVTdGF0ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZVN0YXRlQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBqdW5rOwotCXByaXZhdGUgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+IGp1bmtIb2xkZXI7Ci0JcHJpdmF0ZSBWYWx1ZVN0YXRlQWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qdW5rID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmp1bmtIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEp1bms+KHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIgPSBuZXcgVmFsdWVTdGF0ZUFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTdGF0ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBleHRlbmRzIENoYW5nZUFkYXB0ZXIgewotCQlwcml2YXRlIGJvb2xlYW4gZXZlbnRSZWNlaXZlZCA9IGZhbHNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBzb3VyY2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG9sZFZhbHVlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBuZXdWYWx1ZTsKLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlKSB7Ci0JCQl0aGlzKHNvdXJjZSwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJTG9jYWxMaXN0ZW5lcihPYmplY3Qgc291cmNlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQkJdGhpcy5uZXdWYWx1ZSA9IG5ld1ZhbHVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJYm9vbGVhbiBldmVudFJlY2VpdmVkKCkgewotCQkJcmV0dXJuIHRoaXMuZXZlbnRSZWNlaXZlZDsKLQkJfQotCX0KLQotCWNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiSnVuaygiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOTY2YTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL0pwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVhNmU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFByZWZlcmVuY2VzVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IG5vZGVIb2xkZXI7Ci0JUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHByZWZlcmVuY2VBZGFwdGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQlib29sZWFuIGxpc3RlbmVyUmVtb3ZlZCA9IGZhbHNlOwotCVByZWZlcmVuY2VDaGFuZ2VFdmVudCBwcmVmZXJlbmNlRXZlbnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gImZvbyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRSA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUiOwotCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPih0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMubGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJUHJlZmVyZW5jZXMgYW5vdGhlck5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKCJhbm90aGVyIHRlc3Qgbm9kZSIpOwotCQlhbm90aGVyTm9kZS5wdXQoS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUoYW5vdGhlck5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmZXJlbmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQobnVsbCwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFOT1RIRVJfU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCAiPG1pc3NpbmcgcHJlZmVyZW5jZT4iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbmRSZUFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQkvLyByZW1vdmUgdGhlIHByZWZlcmVuY2UgZW50aXJlbHkuLi4KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gcmVidWlsZCB0aGUgYWRhcHRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZQotCQlTdHJpbmcgREVGQVVMVF9WQUxVRSA9ICJkZWZhdWx0IHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUsIERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIERFRkFVTFRfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyAuLi50aGVuIHJlLWFkZCBpdCB3aXRoIHRoZSBzYW1lIGtleQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoREVGQVVMVF9WQUxVRSwgU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBubyBsb25nZXIgbGlzdGVucyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJLy8gbm8gdGhpcy5ldmVudCBzaG91bGQgaGF2ZSBiZWVuIGZpcmVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCS8vIC4uLmFuZCB0aGUgYWRhcHRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsCi0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUUsIFNUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkvLyBhZGQgdGhlIHRoaXMubGlzdGVuZXIgc28gdGhlIGFkYXB0ZXIgc3luY2hzCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgY29udmVydCBpdCB0byBhbiBpbnRlZ2VyCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmZvckludGVnZXIodGhpcy50ZXN0Tm9kZSwgS0VZX05BTUUsIDApOwotCQlpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAyNDYpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMTIzKSwgbmV3IEludGVnZXIoMjQ2KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyNDYpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMjQ2KSwgbmV3IEludGVnZXIoMCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dEludChLRVlfTkFNRSwgMTIzKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIsIG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigxMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyMyksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGEgc2l0dWF0aW9uIHdoZXJlCi0JICogLSB3ZSBhcmUgbGlzdGVuaW5nIHRvIHRoZSBub2RlIHdoZW4gaXQgZ2V0cyByZW1vdmVkIGZyb20gdGhlIHByZWZlcmVuY2VzICJyZXBvc2l0b3J5IgotCSAqIC0gd2UgZ2V0IG5vdGlmaWNhdGlvbiB0aGF0IGl0IGhhcyBiZWVuIHJlbW92ZWQKLQkgKiAtIHdlIHRyeSB0byByZW1vdmUgb3VyIHRoaXMubGlzdGVuZXIKLQkgKiAtIHRoZSBub2RlIHdpbGwgdGhyb3cgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIC0gdGhlIGFkYXB0ZXIgc2hvdWxkIGhhbmRsZSBpdCBPSy4uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSB0aGlzLnRlc3ROb2RlLnBhcmVudCgpOwotCQlwYXJlbnQuYWRkTm9kZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudGVzdE5vZGUucmVtb3ZlTm9kZSgpOwotCQl0aGlzLnRlc3ROb2RlLmZsdXNoKCk7CQkvLyB0aGlzIHNlZW1zIHRvIGJlIHJlcXVpcmVkIGZvciB0aGUgdGhpcy5ldmVudCB0byB0cmlnZ2VyLi4uCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RlbmVyUmVtb3ZlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZSgpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBub3RoaW5nIHNob3VsZCBoYXBwZW4uLi4KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNhbWVWYWx1ZUZvcmNlUGFzc1Rocm91Z2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VFdmVudCk7Ci0KLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubm9kZUhvbGRlciwgS0VZX05BTUUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQotCQl0aGlzLnRlc3ROb2RlLmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkpOwotCi0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJzb21lIG90aGVyIHZhbHVlIjsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5zZXRWYWx1ZShBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlQcmVmZXJlbmNlRXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCS8vIG5vdyBzZXQgdG8gKnNhbWUqIHZhbHVlIC0gb25seSBvbmUgdGhpcy5ldmVudCBzaG91bGQgZmlyZQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZUV2ZW50ID0gZXZ0OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNb2RlbCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCB0aGlzLmV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5wcmVmZXJlbmNlQWRhcHRlciwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJlZmVyZW5jZUV2ZW50KE9iamVjdCBuZXdWYWx1ZSkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE5vZGUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXRLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBhZGFwdGVyIHRvIHRlc3Qgb3V0IGFsd2F5cyBwYXNzaW5nIHRocm91Z2ggdGhlIG5ldyB2YWx1ZQotCSAqIHRvIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBleHRlbmRzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gewotCi0JCUFsd2F5c1VwZGF0ZVByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSkgewotCQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIsIGtleSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gcHJlZmVyZW5jZUlzVG9CZVNldChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDdlNmZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmcy5QcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkVmFsdWVzOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IG5vZGVIb2xkZXI7Ci0JUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHByZWZlcmVuY2VzQWRhcHRlcjsKLQlDb2xsZWN0aW9uRXZlbnQgZXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdGVuZXI7Ci0JYm9vbGVhbiBsaXN0ZW5lclJlbW92ZWQgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMSA9ICJmb28gMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzIgPSAiZm9vIDIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8zID0gImZvbyAzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzEgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMiA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8zID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAzIjsKLQotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8xLCBTVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pdGVtTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXByaXZhdGUgdm9pZCBsb2dFdmVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8xID0gImFub3RoZXIga2V5IDEiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8yID0gImFub3RoZXIga2V5IDIiOwotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRV8zID0gImFub3RoZXIga2V5IDMiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAxIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMiI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8zID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDMiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMSwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMSk7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzIsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzIpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8zLCBBTk9USEVSX1NUUklOR19WQUxVRV8zKTsKLQotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUoYW5vdGhlck5vZGUpOwotCQkvLyBjb2xsZWN0aW9uQ2hhbmdlZCBkb2VzIG5vdCBwYXNzIGFueSBpdGVtcyBpbiB0aGUgdGhpcy5ldmVudAotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3ROb2RlKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMiwgU1RSSU5HX1ZBTFVFXzIpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgQU5PVEhFUl9LRVlfTkFNRSA9ICJhbm90aGVyIGtleSI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRSA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBleHBlY3RlZEl0ZW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWV4cGVjdGVkSXRlbXMucHV0KEFOT1RIRVJfS0VZX05BTUUsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlFdmVudChleHBlY3RlZEl0ZW1zKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlTdHJpbmcga2V5ID0gKChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKS5nZXRLZXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEtFWV9OQU1FXzIsIGtleSk7Ci0KLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5yZW1vdmUoS0VZX05BTUVfMik7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQlTdHJpbmcgRElGRkVSRU5UID0gInNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCI7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBESUZGRVJFTlQpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlOb2RlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIE5vZGVDaGFuZ2VMaXN0ZW5lciBidWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBOb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZEFkZGVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjaGlsZFJlbW92ZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5nZXRDaGlsZCgpID09IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnRlc3ROb2RlKSB7Ci0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lcik7Ci0JCQkJCS8vIHRoaXMgbGluZSBvZiBjb2RlIHdpbGwgbm90IGV4ZWN1dGUgaWYgdGhlIGxpbmUgYWJvdmUgdHJpZ2dlcnMgYW4gZXhjZXB0aW9uCi0JCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyUmVtb3ZlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGxvZ0V2ZW50KENvbGxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoTWFwPFN0cmluZywgU3RyaW5nPiBpdGVtcykgewotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCWFzc2VydEVxdWFscyhpdGVtcy5zaXplKCksICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtc1NpemUoKSk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IGV2ZW50SXRlbXMgPSAoSXRlcmFibGU8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+PikgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCk7Ci0JCXRoaXMudmVyaWZ5SXRlbXMoaXRlbXMsIGV2ZW50SXRlbXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Tm9kZShQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10ga2V5cyA9IG5vZGUua2V5cygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5zaXplKCksIGtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5nZXQoa2V5c1tpXSksIG5vZGUuZ2V0KGtleXNbaV0sICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlBZGFwdGVyKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjdm0pIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXhwZWN0ZWRWYWx1ZXMuc2l6ZSgpLCBjdm0uc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyh0aGlzLmV4cGVjdGVkVmFsdWVzLCBjdm0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlJdGVtcyhNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+IGFjdHVhbCkgewotCQlmb3IgKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBtb2RlbCA6IGFjdHVhbCkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaXRlbUxpc3RlbmVyKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQobW9kZWwuZ2V0S2V5KCkpLCBtb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCW1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLml0ZW1MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUhhc0FueVByZWZMaXN0ZW5lcnMoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcltdIHByZWZMaXN0ZW5lcnMgPSAoUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG5vZGUsICJwcmVmTGlzdGVuZXJzIik7Ci0JCXJldHVybiBwcmVmTGlzdGVuZXJzLmxlbmd0aCA+IDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlMmM3NC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLkFic3RyYWN0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLS8qKgotICogc2V0IHVwIGFuZCB0ZWFyIGRvd24gYSB0ZXN0IG5vZGUgZm9yIGFueSBzdWJjbGFzcyB0aGF0Ci0gKiBuZWVkcyB0byB0ZXN0IHByZWZlcmVuY2VzLXJlbGF0ZWQgc3R1ZmYKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZXNUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgY2xhc3NOb2RlOwotCXB1YmxpYyBQcmVmZXJlbmNlcyB0ZXN0Tm9kZTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05PREVfTkFNRSA9ICJ0ZXN0IG5vZGUiOwotCi0JcHVibGljIFByZWZlcmVuY2VzVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJlZmVyZW5jZXMgcGFja2FnZU5vZGUgPSBQcmVmZXJlbmNlcy51c2VyTm9kZUZvclBhY2thZ2UodGhpcy5nZXRDbGFzcygpKTsKLQkJdGhpcy5jbGFzc05vZGUgPSBwYWNrYWdlTm9kZS5ub2RlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkvLyBjbGVhbiBvdXQgYW55IGxlZnRvdmVyIGNyYXAuLi4KLQkJaWYgKCh0aGlzLmNsYXNzTm9kZS5rZXlzKCkubGVuZ3RoID4gMCkgfHwgKHRoaXMuY2xhc3NOb2RlLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGggPiAwKSkgewotCQkJdGhpcy5jbGFzc05vZGUucmVtb3ZlTm9kZSgpOwotCQkJLy8gLi4uYW5kIHJlLWNyZWF0ZSB0aGUgbm9kZQotCQkJdGhpcy5jbGFzc05vZGUgPSBwYWNrYWdlTm9kZS5ub2RlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl9Ci0JCXRoaXMudGVzdE5vZGUgPSB0aGlzLmNsYXNzTm9kZS5ub2RlKFRFU1RfTk9ERV9OQU1FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB3YWl0IGZvciBhbGwgdGhlIGV2ZW50cyB0byBiZSBkZWxpdmVyZWQgYmVmb3JlIHRlYXJpbmcgZG93bgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlQcmVmZXJlbmNlcyBub2RlID0gdGhpcy5jbGFzc05vZGUucGFyZW50KCk7Ci0JCXRoaXMuY2xhc3NOb2RlLnJlbW92ZU5vZGUoKTsKLQkJd2hpbGUgKHRoaXMubm9kZUlzVmVzdGlnaWFsKG5vZGUpKSB7Ci0JCQlQcmVmZXJlbmNlcyBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQkJbm9kZS5yZW1vdmVOb2RlKCk7Ci0JCQlub2RlID0gcGFyZW50OwotCQl9Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUlzVmVzdGlnaWFsKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCkKLQkJCSYmIChub2RlLmtleXMoKS5sZW5ndGggPT0gMCkKLQkJCSYmIChub2RlLmNoaWxkcmVuTmFtZXMoKS5sZW5ndGggPT0gMCkKLQkJCSYmIChub2RlICE9IFByZWZlcmVuY2VzLnVzZXJSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpIHsKLQkJd2hpbGUgKCAhIHRoaXMucHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkuaXNFbXB0eSgpKSB7Ci0JCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQkJfQotCQlUZXN0VG9vbHMuc2xlZXAoMTAwKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXZlbnRPYmplY3Q+IHByZWZlcmVuY2VzRXZlbnRRdWV1ZSgpIHsKLQkJcmV0dXJuIChMaXN0PEV2ZW50T2JqZWN0PikgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUoQWJzdHJhY3RQcmVmZXJlbmNlcy5jbGFzcywgImV2ZW50UXVldWUiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2E3YzhlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyID0gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuYm9vbGVhbkhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGhpcy5ib29sZWFuSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRUcnVlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGxvY2FsQm9vbGVhbkhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4pIHRoaXMuYm9vbGVhbkhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsQm9vbGVhbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3NDY0ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuSXRlbUxpc3RlbmVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ2hlY2tCb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBmbGFnMUJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZmxhZzJCdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIG5vdEZsYWcyQnV0dG9uTW9kZWw7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKHRydWUsIHRydWUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcxQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMUhvbGRlcik7Ci0JCXRoaXMuZmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5mbGFnMkhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5vdEZsYWcyQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ub3RGbGFnMkhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzEodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHZtLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKGJvb2xlYW5Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENoZWNrQm94UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMUNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzFDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDEiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5mbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkTm90RmxhZzJDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCWNoZWNrQm94LnNldE1vZGVsKHRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEpDaGVja0JveCBidWlsZFVuYXR0YWNoZWRDaGVja0JveCgpIHsKLQkJSkNoZWNrQm94IGNoZWNrQm94ID0gbmV3IEpDaGVja0JveCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5nZXRNb2RlbCgpLmFkZEl0ZW1MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSXRlbUxpc3RlbmVyIGJ1aWxkVW5hdHRhY2hlZEl0ZW1MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtU3RhdGVDaGFuZ2VkKEl0ZW1FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHN0YXRlIGNoYW5nZWQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRGbGlwRmxhZzFCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRGbGlwRmxhZzFCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkRmxpcEZsYWcxQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJmbGlwIGZsYWcgMSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuZmxpcEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImZsYWcgMTogIiArIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgZmxhZyAyOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNOb3RGbGFnMigpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioiKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmbGFnMTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUcxX1BST1BFUlRZID0gImZsYWcxIjsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcyOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzJfUFJPUEVSVFkgPSAiZmxhZzIiOwotCQlwcml2YXRlIGJvb2xlYW4gbm90RmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRkxBRzJfUFJPUEVSVFkgPSAibm90RmxhZzIiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKGJvb2xlYW4gZmxhZzEsIGJvb2xlYW4gZmxhZzIpIHsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMShib29sZWFuIGZsYWcxKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzE7Ci0JCQl0aGlzLmZsYWcxID0gZmxhZzE7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzFfUFJPUEVSVFksIG9sZCwgZmxhZzEpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihib29sZWFuIGZsYWcyKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCQotCQkJb2xkID0gdGhpcy5ub3RGbGFnMjsKLQkJCXRoaXMubm90RmxhZzIgPSAhIGZsYWcyOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PVF9GTEFHMl9QUk9QRVJUWSwgb2xkLCB0aGlzLm5vdEZsYWcyKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoYm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMiggISBub3RGbGFnMik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxNjExNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVEaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHlldC4uLgotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KGxpc3RIb2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJQ29tYm9Cb3hNb2RlbCBjb21ib0JveE1vZGVsID0gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIsIHNlbGVjdGlvbkhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PERpc3BsYXlhYmxlPihjb21ib0JveE1vZGVsKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlzZWxlY3Rpb25Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShzZWxlY3Rpb25Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCi0JCWNvbWJvQm94TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQlzZWxlY3Rpb25Ib2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZ0KSB7Ci0JCQkJLy8gZG8gbm90aGluZy4uLgotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGlzcGxheWFibGU+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248RGlzcGxheWFibGU+IGMpIHsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqb28iKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamFyIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpheiIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTBiZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNvbWJvQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5GaWx0ZXJpbmdMaXN0QnJvd3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuTGlzdENob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZUxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjb21iby1ib3hlcy4KLSAqIAotICogRGVmYXVsdExvbmdMaXN0QnJvd3NlckRpYWxvZ1VJVGVzdCBzdWJjbGFzc2VzIHRoaXMgY2xhc3M7IHNvIGJlCi0gKiBjYXJlZnVsIHdoZW4gbWFraW5nIGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByb3RlY3RlZCBKRnJhbWUgd2luZG93OwotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gY29sb3JMaXN0SG9sZGVyOwotCXByb3RlY3RlZCBDb21ib0JveE1vZGVsIGNvbG9yQ29tYm9Cb3hNb2RlbDsKLQlwcml2YXRlIGludCBuZXh0Q29sb3JOdW1iZXIgPSAwOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0Q3Jvc3NQbGF0Zm9ybUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwkvLyBNZXRhbCBMQUYKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYud2luZG93cy5XaW5kb3dzTG9va0FuZEZlZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoY29tLnN1bi5qYXZhLnN3aW5nLnBsYWYubW90aWYuTW90aWZMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChvcmFjbGUuYmFsaS5ld3Qub2xhZi5PcmFjbGVMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotCQl0aGlzLnRlc3RNb2RlbCA9IHRoaXMuYnVpbGRUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5jb2xvckxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JMaXN0SG9sZGVyKCk7Ci0JCXRoaXMuY29sb3JDb21ib0JveE1vZGVsID0gdGhpcy5idWlsZENvbWJvQm94TW9kZWxBZGFwdGVyKHRoaXMuY29sb3JMaXN0SG9sZGVyLCB0aGlzLmNvbG9ySG9sZGVyKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBUZXN0TW9kZWwgYnVpbGRUZXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVGVzdE1vZGVsKCk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sb3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oVGVzdE1vZGVsLnZhbGlkQ29sb3JzKCkpOwotLy8JCXJldHVybiBuZXcgQWJzdHJhY3RSZWFkT25seUxpc3RWYWx1ZU1vZGVsKCkgewotLy8JCQlwdWJsaWMgT2JqZWN0IHZhbHVlKCkgewotLy8JCQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcihUZXN0TW9kZWwuVkFMSURfQ09MT1JTKTsKLS8vCQkJfQotLy8JCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0vLwkJCQlyZXR1cm4gVGVzdE1vZGVsLlZBTElEX0NPTE9SUy5sZW5ndGg7Ci0vLwkJCX0KLS8vCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHVpQ29sb3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb2xvckxpc3RIb2xkZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIGJ1aWxkQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHNlbGVjdGlvbkhvbGRlcikgewotCQlyZXR1cm4gbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIsIHNlbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCXRoaXMud2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJdGhpcy53aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJdGhpcy53aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl0aGlzLndpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJdGhpcy53aW5kb3cuc2V0TG9jYXRpb24oMzAwLCAzMDApOwotCQl0aGlzLndpbmRvdy5zZXRTaXplKDQwMCwgMTUwKTsKLQkJdGhpcy53aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlBhbmVsIGJ1aWxkQ29tYm9Cb3hQYW5lbCgpIHsKLQkJSlBhbmVsIHBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29tYm9Cb3goKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29tYm9Cb3goKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkTGlzdENob29zZXIxKCkpOwotCQlwYW5lbC5hZGQodGhpcy5idWlsZExpc3RDaG9vc2VyMigpKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgSkNvbWJvQm94IGJ1aWxkQ29tYm9Cb3goKSB7Ci0JCUpDb21ib0JveCBjb21ib0JveCA9IG5ldyBKQ29tYm9Cb3godGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCQljb21ib0JveC5zZXRSZW5kZXJlcih0aGlzLmJ1aWxkQ29tYm9Cb3hSZW5kZXJlcigpKTsKLQkJcmV0dXJuIGNvbWJvQm94OwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVGV4dChPYmplY3QgdmFsdWUpIHsKLQkJCQlyZXR1cm4gc3VwZXIuYnVpbGRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaG9vc2VyIGJ1aWxkTGlzdENob29zZXIxKCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdENob29zZXIxKHRoaXMuY29sb3JDb21ib0JveE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaG9vc2VyIGJ1aWxkTGlzdENob29zZXIyKCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdENob29zZXIyKHRoaXMuY29sb3JDb21ib0JveE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMiwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldENvbG9yQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEFkZFRlbkJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlVGVuQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzZXQgY29sb3IgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldENvbG9yQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0Q29sb3JBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldENvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBjb2xvciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0Q29sb3IoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldENvbG9yKFRlc3RNb2RlbC5ERUZBVUxUX0NPTE9SKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIG1vZGVsIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc3RvcmUgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaW50IG1vZGVsIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCS8vICoqKioqKioqKiogYWRkIDIwIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkVGVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZFRlbkFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZFRlbkFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIDIwIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRUZW4oKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBhZGRUZW4oKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLm5leHRDb2xvck51bWJlcjsgaSA8IHRoaXMubmV4dENvbG9yTnVtYmVyICsgMjA7IGkrKykgewotCQkJdGhpcy5jb2xvckxpc3RIb2xkZXIuYWRkKHRoaXMuY29sb3JMaXN0SG9sZGVyLnNpemUoKSwgImNvbG9yIiArIGkpOwotCQl9Ci0JCXRoaXMubmV4dENvbG9yTnVtYmVyICs9IDIwOwotCX0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIDIwIGJ1dHRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlVGVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZVRlbkFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZVRlbkFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIDIwIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVUZW4oKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZW1vdmVUZW4oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQkJaWYgKHRoaXMuY29sb3JMaXN0SG9sZGVyLnNpemUoKSA+IDApIHsKLQkJCQl0aGlzLmNvbG9yTGlzdEhvbGRlci5yZW1vdmUodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIGNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfUFJPUEVSVFkgPSAiY29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEID0gInJlZCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFOR0UgPSAib3JhbmdlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFTExPVyA9ICJ5ZWxsb3ciOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRSA9ICJibHVlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElORElHTyA9ICJpbmRpZ28iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklPTEVUID0gInZpb2xldCI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTE9SID0gUkVEOwotCQkJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gdmFsaWRDb2xvcnM7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfVkFMSURfQ09MT1JTID0gewotCQkJCVJFRCwKLQkJCQlPUkFOR0UsCi0JCQkJWUVMTE9XLAotCQkJCUdSRUVOLAotCQkJCUJMVUUsCi0JCQkJSU5ESUdPLAotCQkJCVZJT0xFVAotCQkJfTsKLQkKLQkJcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gdmFsaWRDb2xvcnMoKSB7Ci0JCQlpZiAodmFsaWRDb2xvcnMgPT0gbnVsbCkgewotCQkJCXZhbGlkQ29sb3JzID0gYnVpbGREZWZhdWx0VmFsaWRDb2xvcnMoKTsKLQkJCX0KLQkJCXJldHVybiB2YWxpZENvbG9yczsKLQkJfQotCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZERlZmF1bHRWYWxpZENvbG9ycygpIHsKLQkJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCBERUZBVUxUX1ZBTElEX0NPTE9SUyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoKSB7Ci0JCQl0aGlzKERFRkFVTFRfQ09MT1IpOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQkJdGhpcy5jaGVja0NvbG9yKGNvbG9yKTsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmNvbG9yOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGQsIGNvbG9yKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjaGVja0NvbG9yKFN0cmluZyBjKSB7Ci0JCQlpZiAoICEgdmFsaWRDb2xvcnMoKS5jb250YWlucyhjKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYyk7Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5jb2xvciArICIpIjsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RDaG9vc2VyMSBleHRlbmRzIExpc3RDaG9vc2VyIHsKLQkJcHVibGljIExvY2FsTGlzdENob29zZXIxKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyKG1vZGVsKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbExpc3RDaG9vc2VyMiBleHRlbmRzIExpc3RDaG9vc2VyIHsKLQkJcHVibGljIExvY2FsTGlzdENob29zZXIyKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJCXN1cGVyKG1vZGVsKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RCcm93c2VyIGJ1aWxkQnJvd3NlcigpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nTGlzdEJyb3dzZXI8U3RyaW5nPigpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMDBmNGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MiBleHRlbmRzIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyKCkuZXhlYygpOwotCX0KLQotCXB1YmxpYyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogdXNlIGEgZGlmZmVyZW50IG1vZGVsIHRoYXQgYWxsb3dzIHRoZSBjb2xvciB0byBiZSBzZXQgdG8gbnVsbAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0TW9kZWwgYnVpbGRUZXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVGVzdE1vZGVsMigpOwotCX0KLQotCS8qKgotCSAqIGFkZCBhIG51bGwgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdWlDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIHByZXBlbmQgdGhlIHdyYXBwZWQgbGlzdCB3aXRoIGEgbnVsbCBpdGVtCi0JCXJldHVybiBuZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPihzdXBlci51aUNvbG9yTGlzdEhvbGRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJ0IG51bGwgdG8gc29tZSB0ZXh0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiPG5vbmUgc2VsZWN0ZWQ+IiA6IHN1cGVyLmJ1aWxkVGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RNb2RlbDIgZXh0ZW5kcyBUZXN0TW9kZWwgewotCQkvKioKLQkJICogbnVsbCBpcyBPSyBoZXJlCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY2hlY2tDb2xvcihTdHJpbmcgY29sb3IpIHsKLQkJCWlmIChjb2xvciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJc3VwZXIuY2hlY2tDb2xvcihjb2xvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5Yzc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihuZXcgRGF0ZSgpKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSgoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkgPT0gNzc3Nzc3KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoU3Bpbm5lck1vZGVsIGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgKChEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsSW5pdGlhbFZhbHVlKCkgewotCQlEYXRlIHRvZGF5ID0gbmV3IERhdGUoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgdG9kYXkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyh0b2RheSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCURhdGUgbmV3RGF0ZSA9IG5ldyBEYXRlKCk7Ci0JCW5ld0RhdGUuc2V0VGltZSg3Nzc3NzcpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCi0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKDc3Nzc3NywgKChEYXRlKSB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSkuZ2V0VGltZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjA2ZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRFdmVudC5FdmVudFR5cGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcjsKLQlEb2N1bWVudCBkb2N1bWVudEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIERvY3VtZW50QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCIwMTIzNDU2Nzg5Iik7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyID0gbmV3IERvY3VtZW50QWRhcHRlcih0aGlzLnN0cmluZ0hvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjIzNDU2IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmUoMiwgNSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMTc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAieHh4eHh4IgotCQkJCWFzc2VydEVxdWFscygyLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNSwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5pbnNlcnRTdHJpbmcoMiwgInh4eHh4IiwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMXh4eHh4MjM0NTY3ODkiLCB0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmFkZERvY3VtZW50TGlzdGVuZXIobmV3IFRlc3REb2N1bWVudExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLklOU0VSVCwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIGluc2VydCBvZiAiZm9vIgotCQkJCWFzc2VydEVxdWFscygwLCBlLmdldE9mZnNldCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMywgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlhc3NlcnRFcXVhbHMoRXZlbnRUeXBlLlJFTU9WRSwgZS5nZXRUeXBlKCkpOwotCQkJCWFzc2VydEVxdWFscyhEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmRvY3VtZW50QWRhcHRlciwgZS5nZXREb2N1bWVudCgpKTsKLQkJCQkvLyB0aGlzIHdpbGwgYmUgdGhlIHJlbW92YWwgb2YgIjAxMjM0NTY3ODkiCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygxMCwgZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIjAxMjM0NTY3ODkiLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRUZXh0KDAsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldExlbmd0aCgpKSk7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGxvY2FsU3RyaW5nSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLnN0cmluZ0hvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZG9jdW1lbnRBZGFwdGVyKTsKLQotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxTdHJpbmdIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJzLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgZG9jdW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkb2N1bWVudCwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXREb2N1bWVudExpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi1wcml2YXRlIGNsYXNzIFRlc3REb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgRG9jdW1lbnRMaXN0ZW5lciB7Ci0JVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTk5ZjUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQXR0cmlidXRlU2V0OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBlbnRyeSBmaWVsZHMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERvY3VtZW50QWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX05BTUUgPSAiU2Nvb2J5IERvbyI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUhvbGRlcjsKLQlwcml2YXRlIERvY3VtZW50IG5hbWVEb2N1bWVudDsKLQlwcml2YXRlIERvY3VtZW50IHVwcGVyQ2FzZU5hbWVEb2N1bWVudDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnRBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5uYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMudXBwZXJDYXNlTmFtZURvY3VtZW50ID0gdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudCh0aGlzLm5hbWVIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPih2bSwgVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkTmFtZURvY3VtZW50KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQlyZXR1cm4gbmV3IERvY3VtZW50QWRhcHRlcihzdHJpbmdIb2xkZXIsIHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFic3RyYWN0RG9jdW1lbnQgYnVpbGRVcHBlckNhc2VOYW1lRG9jdW1lbnREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIG5ldyBQbGFpbkRvY3VtZW50KCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpbnNlcnRTdHJpbmcoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJY2hhcltdIHVwcGVyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cHBlci5sZW5ndGg7IGkrKykgewotCQkJCQl1cHBlcltpXSA9IENoYXJhY3Rlci50b1VwcGVyQ2FzZSh1cHBlcltpXSk7Ci0JCQkJfQotCQkJCXN1cGVyLmluc2VydFN0cmluZyhvZmZzZXQsIG5ldyBTdHJpbmcodXBwZXIpLCBhKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRleHRGaWVsZFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVGV4dEZpZWxkUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVhZE9ubHlOYW1lVGV4dEZpZWxkKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZVRleHRGaWVsZCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKVGV4dEZpZWxkIGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJcmV0dXJuIG5ldyBKVGV4dEZpZWxkKHRoaXMubmFtZURvY3VtZW50LCBudWxsLCAwKTsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSB7Ci0JCUpUZXh0RmllbGQgbmFtZVRleHRGaWVsZCA9IHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCk7Ci0JCW5hbWVUZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gbmFtZVRleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TmFtZUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0TmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE5hbWVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IG5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldE5hbWUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldE5hbWUoREVGQVVMVF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzdG9yZU1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZSh0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicHJpbnQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuYW1lOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmdldE5hbWUoKSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2M2YjQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRG9jdW1lbnRBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlNDI2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29vcmRpbmF0ZWRMaXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTGlzdE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbEFkYXB0ZXIgYnVpbGRMaXN0TW9kZWwoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRMaXN0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJ0b20iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImRpY2siKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImhhcnJ5Iik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5hZGQoNiwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCg3LCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCg4LCAiaGFycnkiKTsKLQkJbGlzdEhvbGRlci5hZGQoOSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOSk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TW9kZWwoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjEgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWxBZGFwdGVyIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcjEpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIyID0gdGhpcy5idWlsZExpc3RIb2xkZXIyKCk7Ci0JCWxpc3RNb2RlbC5zZXRNb2RlbChsaXN0SG9sZGVyMik7Ci0JCWFzc2VydEVxdWFscygzLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMi5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJbGlzdE1vZGVsLnNldE1vZGVsKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjEuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlcjIuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXBhcmUoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RNb2RlbC5nZXRTaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gYnVpbGRDdXN0b21Db21wYXJhdG9yKCkgewotCQkvLyBzb3J0IHdpdGggcmV2ZXJzZSBvcmRlcgotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgidG9tIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJkaWNrIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImphciIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdFNvcnQoQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5hZGQoMCwgInRvbSIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiZGljayIpOwotCQlsaXN0SG9sZGVyLmFkZCgwLCAiaGFycnkiKTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdE1vZGVsIGxpc3RNb2RlbCwgTGlzdDxTdHJpbmc+IGxpc3QsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZCgoU3RyaW5nKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKGxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCi0JCWxpc3RNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RNb2RlbC5nZXRTaXplKCkpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0KLQkJbGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzeW5jaExpc3QuZ2V0KDApKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc05vTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTm9MaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdE1vZGVsIGxpc3RNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNMaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCQljLmFkZCgiam9vIik7Ci0JCWMuYWRkKCJqYXIiKTsKLQkJYy5hZGQoImpheiIpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uMihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjxTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInRvbSIpOwotCQljLmFkZCgiZGljayIpOwotCQljLmFkZCgiaGFycnkiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNzYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB2YXJpb3VzIHBlcm11dGF0aW9ucyBvZiB0aGUgTGlzdE1vZGVsQWRhcHRlcgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyOwotCXByaXZhdGUgVGV4dEZpZWxkIHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PihuZXcgVGFza0xpc3QoKSk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoODAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza0xpc3RQYW5lbCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgicHJpbWl0aXZlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSB1bnNvcnRlZCIsIHRoaXMuYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHNvcnRlZCIsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJkaXNwbGF5YWJsZSByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRhc2s+KHRoaXMuYnVpbGREaXNwbGF5YWJsZVRhc2tMaXN0QWRhcHRlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrT2JqZWN0Q29tcGFyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRMaXN0UGFuZWwoU3RyaW5nIGxhYmVsLCBMaXN0TW9kZWwgbGlzdE1vZGVsKSB7Ci0JCUpQYW5lbCBsaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCUpMYWJlbCBsaXN0TGFiZWwgPSBuZXcgSkxhYmVsKCIgICIgKyBsYWJlbCk7Ci0JCWxpc3RQYW5lbC5hZGQobGlzdExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCUpMaXN0IGxpc3RCb3ggPSBuZXcgSkxpc3QoKTsKLQkJbGlzdEJveC5zZXRNb2RlbChsaXN0TW9kZWwpOwotCQlsaXN0Qm94LnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQlsaXN0TGFiZWwuc2V0TGFiZWxGb3IobGlzdEJveCk7Ci0JCWxpc3RQYW5lbC5hZGQobmV3IEpTY3JvbGxQYW5lKGxpc3RCb3gpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJcmV0dXJuIGxpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRhc2s+IGJ1aWxkQ3VzdG9tVGFza09iamVjdENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxUYXNrPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUYXNrIHRvMSwgVGFzayB0bzIpIHsKLQkJCQlyZXR1cm4gdG8yLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8odG8xLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCwgdGhpcy50YXNrTGlzdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza05hbWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPihUYXNrTGlzdC5UQVNLU19MSVNULCB0aGlzLnRhc2tMaXN0KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhckJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoKSB7Ci0JCUpQYW5lbCBhZGRSZW1vdmVUYXNrUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZEFkZEJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuV0VTVCk7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZFRhc2tUZXh0RmllbGQoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWFkZFJlbW92ZVRhc2tQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0JCXJldHVybiBhZGRSZW1vdmVUYXNrUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFzaygpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JcHJpdmF0ZSBUYXNrTGlzdCB0YXNrTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza0xpc3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQl2b2lkIGFkZFRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QoKS5hZGRUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMuZ2V0VGFzaygpOwotCQlpZiAodGFzay5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0KCkucmVtb3ZlVGFzayh0YXNrKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJUYXNrcygpIHsKLQkJdGhpcy50YXNrTGlzdCgpLmNsZWFyVGFza3MoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZCBidWlsZFRhc2tUZXh0RmllbGQoKSB7Ci0JCXRoaXMudGFza1RleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQoKTsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhclRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcHJpdmF0ZSBMaXN0PFRhc2s+IHRhc2tPYmplY3RzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCVRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrT2JqZWN0cy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJaW50IGluZGV4ID0gdGhpcy50YXNrTmFtZXMuc2l6ZSgpOwotCQkJdGhpcy50YXNrTmFtZXMuYWRkKGluZGV4LCB0YXNrTmFtZSk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgdGFza05hbWUpOwotCQotCQkJVGFzayB0YXNrT2JqZWN0ID0gbmV3IFRhc2sodGFza05hbWUpOwotCQkJdGhpcy50YXNrT2JqZWN0cy5hZGQoaW5kZXgsIHRhc2tPYmplY3QpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFRBU0tTX0xJU1QsIGluZGV4LCB0YXNrT2JqZWN0KTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5pbmRleE9mKHRhc2tOYW1lKTsKLQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCU9iamVjdCByZW1vdmVkVGFzayA9IHRoaXMudGFza05hbWVzLnJlbW92ZShpbmRleCk7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVEFTS19OQU1FU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2spOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCU9iamVjdCByZW1vdmVkVGFza09iamVjdCA9IHRoaXMudGFza09iamVjdHMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLU19MSVNULCBpbmRleCwgcmVtb3ZlZFRhc2tPYmplY3QpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLnRhc2tOYW1lcy5jbGVhcigpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVEFTS19OQU1FU19MSVNULCB0aGlzLnRhc2tOYW1lcyk7Ci0JCQl0aGlzLnRhc2tPYmplY3RzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChUQVNLU19MSVNULCB0aGlzLnRhc2tPYmplY3RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBEYXRlIGNyZWF0aW9uVGltZVN0YW1wOwotCQlwdWJsaWMgVGFzayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY3JlYXRpb25UaW1lU3RhbXAgPSBuZXcgRGF0ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5jcmVhdGlvblRpbWVTdGFtcC5nZXRUaW1lKCk7Ci0JCX0KLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYwNjk4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTFVFX0xJU1QgPSB7InJlZCIsICJncmVlbiIsICJibHVlIn07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVkFMVUUgPSBWQUxVRV9MSVNUWzBdOwotCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihERUZBVUxUX1ZBTFVFKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIFZBTFVFX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKFZBTFVFX0xJU1RbMl0pOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhWQUxVRV9MSVNUWzJdLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKFZBTFVFX0xJU1RbMl0pOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhWQUxVRV9MSVNUWzJdLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKERFRkFVTFRfVkFMVUUsIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKFZBTFVFX0xJU1RbMl0pOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhWQUxVRV9MSVNUWzJdLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMF0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoU3Bpbm5lck1vZGVsIGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgKChMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVkOGUxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IHZhbHVlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgLTMzLCAzMywgMSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVNwaW5uZXJNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoLTMzKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIpIGFkYXB0ZXIpLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKCgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsSW5pdGlhbFZhbHVlKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIsIG5ldyBJbnRlZ2VyKC0zMyksIG5ldyBJbnRlZ2VyKDMzKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDApKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjU1ODY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGxpc3RNb2RlbDsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBzZWxlY3Rpb25Nb2RlbDsKLQotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25Nb2RlbCh0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWZhdWx0TGlzdE1vZGVsIGJ1aWxkTGlzdE1vZGVsKCkgewotCQlEZWZhdWx0TGlzdE1vZGVsIGxtID0gbmV3IERlZmF1bHRMaXN0TW9kZWwoKTsKLQkJbG0uYWRkRWxlbWVudCgiZm9vIik7Ci0JCWxtLmFkZEVsZW1lbnQoImJhciIpOwotCQlsbS5hZGRFbGVtZW50KCJiYXoiKTsKLQkJcmV0dXJuIGxtOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkU2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxtKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKGxtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3REYXRhTGlzdGVuZXIoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCQl0aGlzLmxpc3RNb2RlbC5zZXQoMCwgImphciIpOwotCQlhc3NlcnRFcXVhbHMoImphciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKDIsIDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyh0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCksICJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiJ9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWUoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqYXIifSk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlU2VsZWN0ZWRWYWx1ZSgiamFyIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoiLCAiam9vIiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiam9vIn0pOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1pbk1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUlzU2VsZWN0ZWQoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiYmFyIiwgImphciJ9KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImphciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZUxpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0U2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZyBmb3Igbm93Li4uCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTFiZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1ByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0TXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUHJpbWl0aXZlTGlzdFRyZWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0KLQlwdWJsaWMgUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsKHRoaXMuYnVpbGRMaXN0VmFsdWVNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByaW1pdGl2ZUNoYW5nZWQoaW50IGluZGV4LCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCQlpZiAoICEgbmV3VmFsdWUuZXF1YWxzKCIiKSkgewotCQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy50ZXN0TW9kZWwucmVwbGFjZU5hbWUoaW5kZXgsIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/PiBidWlsZExpc3RWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRVNfTElTVCwgdGhpcy50ZXN0TW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldChpbnQgaW5kZXgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoaW5kZXgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByaW1pdGl2ZSgpIHsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MH0sIG5ldyBTdHJpbmdbXSB7ImZvbyJ9KTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcmltaXRpdmUoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImZvbyIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXIiKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmF6Iik7Ci0JCXRoaXMudHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnZlcmlmeVRyZWVNb2RlbEV2ZW50KGUsIG5ldyBpbnRbXSB7MX0sIG5ldyBTdHJpbmdbXSB7ImJhciJ9KTsKLQkJCX0KLQkJfSk7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy50ZXN0TW9kZWwucmVtb3ZlTmFtZSgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVByaW1pdGl2ZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJhciIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXoiKTsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHsxfSwgbmV3IFN0cmluZ1tdIHsiamFyIn0pOwotCQkJfQotCQl9KTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRlc3RNb2RlbC5yZXBsYWNlTmFtZSgxLCAiamFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgbmFtZSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlUcmVlTW9kZWxFdmVudChUcmVlTW9kZWxFdmVudCBlLCBpbnRbXSBleHBlY3RlZENoaWxkSW5kaWNlcywgU3RyaW5nW10gZXhwZWN0ZWROYW1lcykgewotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRDaGlsZEluZGljZXMsIGUuZ2V0Q2hpbGRJbmRpY2VzKCkpKTsKLQkJT2JqZWN0W10gYWN0dWFsQ2hpbGRyZW4gPSBlLmdldENoaWxkcmVuKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWVzLmxlbmd0aCwgYWN0dWFsQ2hpbGRyZW4ubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSAoRGVmYXVsdE11dGFibGVUcmVlTm9kZSkgYWN0dWFsQ2hpbGRyZW5baV07Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lc1tpXSwgbm9kZS5nZXRVc2VyT2JqZWN0KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygxLCBlLmdldFBhdGgoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpLCBlLmdldFBhdGgoKVswXSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyZWVNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JfQotCi0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7Ci0JCQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCQotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgaW50IG5hbWVzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBuYW1lLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lc1NpemUoKSwgbmFtZSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoaW50IGluZGV4LCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgdGhpcy5uYW1lcywgbGlzdCwgTkFNRVNfTElTVCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJCXRoaXMuYWRkTmFtZXModGhpcy5uYW1lc1NpemUoKSwgbGlzdCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgTGlzdDxTdHJpbmc+IHJlbW92ZU5hbWVzKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCB0aGlzLm5hbWVzLCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlcGxhY2VOYW1lKGludCBpbmRleCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXJldHVybiB0aGlzLnNldEl0ZW1Jbkxpc3QoaW5kZXgsIG5ld05hbWUsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUcmVlTW9kZWxMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQ5ZTkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5FdmVudExpc3RlbmVyTGlzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcjsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgcmVkQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgcmVkTGlzdGVuZXI7Ci0JYm9vbGVhbiByZWRFdmVudEZpcmVkOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGdyZWVuTGlzdGVuZXI7Ci0JYm9vbGVhbiBncmVlbkV2ZW50RmlyZWQ7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJsdWVCdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBibHVlTGlzdGVuZXI7Ci0JYm9vbGVhbiBibHVlRXZlbnRGaXJlZDsKLQotLy8JcHJpdmF0ZSBCdXR0b25Hcm91cCBidXR0b25Hcm91cDsJLy8gRE8gTk9UIHVzZSBhIEJ1dHRvbkdyb3VwCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEID0gInJlZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRSA9ICJibHVlIjsKLQotCXB1YmxpYyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obnVsbCk7Ci0vLwkJYnV0dG9uR3JvdXAgPSBuZXcgQnV0dG9uR3JvdXAoKTsKLQotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBSRUQpOwotLy8JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLnNldEdyb3VwKGJ1dHRvbkdyb3VwKTsKLQkJdGhpcy5yZWRMaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLnJlZEV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQnV0dG9uTW9kZWwodGhpcy52YWx1ZUhvbGRlciwgR1JFRU4pOwotLy8JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLmdyZWVuTGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ncmVlbkV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCi0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBCTFVFKTsKLS8vCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLmJsdWVMaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmJsdWVFdmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQkJCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRCdXR0b25Nb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHB2bSwgT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCXJldHVybiBuZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIocHZtLCBidXR0b25WYWx1ZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCkgewotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlZExpc3RlbmVyKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmdyZWVuTGlzdGVuZXIpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5ibHVlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckZsYWdzKCkgewotCQl0aGlzLnJlZEV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ncmVlbkV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5ibHVlRXZlbnRGaXJlZCA9IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saXN0ZW5Ub01vZGVsQWRhcHRlcnMoKTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhHUkVFTiwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEJMVUUsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFJFRCwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5saXN0ZW5Ub01vZGVsQWRhcHRlcnMoKTsKLQotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLnNldFNlbGVjdGVkKHRydWUpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5FdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKFJFRCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoR1JFRU4pOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShCTFVFKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNGZmNTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvckhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIHJlZEJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgZ3JlZW5CdXR0b25Nb2RlbDsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJsdWVCdXR0b25Nb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmNvbG9ySG9sZGVyID0gdGhpcy5idWlsZENvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcih0aGlzLmNvbG9ySG9sZGVyLCBUZXN0TW9kZWwuUkVEKTsKLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5HUkVFTik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5CTFVFKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBjb2xvclBWTSwgU3RyaW5nIGNvbG9yKSB7Ci0JCXJldHVybiBuZXcgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIoY29sb3JQVk0sIGNvbG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgMTAwKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFJhZGlvQnV0dG9uUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRSYWRpb0J1dHRvblBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVkUmFkaW9CdXR0b24oKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRHcmVlblJhZGlvQnV0dG9uKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmx1ZVJhZGlvQnV0dG9uKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZFJlZFJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoInJlZCIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLnJlZEJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkR3JlZW5SYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJncmVlbiIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmdyZWVuQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRCbHVlUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgiYmx1ZSIpOwotCQlyYWRpb0J1dHRvbi5zZXRNb2RlbCh0aGlzLmJsdWVCdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldENvbG9yQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldENvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRDb2xvckFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0Q29sb3IoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXNldENvbG9yKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9DT0xPUik7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiYmx1ZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTE9SID0gUkVEOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCUdSRUVOLAotCQkJCUJMVUUKLQkJCX07Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoKSB7Ci0JCQl0aGlzKERFRkFVTFRfQ09MT1IpOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoVkFMSURfQ09MT1JTLCBjb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmNvbG9yOwotCQkJdGhpcy5jb2xvciA9IGNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTE9SX1BST1BFUlRZLCBvbGQsIGNvbG9yKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJjYjFkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb25Db2x1bW5BZGFwdGVyOwotCi0vKioKLSAqIE1ha2UgaXQgZWFzeSB0byB0ZXN0IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIGFuZAotICogcmVuZGVyZXJzIHdpdGhvdXQgYW55IGVkaXRpbmcgYWxsb3dlZC4KLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgZXh0ZW5kcyBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhMWMxNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCVNwaW5uZXJNb2RlbCBzcGlubmVyTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihuZXcgSW50ZWdlcigwKSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMudmFsdWVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsdWVMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciwgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVWYWx1ZUhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQkJYXNzZXJ0RXF1YWxzKFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIsIGUuZ2V0U291cmNlKCkpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDApLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3IEludGVnZXIoNykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig3KSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGFkYXB0ZXIsICJkZWxlZ2F0ZSIpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGRlbGVnYXRlLCAiZ2V0Q2hhbmdlTGlzdGVuZXJzIik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoYWRhcHRlciwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXRDaGFuZ2VMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJzLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk3NmNhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0U3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHNwaW5uZXJzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJpcnRoRGF0ZUhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBiaXJ0aERhdGVTcGlubmVyTW9kZWw7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYWdlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGFnZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvckhvbGRlcjsKLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBleWVDb2xvclNwaW5uZXJNb2RlbDsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCi0JCXRoaXMuYmlydGhEYXRlSG9sZGVyID0gdGhpcy5idWlsZEJpcnRoRGF0ZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbCh0aGlzLmJpcnRoRGF0ZUhvbGRlcik7Ci0KLQkJdGhpcy5hZ2VIb2xkZXIgPSB0aGlzLmJ1aWxkQWdlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hZ2VTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQWdlU3Bpbm5lck1vZGVsKHRoaXMuYWdlSG9sZGVyKTsKLQotCQl0aGlzLmV5ZUNvbG9ySG9sZGVyID0gdGhpcy5idWlsZEV5ZUNvbG9ySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5leWVDb2xvclNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXJNb2RlbCh0aGlzLmV5ZUNvbG9ySG9sZGVyKTsKLQotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZ2VIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBOdW1iZXI+KHZtLCBUZXN0TW9kZWwuQUdFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZ2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhOdW1iZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QWdlKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWdlU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCB2YWx1ZUhvbGRlci5nZXRWYWx1ZSgpLmludFZhbHVlKCksIFRlc3RNb2RlbC5NSU5fQUdFLCBUZXN0TW9kZWwuTUFYX0FHRSwgMSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBPYmplY3Q+KHZtLCBUZXN0TW9kZWwuRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcih2YWx1ZUhvbGRlciwgVGVzdE1vZGVsLlZBTElEX0VZRV9DT0xPUlMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkU3Bpbm5lclBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkU3Bpbm5lclBhbmVsKCkgewotCQlKUGFuZWwgdGFza0xpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEFnZVNwaW5uZXIoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvclNwaW5uZXIoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYmlydGhEYXRlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWdlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmFnZVNwaW5uZXJNb2RlbCk7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEV5ZUNvbG9yU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEJpcnRoRGF0ZShUZXN0TW9kZWwuREVGQVVMVF9CSVJUSF9EQVRFKTsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0RXllQ29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfRVlFX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc3RvcmVNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzdG9yZSBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiaXJ0aCBkYXRlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QmlydGhEYXRlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImFnZTogIiArIHRoaXMudGVzdE1vZGVsLmdldEFnZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleWVzOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0RXllQ29sb3IoKSk7Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ2FsZW5kYXIgYmlydGhDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJLy8gInZpcnR1YWwiIHByb3BlcnRpZXMKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJUlRIX0RBVEVfUFJPUEVSVFkgPSAiYmlydGhEYXRlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHRV9QUk9QRVJUWSA9ICJhZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlIERFRkFVTFRfQklSVEhfREFURSA9IG5ldyBEYXRlKCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0FHRSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNSU5fQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9BR0UgPSAxNTA7Ci0JCXByaXZhdGUgU3RyaW5nIGV5ZUNvbG9yOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BST1BFUlRZID0gImV5ZUNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMSURfRVlFX0NPTE9SUyA9IHsiYmx1ZSIsICJicm93biIsICJncmVlbiIsICJoYXplbCIsICJwaW5rIn07Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VZRV9DT0xPUiA9IFZBTElEX0VZRV9DT0xPUlNbM107Ci0JCi0JCVRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9CSVJUSF9EQVRFLCBERUZBVUxUX0VZRV9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChEYXRlIGJpcnRoRGF0ZSwgU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQl0aGlzLnNldEJpcnRoRGF0ZShiaXJ0aERhdGUpOwotCQkJdGhpcy5zZXRFeWVDb2xvcihleWVDb2xvcik7Ci0JCX0KLQkJcHVibGljIERhdGUgZ2V0QmlydGhEYXRlKCkgewotCQkJcmV0dXJuIChEYXRlKSB0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5jbG9uZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEJpcnRoRGF0ZShEYXRlIGJpcnRoRGF0ZSkgewotCQkJRGF0ZSBvbGRCaXJ0aERhdGUgPSB0aGlzLmdldEJpcnRoRGF0ZSgpOwotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQl0aGlzLmJpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyhiaXJ0aERhdGUuZ2V0VGltZSgpKTsKLQkJCWludCBuZXdBZ2UgPSB0aGlzLmdldEFnZSgpOwotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oYmlydGhEYXRlLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJUlRIX0RBVEVfUFJPUEVSVFksIG9sZEJpcnRoRGF0ZSwgdGhpcy5nZXRCaXJ0aERhdGUoKSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUdFX1BST1BFUlRZLCBvbGRBZ2UsIG5ld0FnZSk7Ci0JCX0KLQkJcHVibGljIGludCBnZXRBZ2UoKSB7Ci0JCQlDYWxlbmRhciBjdXJyZW50Q2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWludCBhZ2UgPSBjdXJyZW50Q2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpOwotCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSkgewotCQkJCWFnZS0tOwotCQkJfSBlbHNlIGlmIChjdXJyZW50Q2FsLmdldChDYWxlbmRhci5NT05USCkgPT0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkgPCB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKSB7Ci0JCQkJCWFnZS0tOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhZ2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWdlKGludCBuZXdBZ2UpIHsKLQkJCWlmIChuZXdBZ2UgPCBNSU5fQUdFIHx8IG5ld0FnZSA+IE1BWF9BR0UpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKG5ld0FnZSkpOwotCQkJfQotCQotCQkJaW50IG9sZEFnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpbnQgZGVsdGEgPSBuZXdBZ2UgLSBvbGRBZ2U7Ci0JCi0JCQlDYWxlbmRhciBuZXdCaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQluZXdCaXJ0aENhbC5zZXRUaW1lSW5NaWxsaXModGhpcy5iaXJ0aENhbC5nZXRUaW1lKCkuZ2V0VGltZSgpKTsKLQkJCS8vIGlmIHRoZSBhZ2UgaW5jcmVhc2VkLCB0aGUgYmlydGggZGF0ZSBtdXN0IGJlICJkZWNyZWFzZWQiOyBhbmQgdmljZSB2ZXJzYQotCQkJbmV3QmlydGhDYWwuc2V0KENhbGVuZGFyLllFQVIsIG5ld0JpcnRoQ2FsLmdldChDYWxlbmRhci5ZRUFSKSAtIGRlbHRhKTsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKG5ld0JpcnRoQ2FsLmdldFRpbWUoKSk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXRFeWVDb2xvcigpIHsKLQkJCXJldHVybiB0aGlzLmV5ZUNvbG9yOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV5ZUNvbG9yKFN0cmluZyBleWVDb2xvcikgewotCQkJaWYgKCAhIEFycmF5VG9vbHMuY29udGFpbnMoVkFMSURfRVlFX0NPTE9SUywgZXllQ29sb3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleWVDb2xvcik7Ci0JCQl9Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5leWVDb2xvcjsKLQkJCXRoaXMuZXllQ29sb3IgPSBleWVDb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWUVfQ09MT1JfUFJPUEVSVFksIG9sZCwgZXllQ29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoYmlydGg6ICIgKyB0aGlzLmdldEJpcnRoRGF0ZSgpICsgIiAtIGV5ZXM6ICIgKyB0aGlzLmV5ZUNvbG9yICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxMjVhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgQ3Jvd2QgY3Jvd2Q7Ci0JVGFibGVNb2RlbEV2ZW50IGV2ZW50OwotCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jcm93ZCA9IHRoaXMuYnVpbGRDcm93ZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Um93Q291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCkpOwotCQkvLyB3ZSBuZWVkIHRvIGFkZCBhIGxpc3RlbmVyIHRvIHdha2UgdXAgdGhlIGFkYXB0ZXIKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNyb3dkLnBlb3BsZVNpemUoKSwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb25Db2x1bW5BZGFwdGVyLkNPTFVNTl9DT1VOVCwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Q29sdW1uQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSk7Ci0KLQkJTGlzdDxTdHJpbmc+IHNvcnRlZE5hbWVzID0gdGhpcy5zb3J0ZWROYW1lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuY3Jvd2QucGVvcGxlU2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhzb3J0ZWROYW1lcy5nZXQoaSksIHRhYmxlTW9kZWxBZGFwdGVyLmdldFZhbHVlQXQoaSwgUGVyc29uQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlQXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfSk7Ci0KLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uLkVZRV9DT0xPUl9CTFVFLCBwZXJzb24uZ2V0RXllQ29sb3IoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNvbi5pc0V2aWwoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzb24uZ2V0UmFuaygpKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlTW9kZWxBZGFwdGVyLmdldFJvd0NvdW50KCk7IGkrKykgewotCQkJaWYgKHRhYmxlTW9kZWxBZGFwdGVyLmdldFZhbHVlQXQoaSwgUGVyc29uQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTikuZXF1YWxzKCJHb2xsdW0iKSkgewotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQoUGVyc29uLkVZRV9DT0xPUl9IQVpFTCwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5FWUVfQ09MT1JfQ09MVU1OKTsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KEJvb2xlYW4uVFJVRSwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTik7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChuZXcgSW50ZWdlcigtMSksIGksIFBlcnNvbkNvbHVtbkFkYXB0ZXIuUkFOS19DT0xVTU4pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb24uRVlFX0NPTE9SX0hBWkVMLCBwZXJzb24uZ2V0RXllQ29sb3IoKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmlzRXZpbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBwZXJzb24uZ2V0UmFuaygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUm93KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSk7Ci0JCS8vIGFkZCBhIHBlcnNvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0IHNvIHdlIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQKLQkJdGhpcy5jcm93ZC5hZGRQZXJzb24oIlp6enp6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuSU5TRVJULCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuQUxMX0NPTFVNTlMsIHRoaXMuZXZlbnQuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVSb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gcmVtb3ZpbmcgYSBwZXJzb24gc2hvdWxkIG9ubHkgdHJpZ2dlciBvbmUgZXZlbnQsIHNpbmNlIGEgcmUtc29ydCBpcyBub3QgbmVlZGVkCi0JCXRoaXMuY3Jvd2QucmVtb3ZlUGVyc29uKHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5ERUxFVEUsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5BTExfQ09MVU1OUywgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUNlbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gYWRkIGEgcGVyc29uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2Ugb25seSB0cmlnZ2VyIG9uZSBldmVudAotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCXBlcnNvbi5zZXRFdmlsKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LlVQREFURSwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUGVyc29uQ29sdW1uQWRhcHRlci5FVklMX0NPTFVNTiwgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0TGlzdGVuZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJVGFibGVNb2RlbExpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3Jvd2QuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OKSk7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUNlbGxMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlUYWJsZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5SQU5LX1BST1BFUlRZKSk7Ci0KLQkJdGFibGVNb2RlbEFkYXB0ZXIucmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FVklMX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCksIHRoaXMuYnVpbGRDb2x1bW5BZGFwdGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRDZWxsTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPENyb3dkLCBQZXJzb24+KENyb3dkLlBFT1BMRV9DT0xMRUNUSU9OLCB0aGlzLmNyb3dkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxQZXJzb24+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgcmVzdWx0ID0gbmV3IENyb3dkKCk7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkJpbGJvIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkdvbGx1bSIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJGcm9kbyIpOwotCQlyZXN1bHQuYWRkUGVyc29uKCJTYW13aXNlIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyIGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQZXJzb25Db2x1bW5BZGFwdGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsTGlzdGVuZXIgYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHNvcnRlZE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5jcm93ZC5wZW9wbGVOYW1lcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsTGlzdGVuZXIgYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIHdlIGV4cGVjdCBvbmx5IGEgc2luZ2xlIGV2ZW50Ci0JCQkJaWYgKFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9PSBudWxsKSB7Ci0JCQkJCVRhYmxlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbkNvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gNzsKLQkKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRV9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCSVJUSF9EQVRFX0NPTFVNTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEdPTkVfV0VTVF9EQVRFX0NPTFVNTiA9IDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVZRV9DT0xPUl9DT0xVTU4gPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFVklMX0NPTFVNTiA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJBTktfQ09MVU1OID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQURWRU5UVVJFX0NPVU5UX0NPTFVNTiA9IDY7Ci0JCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTFVNTl9OQU1FUyA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkiTmFtZSIsCi0JCQkiQmlydGgiLAotCQkJIkdvbmUgV2VzdCIsCi0JCQkiRXllcyIsCi0JCQkiRXZpbCIsCi0JCQkiUmFuayIsCi0JCQkiQWR2ZW50dXJlcyIKLQkJfTsKLQkKLQkKLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIENPTFVNTl9OQU1FU1tpbmRleF07Ci0JCX0KLQkKLQkJcHVibGljIENsYXNzPD8+IGNvbHVtbkNsYXNzKGludCBpbmRleCkgewotCQkJc3dpdGNoIChpbmRleCkgewotCQkJCWNhc2UgTkFNRV9DT0xVTU46CQkJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJCWNhc2UgQklSVEhfREFURV9DT0xVTU46CQkJcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQkJY2FzZSBHT05FX1dFU1RfREFURV9DT0xVTU46CXJldHVybiBEYXRlLmNsYXNzOwotCQkJCWNhc2UgRVlFX0NPTE9SX0NPTFVNTjoJCQlyZXR1cm4gT2JqZWN0LmNsYXNzOwotCQkJCWNhc2UgRVZJTF9DT0xVTU46CQkJCQlyZXR1cm4gQm9vbGVhbi5jbGFzczsKLQkJCQljYXNlIFJBTktfQ09MVU1OOgkJCQkJcmV0dXJuIEludGVnZXIuY2xhc3M7Ci0JCQkJY2FzZSBBRFZFTlRVUkVfQ09VTlRfQ09MVU1OOnJldHVybiBJbnRlZ2VyLmNsYXNzOwotCQkJCWRlZmF1bHQ6IAkJCQkJCQkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQl9Ci0JCX0KLQkKLQkJcHVibGljIGJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBpbmRleCAhPSBOQU1FX0NPTFVNTjsKLQkJfQotCQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpIHsKLQkJCVBlcnNvbiBwZXJzb24gPSAoUGVyc29uKSBzdWJqZWN0OwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcmVzdWx0ID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsW0NPTFVNTl9DT1VOVF07Ci0JCi0JCQlyZXN1bHRbTkFNRV9DT0xVTU5dID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKHBlcnNvbik7Ci0JCQlyZXN1bHRbQklSVEhfREFURV9DT0xVTU5dID0gdGhpcy5idWlsZEJpcnRoRGF0ZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtHT05FX1dFU1RfREFURV9DT0xVTU5dID0gdGhpcy5idWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtFWUVfQ09MT1JfQ09MVU1OXSA9IHRoaXMuYnVpbGRFeWVDb2xvckFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtFVklMX0NPTFVNTl0gPSB0aGlzLmJ1aWxkRXZpbEFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtSQU5LX0NPTFVNTl0gPSB0aGlzLmJ1aWxkUmFua0FkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtBRFZFTlRVUkVfQ09VTlRfQ09MVU1OXSA9IHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIocGVyc29uKTsKLQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkTmFtZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5OQU1FX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSgoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRCaXJ0aERhdGVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIERhdGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHb25lV2VzdERhdGUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXllQ29sb3IoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXZpbEFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5FVklMX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKCgoQm9vbGVhbil2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkUmFua0FkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5SQU5LX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRSYW5rKCgoSW50ZWdlcikgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZHZlbnR1cmVDb3VudCgpKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0QWR2ZW50dXJlQ291bnQoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDcm93ZCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248UGVyc29uPiBwZW9wbGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRU9QTEVfQ09MTEVDVElPTiA9ICJwZW9wbGUiOwotCQotCQlwdWJsaWMgQ3Jvd2QoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wZW9wbGUgPSBuZXcgQXJyYXlMaXN0PFBlcnNvbj4oKTsKLQkJfQotCQotCQotCQlwdWJsaWMgSXRlcmF0b3I8UGVyc29uPiBwZW9wbGUoKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UGVyc29uPih0aGlzLnBlb3BsZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShQZXJzb24gcGVyc29uKSB7Ci0JCQkJCUNyb3dkLnRoaXMucmVtb3ZlUGVyc29uKHBlcnNvbik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwdWJsaWMgaW50IHBlb3BsZVNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZW9wbGUuc2l6ZSgpOwotCQl9Ci0JCi0JCXB1YmxpYyBQZXJzb24gYWRkUGVyc29uKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmNoZWNrUGVyc29uTmFtZShuYW1lKTsKLQkJCXJldHVybiB0aGlzLmFkZFBlcnNvbihuZXcgUGVyc29uKHRoaXMsIG5hbWUpKTsKLQkJfQotCQotCQlwcml2YXRlIFBlcnNvbiBhZGRQZXJzb24oUGVyc29uIHBlcnNvbikgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHBlcnNvbiwgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBwZXJzb247Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVyc29uKFBlcnNvbiBwZXJzb24pIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHBlcnNvbiwgdGhpcy5wZW9wbGUsIFBFT1BMRV9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZW9wbGUoQ29sbGVjdGlvbjxQZXJzb24+IHBlcnNvbnMpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihwZXJzb25zLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlb3BsZShJdGVyYXRvcjxQZXJzb24+IHBlcnNvbnMpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihwZXJzb25zLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXZvaWQgY2hlY2tQZXJzb25OYW1lKFN0cmluZyBwZXJzb25OYW1lKSB7Ci0JCQlpZiAocGVyc29uTmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMucGVvcGxlTmFtZXMoKSwgcGVyc29uTmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHBlcnNvbk5hbWUpOwotCQkJfQotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IHBlb3BsZU5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFBlcnNvbiwgU3RyaW5nPih0aGlzLnBlb3BsZS5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUGVyc29uIHBlcnNvbikgewotCQkJCQlyZXR1cm4gcGVyc29uLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBQZXJzb24gcGVyc29uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8UGVyc29uPiBzdHJlYW0gPSB0aGlzLnBlb3BsZS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlQZXJzb24gcGVyc29uID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAocGVyc29uLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIHBlcnNvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIFN0cmluZy52YWx1ZU9mKHRoaXMucGVvcGxlLnNpemUoKSkgKyAiIHBlb3BsZSIpOwotCQl9Ci0JCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENvbXBhcmFibGU8UGVyc29uPiB7Ci0JCXByaXZhdGUgQ3Jvd2QgY3Jvd2Q7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZPSAibmFtZSI7Ci0JCXByaXZhdGUgRGF0ZSBiaXJ0aERhdGU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSVJUSF9EQVRFX1BST1BFUlRZPSAiYmlydGhEYXRlIjsKLQkJcHJpdmF0ZSBEYXRlIGdvbmVXZXN0RGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdPTkVfV0VTVF9EQVRFX1BST1BFUlRZPSAiZ29uZVdlc3REYXRlIjsKLQkJcHJpdmF0ZSBTdHJpbmcgZXllQ29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUFJPUEVSVFk9ICJleWVDb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfQkxVRSA9ICJibHVlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9HUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfQlJPV04gPSAiYnJvd24iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0hBWkVMID0gImhhemVsIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9QSU5LID0gInBpbmsiOwotCQkJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbGlkRXllQ29sb3JzOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWUVfQ09MT1IgPSBFWUVfQ09MT1JfQkxVRTsKLQkJcHJpdmF0ZSBib29sZWFuIGV2aWw7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVklMX1BST1BFUlRZPSAiZXZpbCI7Ci0JCXByaXZhdGUgaW50IHJhbms7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5LX1BST1BFUlRZPSAicmFuayI7Ci0JCXByaXZhdGUgaW50IGFkdmVudHVyZUNvdW50OwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZPSAiYWR2ZW50dXJlQ291bnQiOwotCQotCQlQZXJzb24oQ3Jvd2QgY3Jvd2QsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jcm93ZCA9IGNyb3dkOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuYmlydGhEYXRlID0gbmV3IERhdGUoKTsKLQkJCUNhbGVuZGFyIGMgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJYy5hZGQoQ2FsZW5kYXIuWUVBUiwgMjUwKTsKLQkJCXRoaXMuZ29uZVdlc3REYXRlID0gbmV3IERhdGUoYy5nZXRUaW1lSW5NaWxsaXMoKSk7Ci0JCQl0aGlzLmV5ZUNvbG9yID0gREVGQVVMVF9FWUVfQ09MT1I7Ci0JCQl0aGlzLmV2aWwgPSBmYWxzZTsKLQkJCXRoaXMucmFuayA9IDA7Ci0JCQl0aGlzLmFkdmVudHVyZUNvdW50ID0gMDsKLQkJfQotCQotCQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRWYWxpZEV5ZUNvbG9ycygpIHsKLQkJCWlmICh2YWxpZEV5ZUNvbG9ycyA9PSBudWxsKSB7Ci0JCQkJdmFsaWRFeWVDb2xvcnMgPSBidWlsZFZhbGlkRXllQ29sb3JzKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsaWRFeWVDb2xvcnM7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkVmFsaWRFeWVDb2xvcnMoKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlyZXN1bHQuYWRkKEVZRV9DT0xPUl9CTFVFKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0dSRUVOKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0JST1dOKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0hBWkVMKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX1BJTkspOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwdWJsaWMgQ3Jvd2QgZ2V0Q3Jvd2QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jcm93ZDsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuY3Jvd2QuY2hlY2tQZXJzb25OYW1lKG5hbWUpOwotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgRGF0ZSBnZXRCaXJ0aERhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5iaXJ0aERhdGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QmlydGhEYXRlKERhdGUgYmlydGhEYXRlKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5iaXJ0aERhdGU7Ci0JCQl0aGlzLmJpcnRoRGF0ZSA9IGJpcnRoRGF0ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSVJUSF9EQVRFX1BST1BFUlRZLCBvbGQsIGJpcnRoRGF0ZSk7Ci0JCX0KLQkKLQkJcHVibGljIERhdGUgZ2V0R29uZVdlc3REYXRlKCkgewotCQkJcmV0dXJuIHRoaXMuZ29uZVdlc3REYXRlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEdvbmVXZXN0RGF0ZShEYXRlIGdvbmVXZXN0RGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZ29uZVdlc3REYXRlOwotCQkJdGhpcy5nb25lV2VzdERhdGUgPSBnb25lV2VzdERhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR09ORV9XRVNUX0RBVEVfUFJPUEVSVFksIG9sZCwgZ29uZVdlc3REYXRlKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGdldEV5ZUNvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZXllQ29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXllQ29sb3IoU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQlpZiAoISBnZXRWYWxpZEV5ZUNvbG9ycygpLmNvbnRhaW5zKGV5ZUNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXllQ29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuZXllQ29sb3I7Ci0JCQl0aGlzLmV5ZUNvbG9yID0gZXllQ29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVlFX0NPTE9SX1BST1BFUlRZLCBvbGQsIGV5ZUNvbG9yKTsKLQkJfQotCQotCQlwdWJsaWMgYm9vbGVhbiBpc0V2aWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmlsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEV2aWwoYm9vbGVhbiBldmlsKSB7Ci0JCQlib29sZWFuIG9sZCA9IHRoaXMuZXZpbDsKLQkJCXRoaXMuZXZpbCA9IGV2aWw7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVZJTF9QUk9QRVJUWSwgb2xkLCBldmlsKTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGdldFJhbmsoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yYW5rOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFJhbmsoaW50IHJhbmspIHsKLQkJCWludCBvbGQgPSB0aGlzLnJhbms7Ci0JCQl0aGlzLnJhbmsgPSByYW5rOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJBTktfUFJPUEVSVFksIG9sZCwgcmFuayk7Ci0JCX0KLQkKLQkJcHVibGljIGludCBnZXRBZHZlbnR1cmVDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmFkdmVudHVyZUNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEFkdmVudHVyZUNvdW50KGludCBhZHZlbnR1cmVDb3VudCkgewotCQkJaW50IG9sZCA9IHRoaXMuYWR2ZW50dXJlQ291bnQ7Ci0JCQl0aGlzLmFkdmVudHVyZUNvdW50ID0gYWR2ZW50dXJlQ291bnQ7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZLCBvbGQsIGFkdmVudHVyZUNvdW50KTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhQZXJzb24gcCkgewotCQkJcmV0dXJuIHRoaXMubmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKHAubmFtZSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgCi0JCQkJCQkiXHRib3JuOiAiICsgRGF0ZUZvcm1hdC5nZXREYXRlSW5zdGFuY2UoKS5mb3JtYXQodGhpcy5iaXJ0aERhdGUpICsgCi0JCQkJCQkiXHRnb25lIHdlc3Q6ICIgKyBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdCh0aGlzLmdvbmVXZXN0RGF0ZSkgKyAKLQkJCQkJCSJcdGV5ZXM6ICIgKyB0aGlzLmV5ZUNvbG9yICsgCi0JCQkJCQkiXHRldmlsOiAiICsgdGhpcy5ldmlsICsgCi0JCQkJCQkiXHRyYW5rOiAiICsgdGhpcy5yYW5rICsKLQkJCQkJCSJcdGFkdmVudHVyZXM6ICIgKyB0aGlzLmFkdmVudHVyZUNvdW50Ci0JCQk7Ci0JCX0KLQkKLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRhYmxlTW9kZWxMaXN0ZW5lciB7Ci0JCVRlc3RUYWJsZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChUYWJsZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E2MTRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KU3Bpbm5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ29sdW1uOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Eb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRhdGVTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkNoZWNrQm94VGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuVGFibGVDZWxsRWRpdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5Dcm93ZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuUGVyc29uQ29sdW1uQWRhcHRlcjsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHRoZSBUYWJsZU1vZGVsQWRhcHRlcgotICogCSJuYW1lIiBjb2x1bW4gaXMgcmVhZC1vbmx5IHRleHQgZmllbGQKLSAqIAkiYmlydGggZGF0ZSIgY29sdW1uIGlzIGRhdGUgdGV4dCBmaWVsZAotICogCSJnb25lIHdlc3QgZGF0ZSIgY29sdW1uIGlzIGRhdGUgc3Bpbm5lcgotICogCSJleWUgY29sb3IiIGNvbHVtbiBpcyBjb21iby1ib3gKLSAqIAkiZXZpbCIgY29sdW1uIGlzIGNoZWNrIGJveAotICogCSJyYW5rIiBjb2x1bW4gaXMgbnVtYmVyIHRleHQgZmllbGQKLSAqIAkiYWR2ZW50dXJlIGNvdW50IiBjb2x1bW4gaXMgbnVtYmVyIHNwaW5uZXIKLSAqIAotICogTm90ZSB0aGF0IHRoZSB0YWJsZSBtb2RlbCBhbmQgcm93IHNlbGVjdGlvbiBtb2RlbCBzaGFyZSB0aGUgc2FtZQotICogbGlzdCB2YWx1ZSBtb2RlbCAodGhlIHNvcnRlZCBwZW9wbGUgYWRhcHRlcikKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBleWVDb2xvcnNIb2xkZXI7ICAvLyBPYmplY3QgYmVjYXVzZSBpdCBhZGFwdHMgdG8gYSBjb21iby1ib3gKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBjcm93ZEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gc2VsZWN0ZWRQZXJzb25Ib2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IHNvcnRlZFBlb3BsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBUYWJsZU1vZGVsIHRhYmxlTW9kZWw7Ci0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcm93U2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBBY3Rpb24gcmVtb3ZlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHJlbmFtZUFjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKGFyZ3MpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRTeXN0ZW1Mb29rQW5kRmVlbENsYXNzTmFtZSgpKTsKLQkJdGhpcy5leWVDb2xvcnNIb2xkZXIgPSB0aGlzLiBidWlsZEV5ZUNvbG9yQ29sbGVjdGlvbkhvbGRlcigpOwotCQl0aGlzLmNyb3dkSG9sZGVyID0gdGhpcy5idWlsZENyb3dkSG9sZGVyKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKTsKLQkJdGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyID0gdGhpcy5idWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKTsKLQkJdGhpcy50YWJsZU1vZGVsID0gdGhpcy5idWlsZFRhYmxlTW9kZWwoKTsKLQkJdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25Nb2RlbCgpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckNvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PihuZXcgQXJyYXlMaXN0PE9iamVjdD4oUGVyc29uLmdldFZhbGlkRXllQ29sb3JzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPiBidWlsZENyb3dkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDcm93ZD4odGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCXByaXZhdGUgQ3Jvd2QgYnVpbGRDcm93ZCgpIHsKLQkJQ3Jvd2QgY3Jvd2QgPSBuZXcgQ3Jvd2QoKTsKLQotCQlQZXJzb24gcCA9IGNyb3dkLmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JST1dOKTsKLQkJcC5zZXRSYW5rKDIyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJHb2xsdW0iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX1BJTkspOwotCQlwLnNldEV2aWwodHJ1ZSk7Ci0JCXAuc2V0UmFuaygyKTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCg1MCk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiRnJvZG8iKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0JMVUUpOwotCQlwLnNldFJhbmsoMzQpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcC5zZXRFeWVDb2xvcihQZXJzb24uRVlFX0NPTE9SX0dSRUVOKTsKLQkJcC5zZXRSYW5rKDE5KTsKLQkJcC5zZXRBZHZlbnR1cmVDb3VudCgxKTsKLQotCQlyZXR1cm4gY3Jvd2Q7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkU2VsZWN0ZWRQZXJzb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQkvLyB0aGUgbGlzdCB3aWxsIG5lZWQgdG8gYmUgcmUtc29ydGVkIGlmIGEgbmFtZSBjaGFuZ2VzCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZUFkYXB0ZXIoKSwgUGVyc29uLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8Q3Jvd2QsIFBlcnNvbj4odGhpcy5jcm93ZEhvbGRlciwgQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGVTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZU1vZGVsIGJ1aWxkVGFibGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlciwgdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBidWlsZFJvd1NlbGVjdGlvbk1vZGVsKCkgewotCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgcnNtID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIpKTsKLQkJcnNtLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJzbS5zZXRTZWxlY3Rpb25Nb2RlKExpc3RTZWxlY3Rpb25Nb2RlbC5TSU5HTEVfU0VMRUNUSU9OKTsKLQkJcmV0dXJuIHJzbTsKLQl9Ci0KLQlwcml2YXRlIExpc3RTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJvd1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChMaXN0U2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLmdldFZhbHVlSXNBZGp1c3RpbmcoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucm93U2VsZWN0aW9uQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHJvd1NlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlQZXJzb24gc2VsZWN0aW9uID0gKFBlcnNvbikgdGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCXRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0aW9uKTsKLQkJYm9vbGVhbiBwZXJzb25TZWxlY3RlZCA9IChzZWxlY3Rpb24gIT0gbnVsbCk7Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQocGVyc29uU2VsZWN0ZWQpOwotCQl0aGlzLnJlbmFtZUFjdGlvbi5zZXRFbmFibGVkKHBlcnNvblNlbGVjdGVkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigyMDAsIDIwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDYwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRhYmxlUGFuZSgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUYWJsZVBhbmUoKSB7Ci0JCXJldHVybiBuZXcgSlNjcm9sbFBhbmUodGhpcy5idWlsZFRhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSlRhYmxlIGJ1aWxkVGFibGUoKSB7Ci0JCUpUYWJsZSB0YWJsZSA9IG5ldyBKVGFibGUodGhpcy50YWJsZU1vZGVsKTsKLQkJdGFibGUucHV0Q2xpZW50UHJvcGVydHkoInRlcm1pbmF0ZUVkaXRPbkZvY3VzTG9zdCIsIEJvb2xlYW4uVFJVRSk7CS8vIHNlZSBKYXZhIGJ1ZyA1MDA3NjUyCi0JCXRhYmxlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMucm93U2VsZWN0aW9uTW9kZWwpOwotCQl0YWJsZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJdGFibGUuc2V0QXV0b1Jlc2l6ZU1vZGUoSlRhYmxlLkFVVE9fUkVTSVpFX05FWFRfQ09MVU1OKTsKLQkJaW50IHJvd0hlaWdodCA9IDIwOwkvLyBzdGFydCB3aXRoIG1pbmltdW0gb2YgMjAKLQotCQkvLyBnb25lIHdlc3QgY29sdW1uIChzcGlubmVyKQotCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkdPTkVfV0VTVF9EQVRFX0NPTFVNTik7Ci0JCVNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBzcGlubmVyUmVuZGVyZXIgPSB0aGlzLmJ1aWxkRGF0ZVNwaW5uZXJSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKHNwaW5uZXJSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGV5ZSBjb2xvciBjb2x1bW4gKGNvbWJvLWJveCkKLQkJLy8gdGhlIGpkayBjb21iby1ib3ggcmVuZGVyZXIgbG9va3MgbGlrZSBhIHRleHQgZmllbGQKLQkJLy8gdW50aWwgdGhlIHVzZXIgc3RhcnRzIGFuIGVkaXQgLSB1c2UgYSBjdXN0b20gb25lCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVlFX0NPTE9SX0NPTFVNTik7Ci0JCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgZXllQ29sb3JSZW5kZXJlciA9IHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihleWVDb2xvclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpKSk7Ci0JCXJvd0hlaWdodCA9IE1hdGgubWF4KHJvd0hlaWdodCwgZXllQ29sb3JSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gZXZpbCAoY2hlY2sgYm94KQotCQkvLyB0aGUgamRrIGNoZWNrIGJveCByZW5kZXJlciBhbmQgZWRpdG9yIHN1Y2sgLSB1c2UgYSBjdXN0b20gb25lcwotCQljb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW5Nb2RlbCgpLmdldENvbHVtbihQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OKTsKLQkJQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBldmlsUmVuZGVyZXIgPSBuZXcgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKGV2aWxSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKG5ldyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBldmlsUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCS8vIGFkdmVudHVyZSBjb3VudCBjb2x1bW4gKHNwaW5uZXIpCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuQURWRU5UVVJFX0NPVU5UX0NPTFVNTik7Ci0JCXNwaW5uZXJSZW5kZXJlciA9IHRoaXMuYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKTsKLQkJY29sdW1uLnNldENlbGxSZW5kZXJlcihzcGlubmVyUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBzcGlubmVyUmVuZGVyZXIucHJlZmVycmVkSGVpZ2h0KCkpOwotCi0JCXRhYmxlLnNldFJvd0hlaWdodChyb3dIZWlnaHQpOwotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIgYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBidWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIobmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIobmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvckNvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcih0aGlzLmJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSwgdGhpcy5idWlsZEV5ZUNvbG9yUmVuZGVyZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21ib0JveE1vZGVsIGJ1aWxkUmVhZE9ubHlFeWVDb2xvckNvbWJvQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5leWVDb2xvcnNIb2xkZXIsIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRFeWVDb2xvclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEV5ZUNvbG9yUmVuZGVyZXIoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRCdXR0b25QYW5lbCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUGVyc29uUGFuZWwoKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRCdXR0b25QYW5lbCgpIHsKLQkJSlBhbmVsIGJ1dHRvblBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkRXllQ29sb3JCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBidXR0b25QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFBlcnNvblBhbmVsKCkgewotCQlKUGFuZWwgcGVyc29uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGROYW1lVGV4dEZpZWxkKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkR29uZVdlc3REYXRlU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRFeWVDb2xvckNvbWJvQm94KCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEV2aWxDaGVja0JveCgpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRSYW5rU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSk7Ci0JCXJldHVybiBwZXJzb25QYW5lbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFBlcnNvbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFBlcnNvbigpIHsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWVGcm9tVXNlcigpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkUGVyc29uKHRoaXMuY3Jvd2QoKS5hZGRQZXJzb24obmFtZSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJdGhpcy5yZW1vdmVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVtb3ZlUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVtb3ZlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW1vdmVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW1vdmVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJdGhpcy5jcm93ZCgpLnJlbW92ZVBlcnNvbihwZXJzb24pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbmFtZSBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVuYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbmFtZUFjdGlvbigpIHsKLQkJdGhpcy5yZW5hbWVBY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMucmVuYW1lQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5yZW5hbWVBY3Rpb247Ci0JfQotCi0Jdm9pZCByZW5hbWVQZXJzb24oKSB7Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLnNlbGVjdGVkUGVyc29uKCk7Ci0JCWlmIChwZXJzb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnByb21wdFVzZXJGb3JOYW1lKHBlcnNvbi5nZXROYW1lKCkpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCXBlcnNvbi5zZXROYW1lKG5hbWUpOwotCQkJCXRoaXMuc2V0U2VsZWN0ZWRQZXJzb24ocGVyc29uKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgZXllIGNvbG9yIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRFeWVDb2xvckJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRFeWVDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEV5ZUNvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgZXllIGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRFeWVDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZEV5ZUNvbG9yKCkgewotCQlTdHJpbmcgY29sb3IgPSB0aGlzLnByb21wdFVzZXJGb3JFeWVDb2xvcigpOwotCQlpZiAoY29sb3IgIT0gbnVsbCkgewotCQkJdGhpcy5leWVDb2xvcnNIb2xkZXIuYWRkKGNvbG9yKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb21wdFVzZXJGb3JFeWVDb2xvcigpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBleWVDb2xvciA9IEpPcHRpb25QYW5lLnNob3dJbnB1dERpYWxvZygiRXllIENvbG9yIik7Ci0JCQlpZiAoZXllQ29sb3IgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gdXNlciBwcmVzc2VkIDxDYW5jZWw+Ci0JCQl9Ci0JCQlpZiAoKGV5ZUNvbG9yLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBleWUgY29sb3IgaXMgcmVxdWlyZWQuIiwgIkludmFsaWQgRXllIENvbG9yIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmV5ZUNvbG9yc0hvbGRlci5pdGVyYXRvcigpLCBleWVDb2xvcikpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIGV5ZSBjb2xvciBhbHJlYWR5IGV4aXN0cy4iLCAiSW52YWxpZCBFeWUgQ29sb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGV5ZUNvbG9yOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50IGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRQcmludEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRDcm93ZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50Q3Jvd2QoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmNyb3dkKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFBlcnNvbj4gc3RyZWFtID0gdGhpcy5jcm93ZCgpLnBlb3BsZSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzZXQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0KCkgewotCQl0aGlzLmNyb3dkSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRDcm93ZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmV3IG5hbWUgZGlhbG9nICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldE5hbWVGcm9tVXNlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvbXB0VXNlckZvck5hbWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvbXB0VXNlckZvck5hbWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZyBvcmlnaW5hbE5hbWUpIHsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCVN0cmluZyBuYW1lID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKCJQZXJzb24gTmFtZSIpOwotCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwkJLy8gdXNlciBwcmVzc2VkIDxDYW5jZWw+Ci0JCQl9Ci0JCQlpZiAoKG5hbWUubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgaXMgcmVxdWlyZWQuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIGlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jcm93ZCgpLnBlb3BsZU5hbWVzKCksIG5hbWUpKSB7Ci0JCQkJSk9wdGlvblBhbmUuc2hvd01lc3NhZ2VEaWFsb2cobnVsbCwgIlRoZSBuYW1lIGFscmVhZHkgZXhpc3RzLiIsICJJbnZhbGlkIE5hbWUiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSB0ZXh0IGZpZWxkICoqKioqKioqKioKLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTmFtZVRleHRGaWVsZCgpIHsKLQkJSlRleHRGaWVsZCB0ZXh0RmllbGQgPSBuZXcgSlRleHRGaWVsZCh0aGlzLmJ1aWxkTmFtZURvY3VtZW50KCksIG51bGwsIDApOwotCQl0ZXh0RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQlyZXR1cm4gdGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGROYW1lRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHRoaXMuYnVpbGROYW1lQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBTdHJpbmc+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJpcnRoIGRhdGUgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRCaXJ0aERhdGVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uQklSVEhfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEJpcnRoRGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEJpcnRoRGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnb25lIHdlc3QgZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRHb25lV2VzdERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5HT05FX1dFU1RfREFURV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdvbmVXZXN0RGF0ZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEdvbmVXZXN0RGF0ZSgoRGF0ZSkgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleWUgY29sb3IgY29tYm8tYm94ICoqKioqKioqKioKLQotCXByaXZhdGUgSkNvbWJvQm94IGJ1aWxkRXllQ29sb3JDb21ib0JveCgpIHsKLQkJcmV0dXJuIG5ldyBKQ29tYm9Cb3godGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRFeWVDb2xvckNvbWJvQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5leWVDb2xvcnNIb2xkZXIsIHRoaXMuYnVpbGRFeWVDb2xvckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkRXllQ29sb3JBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXllQ29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeWVDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2aWwgY2hlY2sgYm94ICoqKioqKioqKioKLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkRXZpbENoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImV2aWwiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5idWlsZEV2aWxDaGVja0JveE1vZGVsKCkpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEV2aWxDaGVja0JveE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENoZWNrQm94TW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRFdmlsQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXZpbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkVWSUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFdmlsKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFdmlsKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmFuayBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRSYW5rU3Bpbm5lcigpIHsKLQkJcmV0dXJuIG5ldyBKU3Bpbm5lcih0aGlzLmJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZFJhbmtTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkUmFua0FkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IGJ1aWxkUmFua0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgTnVtYmVyPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uUkFOS19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTnVtYmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcih0aGlzLnN1YmplY3QuZ2V0UmFuaygpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRSYW5rKHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZHZlbnR1cmUgY291bnQgc3Bpbm5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgTnVtYmVyPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uQURWRU5UVVJFX0NPVU5UX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRBZHZlbnR1cmVDb3VudCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRBZHZlbnR1cmVDb3VudCh2YWx1ZS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENyb3dkIGNyb3dkKCkgewotCQlyZXR1cm4gdGhpcy5jcm93ZEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgUGVyc29uIHNlbGVjdGVkUGVyc29uKCkgewotCQlpZiAodGhpcy5yb3dTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoUGVyc29uKSB0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWRQZXJzb24oUGVyc29uIHBlcnNvbikgewotCQl0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUocGVyc29uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIHJlbmRlcmVyICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGlzIHNpbXBseSBhbiBleGFtcGxlIG9mIGEgcmVuZGVyZXIgZm9yIHRoZSBlbWJlZGRlZCBjb21iby1ib3guCi0JICogSXQgZG9lcyBub3RoaW5nIHNwZWNpYWwgdW5sZXNzIHlvdSB1bmNvbW1lbnQgdGhlIGNvZGUgYmVsb3cuLi4uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBFeWVDb2xvclJlbmRlcmVyIGV4dGVuZHMgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXIgewotCQlFeWVDb2xvclJlbmRlcmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCQkvLyBqdXN0IGRvIHNvbWV0aGluZyB0byBzaG93IHRoZSByZW5kZXJlciBpcyB3b3JraW5nLi4uCi0JLy8JCXZhbHVlID0gIj4iICsgdmFsdWU7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNmFjMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRyZWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSW5kZW50aW5nUHJpbnRXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLk51bGxMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVOb2RlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgVHJlZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb290KCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygicm9vdCIsIHJvb3QuZ2V0TmFtZSgpKTsKLS8vCQlyb290LmR1bXAoKTsKLS8vCQlyb290Tm9kZS5kdW1wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE5vZGUgYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0KLQkJZXhwZWN0ZWQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYWN0dWFsID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Q2hpbGQocm9vdE5vZGUsIDIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENoaWxkQ291bnQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlhc3NlcnRFcXVhbHMoNSwgdHJlZU1vZGVsLmdldENoaWxkQ291bnQocm9vdE5vZGUpKTsKLQotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChub2RlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluZGV4T2ZDaGlsZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCVRlc3ROb2RlIGNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAwIik7Ci0JCWFzc2VydEVxdWFscygwLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEVxdWFscygxLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCi0JCWNoaWxkID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0cmVlTW9kZWwuZ2V0SW5kZXhPZkNoaWxkKHJvb3ROb2RlLCBjaGlsZCkpOwotCQlUZXN0Tm9kZSBncmFuZGNoaWxkID0gY2hpbGQuY2hpbGROYW1lZCgibm9kZSAyLjIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQoY2hpbGQsIGdyYW5kY2hpbGQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZWFmKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYocm9vdE5vZGUpKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlhc3NlcnRGYWxzZSh0cmVlTW9kZWwuaXNMZWFmKG5vZGUpKTsKLQkJbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMyIpOwotCQlhc3NlcnRUcnVlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0NoYW5nZWQoKSB7Ci0JCS8vIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgIm5vZGUgY2hhbmdlZCIgZXZlbnQgaXMgdG8gdXNlIGFuIHVuc29ydGVkIHRyZWU7Ci0JCS8vIGEgc29ydGVkIHRyZWUgd2lsbCB3aWxsIHRyaWdnZXIgb25seSAibm9kZSByZW1vdmVkIiBhbmQgIm5vZGUgaW5zZXJ0ZWQiIGV2ZW50cwotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uc2V0TmFtZSgibm9kZSAxLjErKyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVOb2Rlc0luc2VydGVkKCkgewotCQkvLyB1c2UgYW4gdW5zb3J0ZWQgdHJlZSBzbyB0aGUgbm9kZXMgYXJlIG5vdCByZS1zaHVmZmxlZC4uLgotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIHRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoIm5ldyBjaGlsZC4uLiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0KLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCW5vZGUgPSBub2RlLmNoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCXRtID0gbm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJdG0uYWRkQ2hpbGQoImFub3RoZXIgbmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzUmVtb3ZlZCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXJvb3QucmVtb3ZlQ2hpbGQocm9vdC5jaGlsZE5hbWVkKCJub2RlIDMiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5yZW1vdmVDaGlsZCh0bS5jaGlsZE5hbWVkKCJub2RlIDIuMiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlU3RydWN0dXJlQ2hhbmdlZCgpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IG5vZGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKG5vZGVIb2xkZXIpOwotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJbm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBwcm9ibGVtIHdlIGhhZCB3aGVyZSByZW1vdmluZyBhIGNoaWxkIGZyb20gYSB0cmVlIHdvdWxkIGNhdXNlCi0JICogdGhlIEpUcmVlIHRvIGNhbGwgI2VxdWFscyhPYmplY3QpIG9uIGVhY2ggbm9kZSByZW1vdmVkIChhY3R1YWxseSwgaXQgd2FzCi0JICogVHJlZVBhdGgsIGJ1dCB0aGF0IHdhcyBiZWNhdXNlIGl0cyBvd24gI2VxdWFscyhPYmplY3QpIHdhcyBjYWxsZWQgYnkKLQkgKiBKVHJlZSk7IGFuZCBzaW5jZSB3ZSBoYWQgYWxyZWFkeSByZW1vdmVkIHRoZSBsYXN0IGxpc3RlbmVyIGZyb20gdGhlCi0JICogYXNwZWN0IGFkYXB0ZXIsIHRoZSBhc3BlY3QgYWRhcHRlciB3b3VsZCBzYXkgaXRzIHZhbHVlIHdhcyBudWxsOyB0aGlzCi0JICogd291bGQgY2F1c2UgYSBOUEUgdW50aWwgd2UgdHdlYWtlZCBUcmVlTW9kZWxBZGFwdGVyIHRvIHJlbW92ZSBpdHMKLQkgKiBsaXN0ZW5lcnMgZnJvbSBhIG5vZGUgb25seSAqYWZ0ZXIqIHRoZSBub2RlIGhhZCBiZWVuIGNvbXBsZXRlbHkKLQkgKiByZW1vdmVkIGZyb20gdGhlIEpUcmVlCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI3JlbW92ZU5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqIEBzZWUgVHJlZU1vZGVsQWRhcHRlciNhZGROb2RlKE9iamVjdFtdLCBpbnQsIFRyZWVOb2RlVmFsdWVNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUluaXRpYWxpemF0aW9uKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNwZWNpYWxUcmVlTW9kZWwoKTsKLQkJSlRyZWUgalRyZWUgPSBuZXcgSlRyZWUodHJlZU1vZGVsKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0JCVRlc3RNb2RlbCByb290ID0gcm9vdE5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCS8vIHRoaXMgd291bGQgY2F1c2UgYSBOUEU6Ci0JCXJvb3QucmVtb3ZlQ2hpbGQocm9vdC5jaGlsZE5hbWVkKCJub2RlIDMiKSk7Ci0JCWFzc2VydEVxdWFscyh0cmVlTW9kZWwsIGpUcmVlLmdldE1vZGVsKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRVbnNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFVuc29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFVuc29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNwZWNpYWxUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJlZU1vZGVsKHRoaXMuYnVpbGRTcGVjaWFsUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNwZWNpYWxSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTcGVjaWFsVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0TW9kZWwgcm9vdCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJLypOb2RlIG5vZGVfMCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSAwIik7Ci0JCVRlc3RNb2RlbCBub2RlXzEgPSByb290LmFkZENoaWxkKCJub2RlIDEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMV8xID0gbm9kZV8xLmFkZENoaWxkKCJub2RlIDEuMSIpOwotCQkvKk5vZGUgbm9kZV8xXzFfMSA9ICovbm9kZV8xXzEuYWRkQ2hpbGQoIm5vZGUgMS4xLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMiA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMiIpOwotCQkvKk5vZGUgbm9kZV8yXzAgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjAiKTsKLQkJLypOb2RlIG5vZGVfMl8xID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4xIik7Ci0JCS8qTm9kZSBub2RlXzJfMiA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzMgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjMiKTsKLQkJLypOb2RlIG5vZGVfMl80ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi40Iik7Ci0JCS8qTm9kZSBub2RlXzJfNSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNSIpOwotCQkvKk5vZGUgbm9kZV8zID0gKi9yb290LmFkZENoaWxkKCJub2RlIDMiKTsKLQkJLypOb2RlIG5vZGVfNCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSA0Iik7Ci0JCXJldHVybiByb290OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGEgdHlwaWNhbCBtb2RlbCBjbGFzcyB3aXRoIHRoZSB0eXBpY2FsIGNoYW5nZSBub3RpZmljYXRpb25zCi0JICogZm9yICNuYW1lIGFuZCAjY2hpbGRyZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQkvLyB0aGUgIHBhcmVudCBpcyBpbW11dGFibGU7IHRoZSByb290J3MgcGFyZW50IGlzIG51bGwKLQkJcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgcGFyZW50OwotCi0JCS8vIHRoZSBuYW1lIGlzIG11dGFibGU7IHNvIEkgZ3Vlc3MgaXQgaXNuJ3QgdGhlICJwcmltYXJ5IGtleSIgOi0pCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0TW9kZWw+IGNoaWxkcmVuOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJTERSRU5fQ09MTEVDVElPTiA9ICJjaGlsZHJlbiI7Ci0KLQotCQlwdWJsaWMgVGVzdE1vZGVsKFN0cmluZyBuYW1lKSB7CS8vIHJvb3QgY3RvcgotCQkJdGhpcyhudWxsLCBuYW1lKTsKLQkJfQotCQlwcml2YXRlIFRlc3RNb2RlbChUZXN0TW9kZWwgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuY2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0TW9kZWw+KCk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxUZXN0TW9kZWw+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPFRlc3RNb2RlbD4odGhpcy5jaGlsZHJlbik7Ci0JCX0KLQkJcHVibGljIGludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbCBhZGRDaGlsZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlUZXN0TW9kZWwgY2hpbGQgPSBuZXcgVGVzdE1vZGVsKHRoaXMsIGNoaWxkTmFtZSk7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oY2hpbGQsIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWxbXSBhZGRDaGlsZHJlbihTdHJpbmdbXSBjaGlsZE5hbWVzKSB7Ci0JCQlUZXN0TW9kZWxbXSBuZXdDaGlsZHJlbiA9IG5ldyBUZXN0TW9kZWxbY2hpbGROYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbmV3Q2hpbGRyZW5baV0gPSBuZXcgVGVzdE1vZGVsKHRoaXMsIGNoaWxkTmFtZXNbaV0pOwotCQkJfQotCQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihuZXdDaGlsZHJlbiwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gbmV3Q2hpbGRyZW47Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGQoVGVzdE1vZGVsIGNoaWxkKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oVGVzdE1vZGVsW10gdGVzdE1vZGVscykgewotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHRlc3RNb2RlbHMsIHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyQ2hpbGRyZW4oKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGNoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJZm9yIChUZXN0TW9kZWwgY2hpbGQgOiB0aGlzLmNoaWxkcmVuKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNoaWxkIG5vdCBmb3VuZDogIiArIGNoaWxkTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGR1bXBTdHJpbmcoKSB7Ci0JCQlTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIoc3cpOwotCQkJdGhpcy5kdW1wT24oaXB3KTsKLQkJCXJldHVybiBzdy50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGR1bXBPbihJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludGxuKHRoaXMpOwotCQkJd3JpdGVyLmluZGVudCgpOwotCQkJZm9yIChUZXN0TW9kZWwgY2hpbGQgOiB0aGlzLmNoaWxkcmVuKSB7Ci0JCQkJY2hpbGQuZHVtcE9uKHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZXIudW5kZW50KCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHN0cmVhbSkpOwotCQkJdGhpcy5kdW1wT24od3JpdGVyKTsKLQkJCXdyaXRlci5mbHVzaCgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCQl0aGlzLmR1bXBPbihTeXN0ZW0ub3V0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBUaGlzIE5vZGUgd3JhcHMgYSBUZXN0TW9kZWwgYW5kIGNvbnZlcnRzIGludG8gc29tZXRoaW5nIHRoYXQgY2FuCi0JICogYmUgdXNlZCBieSBUcmVlTW9kZWxBZGFwdGVyLiBJdCBjb252ZXJ0cyBjaGFuZ2VzIHRvIHRoZSBUZXN0TW9kZWwncwotCSAqIG5hbWUgaW50byAic3RhdGUgY2hhbmdlcyIgdG8gdGhlIE5vZGU7IGFuZCBjb252ZXJ0cyB0aGUKLQkgKiBUZXN0TW9kZWwncyBjaGlsZHJlbiBpbnRvIGEgTGlzdFZhbHVlTW9kZWwgb2YgTm9kZXMgd2hvc2Ugb3JkZXIgaXMKLQkgKiBkZXRlcm1pbmVkIGJ5IHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFRlc3ROb2RlIGV4dGVuZHMgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPFRlc3ROb2RlPiB7Ci0JCS8qKiB0aGUgbW9kZWwgb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJLyoqIHRoaXMgbm9kZSdzIHBhcmVudCBub2RlOyBudWxsIGZvciB0aGUgcm9vdCBub2RlICovCi0JCXByaXZhdGUgZmluYWwgVGVzdE5vZGUgcGFyZW50OwotCQkvKiogdGhpcyBub2RlJ3MgY2hpbGQgbm9kZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbDsKLQkJLyoqIGEgbGlzdGVuZXIgdGhhdCBub3RpZmllcyB1cyB3aGVuIHRoZSBtb2RlbCBvYmplY3QncyAiaW50ZXJuYWwgc3RhdGUiIGNoYW5nZXMgKi8KLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRlc3RNb2RlbExpc3RlbmVyOwotCi0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JCS8qKgotCQkgKiByb290IG5vZGUgY29uc3RydWN0b3IKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQl0aGlzKG51bGwsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvKioKLQkJICogYnJhbmNoIG9yIGxlYWYgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmNoaWxkcmVuTW9kZWwgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5Nb2RlbCh0ZXN0TW9kZWwpOwotCQkJdGhpcy50ZXN0TW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGVzdE1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlUZXN0Tm9kZS50aGlzLnRlc3RNb2RlbENoYW5nZWQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBzdWJjbGFzc2VzIGRlY2lkZSB0aGUgb3JkZXIgb2YgdGhlIGNoaWxkIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkQ2hpbGRyZW5Nb2RlbChUZXN0TW9kZWwgbW9kZWwpOwotCi0JCS8qKgotCQkgKiB1c2VkIGJ5IHN1YmNsYXNzZXM7Ci0JCSAqIHRyYW5zZm9ybSB0aGUgdGVzdCBtb2RlbCBjaGlsZHJlbiBpbnRvIG5vZGVzCi0JCSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkTm9kZUFkYXB0ZXIoVGVzdE1vZGVsIG1vZGVsKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8VGVzdE1vZGVsLCBUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4odGhpcy5idWlsZENoaWxkcmVuQWRhcHRlcihtb2RlbCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgVGVzdE5vZGUgdHJhbnNmb3JtSXRlbShUZXN0TW9kZWwgaXRlbSkgewotCQkJCQlyZXR1cm4gVGVzdE5vZGUudGhpcy5idWlsZENoaWxkTm9kZShpdGVtKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN1YmNsYXNzZXMgbXVzdCBidWlsZCBhIGNvbmNyZXRlIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgdGVzdCBtb2RlbAotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZFRlc3RNb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIHJldHVybiBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgb24gdGhlIHNwZWNpZmllZCBtb2RlbCdzIGNoaWxkcmVuCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VGVzdE1vZGVsPiBidWlsZENoaWxkcmVuQWRhcHRlcihUZXN0TW9kZWwgbW9kZWwpIHsKLQkJCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBUZXN0TW9kZWw+KFRlc3RNb2RlbC5DSElMRFJFTl9DT0xMRUNUSU9OLCBtb2RlbCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxUZXN0TW9kZWw+IGl0ZXJhdG9yXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jaGlsZHJlbigpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNoaWxkcmVuU2l6ZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gY2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLk5BTUVfUFJPUEVSVFksIHRoaXMudGVzdE1vZGVsTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy50ZXN0TW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogRGlzcGxheWFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbC5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogZGVidWdnaW5nIHN1cHBvcnQgKioqKioqKioqKgotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCQl3cml0ZXIucHJpbnRsbih0aGlzKTsKLQkJCXdyaXRlci5pbmRlbnQoKTsKLQkJCWZvciAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW5Nb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQkvLyBjYXN0IHRvIGEgVGVzdE5vZGUgKGkuZS4gdGhpcyB3b24ndCB3b3JrIHdpdGggYSBOYW1lVGVzdE5vZGUgaW4gdGhlIHRyZWUpCi0JCQkJKChUZXN0Tm9kZSkgc3RyZWFtLm5leHQoKSkuZHVtcE9uKHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZXIudW5kZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkdW1wKCkgewotCQkJdGhpcy5kdW1wT24oU3lzdGVtLm91dCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JCS8qKgotCQkgKiB0aGUgbW9kZWwncyBuYW1lIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIHRoZSBldmVudCB0byBvdXIgbGlzdGVuZXJzCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCB0ZXN0TW9kZWxDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJLy8gd2UgbmVlZCB0byBub3RpZnkgbGlzdGVuZXJzIHRoYXQgb3VyICJpbnRlcm5hbCBzdGF0ZSIgaGFzIGNoYW5nZWQKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQkJLy8gb3VyIGRpc3BsYXkgc3RyaW5nIHN0YXlzIGluIHN5bmNoIHdpdGggdGhlIG1vZGVsJ3MgbmFtZQotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBlLmdldE9sZFZhbHVlKCksIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWw7Ci0JCX0KLQotCQkvKioKLQkJICogdGVzdGluZyBjb252ZW5pZW5jZSBtZXRob2QKLQkJICovCi0JCXB1YmxpYyBUZXN0Tm9kZSBjaGlsZE5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gY2hpbGROb2RlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoY2hpbGROb2RlIGluc3RhbmNlb2YgVGVzdE5vZGUpIHsKLQkJCQkJaWYgKCgoVGVzdE5vZGUpIGNoaWxkTm9kZSkuZ2V0VGVzdE1vZGVsKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJcmV0dXJuIChUZXN0Tm9kZSkgY2hpbGROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgbmFtZSk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHVibGljIGludCBjb21wYXJlVG8oVGVzdE5vZGUgbykgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiTm9kZSgiICsgdGhpcy50ZXN0TW9kZWwgKyAiKSI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQga2VlcHMgaXRzIGNoaWxkcmVuIHNvcnRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU29ydGVkVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHRoZSBsaXN0IHNob3VsZCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIodGVzdE1vZGVsKSk7Ci0JCX0KLQkJLyoqIHRoZSBkaXNwbGF5IHN0cmluZyAobmFtZSkgb2YgZWFjaCBub2RlIGNhbiBjaGFuZ2UgKi8KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZERpc3BsYXlTdHJpbmdBZGFwdGVyKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKSwgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyBzb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBsZWF2ZXMgaXRzIGNoaWxkcmVuIHVuc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBVbnNvcnRlZFRlc3ROb2RlIGV4dGVuZHMgVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFVuc29ydGVkVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIE5PVCBiZSBzb3J0ZWQgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZUFkYXB0ZXIodGVzdE1vZGVsKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gdW5zb3J0ZWQgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKiBhbmQgaGFzIGEgc3BlY2lhbCBzZXQgb2YgY2hpbGRyZW4gZm9yICJub2RlIDMiCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTcGVjaWFsVGVzdE5vZGUgZXh0ZW5kcyBVbnNvcnRlZFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIodGVzdE1vZGVsKTsKLQkJfQotCQlwdWJsaWMgU3BlY2lhbFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiByZXR1cm4gYSBkaWZmZXJlbnQgbGlzdCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCWlmICh0ZXN0TW9kZWwuZ2V0TmFtZSgpLmVxdWFscygibm9kZSAzIikpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCX0KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZFNwZWNpYWxDaGlsZHJlbk1vZGVsKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD5bXSBjaGlsZHJlbiA9IG5ldyBOYW1lVGVzdE5vZGVbMV07Ci0JCQljaGlsZHJlblswXSA9IG5ldyBOYW1lVGVzdE5vZGUodGhpcyk7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PihBcnJheXMuYXNMaXN0KGNoaWxkcmVuKSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNwZWNpYWwgbm9kZXMgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBUZXN0Tm9kZSBidWlsZENoaWxkTm9kZShUZXN0TW9kZWwgY2hpbGROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTmFtZVRlc3ROb2RlIGV4dGVuZHMgQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiB7Ci0JCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQkJcHJpdmF0ZSBmaW5hbCBTcGVjaWFsVGVzdE5vZGUgc3BlY2lhbE5vZGU7CQkvLyBwYXJlbnQgbm9kZQotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbmFtZUxpc3RlbmVyOwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgTmFtZVRlc3ROb2RlKFNwZWNpYWxUZXN0Tm9kZSBzcGVjaWFsTm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZUxpc3RlbmVyID0gdGhpcy5idWlsZE5hbWVMaXN0ZW5lcigpOwotCQkJdGhpcy5zcGVjaWFsTm9kZSA9IHNwZWNpYWxOb2RlOwotCQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcigpOwotCQkJdGhpcy5jaGlsZHJlbk1vZGVsID0gbmV3IE51bGxMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4oKTsKLQkJfQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5hbWVMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCU5hbWVUZXN0Tm9kZS50aGlzLm5hbWVDaGFuZ2VkKGUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgU3RyaW5nPihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy5nZXRUZXN0TW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHVibGljIFRlc3RNb2RlbCBnZXRUZXN0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWFsTm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVHJlZU5vZGVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKChTdHJpbmcpIHZhbHVlKTsKLQkJfQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lhbE5vZGU7Ci0JCX0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubmFtZUxpc3RlbmVyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5hbWVMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgdm9pZCBuYW1lQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCS8vIHdlIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVycyB0aGF0IG91ciAidmFsdWUiIGhhcyBjaGFuZ2VkCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFRlc3ROb2RlIHJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4ocm9vdCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pihyb290SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGROb2RlU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZVZhbHVlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUm9vdExpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCi0KLQkvKioKLQkgKiBsaXN0ZW5lciB0aGF0IHdpbGwgYmxvdyB1cCB3aXRoIGFueSBldmVudDsKLQkgKiBvdmVycmlkZSBhbmQgaW1wbGVtZW50IGV4cGVjdGVkIGV2ZW50IG1ldGhvZHMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRyZWVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVHJlZU1vZGVsTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZVN0cnVjdHVyZUNoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3YTAyNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LlRleHRGaWVsZDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlU2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlNvcnRlZFRlc3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVGVzdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuVGVzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5VbnNvcnRlZFRlc3ROb2RlOwotCi0vKioKLSAqIGFuIGV4YW1wbGUgVUkgZm9yIHRlc3RpbmcgdGhlIFRyZWVNb2RlbEFkYXB0ZXIKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQkvLyBob2xkIHRoZSB0cmVlIHNvIHdlIGNhbiByZXN0b3JlIGl0cyBleHBhbnNpb24gc3RhdGUKLQlwcml2YXRlIEpUcmVlIHRyZWU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gcm9vdE5vZGVIb2xkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHNvcnRlZDsKLQlwcml2YXRlIFRyZWVNb2RlbCB0cmVlTW9kZWw7Ci0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTW9kZWwgdHJlZVNlbGVjdGlvbk1vZGVsOwotCXByaXZhdGUgVGV4dEZpZWxkIG5hbWVUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMucm9vdE5vZGVIb2xkZXIgPSB0aGlzLmJ1aWxkUm9vdE5vZGVIb2xkZXIoKTsKLQkJdGhpcy5zb3J0ZWQgPSB0aGlzLnJvb3ROb2RlSG9sZGVyLmdldFZhbHVlKCkgaW5zdGFuY2VvZiBTb3J0ZWRUZXN0Tm9kZTsKLQkJdGhpcy50cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZU1vZGVsKCk7Ci0JCXRoaXMudHJlZVNlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFRyZWVTZWxlY3Rpb25Nb2RlbCgpOwotCQl0aGlzLm5hbWVUZXh0RmllbGQgPSBuZXcgVGV4dEZpZWxkKCk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkUm9vdE5vZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFVuc29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgYnVpbGRSb290KCkgewotCQlUZXN0TW9kZWwgcm9vdCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQotCQlUZXN0TW9kZWwgbm9kZV8xID0gcm9vdC5hZGRDaGlsZCgibm9kZSAxIik7Ci0JCS8qTm9kZSBub2RlXzFfMSA9ICovbm9kZV8xLmFkZENoaWxkKCJub2RlIDEuMSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzIgPSByb290LmFkZENoaWxkKCJub2RlIDIiKTsKLQkJLypOb2RlIG5vZGVfMl8xID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzJfMiA9IG5vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjIiKTsKLQkJLypOb2RlIG5vZGVfMl8yXzEgPSAqL25vZGVfMl8yLmFkZENoaWxkKCJub2RlIDIuMi4xIik7Ci0JCS8qTm9kZSBub2RlXzJfMl8yID0gKi9ub2RlXzJfMi5hZGRDaGlsZCgibm9kZSAyLjIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzMgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjMiKTsKLQkJLypOb2RlIG5vZGVfMl80ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi40Iik7Ci0JCS8qTm9kZSBub2RlXzJfNSA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuNSIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzMgPSByb290LmFkZENoaWxkKCJub2RlIDMiKTsKLQkJVGVzdE1vZGVsIG5vZGVfM18xID0gbm9kZV8zLmFkZENoaWxkKCJub2RlIDMuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8zXzFfMSA9IG5vZGVfM18xLmFkZENoaWxkKCJub2RlIDMuMS4xIik7Ci0JCS8qTm9kZSBub2RlXzNfMV8xXzEgPSAqL25vZGVfM18xXzEuYWRkQ2hpbGQoIm5vZGUgMy4xLjEuMSIpOwotCi0JCS8qTm9kZSBub2RlXzQgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgNCIpOwotCi0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRyZWVNb2RlbEFkYXB0ZXI8T2JqZWN0Pih0aGlzLnJvb3ROb2RlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCBidWlsZFRyZWVTZWxlY3Rpb25Nb2RlbCgpIHsKLQkJVHJlZVNlbGVjdGlvbk1vZGVsIHRzbSA9IG5ldyBEZWZhdWx0VHJlZVNlbGVjdGlvbk1vZGVsKCk7Ci0JCXRzbS5hZGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdHNtLnNldFNlbGVjdGlvbk1vZGUoVHJlZVNlbGVjdGlvbk1vZGVsLlNJTkdMRV9UUkVFX1NFTEVDVElPTik7Ci0JCXJldHVybiB0c207Ci0JfQotCi0JcHJpdmF0ZSBUcmVlU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnRyZWVTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdHJlZVNlbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZVRleHRGaWVsZC5zZXRUZXh0KHNlbGVjdGVkVGVzdE1vZGVsLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJSkZyYW1lIHdpbmRvdyA9IG5ldyBKRnJhbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXdpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl3aW5kb3cuYWRkV2luZG93TGlzdGVuZXIodGhpcy5idWlsZFdpbmRvd0xpc3RlbmVyKCkpOwotCQl3aW5kb3cuZ2V0Q29udGVudFBhbmUoKS5hZGQodGhpcy5idWlsZE1haW5QYW5lbCgpLCAiQ2VudGVyIik7Ci0JCXdpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXdpbmRvdy5zZXRTaXplKDQwMCwgNDAwKTsKLQkJd2luZG93LnNldFZpc2libGUodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBXaW5kb3dMaXN0ZW5lciBidWlsZFdpbmRvd0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFdpbmRvd0FkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NpbmcoV2luZG93RXZlbnQgZSkgewotCQkJCWUuZ2V0V2luZG93KCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNYWluUGFuZWwoKSB7Ci0JCUpQYW5lbCBtYWluUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBCb3JkZXJMYXlvdXQoKSk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZFRyZWVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRyZWVQYW5lKCkgewotCQlyZXR1cm4gbmV3IEpTY3JvbGxQYW5lKHRoaXMuYnVpbGRUcmVlKCkpOwotCX0KLQotCXByaXZhdGUgSlRyZWUgYnVpbGRUcmVlKCkgewotCQl0aGlzLnRyZWUgPSBuZXcgSlRyZWUodGhpcy50cmVlTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VmFsdWVUb1RleHQoT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGV4cGFuZGVkLCBib29sZWFuIGxlYWYsIGludCByb3csIGJvb2xlYW4gaGFzRm9jdXMpIHsKLQkJCQlyZXR1cm4gKChEaXNwbGF5YWJsZSkgdmFsdWUpLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy50cmVlLnNldFNlbGVjdGlvbk1vZGVsKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy50cmVlLnNldFJvb3RWaXNpYmxlKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0U2hvd3NSb290SGFuZGxlcyh0cnVlKTsKLQkJdGhpcy50cmVlLnNldFJvd0hlaWdodCgyMCk7Ci0JCXRoaXMudHJlZS5zZXREb3VibGVCdWZmZXJlZCh0cnVlKTsKLQkJcmV0dXJuIHRoaXMudHJlZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZENvbnRyb2xQYW5lbCgpIHsKLQkJSlBhbmVsIGNvbnRyb2xQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMCwgMSkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW5hbWVOb2RlUGFuZWwoKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZE1pc2NQYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbmFtZU5vZGVQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVuYW1lTm9kZVBhbmVsLmFkZCh0aGlzLm5hbWVUZXh0RmllbGQsIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW5hbWVCdXR0b24oKSwgQm9yZGVyTGF5b3V0LkVBU1QpOwotCQlyZXR1cm4gYWRkUmVuYW1lTm9kZVBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWlzY1BhbmVsKCkgewotCQlKUGFuZWwgbWlzY1BhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSk7Ci0JCW1pc2NQYW5lbC5hZGQodGhpcy5idWlsZFJlbW92ZUJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXRCdXR0b24oKSk7Ci0JCXJldHVybiBtaXNjUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZVRleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQlwcml2YXRlIFRlc3ROb2RlIHNlbGVjdGVkTm9kZSgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuZ2V0U2VsZWN0aW9uUGF0aCgpLmdldExhc3RQYXRoQ29tcG9uZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwoKSB7Ci0JCWlmICh0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGlvbkVtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkTm9kZSgpLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSByb290Tm9kZSgpIHsKLQkJcmV0dXJuIChUZXN0Tm9kZSkgdGhpcy50cmVlTW9kZWwuZ2V0Um9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIHJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VHJlZVBhdGg+IGV4cGFuZGVkUGF0aHMoKSB7Ci0JCUVudW1lcmF0aW9uPFRyZWVQYXRoPiBzdHJlYW0gPSB0aGlzLnRyZWUuZ2V0RXhwYW5kZWREZXNjZW5kYW50cyhuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JCWlmIChzdHJlYW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxUcmVlUGF0aD4oc3RyZWFtKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkTm9kZShUZXN0Tm9kZSBzZWxlY3RlZE5vZGUpIHsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uUGF0aChuZXcgVHJlZVBhdGgoc2VsZWN0ZWROb2RlLnBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRQYXRocyhDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocykgewotCQlmb3IgKFRyZWVQYXRoIHBhdGggOiBwYXRocykgewotCQkJdGhpcy50cmVlLmV4cGFuZFBhdGgocGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkZCAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQWRkQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZEFkZEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiYWRkIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZE5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogYWRkaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgYWRkTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCS8vIHNhdmUgdGhlIGV4cGFuc2lvbiBzdGF0ZSBhbmQgcmVzdG9yZSBpdCBhZnRlciB0aGUgYWRkCi0JCQlDb2xsZWN0aW9uPFRyZWVQYXRoPiBwYXRocyA9IHRoaXMuZXhwYW5kZWRQYXRocygpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5hZGRDaGlsZChuYW1lKTsKLQotCQkJdGhpcy5leHBhbmRQYXRocyhwYXRocyk7Ci0JCQl0aGlzLnNldFNlbGVjdGVkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSgpLmNoaWxkTmFtZWQobmFtZSkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHdlIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBub2RlIHRvIHNlbGVjdCBhZnRlcgotCSAqIHRoZSBzZWxlY3RlZCBub2RlIGlzIGRlbGV0ZWQKLQkgKi8KLQl2b2lkIHJlbW92ZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSByb290IHRvIGJlIHJlbW92ZWQKLQkJaWYgKChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSAmJiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gdGhpcy5yb290KCkpKSB7Ci0JCQkvLyBzYXZlIHRoZSBwYXJlbnQgYW5kIGluZGV4LCBzbyB3ZSBjYW4gc2VsZWN0IGFub3RoZXIsIG5lYXJieSwgbm9kZQotCQkJLy8gb25jZSB0aGUgc2VsZWN0ZWQgbm9kZSBpcyByZW1vdmVkCi0JCQlUZXN0Tm9kZSBwYXJlbnROb2RlID0gKFRlc3ROb2RlKSB0aGlzLnNlbGVjdGVkTm9kZSgpLnBhcmVudCgpOwotCQkJaW50IGNoaWxkSW5kZXggPSBwYXJlbnROb2RlLmluZGV4T2ZDaGlsZCh0aGlzLnNlbGVjdGVkTm9kZSgpKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQoc2VsZWN0ZWRUZXN0TW9kZWwpOwotCi0JCQlpbnQgY2hpbGRyZW5TaXplID0gcGFyZW50Tm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCWlmIChjaGlsZEluZGV4IDwgY2hpbGRyZW5TaXplKSB7Ci0JCQkJLy8gc2VsZWN0IHRoZSBjaGlsZCB0aGF0IG1vdmVkIHVwIGFuZCByZXBsYWNlZCB0aGUganVzdC1kZWxldGVkIGNoaWxkCi0JCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGFyZSBubyBtb3JlIGNoaWxkcmVuLCBzZWxlY3QgdGhlIHBhcmVudAotCQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZShwYXJlbnROb2RlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBpZiB0aGUgY2hpbGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbGlzdCB3YXMgZGVsZXRlZCwgc2VsZWN0IHRoZSBuZXh0IGNoaWxkIHVwCi0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKChUZXN0Tm9kZSkgcGFyZW50Tm9kZS5jaGlsZChjaGlsZEluZGV4IC0gMSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVuYW1lICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW5hbWUiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVuYW1lTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiByZW5hbWluZyBjYXVzZXMgdGhlIHRyZWUgdG8gYmUgc29ydGVkIGFuZCBub2RlcyB0byBiZQotCSAqIHJlbW92ZWQgYW5kIHJlLWFkZGVkOyBzbyB3ZSBoYXZlIHRvIGZpZGRsZSB3aXRoIHRoZSBleHBhbnNpb24gc3RhdGUKLQkgKi8KLQl2b2lkIHJlbmFtZU5vZGUoKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCS8vIHNhdmUgdGhlIG5vZGUgYW5kIHJlLXNlbGVjdCBpdCBhZnRlciB0aGUgcmVuYW1lCi0JCQlUZXN0Tm9kZSBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLnNldE5hbWUodGhpcy5nZXROYW1lKCkpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHNlbGVjdGVkTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsZWFyIGNoaWxkcmVuICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhckNoaWxkcmVuQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhckNoaWxkcmVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBjaGlsZHJlbiIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5jbGVhckNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIG5vdGhpbmcgc3BlY2lhbCwgd2UganVzdCB3YW50IHRvIHRlc3QgI2ZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcpCi0JICovCi0Jdm9pZCBjbGVhckNoaWxkcmVuKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZFRlc3RNb2RlbC5jbGVhckNoaWxkcmVuKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc2V0ICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXNldEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0QWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IHRoZSBhZGFwdGVyJ3Mgcm9vdCBub2RlIGhvbGRlcjsKLQkgKiB0b2dnbGUgYmV0d2VlbiBzb3J0ZWQgYW5kIHVuc29ydGVkIGxpc3RzCi0JICovCi0Jdm9pZCByZXNldCgpIHsKLQkJdGhpcy5zb3J0ZWQgPSAhIHRoaXMuc29ydGVkOwotCQlpZiAodGhpcy5zb3J0ZWQpIHsKLQkJCXRoaXMucm9vdE5vZGVIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQkJfQotCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChuZXcgVHJlZVBhdGgodGhpcy5yb290Tm9kZSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjZDYyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFic3RyYWN0Tm9kZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIHJvb3Q7Ci0KLQlwdWJsaWMgQWJzdHJhY3ROb2RlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5yb290ID0gdGhpcy5idWlsZFJvb3QoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCByID0gbmV3IFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoInJvb3QiKTsKLQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMSA9IHIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMV8xID0gbm9kZTEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjEiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMiIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCQkJbm9kZTEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4yIik7Ci0JCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTIgPSByLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJCQlub2RlMi5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyLjEiKTsKLQkJCQlub2RlMi5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAyLjIiKTsKLQkJCXIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMyIpOwotCQkJci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSA0Iik7Ci0KLQkJLy8gbWFyayB0aGUgZW50aXJlIHRyZWUgY2xlYW4KLQkJci5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZXN0V29ya2JlbmNoTW9kZWwoKSB7Ci0JCS8vIG1ha2Ugc3VyZSBvdXIgdGVzdCBjbGFzcyB3b3JrcyBPSy4uLgotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMSIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMi4xIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDIuMSIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKS5pc0NsZWFuQnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXJlbnRBbmRDaGlsZHJlbigpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMS4xLjMiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJub2RlIDEuMSIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMSIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoInJvb3QiLCBub2RlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmNoaWxkcmVuKCkpKTsKLQotCQlub2RlID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0TnVsbChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHkoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5VW5jaGFuZ2VkQXR0cmlidXRlKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJLy8gc2V0IHNpemUgdG8gc2FtZSBudW1iZXIgLSBzaG91bGQgc3RheSBjbGVhbgotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2goKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJcGFyZW50LnNldFNpemUoNzcpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCW5vZGUubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoQ2xlYW5DaGlsZERpcnR5UGFyZW50KCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXRTaXplKDc3KTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQkvLyBub3csIGNsZWFuIHRoZSBjaGlsZCwgYnV0IGxlYXZlIHRoZSBwYXJlbnQgZGlydHkKLQkJbm9kZS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hDbGVhbkNoaWxkRGlydHlDaGlsZCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjEiKTsKLQkJbm9kZTEuc2V0U2l6ZSg0MSk7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMiA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4yIik7Ci0JCW5vZGUyLnNldFNpemUoNDIpOwotCi0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlMS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQkvLyBub3csIGNsZWFuIHRoZSBmaXJzdCBjaGlsZCwgYnV0IGxlYXZlIHRoZSBzZWNvbmQgY2hpbGQgZGlydHkKLQkJbm9kZTEubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5QnJhbmNoRm9yY2VkKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCi0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbkJyYW5jaCgpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eVRyYW5zaWVudEF0dHJpYnV0ZSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0RpcnR5KCkpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQl0aGlzLnJvb3QubWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LnByb2JsZW1zU2l6ZSgpID09IDApOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5wcm9ibGVtc1NpemUoKSA+IDApOwotCi0JCS8vIHNpbmNlIHByb2JsZW1zIGFyZSB0cmFuc2llbnQsIGV2ZXJ5dGhpbmcgc2hvdWxkIHN0aWxsIGJlIGNsZWFuCi0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbkJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlQcm9ibGVtIHByb2JsZW0xID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQotCQkvLyBub3cgY3JlYXRlIGFub3RoZXIgcHJvYmxlbSB0aGF0IHNob3VsZCByZW1vdmUgdGhlIG9sZCBwcm9ibGVtCi0JCW5vZGUuc2V0TmFtZSgiU1RJTEwgQk9HVVMiKTsKLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJUHJvYmxlbSBwcm9ibGVtMiA9IG5vZGUucHJvYmxlbXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHByb2JsZW0xID09IHByb2JsZW0yKTsKLQkJcHJvYmxlbTEgPSBwcm9ibGVtMjsKLQotCQkvLyBub3cgY3JlYXRlIGFub3RoZXIgcHJvYmxlbSB0aGF0IHNob3VsZCByZXBsYWNlIHRoZSBvbGQgcHJvYmxlbQotCQlub2RlLnNldE5hbWUoIlNUSUxMIEJPR1VTIik7Ci0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCXByb2JsZW0yID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQkJLy8gdGhlIHNhbWUgcHJvYmxlbSBzaG91bGQgYmUgdGhlcmUKLQkJYXNzZXJ0VHJ1ZShwcm9ibGVtMS5lcXVhbHMocHJvYmxlbTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQotCQlub2RlLnNldE5hbWUoIm9raWUtZG9raWUiKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMucm9vdC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQotCQlwYXJlbnQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmJyYW5jaFByb2JsZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlZEJyYW5jaFByb2JsZW1zKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCXBhcmVudC5zZXROYW1lKCJCT0dVUyBUT08iKTsKLQkJdGhpcy5yb290LnNldE5hbWUoIkJPR1VTIFRPTyBUT08iKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMucm9vdC5icmFuY2hQcm9ibGVtcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5icmFuY2hQcm9ibGVtcygpKSk7Ci0KLQkJLy8gY29tcGxldGVseSByZW1vdmUgYSBub2RlIHRoYXQgaGFzIHByb2JsZW1zIC0KLQkJLy8gdGhlIGVudGlyZSB0cmVlIHNob3VsZCByZWNhbGN1bGF0ZSBpdHMgImJyYW5jaCIgcHJvYmxlbXMKLQkJcGFyZW50LnJlbW92ZVRlc3RDaGlsZChub2RlKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMucm9vdC5icmFuY2hQcm9ibGVtcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgY2xhc3MgVGVzdFdvcmtiZW5jaE1vZGVsIGV4dGVuZHMgQWJzdHJhY3ROb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgaW50IHNpemU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVpFX1BST1BFUlRZID0gInNpemUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248VGVzdFdvcmtiZW5jaE1vZGVsPiB0ZXN0Q2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NISUxEUkVOX0NPTExFQ1RJT04gPSAiY2hpbGRyZW4iOwotCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwoVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQkJdGhpcy5zaXplID0gMDsKLQkJCXRoaXMudGVzdENoaWxkcmVuID0gbmV3IEhhc2hCYWc8VGVzdFdvcmtiZW5jaE1vZGVsPigpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQotCQotCQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zaXplOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpIHsKLQkJCWludCBvbGQgPSB0aGlzLnNpemU7Ci0JCQl0aGlzLnNpemUgPSBzaXplOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RXb3JrYmVuY2hNb2RlbD4gdGVzdENoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFRlc3RXb3JrYmVuY2hNb2RlbD4odGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoVGVzdFdvcmtiZW5jaE1vZGVsIGN1cnJlbnQpIHsKLQkJCQkJVGVzdFdvcmtiZW5jaE1vZGVsLnRoaXMucmVtb3ZlVGVzdENoaWxkKGN1cnJlbnQpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIGludCB0ZXN0Q2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdENoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwcml2YXRlIFRlc3RXb3JrYmVuY2hNb2RlbCBhZGRUZXN0Q2hpbGQoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKHRlc3RDaGlsZCwgdGhpcy50ZXN0Q2hpbGRyZW4sIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gdGVzdENoaWxkOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgYWRkVGVzdENoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJaWYgKHRoaXMudGVzdENoaWxkTmFtZWQoY2hpbGROYW1lKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjaGlsZE5hbWUpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuYWRkVGVzdENoaWxkKG5ldyBUZXN0V29ya2JlbmNoTW9kZWwodGhpcywgY2hpbGROYW1lKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlVGVzdENoaWxkKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0Q2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHRlc3RDaGlsZCwgdGhpcy50ZXN0Q2hpbGRyZW4sIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZE5hbWVkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCWZvciAoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCA6IHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJaWYgKHRlc3RDaGlsZC5nZXROYW1lKCkuZXF1YWxzKGNoaWxkTmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRlc3RDaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3REZXNjZW5kYW50TmFtZWQoU3RyaW5nIGRlc2NlbmRhbnROYW1lKSB7Ci0JCQlmb3IgKFRlc3RXb3JrYmVuY2hNb2RlbCB0ZXN0RGVzY2VuZGFudCA6IHRoaXMudGVzdENoaWxkcmVuKSB7Ci0JCQkJaWYgKHRlc3REZXNjZW5kYW50LmdldE5hbWUoKS5lcXVhbHMoZGVzY2VuZGFudE5hbWUpKSB7Ci0JCQkJCXJldHVybiB0ZXN0RGVzY2VuZGFudDsKLQkJCQl9Ci0JCQkJLy8gcmVjdXJzZS4uLgotCQkJCXRlc3REZXNjZW5kYW50ID0gdGVzdERlc2NlbmRhbnQudGVzdERlc2NlbmRhbnROYW1lZChkZXNjZW5kYW50TmFtZSk7Ci0JCQkJaWYgKHRlc3REZXNjZW5kYW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRlc3REZXNjZW5kYW50OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGRyZW5UbyhMaXN0PE5vZGU+IGNoaWxkcmVuKSB7Ci0JCQlzdXBlci5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJCWNoaWxkcmVuLmFkZEFsbCh0aGlzLnRlc3RDaGlsZHJlbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJCS8vIG5hbWVzIG11c3QgYmUgYWxsIGxvd2VyY2FzZS4uLgotCQkJZm9yIChpbnQgaSA9IHRoaXMubmFtZS5sZW5ndGgoKTsgaS0tID4gMDsgKSB7Ci0JCQkJY2hhciBjID0gdGhpcy5uYW1lLmNoYXJBdChpKTsKLQkJCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGMpICYmICEgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGMpKSB7Ci0JCQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQodGhpcy5idWlsZFByb2JsZW0oIk5BTUVfTVVTVF9CRV9MT1dFUkNBU0UiLCAzICx0aGlzLm5hbWUpKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCBleHRlbmRzIFRlc3RXb3JrYmVuY2hNb2RlbCB7Ci0JCXB1YmxpYyBSb290VGVzdFdvcmtiZW5jaE1vZGVsKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihudWxsLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCQlyZXR1cm4gTm9kZS5OVUxMX1ZBTElEQVRPUjsKLQkJfQotCX0KLQotfQotCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjZkY2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL25vZGUvSnB0VXRpbGl0eU5vZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5Tm9kZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU5vZGVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFic3RyYWN0Tm9kZVRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlOb2RlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZGJhZGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbXBvc2l0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLkFzeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLk11bHRpVGhyZWFkZWRUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCVByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsMTsKLQlTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwxOwotCUNvbW1hbmQgY29tbWFuZDE7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjE7Ci0KLQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDI7Ci0JU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsMjsKLQlDb21tYW5kIGNvbW1hbmQyOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIyOwotCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMSA9IG5ldyBQcmltYXJ5TW9kZWwxKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwxID0gbmV3IFNlY29uZGFyeU1vZGVsMSh0aGlzLnByaW1hcnlNb2RlbDEpOwotCQl0aGlzLmNvbW1hbmQxID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSh0aGlzLnNlY29uZGFyeU1vZGVsMSk7Ci0JCXRoaXMuc3luY2hyb25pemVyMSA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDIgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMiA9IG5ldyBTZWNvbmRhcnlNb2RlbDIodGhpcy5wcmltYXJ5TW9kZWwyKTsKLQkJdGhpcy5jb21tYW5kMiA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIodGhpcy5wcmltYXJ5TW9kZWwyLCB0aGlzLnNlY29uZGFyeU1vZGVsMik7Ci0JCXRoaXMuc3luY2hyb25pemVyMiA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMiwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RvcCgpOwotCQl0aGlzLnN5bmNocm9uaXplcjIuc3RvcCgpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnN5bmNocm9uaXplcjEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RvcCgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCi0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMuc3luY2hyb25pemVyMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMSk7Ci0JCS8vIHRoZSBhc3luYyBzeW5jaHJvbml6ZXIgZG9lcyBub3Qgc3luY2hyb25pemUgYXQgc3RhcnQtdXAKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg4KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RvcCgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCi0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMuc3luY2hyb25pemVyMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMuc3luY2hyb25pemVyMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVTdGFydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5zdGFydFN5bmNocm9uaXplcigpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRoaXMuc3luY2hyb25pemVyMS5zdG9wKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gcmUtc3RhcnQgc28gdGVhci1kb3duIHdvcmtzCi0JCXRoaXMuc3luY2hyb25pemVyMS5zdGFydCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDIuc2V0Q291bnQoNyk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLnByaW1hcnlNb2RlbDIuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQlhc3NlcnRFcXVhbHMoMjAsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTeW5jaHJvbml6ZXIgcyA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIobnVsbCwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCQlmYWlsKCJib2d1czogIiArIHMpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWROYW1lKCkgewotCQlTeW5jaHJvbml6ZXIgcyA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSwgInN5bmMiKTsKLQkJcy5zdGFydCgpOwotCQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yIGN0YyA9IChDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShzLCAiY29uc3VtZXJUaHJlYWRDb29yZGluYXRvciIpOwotCQlUaHJlYWQgdCA9IChUaHJlYWQpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGN0YywgInRocmVhZCIpOwotCQlhc3NlcnRFcXVhbHMoInN5bmMiLCB0LmdldE5hbWUoKSk7Ci0JCXMuc3RvcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNhbGxlZEJlZm9yZVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUNvbW1hbmQgY29tbWFuZCA9IG5ldyBTaW1wbGVDb21tYW5kKCk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCi0JCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBTaW1wbGVDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJvZ3VzQ29tbWFuZCBjb21tYW5kID0gbmV3IEJvZ3VzQ29tbWFuZCgpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0KLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQ29tcG9zaXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgZXguZ2V0RXhjZXB0aW9ucygpLmxlbmd0aCk7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCWFzc2VydEVxdWFscygyLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQm9ndXNDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb21tYW5kcyAqKioqKioqKioqCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJpdmF0ZSBmaW5hbCBTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMShTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsID0gc2Vjb25kYXJ5TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgcHJpbWFyeSBtb2RlbCAoc3ViY2xhc3MpIGhhcyB0byBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiAoc3VwZXJjbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMiBleHRlbmRzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSB7Ci0JCXByaXZhdGUgZmluYWwgUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWw7Ci0KLQkJcHVibGljIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMihQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcihzZWNvbmRhcnlNb2RlbCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJc3VwZXIuZXhlY3V0ZSgpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogdGhpcyBvYmplY3Qgd2lsbCBjYWxsIHRoZSBzeW5jaHJvbml6ZXIgd2hlbmV2ZXIgaXRzIGNvdW50IGNoYW5nZXMsCi0JICogYWxsb3dpbmcgaW50ZXJlc3RlZCBwYXJ0aWVzIHRvIHN5bmNocm9uaXplIHdpdGggdGhlIGNoYW5nZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyOwotCQlwcm90ZWN0ZWQgaW50IGNvdW50ID0gMjsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMSgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q291bnQoaW50IGNvdW50KSB7Ci0JCQlpZiAoY291bnQgIT0gdGhpcy5jb3VudCkgewotCQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQlpZiAoc3luY2hyb25pemVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhzeW5jaHJvbml6ZXIpOwotCQl9Ci0JCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydFN5bmNocm9uaXplcigpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0YXJ0KCk7ICAvLyB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24KLQkJfQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiY291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbW9kZWwgc3luY2hyb25pemVzIHdpdGggaXRzZWxmLCB0cmlnZ2VyaW5nIGEgcmVjdXJzaXZlIHN5bmNocm9uaXphdGlvbgotCSAqIHdpdGggdGhlIGNoYW5nZS4gV2hlbmV2ZXIgdGhlIFtpbmhlcml0ZWRdICdjb3VudCcgY2hhbmdlcywgJ2NvdW50UGx1czMnCi0JICogaXMgdXBkYXRlZCBhcHByb3ByaWF0ZWx5IGFuZCBhbm90aGVyIHN5bmNocm9uaXplIGlzIGluaXRpYXRlZCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDIgZXh0ZW5kcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgY291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDIoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb3VudFBsdXMzID0gdGhpcy5jb3VudCArIDM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudFBsdXMzOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHNldENvdW50UGx1czMoaW50IGNvdW50UGx1czMpIHsKLQkJCWlmIChjb3VudFBsdXMzICE9IHRoaXMuY291bnRQbHVzMykgewotCQkJCXRoaXMuY291bnRQbHVzMyA9IGNvdW50UGx1czM7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHN5bmNocm9uaXplIHdpdGggaXRzZWxmLCBzbyB0byBzcGVhawotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuc2V0Q291bnRQbHVzMyh0aGlzLmNvdW50ICsgMyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5jb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGRlcGVuZGVudCBvYmplY3QgdXBkYXRlcyBpdHMgJ2RvdWJsZUNvdW50JyB3aGVuZXZlciB0aGUKLQkgKiBQcmltYXJ5TW9kZWwxJ3MgJ2NvdW50JyBjaGFuZ2VzLCB2aWEgdGhlICdzeW5jaHJvbml6ZXInLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsOwotCQlwcm90ZWN0ZWQgaW50IGRvdWJsZUNvdW50ID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwxKFByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXRoaXMuZG91YmxlQ291bnQgPSB0aGlzLnByaW1hcnlNb2RlbC5nZXRDb3VudCgpICogMjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImRvdWJsZUNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnQpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMiBleHRlbmRzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGRvdWJsZUNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDIoUHJpbWFyeU1vZGVsMiBleHRlbmRlZFByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoZXh0ZW5kZWRQcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFByaW1hcnlNb2RlbDIgZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFByaW1hcnlNb2RlbDIpIHRoaXMucHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJc3VwZXIuc3luY2hyb25pemUoKTsKLQkJCWludCB0ZW1wID0gdGhpcy5nZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpLmdldENvdW50UGx1czMoKSAqIDI7Ci0JCQlpZiAodGhpcy5kb3VibGVDb3VudFBsdXMzICE9IHRlbXApIHsKLQkJCQl0aGlzLmRvdWJsZUNvdW50UGx1czMgPSB0ZW1wOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnRQbHVzMzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgZG91YmxlQ291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhY2YzMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9KcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5U3luY2hyb25pemVyc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbml6ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjdjNjdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN5bmNocm9uaXplclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyU3RhcnQoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclN5bmNocm9uaXplKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7ICAvLyBqdXN0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGJsb3cgdXA/Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJTdG9wKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJc3luY2hyb25pemVyLnN0b3AoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclRvU3RyaW5nKCkgewotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChzeW5jaHJvbml6ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NjAxYmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMKLQlleHRlbmRzIE11bHRpVGhyZWFkZWRUZXN0Q2FzZQotewotCVByaW1hcnlNb2RlbDEgcHJpbWFyeU1vZGVsMTsKLQlTZWNvbmRhcnlNb2RlbDEgc2Vjb25kYXJ5TW9kZWwxOwotCUNvbW1hbmQgY29tbWFuZDE7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjE7Ci0KLQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDI7Ci0JU2Vjb25kYXJ5TW9kZWwyIHNlY29uZGFyeU1vZGVsMjsKLQlDb21tYW5kIGNvbW1hbmQyOwotCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIyOwotCi0JcHVibGljIFN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxID0gbmV3IFByaW1hcnlNb2RlbDEoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDEgPSBuZXcgU2Vjb25kYXJ5TW9kZWwxKHRoaXMucHJpbWFyeU1vZGVsMSk7Ci0JCXRoaXMuY29tbWFuZDEgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKHRoaXMuc2Vjb25kYXJ5TW9kZWwxKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuY29tbWFuZDEpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMSk7Ci0KLQkJdGhpcy5wcmltYXJ5TW9kZWwyID0gbmV3IFByaW1hcnlNb2RlbDIoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDIgPSBuZXcgU2Vjb25kYXJ5TW9kZWwyKHRoaXMucHJpbWFyeU1vZGVsMik7Ci0JCXRoaXMuY29tbWFuZDIgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHRoaXMucHJpbWFyeU1vZGVsMiwgdGhpcy5zZWNvbmRhcnlNb2RlbDIpOwotCQl0aGlzLnN5bmNocm9uaXplcjIgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMik7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb24oKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zeW5jaHJvbml6ZXIxLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFydCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdG9wKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVTdGFydCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuc3RhcnRTeW5jaHJvbml6ZXIoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RvcCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZUNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDIuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5wcmltYXJ5TW9kZWwyLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygyMCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsICNzdG9wKCkgZnJvbSBhbm90aGVyIHRocmVhZC4KLQkgKiBWZXJpZnkgdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuCi0JICogVmVyaWZ5IHRoZSBjYWxsIHRvICNzdG9wKCkgZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZSBwZW5kaW5nCi0JICogc3luY2hyb25pemF0aW9uIGlzIGNvbXBsZXRlIChtdXN0IHNldCB7QGxpbmsgI0RFQlVHfSB0byB0cnVlIGFuZAotCSAqIGxvb2sgYXQgdGhlIGNvbnNvbGUpLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spOwotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcykKLQkgKiAxIC0gInN5bmMiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgUHJpbWFyeU1vZGVsMS5zZXRDb3VudChpbnQpCi0JICogICAgICB3aGljaCB0cmlnZ2VycyBjYWxsIHRvIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gb2YgU2Vjb25kYXJ5TW9kZWwgKHdoaWNoIHdpbGwgcnVuIGZvciAyIHRpY2tzOwotCSAqICAgICAgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDMpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCBzeW5jaHJvbml6YXRpb24gaXMgY29tcGxldGUKLQkgKiAzIC0gc3luY2hyb25pemF0aW9uIGNvbXBsZXRlcyBmaXJzdCBleGVjdXRpb24gYW5kIHNob3VsZCBzdG9wOwotCSAqICAgICAgInN0b3AiIHRocmVhZCBzaG91bGQgcnVuIHRvIGNvbXBsZXRpb24gb25jZSB0aGUgc3luY2hyb25pemF0aW9uIGhhcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhbGxTdG9wRnJvbUFub3RoZXJUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nKCI9PT09PSIgKyB0aGlzLmdldE5hbWUoKSArICI9PT09PSIpOwotCQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDMgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQkvLyBhIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJU2Vjb25kYXJ5TW9kZWwzIHNlY29uZGFyeU1vZGVsMyA9IG5ldyBTZWNvbmRhcnlNb2RlbDMocHJpbWFyeU1vZGVsMyk7Ci0JCUNvbW1hbmQgY29tbWFuZDMgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHByaW1hcnlNb2RlbDMsIHNlY29uZGFyeU1vZGVsMyk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIzID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQzKTsKLQkJLy8gYW5vdGhlciBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCXByaW1hcnlNb2RlbDMuc2V0U3luY2hyb25pemVyKHN5bmNocm9uaXplcjMpOwotCQlzZWNvbmRhcnlNb2RlbDMuc2V0VGlja3MoMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0KLQkJVGhyZWFkIHN5bmNUaHJlYWQgPSB0aGlzLmJ1aWxkVHJpZ2dlclN5bmNocm9uaXplVGhyZWFkKHByaW1hcnlNb2RlbDMsIDEpOwotCQlUaHJlYWQgc3RvcFRocmVhZCA9IHRoaXMuYnVpbGRTdG9wVGhyZWFkKHN5bmNocm9uaXplcjMsIDIpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0KLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN5bmNUaHJlYWQuam9pbigpOwotCi0JCS8vICdkb3VibGVDb3VudCcgaXMgc3luY2hyb25pemVkOyBidXQgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBzdG9wcGVkCi0JCS8vIHdoaWxlIHRoYXQgaXMgaGFwcGVuaW5nIChieSB0aGUgJ3N0b3BUaHJlYWQnKSwgc28gJ2RvdWJsZUNvdW50UGx1czMnCi0JCS8vIGRvZXMgbm90IGdldCBzeW5jaHJvbml6ZWQKLQkJYXNzZXJ0RXF1YWxzKDcsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyB0aGlzIGRvZXMgbm90IGdldCB1cGRhdGVkIGJlY2F1c2UgaXQgd291bGQndmUgYmVlbiB1cGRhdGVkIGJ5IHRoZQotCQkvLyByZWN1cnNpdmUgY2FsbCB0byAjc3luY2hyb25pemUoKSwgYnV0IGJ5IHRoYXQgdGltZSAjc3RvcCgpIGhhZCBiZWVuIGNhbGxlZAotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkVHJpZ2dlclN5bmNocm9uaXplVGhyZWFkKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVSdW5uYWJsZShwcmltYXJ5TW9kZWwsIHRpY2tzKSwgInRyaWdnZXIgc3luYyIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmlnZ2VyU3luY2hyb25pemVSdW5uYWJsZShmaW5hbCBQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCXByaW1hcnlNb2RlbC5zZXRDb3VudCg3KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFN0b3BUaHJlYWQoU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkU3RvcFJ1bm5hYmxlKHN5bmNocm9uaXplciwgdGlja3MpLCAic3RvcCIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdG9wUnVubmFibGUoZmluYWwgU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCWxvZygiU1RPUCB0aHJlYWQgU3luY2hyb25pemVyLnN0b3AoKSIpOwotCQkJCXN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQkJbG9nKCJTVE9QIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ29kZSBjbG9uZWQgZnJvbSB7QGxpbmsgI3Rlc3RTdG9wQ2FsbGVkRnJvbUFub3RoZXJUaHJlYWQoKX0uCi0JICogCi0JICogSW50ZXJydXB0IHRoZSAic3RvcCIgdGhyZWFkIHdoaWxlIGl0IGlzIHdhaXRpbmcgZm9yIHRoZSAic3luY2giIHRocmVhZCB0byBmaW5pc2guCi0JICogVmVyaWZ5IHRoYXQgbm8gZnVydGhlciBzeW5jaHJvbml6YXRpb25zIG9jY3VyLgotCSAqIFZlcmlmeSB0aGUgY2FsbCB0byAjc3RvcCgpIHJldHVybnMgKmJlZm9yZSoKLQkgKiBzeW5jaHJvbml6YXRpb24gaXMgY29tcGxldGUgKG11c3Qgc2V0IHtAbGluayAjREVCVUd9IHRvIHRydWUgYW5kCi0JICogbG9vayBhdCB0aGUgY29uc29sZSkuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljayk7Ci0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKTsKLQkgKiAgICAgIHN0YXJ0ICJpbnRlcnJ1cHQiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMyB0aWNrcykKLQkgKiAxIC0gInN5bmMiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgUHJpbWFyeU1vZGVsMS5zZXRDb3VudChpbnQpCi0JICogICAgICB3aGljaCB0cmlnZ2VycyBjYWxsIHRvIFN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpIHRvIGJlZ2luCi0JICogICAgICBzeW5jaHJvbml6YXRpb24gb2YgU2Vjb25kYXJ5TW9kZWwgKHdoaWNoIHdpbGwgcnVuIGZvciAzIHRpY2tzOwotCSAqICAgICAgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDQpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCBpdCBpcyBpbnRlcnJ1cHRlZAotCSAqIDMgLSAiaW50ZXJydXB0IiB0aHJlYWQgd2FrZXMgdXAgYW5kIGludGVycnVwdHMgInN0b3AiIHRocmVhZDsKLQkgKiAgICAgICBib3RoIHdpbGwgcnVuIHRvIGNvbXBsZXRpb24gYXQgdGhhdCBwb2ludAotCSAqIDQgLSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVzIGZpcnN0IGV4ZWN1dGlvbiBhbmQgc2hvdWxkIHN0b3Agc2luY2UgdGhlCi0JICogICAgICAic3RvcCIgdGhyZWFkLCBiZWZvcmUgaXQgd2FzIGludGVycnVwdGVkLCB0b2xkIHRoZSAic3luY2giIHRocmVhZCB0byBzdG9wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEludGVycnVwdFN0b3BUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nKCI9PT09PSIgKyB0aGlzLmdldE5hbWUoKSArICI9PT09PSIpOwotCQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDMgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQkvLyBhIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJU2Vjb25kYXJ5TW9kZWwzIHNlY29uZGFyeU1vZGVsMyA9IG5ldyBTZWNvbmRhcnlNb2RlbDMocHJpbWFyeU1vZGVsMyk7Ci0JCUNvbW1hbmQgY29tbWFuZDMgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHByaW1hcnlNb2RlbDMsIHNlY29uZGFyeU1vZGVsMyk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIzID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQzKTsKLQkJLy8gYW5vdGhlciBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCXByaW1hcnlNb2RlbDMuc2V0U3luY2hyb25pemVyKHN5bmNocm9uaXplcjMpOwotCQlzZWNvbmRhcnlNb2RlbDMuc2V0VGlja3MoMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0KLQkJVGhyZWFkIHN5bmNUaHJlYWQgPSB0aGlzLmJ1aWxkVHJpZ2dlclN5bmNocm9uaXplVGhyZWFkKHByaW1hcnlNb2RlbDMsIDEpOwotCQlUaHJlYWQgc3RvcFRocmVhZCA9IHRoaXMuYnVpbGRTdG9wVGhyZWFkKHN5bmNocm9uaXplcjMsIDIpOwotCQlUaHJlYWQgaW50ZXJydXB0VGhyZWFkID0gdGhpcy5idWlsZEludGVycnVwdFRocmVhZChzdG9wVGhyZWFkLCAzKTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN0b3BUaHJlYWQuc3RhcnQoKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCQlpbnRlcnJ1cHRUaHJlYWQuc3RhcnQoKTsKLQotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3luY1RocmVhZC5qb2luKCk7Ci0JCWludGVycnVwdFRocmVhZC5qb2luKCk7Ci0KLQkJLy8gJ2RvdWJsZUNvdW50JyBpcyBzeW5jaHJvbml6ZWQ7IGJ1dCB0aGUgc3luY2hyb25pemF0aW9uIGlzIHN0b3BwZWQKLQkJLy8gd2hpbGUgdGhhdCBpcyBoYXBwZW5pbmcgKGJ5IHRoZSAnc3RvcFRocmVhZCcpLCBzbyAnZG91YmxlQ291bnRQbHVzMycKLQkJLy8gZG9lcyBub3QgZ2V0IHN5bmNocm9uaXplZAotCQlhc3NlcnRFcXVhbHMoNywgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHRoaXMgZG9lcyBub3QgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBpdCB3b3VsZCd2ZSBiZWVuIHVwZGF0ZWQgYnkgdGhlCi0JCS8vIHJlY3Vyc2l2ZSBjYWxsIHRvICNzeW5jaHJvbml6ZSgpLCBidXQgYnkgdGhhdCB0aW1lICNzdG9wKCkgaGFkIGJlZW4gY2FsbGVkCi0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29kZSBjbG9uZWQgZnJvbSB7QGxpbmsgI3Rlc3RTdG9wQ2FsbGVkRnJvbUFub3RoZXJUaHJlYWQoKX0uCi0JICogCi0JICogSW50ZXJydXB0IHRoZSAic3luYyIgdGhyZWFkIHdoaWxlIGl0IGlzIHN5bmNocm9uaXppbmcsIGN1dHRpbmcgc2hvcnQgdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKiBWZXJpZnkgdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuCi0JICogVmVyaWZ5IHRoZSBjYWxsIHRvICNzdG9wKCkgZG9lcyBub3QgcmV0dXJuIHVudGlsIHRoZSBwZW5kaW5nCi0JICogc3luY2hyb25pemF0aW9uIGlzIHN0b3BzIGFmdGVyIGl0IGlzIGludGVycnVwdGVkIChtdXN0IHNldCB7QGxpbmsgI0RFQlVHfSB0byB0cnVlIGFuZAotCSAqIGxvb2sgYXQgdGhlIGNvbnNvbGUpLgotCSAqIAotCSAqIHRpY2tzOgotCSAqIDAgLSBzdGFydCAic3luYyIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAxIHRpY2spCi0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKQotCSAqICAgICAgc3RhcnQgImludGVycnVwdCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAzIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBQcmltYXJ5TW9kZWwxLnNldENvdW50KGludCkKLQkgKiAgICAgIHdoaWNoIHRyaWdnZXJzIGNhbGwgdG8gU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiBvZiBTZWNvbmRhcnlNb2RlbCAod2hpY2ggd2lsbCBydW4gZm9yIDQgdGlja3M7Ci0JICogICAgICBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgNSkKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIHRoZSBzeW5jaHJvbml6YXRpb24gaXMgaW50ZXJydXB0ZWQKLQkgKiAzIC0gImludGVycnVwdCIgdGhyZWFkIHdha2VzIHVwIGFuZCBpbnRlcnJ1cHRzICJzeW5jIiB0aHJlYWQ7Ci0JICogICAgICB0aGUgImludGVycnVwdCIgdGhyZWFkIHJ1bnMgdG8gY29tcGxldGlvbiwgd2hpbGUgdGhlICJzeW5jIiB0aHJlYWQga2VlcHMKLQkgKiAgICAgIGdvaW5nIGZvciBhbm90aGVyIHRpY2sgYmVmb3JlIGl0IHN0b3BzIGluICJtaWQtc3luY2hyb25pemUiCi0JICogNCAtIHRoZSAic3luYyIgdGhyZWFkIGFja25vd2xlZGdlcyB0aGUgaW50ZXJydXB0IGFuZCBzdG9wcyBpbgotCSAqICAgICAgIm1pZC1zeW5jaHJvbml6ZSI7IGl0IHdpbGwgc3RvcCBzaW5jZSB0aGUgInN0b3AiIHRocmVhZCB0b2xkIGl0IHRvIGF0IHRpY2sgMjsKLQkgKiAgICAgIHRoZSAic3luYyIgYW5kICJzdG9wIiB0aHJlYWRzIHJ1biB0byBjb21wbGV0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEludGVycnVwdFN5bmNUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbG9nKCI9PT09PSIgKyB0aGlzLmdldE5hbWUoKSArICI9PT09PSIpOwotCQlQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDMgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQkvLyBhIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJU2Vjb25kYXJ5TW9kZWwzIHNlY29uZGFyeU1vZGVsMyA9IG5ldyBTZWNvbmRhcnlNb2RlbDMocHJpbWFyeU1vZGVsMyk7Ci0JCUNvbW1hbmQgY29tbWFuZDMgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKHByaW1hcnlNb2RlbDMsIHNlY29uZGFyeU1vZGVsMyk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIzID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQzKTsKLQkJLy8gYW5vdGhlciBzeW5jaHJvbml6ZSB3aWxsIG9jY3VyIGhlcmU6Ci0JCXByaW1hcnlNb2RlbDMuc2V0U3luY2hyb25pemVyKHN5bmNocm9uaXplcjMpOwotCQlzZWNvbmRhcnlNb2RlbDMuc2V0VGlja3MoNCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0KLQkJVGhyZWFkIHN5bmNUaHJlYWQgPSB0aGlzLmJ1aWxkVHJpZ2dlclN5bmNocm9uaXplVGhyZWFkKHByaW1hcnlNb2RlbDMsIDEpOwotCQlUaHJlYWQgc3RvcFRocmVhZCA9IHRoaXMuYnVpbGRTdG9wVGhyZWFkKHN5bmNocm9uaXplcjMsIDIpOwotCQlUaHJlYWQgaW50ZXJydXB0VGhyZWFkID0gdGhpcy5idWlsZEludGVycnVwdFRocmVhZChzeW5jVGhyZWFkLCAzKTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN0b3BUaHJlYWQuc3RhcnQoKTsKLQkJc3luY1RocmVhZC5zdGFydCgpOwotCQlpbnRlcnJ1cHRUaHJlYWQuc3RhcnQoKTsKLQotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3luY1RocmVhZC5qb2luKCk7Ci0JCWludGVycnVwdFRocmVhZC5qb2luKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDcsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudFBsdXMzKCkpOwotCi0JCS8vIG5vbmUgb2YgdGhlIHNlY29uZGFyeSBtb2RlbCBpcyBzeW5jaHJvbml6ZWQgYmVjYXVzZSB0aGUgc3luY2hyb25pemUoKQotCQkvLyBtZXRob2Qgd2FzIGludGVycnVwdGVkIGJlZm9yZSBhbnkgc3luY2hyb25pemF0aW9uIGhhZCBvY2N1cnJlZAotCQlhc3NlcnRFcXVhbHMoNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkSW50ZXJydXB0VGhyZWFkKFRocmVhZCB0aHJlYWQsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZEludGVycnVwdFJ1bm5hYmxlKHRocmVhZCwgdGlja3MpLCAiaW50ZXJydXB0Iik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEludGVycnVwdFJ1bm5hYmxlKGZpbmFsIFRocmVhZCB0aHJlYWQsIGZpbmFsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlsb2coIklOVEVSUlVQVCB0aHJlYWQgVGhyZWFkLmludGVycnVwdCgpIik7Ci0JCQkJdGhyZWFkLmludGVycnVwdCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENhbGwgI3N0b3AoKSBkdXJpbmcgYSBsb25nLXJ1bm5pbmcgInN5bmNocm9uaXplIjsgdGhlbiBjYWxsICNzdGFydCgpCi0JICogd2hpbGUgdGhlICNzdG9wKCkgaXMgd2FpdGluZyBmb3IgdGhlICJzeW5jaHJvbml6ZSIgdG8gY29tcGxldGUuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljaykKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpCi0JICogICAgICBzdGFydCAic3RhcnQiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMyB0aWNrcykKLQkgKiAxIC0gInN5bmMiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiAod2hpY2ggd2lsbCBydW4gZm9yIDMgdGlja3M7IGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayA0KQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBmaW5pc2hlZCAoaS5lLiB0aWNrIDQpCi0JICogMyAtICJzdGFydCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RhcnQoKQotCSAqICAgICAgd2hpY2ggd2lsbCB0aHJvdyBhbiBleGNlcHRpb24KLQkgKiA0IC0gdGhlICJzeW5jIiB0aHJlYWQgZmluaXNoZXMgZXhlY3V0aW9uOwotCSAqICAgICAgaXQgd2lsbCBzdG9wIHNpbmNlIHRoZSAic3RvcCIgdGhyZWFkIHRvbGQgaXQgdG8gYXQgdGljayAyOwotCSAqICAgICAgdGhlICJzeW5jIiBhbmQgInN0b3AiIHRocmVhZHMgcnVuIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsbFN0YXJ0RHVyaW5nU3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCURlbGF5Q29tbWFuZCBjb21tYW5kID0gdGhpcy5idWlsZERlbGF5Q29tbWFuZCgzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcihjb21tYW5kKTsKLQkJc3luY2hyb25pemVyLnN0YXJ0KCk7Ci0KLQkJVGhyZWFkIHN5bmNUaHJlYWQgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVUaHJlYWQoc3luY2hyb25pemVyLCAxKTsKLQkJVGhyZWFkIHN0b3BUaHJlYWQgPSB0aGlzLmJ1aWxkU3RvcFRocmVhZChzeW5jaHJvbml6ZXIsIDIpOwotCQlTeW5jaHJvbml6ZWRCb29sZWFuIGV4Q2F1Z2h0ID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oZmFsc2UpOwotCQlUaHJlYWQgc3RhcnRUaHJlYWQgPSB0aGlzLmJ1aWxkU3RhcnRUaHJlYWQoc3luY2hyb25pemVyLCAzLCBleENhdWdodCk7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0JCXN0b3BUaHJlYWQuc3RhcnQoKTsKLQkJc3RhcnRUaHJlYWQuc3RhcnQoKTsKLQotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQkJc3RvcFRocmVhZC5qb2luKCk7Ci0JCXN0YXJ0VGhyZWFkLmpvaW4oKTsKLQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWxheUNvbW1hbmQgYnVpbGREZWxheUNvbW1hbmQoaW50IHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgRGVsYXlDb21tYW5kKHRpY2tzKTsKLQl9Ci0KLQljbGFzcyBEZWxheUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJZmluYWwgbG9uZyB0aWNrczsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJRGVsYXlDb21tYW5kKGludCB0aWNrcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGlja3MgPSB0aWNrczsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciB0aGUgZmlyc3QgY2FsbCAoZnJvbSAjc3RhcnQoKSkKLQkJCWlmICh0aGlzLmZpcnN0KSB7Ci0JCQkJbG9nKCJFWEVDIGZpcnN0Iik7Ci0JCQkJdGhpcy5maXJzdCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWxvZygiRVhFQyBzdGFydCAiICsgdGhpcy5jb3VudCk7Ci0JCQlUZXN0VG9vbHMuc2xlZXAodGhpcy50aWNrcyAqIFRJQ0spOwotCQkJbG9nKCJFWEVDIHN0b3AgIiArIHRoaXMuY291bnQpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFN0YXJ0VGhyZWFkKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGxvbmcgdGlja3MsIFN5bmNocm9uaXplZEJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFN0YXJ0UnVubmFibGUoc3luY2hyb25pemVyLCB0aWNrcywgZXhDYXVnaHQpLCAic3RhcnQiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhcnRSdW5uYWJsZShmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzLCBmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIGV4Q2F1Z2h0KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJTVEFSVCB0aHJlYWQgU3luY2hyb25pemVyLnN0YXJ0KCkiKTsKLQkJCQl0cnkgewotCQkJCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQuc2V0VHJ1ZSgpOwotCQkJCQlsb2coIlNUQVJUIHRocmVhZCBleGNlcHRpb24iKTsKLQkJCQl9Ci0JCQkJbG9nKCJTVEFSVCB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkU3luY2hyb25pemVUaHJlYWQoU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkU3luY2hyb25pemVSdW5uYWJsZShzeW5jaHJvbml6ZXIsIHRpY2tzKSwgInN5bmNocm9uaXplIik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN5bmNocm9uaXplUnVubmFibGUoZmluYWwgU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCWxvZygiU1lOQyB0aHJlYWQgU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkiKTsKLQkJCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIHN0b3AiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJvZ3VzQ29tbWFuZCBjb21tYW5kID0gbmV3IEJvZ3VzQ29tbWFuZCgpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQotCQl0cnkgewotCQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIHdlIHVzZWQgdG8gaGFuZyBoZXJlLCBiZWZvcmUgd2UgYmVnYW4gaGFuZGxpbmcgZXhjZXB0aW9ucwotCQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoQ29tcG9zaXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZXguZ2V0RXhjZXB0aW9ucygpLmxlbmd0aCk7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCS8vIHN0YXJ0ICsgc3luY2hyb25pemUKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBCb2d1c0NvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCWlmICh0aGlzLmNvdW50ID4gMSkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGNvbW1hbmRzICoqKioqKioqKioKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwcml2YXRlIGZpbmFsIFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwgPSBzZWNvbmRhcnlNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHRoZSBwcmltYXJ5IG1vZGVsIChzdWJjbGFzcykgaGFzIHRvIHN5bmNocm9uaXplIHdpdGggaXRzZWxmIChzdXBlcmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyIGV4dGVuZHMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIHsKLQkJcHJpdmF0ZSBmaW5hbCBQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKHNlY29uZGFyeU1vZGVsKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaW1hcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiB0aGlzIG9iamVjdCB3aWxsIGNhbGwgdGhlIHN5bmNocm9uaXplciB3aGVuZXZlciBpdHMgY291bnQgY2hhbmdlcywKLQkgKiBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JCXByb3RlY3RlZCBpbnQgY291bnQgPSAyOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwxKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCAhPSB0aGlzLmNvdW50KSB7Ci0JCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCWlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKHN5bmNocm9uaXplcik7Ci0JCX0KLQkJCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemVyKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIHRoaXMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJjb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtb2RlbCBzeW5jaHJvbml6ZXMgd2l0aCBpdHNlbGYsIHRyaWdnZXJpbmcgYSByZWN1cnNpdmUgc3luY2hyb25pemF0aW9uCi0JICogd2l0aCB0aGUgY2hhbmdlLiBXaGVuZXZlciB0aGUgW2luaGVyaXRlZF0gJ2NvdW50JyBjaGFuZ2VzLCAnY291bnRQbHVzMycKLQkgKiBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFub3RoZXIgc3luY2hyb25pemUgaXMgaW5pdGlhdGVkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMiBleHRlbmRzIFByaW1hcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBjb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMigpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvdW50UGx1czMgPSB0aGlzLmNvdW50ICsgMzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50UGx1czM7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRQbHVzMyhpbnQgY291bnRQbHVzMykgewotCQkJaWYgKGNvdW50UGx1czMgIT0gdGhpcy5jb3VudFBsdXMzKSB7Ci0JCQkJdGhpcy5jb3VudFBsdXMzID0gY291bnRQbHVzMzsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYsIHNvIHRvIHNwZWFrCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5zZXRDb3VudFBsdXMzKHRoaXMuY291bnQgKyAzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgY291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIFRoaXMgZGVwZW5kZW50IG9iamVjdCB1cGRhdGVzIGl0cyAnZG91YmxlQ291bnQnIHdoZW5ldmVyIHRoZQotCSAqIFByaW1hcnlNb2RlbDEncyAnY291bnQnIGNoYW5nZXMsIHZpYSB0aGUgJ3N5bmNocm9uaXplcicuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgZmluYWwgUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWw7Ci0JCXByb3RlY3RlZCBpbnQgZG91YmxlQ291bnQgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDEoUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJCXRoaXMuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5kb3VibGVDb3VudCA9IHRoaXMucHJpbWFyeU1vZGVsLmdldENvdW50KCkgKiAyOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiZG91YmxlQ291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwyIGV4dGVuZHMgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgZG91YmxlQ291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMihQcmltYXJ5TW9kZWwyIGV4dGVuZGVkUHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcihleHRlbmRlZFByaW1hcnlNb2RlbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUHJpbWFyeU1vZGVsMiBnZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpIHsKLQkJCXJldHVybiAoUHJpbWFyeU1vZGVsMikgdGhpcy5wcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJaW50IHRlbXAgPSB0aGlzLmdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkuZ2V0Q291bnRQbHVzMygpICogMjsKLQkJCWlmICh0aGlzLmRvdWJsZUNvdW50UGx1czMgIT0gdGVtcCkgewotCQkJCXRoaXMuZG91YmxlQ291bnRQbHVzMyA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudFBsdXMzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBkb3VibGVDb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEFsbG93IHRoZSB0aW1lIHJlcXVpcmVkIHRvIHN5bmNocm9uaXplIHRvIGJlIHNwZWNpZmllZC4KLQkgKiBBIChub24tZGVsYXllZCkgc3luY2hyb25pemUgd2lsbCBleGVjdXRlIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvCi0JICogY2hhbmdlIHRoZSB0aWNrIGNvdW50LiAoSXQgaXMgY2FsbGVkIGluIHRoZSBTZWNvbmRhcnlNb2RlbDEgY29uc3RydWN0b3IuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwzIGV4dGVuZHMgU2Vjb25kYXJ5TW9kZWwyIHsKLQkJcHJpdmF0ZSBsb25nIGRlbGF5ID0gMDsKLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMyhQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIocHJpbWFyeU1vZGVsKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRpY2tzKGxvbmcgdGlja3MpIHsKLQkJCXRoaXMuZGVsYXkgPSB0aWNrcyAqIFRJQ0s7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQkvLyBkb24ndCBsb2cgYW55dGhpbmcgdW50aWwgJ3RpY2tzJyBpcyBzZXQKLQkJCWlmICh0aGlzLmRlbGF5ID09IDApIHsKLQkJCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJfSBlbHNlIHsKLQkJCQlsb2coIlNZTkMgdGhyZWFkIHN0YXJ0IC0gc3luYyBkdXJhdGlvbiB3aWxsIGJlOiAiICsgKHRoaXMuZGVsYXkgLyBUSUNLKSArICIgdGlja3MiKTsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAodGhpcy5kZWxheSk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJbG9nKCJTWU5DIHRocmVhZCBpbnRlcnJ1cHRlZCIpOwotCQkJCQlUZXN0VG9vbHMuc2xlZXAoVElDSyk7Ci0JCQkJCXJldHVybjsgIC8vIHN0b3Agc3luY2hyb25pemUgKGkuZS4gZG9uJ3QgY2FsbCBzdXBlci5zeW5jaHJvbml6ZSgpKQotCQkJCX0KLQkJCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJCWxvZygiU1lOQyB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB7Ci0JCWFzc2VydEZhbHNlKERFQlVHKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChERUJVRykgewotCQkJbG9nXyhtZXNzYWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbG9nXyhTdHJpbmcgbWVzc2FnZSkgewotCQlTeXN0ZW0ub3V0LnByaW50KHRpbWVzdGFtcCgpKTsKLQkJU3lzdGVtLm91dC5wcmludCgnICcpOwotCQlTeXN0ZW0ub3V0LnByaW50KG1lc3NhZ2UpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aW1lc3RhbXAoKSB7Ci0JCXJldHVybiBTdHJpbmcudmFsdWVPZigoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgJSAxMDAwMCkgLyAxMDAwZik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3Rlc3QueG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ2MzVmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDY0Y2JiLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDcyMWE0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhYmFjZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDY0YzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUiIAotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iCi0gICAgICAgICB2ZXJzaW9uPSIyLjMuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIKLSAgICAgICAgIHZlcnNpb249IjIuMy4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kYndzIgotICAgICAgICAgdmVyc2lvbj0iMi4zLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRid3MuYnVpbGRlciIKLSAgICAgICAgIHZlcnNpb249IjIuMy4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmOTNkMC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzZTJlYi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOWE1My4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzgzOWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYzI4NTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOWRhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOWE1My4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJhOTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxOTQ1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZmNmYmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydCBTREsgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NTdiYi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YxZDliLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk5MDZkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmMGQxYi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGJmNDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFmMTk0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2RhZWJmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3OGVkNy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFmMTk0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2RhZWJmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQ0MTguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRjODI2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI5MjQ1MS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0IFNESyAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWNmZDQwLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2UxNDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTkwNmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWZmMzQ0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlNTJhNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM0YjY3Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU291cmNlIC0gSkFYQiBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTk1MjliLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+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+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YzQ5MTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYTNlZjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ZWU5ZTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzIwNzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2UgLSBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAxMC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDkxNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZGVlNy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThmNzllLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIENvcmUgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBKQVhCIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGViZWUwLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBlMTE0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmNjBiZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTY3MmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmNzM0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU0RLIC0gSkFYQiBTdXBwb3J0IFNESyAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZGRhZDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3MzFhYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMTZmMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwN2Q0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjFlMjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyMGUzYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YWU5MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjlhNTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzMmM4My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KYXZhU0UtMS42Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU3YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Y2M2ZmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKYW4gMzEgMTQ6NTE6MTUgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS42Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS42CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzk1ZjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRid3MuYnVpbGRlcjtidW5kbGUtdmVyc2lvbj0iWzIuMy4wLDMuMC4wKSIsCi0gamF2YXgud3NkbDtidW5kbGUtdmVyc2lvbj0iWzEuNi4yLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA2NDFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS42Ci1qYXZhY1RhcmdldD0xLjYKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNTM3ZmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBTdXBwb3J0IC0gV2ViIFNlcnZpY2VzIEdlbmVyYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL01haW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZmNDQ1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vTWFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5JTkZPOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU1BhY2thZ2VyLkFyY2hpdmVVc2UuaWdub3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgamF2YXgud3NkbC5XU0RMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4uaW50ZXJuYWwuSnB0RGJ3c0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MVW5tYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlck1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXJNb2RlbFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTUGFja2FnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5FY2xpcHNlUGFja2FnZXI7Ci0KLS8qKgotICogIEdlbmVyYXRlIERCV1MgY29udGVudAotICogIAotICogQ3VycmVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgotICogICAgIFstYnVpbGRlckZpbGUgZGJ3cy1idWlsZGVyLnhtbF0gLSBzcGVjaWZpZXMgc291cmNlIGJ1aWxkZXIgZmlsZQotICogICAgIFstc3RhZ2VEaXIgLlxPdXRwdXRfRGlyXSAtIHNwZWNpZmllcyBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLSAqICAgICBbLXBhY2thZ2VBcyBlY2xpcHNlXSAtIHNwZWNpZmllcyB0aGUgc291cmNlIHBhY2thZ2UKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIFN0cmluZyBidWlsZGVyRmlsZTsKLQlwcml2YXRlIFN0cmluZyBzdGFnZURpcjsKLQlwcml2YXRlIFN0cmluZyBwYWNrYWdlQXM7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotCi0JCURCV1NCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgREJXU0J1aWxkZXIoKTsKLQotICAgIAlEQldTQnVpbGRlck1vZGVsIG1vZGVsID0gdGhpcy5idWlsZEJ1aWxkZXJNb2RlbCh0aGlzLmJ1aWxkZXJGaWxlKTsKLQkJaWYobW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy5sb2dNZXNzYWdlKElORk8sIEpwdERid3NDb3JlTWVzc2FnZXMuTk9fR0VORVJBVElPTl9QRVJGT1JNRUQpOwotCSAgICAgICAgcmV0dXJuOwotCQl9Ci0KLSAgICAgICAgYnVpbGRlci5zZXRQcm9wZXJ0aWVzKG1vZGVsLnByb3BlcnRpZXMpOwotICAgICAgICBidWlsZGVyLnNldE9wZXJhdGlvbnMobW9kZWwub3BlcmF0aW9ucyk7Ci0KLSAgICAgICAgaWYoICEgdGhpcy5qZGJjRHJpdmVySXNPbkNsYXNzcGF0aChidWlsZGVyLmdldERyaXZlcigpKSkgewotICAgICAgICAJcmV0dXJuOwotICAgICAgICB9Ci0JCQotICAgICAgICBEQldTUGFja2FnZXIgcGFja2FnZXIgPSB0aGlzLmJ1aWxkRWNsaXBzZVBhY2thZ2VyKCk7Ci0gICAgICAgIAotICAgIAl0aGlzLmluaXRpYWxpemVQYWNrYWdlcihwYWNrYWdlciwgYnVpbGRlciwgdGhpcy5idWlsZFN0YWdlRGlyKHRoaXMuc3RhZ2VEaXIpKTsKLSAgICAJYnVpbGRlci5zZXRQYWNrYWdlcihwYWNrYWdlcik7Ci0gICAgCQotICAgICAgICB0cnkgewotCQkJYnVpbGRlci5zdGFydCgpOwotCQl9Ci0JCWNhdGNoKFdTRExFeGNlcHRpb24gZSkgewotCQkJdGhpcy5sb2dNZXNzYWdlKFNFVkVSRSwgSnB0RGJ3c0NvcmVNZXNzYWdlcy5XU0RMX0VYQ0VQVElPTiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotCQl9Ci0JCWNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gQ2xlYW4tdXAgU3RhZ2UgZGlyLiA/Ci0JCQl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fRkFJTEVELCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgcmV0dXJuOwotCQl9Ci0JCXRoaXMubG9nTWVzc2FnZShJTkZPLCBKcHREYndzQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fQ09NUExFVEVEKTsKLSAgICAgICAgcmV0dXJuOwotCi0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCQkKLSAgICAJdGhpcy5idWlsZGVyRmlsZSA9IHRoaXMuZ2V0QXJndW1lbnRCdWlsZGVyRmlsZShhcmdzKTsKLSAgICAJdGhpcy5zdGFnZURpciA9IHRoaXMuZ2V0QXJndW1lbnRTdGFnZURpcihhcmdzKTsKLSAgICAJdGhpcy5wYWNrYWdlQXMgPSB0aGlzLmdldEFyZ3VtZW50UGFja2FnZUFzKGFyZ3MpOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldEFyZ3VtZW50RGVidWdNb2RlKGFyZ3MpOwotCX0KLQkgICAgCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVQYWNrYWdlcihEQldTUGFja2FnZXIgcGFja2FnZXIsIERCV1NCdWlsZGVyIGJ1aWxkZXIsIEZpbGUgc3RhZ2VEaXIpIHsKLQotICAgICAgICBwYWNrYWdlci5zZXREQldTQnVpbGRlcihidWlsZGVyKTsKLSAgICAgICAgcGFja2FnZXIuc2V0QXJjaGl2ZVVzZShpZ25vcmUpOwotICAgICAgICBwYWNrYWdlci5zZXRBZGRpdGlvbmFsQXJncyhudWxsKTsKLSAgICAgICAgcGFja2FnZXIuc2V0U3RhZ2VEaXIoc3RhZ2VEaXIpOwotICAgICAgICBwYWNrYWdlci5zZXRTZXNzaW9uc0ZpbGVOYW1lKGJ1aWxkZXIuZ2V0U2Vzc2lvbnNGaWxlTmFtZSgpKTsKLQl9Ci0gICAgCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIGJ1aWxkQnVpbGRlck1vZGVsKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQkJCi0gICAgCUZpbGUgYnVpbGRlckZpbGUgPSB0aGlzLmdldEJ1aWxkZXJGaWxlKGJ1aWxkZXJGaWxlTmFtZSk7Ci0JCXJldHVybiB0aGlzLnVubWFyc2hhbChidWlsZGVyRmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIHVubWFyc2hhbChGaWxlIGJ1aWxkZXJGaWxlKSB7Ci0gICAgICAgIGlmKChidWlsZGVyRmlsZSA9PSBudWxsKSB8fCAoICEgYnVpbGRlckZpbGUuZXhpc3RzKCkpKSB7Ci0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCQlYTUxDb250ZXh0IGNvbnRleHQgPSBuZXcgWE1MQ29udGV4dChuZXcgREJXU0J1aWxkZXJNb2RlbFByb2plY3QoKSk7Ci0gICAgICAgIFhNTFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBjb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpOwotICAgICAgICAKLSAgICAgICAgREJXU0J1aWxkZXJNb2RlbCBtb2RlbCA9IChEQldTQnVpbGRlck1vZGVsKXVubWFyc2hhbGxlci51bm1hcnNoYWwoYnVpbGRlckZpbGUpOwotICAgICAgICBpZihtb2RlbC5wcm9wZXJ0aWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIAl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLk5PX09QRVJBVElPTlNfU1BFQ0lGSUVEKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0QnVpbGRlckZpbGUoU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZSkgewotCi0gICAgICAgIEZpbGUgYnVpbGRlckZpbGUgPSBuZXcgRmlsZShidWlsZGVyRmlsZU5hbWUpOwotICAgICAgICBpZiggISAoYnVpbGRlckZpbGUuZXhpc3RzKCkgJiYgYnVpbGRlckZpbGUuaXNGaWxlKCkpKSB7Ci0gICAgICAgIAl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCAKLSAgICAgICAgCQlKcHREYndzQ29yZU1lc3NhZ2VzLlVOQUJMRV9UT19MT0NBVEVfQlVJTERFUl9YTUwsIGJ1aWxkZXJGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyRmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkU3RhZ2VEaXIoU3RyaW5nIHN0YWdlRGlyTmFtZSkgewotICAgIAlGaWxlIGRpciA9IG5ldyBGaWxlKHN0YWdlRGlyTmFtZSk7Ci0gICAgICAgIGlmKCggISBkaXIuZXhpc3RzKCkpIHx8ICggISBkaXIuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgCWRpciA9IFRvb2xzLmJ1aWxkRGlyZWN0b3J5KHN0YWdlRGlyTmFtZSk7Ci0gICAgICAgIH0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JcHJpdmF0ZSBFY2xpcHNlUGFja2FnZXIgYnVpbGRFY2xpcHNlUGFja2FnZXIoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZVBhY2thZ2VyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJCQkgIC8vIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2Ygc3RhZ2VEaXIsIGV2ZXJ5dGhpbmcgaXMgaW4tbWVtb3J5Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGpkYmNEcml2ZXJJc09uQ2xhc3NwYXRoKFN0cmluZyBqZGJjRHJpdmVyTmFtZSkgewotCSAgICB0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShqZGJjRHJpdmVyTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotCQkJdGhpcy5sb2dNZXNzYWdlKFNFVkVSRSwgSnB0RGJ3c0NvcmVNZXNzYWdlcy5EUklWRVJfTk9UX09OX0NMQVNTUEFUSCwgamRiY0RyaXZlck5hbWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTWVzc2FnZShMZXZlbCBsZXZlbCwgU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCVRvb2xzLmxvZ01lc3NhZ2UobGV2ZWwsIFRvb2xzLmJpbmQoa2V5LCBhcmd1bWVudCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nTWVzc2FnZShMZXZlbCBsZXZlbCwgU3RyaW5nIGtleSkgewotCQlUb29scy5sb2dNZXNzYWdlKGxldmVsLCBUb29scy5nZXRTdHJpbmcoa2V5KSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudEJ1aWxkZXJGaWxlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBcmd1bWVudFZhbHVlKCItYnVpbGRlckZpbGUiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50U3RhZ2VEaXIoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1zdGFnZURpciIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRQYWNrYWdlQXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wYWNrYWdlQXMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBnZXRBcmd1bWVudERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIGFyZ3Nbal07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL0pwdERid3NDb3JlTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvSnB0RGJ3c0NvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjNmYTliLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvSnB0RGJ3c0NvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBEQldTIGdlbmVyYXRpb24gY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdERid3NDb3JlTWVzc2FnZXMKLXsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU9OX0NPTVBMRVRFRCA9ICJHRU5FUkFUSU9OX0NPTVBMRVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVElPTl9GQUlMRUQgPSAiR0VORVJBVElPTl9GQUlMRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0dFTkVSQVRJT05fUEVSRk9STUVEID0gIk5PX0dFTkVSQVRJT05fUEVSRk9STUVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX0VYQ0VQVElPTiA9ICJXU0RMX0VYQ0VQVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fT1BFUkFUSU9OU19TUEVDSUZJRUQgPSAiTk9fT1BFUkFUSU9OU19TUEVDSUZJRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQUJMRV9UT19MT0NBVEVfQlVJTERFUl9YTUwgPSAiVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX05PVF9PTl9DTEFTU1BBVEggPSAiRFJJVkVSX05PVF9PTl9DTEFTU1BBVEgiOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4uaW50ZXJuYWwuanB0X2Rid3NfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHREYndzQ29yZU1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNDlkN2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLS8qKgotICogIFRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUb29scwotewotCS8qKiBlbXB0eSBzdHJpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfRElSRUNUT1JZID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwkvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0JCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHlfKGNoYXJbXSBzLCBpbnQgbGVuKSB7Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBuYW1lIG1hbmlwdWxhdGlvbiAqKioqKioqKioqCi0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGREaXJlY3RvcnkoU3RyaW5nIGRpck5hbWUpIHsKLSAgICAJRmlsZSBjdXJyZW50RGlyID0gY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKTsKLSAgICAJRmlsZSBkaXIgPSBuZXcgRmlsZShjdXJyZW50RGlyLCBkaXJOYW1lKTsKLSAgICAJZGlyLm1rZGlyKCk7Ci0JCXJldHVybiBkaXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfRElSRUNUT1JZKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlIG5hbWUgaGFzIG5vCi0JICogZXh0ZW5zaW9uLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQKLQkgKiBGaWxlI2Jhc2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcEV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiggISBwYXRoLmNvbnRhaW5zKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCi0JCX0KLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ01lc3NhZ2UoTGV2ZWwgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmKGxldmVsID09IFNFVkVSRSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCdcbicgKyBtZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbignXG4nICsgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOTFMgdXRpbGl0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHREYndzQ29yZU1lc3NhZ2VzLmdldFN0cmluZyhrZXkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL2pwdF9kYndzX2NvcmUucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvanB0X2Rid3NfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDlkNzBmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvanB0X2Rid3NfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUdFTkVSQVRJT05fQ09NUExFVEVEID0gIERCV1NCdWlsZGVyIGdlbmVyYXRpb24gY29tcGxldGVkCi1HRU5FUkFUSU9OX0ZBSUxFRCA9ICBEQldTQnVpbGRlciBnZW5lcmF0aW9uIGZhaWxlZDogezB9Ci1OT19HRU5FUkFUSU9OX1BFUkZPUk1FRCA9ICBEQldTQnVpbGRlciBubyBnZW5lcmF0aW9uIHBlcmZvcm1lZAotV1NETF9FWENFUFRJT04gPSAgV1NETEV4Y2VwdGlvbjogezB9Ci1OT19PUEVSQVRJT05TX1NQRUNJRklFRCA9ICBObyBvcGVyYXRpb25zIHNwZWNpZmllZAotVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCA9ICBEQldTQnVpbGRlciB1bmFibGUgdG8gbG9jYXRlIGJ1aWxkZXIgWE1MIGZpbGU6ICB7MH0KLURSSVZFUl9OT1RfT05fQ0xBU1NQQVRIID0gIEpEQkMgZHJpdmVyIG5vdCBvbiBjbGFzc3BhdGg6IHswfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ZTFkZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0phdmFTRS0xLjYiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5NmRkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkM2I1N2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTVjZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI01vbiBKYW4gMDMgMDI6NDk6NTYgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWNkNzYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW47YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjMuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRid3MuYnVpbGRlcjtidW5kbGUtdmVyc2lvbj0iWzIuMy4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZDMwYzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlID0gMS42Ci1qYXZhY1RhcmdldCA9IDEuNgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZjJkYjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWUwNWZhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGVlYjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBhY2FkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MxNmEwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL3dpemJhbi93ZWJzZXJ2aWNlc2NsaWVudF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmFiMWIyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWdlbmVyYXRlREJXUyA9IEdlbmVyYXRlIERhdGFiYXNlIFdlYiBTZXJ2aWNlcwotCi1kYndzV2l6YXJkQ2F0ZWdvcnlOYW1lID0gRGF0YWJhc2UgV2ViIFNlcnZpY2VzCi0KLWdlbmVyYXRlRGJ3c0Zyb21YbWxOYW1lID0gV2ViIFNlcnZpY2VzIGZyb20gQnVpbGRlciBYTUwKLWdlbmVyYXRlRGJ3c0Zyb21YbWxEZXNjID0gR2VuZXJhdGUgV2ViIFNlcnZpY2VzIGZyb20gQnVpbGRlciBYTUwKLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1MmQ4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08IS0tCi0gICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgICAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAgICAKLSAgICAgQ29udHJpYnV0b3JzOiAKLSAgICAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotIAk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0JCQotCQk8IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIGFueSBwb3B1cCAtLT4KLQkJPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS51aS5wb3B1cC5hbnkiPgotCQkJCQkJCi0JCQk8bWVudQotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy51aS5tZW51LldlYlNlcnZpY2VzIgotCQkJCWxhYmVsPSIlZGJ3c1dpemFyZENhdGVnb3J5TmFtZSI+Ci0JCQk8L21lbnU+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0gCTwvZXh0ZW5zaW9uPgotCi0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQotCQk8Y2F0ZWdvcnkKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cyIKLQkJCW5hbWU9IiVkYndzV2l6YXJkQ2F0ZWdvcnlOYW1lIi8+Ci0KLSAJCTx3aXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy51aS53aXphcmQuZ2VuZXJhdGVEYndzIgotCQkJbmFtZT0iJWdlbmVyYXRlRGJ3c0Zyb21YbWxOYW1lIgotIAkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQuZGJ3cyIKLSAJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uRGJ3c0dlbmVyYXRvcldpemFyZCIKLQkJCWljb249Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdjbGllbnRfd2Vic2Vydl93aXouZ2lmIj4KLQkJCQk8ZGVzY3JpcHRpb24+JWdlbmVyYXRlRGJ3c0Zyb21YbWxEZXNjPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0KLQk8L2V4dGVuc2lvbj4KLQkJCQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0KLQkJPCEtLSBjb250cmlidXRpb25zIHRvIHRoZSAiR2VuZXJhdGUiIHN1Ym1lbnUgLS0+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkueHNkRmlsZUFjdGlvbnMiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSIqYnVpbGRlci54bWwiPgotCQkJCi0JCQk8ZmlsdGVyCi0JCQkJbmFtZT0icHJvamVjdE5hdHVyZSIKLQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqc3Qud2ViIi8+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLnVpLmdlbmVyYXRlRGJ3cyIgCi0JCQkJbGFiZWw9IiVnZW5lcmF0ZURCV1MiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC5kYndzLnVpLm1lbnUuV2ViU2VydmljZXMvY29udGVudCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuYWN0aW9ucy5HZW5lcmF0ZURid3NBY3Rpb24iPiAKLQkJCTwvYWN0aW9uPiAKLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9kYndzX3VpLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvanB0X2Rid3NfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2MmM2Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvanB0X2Rid3NfdWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0KLSMgRGJ3c0dlbmVyYXRvcgotRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSA9IE5ldyBEYXRhYmFzZSBXZWIgU2VydmljZXMgZnJvbSBCdWlsZGVyIFhNTAotRGJ3c0dlbmVyYXRvcldpemFyZF9nZW5lcmF0aW5nRGJ3cyA9IEdlbmVyYXRpbmcgRGF0YWJhc2UgV2ViIFNlcnZpY2VzCi0KLVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV90aXRsZSA9IFdlYiBEeW5hbWljIFByb2plY3QKLVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXNjID0gU3BlY2lmeSBwcm9qZWN0IGZvciBEYXRhYmFzZSBXZWIgU2VydmljZXMKLVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXN0aW5hdGlvblByb2plY3QgPSBTZWxlY3QgZGVzdGluYXRpb24gcHJvamVjdDoKLQotQnVpbGRlclhtbFdpemFyZFBhZ2VfdGl0bGUgPSBTZWxlY3QgQnVpbGRlciBYTUwgRmlsZQotQnVpbGRlclhtbFdpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgWE1MIGZpbGUgdG8gZ2VuZXJhdGUgRGF0YWJhc2UgV2ViIFNlcnZpY2VzIGZyb20KLQotQnVpbGRlclhtbFdpemFyZFBhZ2VfZXJyb3JVcmlDYW5ub3RCZUxvY2F0ZWQgPSBUaGUgc2VsZWN0ZWQgY2F0YWxvZyBlbnRyeSBzcGVjaWZpZXMgYSBVUkkgdGhhdCBjYW4gbm90IGJlIGxvY2F0ZWQuCi0KLUpkYmNEcml2ZXJXaXphcmRQYWdlX3RpdGxlID0gRHJpdmVyIGZpbGVzCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV9kZXNjID0gU3BlY2lmeSBkcml2ZXIgSkFSIGZpbGVzCi0KLUpkYmNEcml2ZXJXaXphcmRQYWdlX2RyaXZlckZpbGVzID0gRHJpdmVyIGZpbGVzOgotCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV9hZGRCdXR0b24gPSBBZGQuLi4KLUpkYmNEcml2ZXJXaXphcmRQYWdlX3JlbW92ZUJ1dHRvbiA9IFJlbW92ZQotCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV9jaG9vc2VBRHJpdmVyRmlsZSA9IERyaXZlciBGaWxlIFNlbGVjdGlvbgotCi1EYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nVGl0bGUgPSBHZW5lcmF0aW5nIERhdGFiYXNlIFdlYiBTZXJ2aWNlcwotRGJ3c0dlbmVyYXRvclVpX3J1bm5pbmdEYndzV2FybmluZ01lc3NhZ2UgPSBcCi0JCVdhcm5pbmc6IFJ1bm5pbmcgREJXUyBCdWlsZGVyIHdpbGwgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGluIHlvdXIgcHJvamVjdC5cCi0JCVxuXG5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci0KLURid3NHZW5lcmF0b3JVaV9kYndzTm90T25DbGFzc3BhdGhNZXNzYWdlID0gXAotCQlXYXJuaW5nOiBEQldTIEJ1aWxkZXIgaXMgbm90IG9uIHlvdXIgcHJvamVjdCBjbGFzc3BhdGguXAotCQlcblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi1EYndzR2VuZXJhdG9yVWlfbm90SmF2YVByb2plY3QgPSBOb3QgYSBqYXZhIHByb2plY3QKLURid3NHZW5lcmF0b3JVaV9ub3RXZWJEeW5hbWljUHJvamVjdCA9IE5vdCBhIFdlYkR5bmFtaWMgcHJvamVjdAotCi1CdWlsZGVyWG1sV2l6YXJkUGFnZV94bWxDYXRhbG9nVGFibGVUaXRsZSA9IFhNTCBDYXRhbG9nCi1CdWlsZGVyWG1sV2l6YXJkUGFnZV94bWxDYXRhbG9nS2V5Q29sdW1uID0gS2V5Ci1CdWlsZGVyWG1sV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uID0gVVJJClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2dlbi9EYndzR2VuZXJhdG9yLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZ2VuL0Rid3NHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMWU2Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZ2VuL0Rid3NHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW4uQWJzdHJhY3RKcHRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqICBEYndzR2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEYndzR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlzdGF0aWMgcHVibGljIFN0cmluZyBMQVVOQ0hfQ09ORklHX05BTUUgPSAiREJXUyBHZW4gUnVuIENvbmZpZyI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIERCV1NfR0VOX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIERCV1NfR0VOX0NMQVNTID0gREJXU19HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBEQldTX0dFTl9KQVJfUFJFRklYID0gREJXU19HRU5fUEFDS0FHRV9OQU1FICsgIl8iOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVpbGRlckZpbGVOYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0YWdlRGlyTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkcml2ZXJKYXJMaXN0OwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJCVN0cmluZyBidWlsZGVyRmlsZU5hbWUsIAotCQkJU3RyaW5nIHN0YWdlRGlyTmFtZSwgCi0JCQlTdHJpbmcgZHJpdmVySmFyTGlzdCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IERid3NHZW5lcmF0b3IoamF2YVByb2plY3QsIAotCQkJYnVpbGRlckZpbGVOYW1lLCAKLQkJCXN0YWdlRGlyTmFtZSwgCi0JCQlkcml2ZXJKYXJMaXN0KS5nZW5lcmF0ZShtb25pdG9yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIERid3NHZW5lcmF0b3IoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZSwgCi0JCQlTdHJpbmcgc3RhZ2VEaXJOYW1lLCAKLQkJCVN0cmluZyBkcml2ZXJKYXJMaXN0KSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJdGhpcy5idWlsZGVyRmlsZU5hbWUgPSBidWlsZGVyRmlsZU5hbWU7Ci0JCXRoaXMuc3RhZ2VEaXJOYW1lID0gc3RhZ2VEaXJOYW1lOwotCQl0aGlzLmRyaXZlckphckxpc3QgPSBkcml2ZXJKYXJMaXN0OwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UeXBlKCkgewotCQlyZXR1cm4gREJXU19HRU5fQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hDb25maWdOYW1lKCkgewotCQlyZXR1cm4gTEFVTkNIX0NPTkZJR19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkgewotCQlyZXR1cm4gREJXU19HRU5fSkFSX1BSRUZJWDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCQkKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0R2VuZXJhdGUoKSB7Ci0JCXN1cGVyLnBvc3RHZW5lcmF0ZSgpOwotCQl0cnkgewotCQkJdGhpcy5nZXRQcm9qZWN0KCkucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIExhdW5jaCBDb25maWd1cmF0aW9uIFNldHVwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJLy8gREJXU19HZW4gamFyCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRCb290c3RyYXBKYXJDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIERlZmF1bHQgUHJvamVjdCBjbGFzc3BhdGgKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldERlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBKREJDIGphcgotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZHJpdmVySmFyTGlzdCkpIHsKLQkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCi0JCVN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCS8vIGJ1aWxkZXJGaWxlCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWJ1aWxkZXJGaWxlIFwiIik7CSAgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmJ1aWxkZXJGaWxlTmFtZSk7Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCciJyk7Ci0KLQkJLy8gc3RhZ2VEaXIKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtc3RhZ2VEaXIgXCIiKTsJICAvLyROT04tTkxTLTEkCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMuc3RhZ2VEaXJOYW1lKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyInKTsKLQotCQkvLyBwYWNrYWdlQXMKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtcGFja2FnZUFzIGVjbGlwc2UiKTsJICAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCBwcm9ncmFtQXJndW1lbnRzLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKSB7Ci0JCXJldHVybiBnZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkodGhpcy5idWlsZEpkYmNKYXJQYXRoKCkpOwotCX0KLQkKLQlwcml2YXRlIElQYXRoIGJ1aWxkSmRiY0phclBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aCh0aGlzLmRyaXZlckphckxpc3QpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvSnB0RGJ3c1VpUGx1Z2luLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL0pwdERid3NVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIwZjc0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvSnB0RGJ3c1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdERid3NVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19JRCA9IFhNTENvcmVQbHVnaW4uREVGQVVMVF9DQVRBTE9HX0lEOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lEOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdERid3NVaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERid3NVaVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogWE1MQ29yZVBsdWdpbiBBUEkgKioqKioqKioqKgotCQotCXB1YmxpYyBJQ2F0YWxvZyBnZXREZWZhdWx0WE1MQ2F0YWxvZygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpwdERid3NVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0Rid3NHZW5lcmF0b3JVaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9EYndzR2VuZXJhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwMGJmMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0Rid3NHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5nZW4uRGJ3c0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5EYndzR2VuZXJhdG9yV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MVW5tYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXJNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyTW9kZWxQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiAgRGJ3c0dlbmVyYXRvclVpCi0gKi8KLXB1YmxpYyBjbGFzcyBEYndzR2VuZXJhdG9yVWkKLXsKLQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBidWlsZGVyWG1sRmlsZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRkFDRVRfSUQgPSAianN0LndlYiI7CQkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9QUk9QRVJUWSA9ICJkcml2ZXIiOwkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQldTX0JVSUxERVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyIjsJCS8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKElGaWxlIHhtbEZpbGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHhtbEZpbGUuZ2V0UHJvamVjdCgpOwotCQkKLQkJaWYoICEgcHJvamVjdElzV2ViRHluYW1pYyhwcm9qZWN0KSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0KTsKLQkJfQotCQlJUGF0aCB4bWxQYXRoID0geG1sRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQotCQluZXcgRGJ3c0dlbmVyYXRvclVpKHByb2plY3QsIHhtbFBhdGgudG9PU1N0cmluZygpKS5nZW5lcmF0ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0SXNXZWJEeW5hbWljKElQcm9qZWN0IHByb2plY3QpIHsKLQotCQkgSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoV0VCX0ZBQ0VUX0lEKTsKLSAgICAgICAgIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgfSAKLSAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpID8gZmFsc2UgOiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJcmV0dXJuIG1vZHVsZVBhdGg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3BsYXlEQldTTm90T25DbGFzc3BhdGhXYXJuaW5nKFNoZWxsIHNoZWxsKSB7Ci0KLQkJU3RyaW5nIG1zZyA9IEpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9kYndzTm90T25DbGFzc3BhdGhNZXNzYWdlOwotCi0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbigKLQkJCXNoZWxsLAotCQkJSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX3J1bm5pbmdEYndzV2FybmluZ1RpdGxlLAotCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzcGxheU92ZXJyaWRpbmdXZWJDb250ZW50V2FybmluZyhTaGVsbCBzaGVsbCkgewotCi0JCVN0cmluZyBtc2cgPSBKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZTsKLQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQlzaGVsbCwKLQkJCUpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZSwKLQkJCW1zZyk7Ci0JfQotICAgIAotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIERid3NHZW5lcmF0b3JVaShJUHJvamVjdCB3ZWJQcm9qZWN0LCBTdHJpbmcgYnVpbGRlclhtbEZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYod2ViUHJvamVjdCA9PSBudWxsIHx8IFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoYnVpbGRlclhtbEZpbGUpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFQcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdEZyb20od2ViUHJvamVjdCk7Ci0JCWlmKHRoaXMuamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX25vdEphdmFQcm9qZWN0KTsKLQkJfQotCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gYnVpbGRlclhtbEZpbGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSAqKioqKioqKioqCi0JLyoqCi0JICogcHJvbXB0IHRoZSB1c2VyIHdpdGggYSB3aXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZSgpIHsKLQotCQlpZiggISB0aGlzLmRid3NJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCWlmKCAhIGRpc3BsYXlEQldTTm90T25DbGFzc3BhdGhXYXJuaW5nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMuY2xhc3NJc09uUHJvamVjdHNDbGFzc3BhdGgoCi0JCQkJCQkJdGhpcy5nZXREcml2ZXJOYW1lRnJvbSh0aGlzLmJ1aWxkZXJYbWxGaWxlKSkpIHsKLQotCQkJaWYoZGlzcGxheU92ZXJyaWRpbmdXZWJDb250ZW50V2FybmluZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpKSkgewotCQkJCXRoaXMuc2NoZWR1bGVHZW5lcmF0ZURid3NKb2IoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLm9wZW5XaXphcmREaWFsb2coKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgb3BlbldpemFyZERpYWxvZygpIHsKLQotCQlEYndzR2VuZXJhdG9yV2l6YXJkIHdpemFyZCA9IG5ldyBEYndzR2VuZXJhdG9yV2l6YXJkKHRoaXMuamF2YVByb2plY3QsIHRoaXMuYnVpbGRlclhtbEZpbGUpOwotCQl3aXphcmQuc2V0V2luZG93VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZihyZXR1cm5Db2RlICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERyaXZlck5hbWVGcm9tKFN0cmluZyBidWlsZGVyWG1sRmlsZSkgewotCQl0cnkgewotCQkJREJXU0J1aWxkZXJNb2RlbCBtb2RlbCA9IHRoaXMuYnVpbGRCdWlsZGVyTW9kZWwoYnVpbGRlclhtbEZpbGUpOwotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbW9kZWwuZ2V0UHJvcGVydGllcygpOwotCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0KERSSVZFUl9QUk9QRVJUWSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIGJ1aWxkQnVpbGRlck1vZGVsKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQkJU3RyaW5nIHByb2plY3REaXJOYW1lID0gdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgCUZpbGUgYnVpbGRlckZpbGUgPSB0aGlzLmdldEJ1aWxkZXJGaWxlKHByb2plY3REaXJOYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBidWlsZGVyRmlsZU5hbWUpOwotCQlyZXR1cm4gdGhpcy51bm1hcnNoYWwoYnVpbGRlckZpbGUpOwotCX0KLQotCXByaXZhdGUgREJXU0J1aWxkZXJNb2RlbCB1bm1hcnNoYWwoRmlsZSBidWlsZGVyRmlsZSkgewotICAgICAgICBpZigoYnVpbGRlckZpbGUgPT0gbnVsbCkgfHwgKCAhIGJ1aWxkZXJGaWxlLmV4aXN0cygpKSkgewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQkJWE1MQ29udGV4dCBjb250ZXh0ID0gbmV3IFhNTENvbnRleHQobmV3IERCV1NCdWlsZGVyTW9kZWxQcm9qZWN0KCkpOwotICAgICAgICBYTUxVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgCi0gICAgICAgIERCV1NCdWlsZGVyTW9kZWwgbW9kZWwgPSAoREJXU0J1aWxkZXJNb2RlbCl1bm1hcnNoYWxsZXIudW5tYXJzaGFsKGJ1aWxkZXJGaWxlKTsKLSAgICAgICAgaWYobW9kZWwgPT0gbnVsbCB8fCBtb2RlbC5wcm9wZXJ0aWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEJ1aWxkZXJGaWxlKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQotICAgICAgICBGaWxlIGJ1aWxkZXJGaWxlID0gbmV3IEZpbGUoYnVpbGRlckZpbGVOYW1lKTsKLSAgICAgICAgaWYoICEgKGJ1aWxkZXJGaWxlLmV4aXN0cygpICYmIGJ1aWxkZXJGaWxlLmlzRmlsZSgpKSkgewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjbGFzc0lzT25Qcm9qZWN0c0NsYXNzcGF0aChTdHJpbmcgZHJpdmVyTmFtZSkgewotCQl0cnkgewotCQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkcml2ZXJOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5qYXZhUHJvamVjdC5maW5kVHlwZShkcml2ZXJOYW1lKTsKLQkJCXJldHVybiAoZ2VuQ2xhc3MgIT0gbnVsbCk7Ci0JCX0gCi0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgREJXUyBidWlsZGVyIGlzIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkYndzSXNPbkNsYXNzcGF0aCgpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5qYXZhUHJvamVjdC5maW5kVHlwZShEQldTX0JVSUxERVJfQ0xBU1NfTkFNRSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElKYXZhUHJvamVjdCkoKElKYXZhRWxlbWVudCkoKElBZGFwdGFibGUpcHJvamVjdCkuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKTsKLQl9Ci0KLQlwcml2YXRlIFNoZWxsIGdldEN1cnJlbnRTaGVsbCgpIHsKLQkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlR2VuZXJhdGVEYndzSm9iKCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBHZW5lcmF0ZURid3NKb2IoCi0JCQl0aGlzLmphdmFQcm9qZWN0LAotCQkJdGhpcy5idWlsZGVyWG1sRmlsZSwKLQkJCXN0YWdlRGlyTmFtZSwKLQkJCW51bGwJCS8vIGRyaXZlckphckxpc3QKLQkJKTsKLQkJZ2VuZXJhdGVKb2Iuc2NoZWR1bGUoKTsJCi0JfQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBEQldTIGpvYiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyYXRlRGJ3c0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3Q7Ci0JCWZpbmFsIFN0cmluZyBidWlsZGVyRmlsZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBzdGFnZURpck5hbWU7Ci0JCWZpbmFsIFN0cmluZyBkcml2ZXJKYXJMaXN0OwotCi0JCXB1YmxpYyBHZW5lcmF0ZURid3NKb2IoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyRmlsZU5hbWUsIFN0cmluZyBzdGFnZURpck5hbWUsIFN0cmluZyBkcml2ZXJKYXJMaXN0KSB7Ci0JCQlzdXBlcihKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzKTsKLQotCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdCA7Ci0JCQl0aGlzLmJ1aWxkZXJGaWxlTmFtZSA9IGJ1aWxkZXJGaWxlTmFtZTsKLQkJCXRoaXMuc3RhZ2VEaXJOYW1lID0gc3RhZ2VEaXJOYW1lOwotCQkJdGhpcy5kcml2ZXJKYXJMaXN0ID0gZHJpdmVySmFyTGlzdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCURid3NHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5wcm9qZWN0LCB0aGlzLmJ1aWxkZXJGaWxlTmFtZSwgdGhpcy5zdGFnZURpck5hbWUsIHRoaXMuZHJpdmVySmFyTGlzdCwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmVkYTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9KcHREYndzVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHREYndzVWlJY29ucwotewotCS8vICoqKioqKioqKioqKioqKiogV2l6YXJkIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERCV1NfR0VOX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6IjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMGVhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgREJXUyBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdERid3NVaU1lc3NhZ2VzIHsKLQkKLQkvLyBEYndzR2VuZXJhdG9yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXN0aW5hdGlvblByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9kcml2ZXJGaWxlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9hZGRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Nob29zZUFEcml2ZXJGaWxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfZGJ3c05vdE9uQ2xhc3NwYXRoTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfbm90SmF2YVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsKLQotCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9kYndzX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdERid3NVaU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHREYndzVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmVlNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRGJ3c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5EYndzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEdlbmVyYXRlRGJ3c0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVEYndzQWN0aW9uIGV4dGVuZHMgT2JqZWN0QWN0aW9uCi17Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElGaWxlIHhtbEZpbGUpIHsKLQotCQlEYndzR2VuZXJhdG9yVWkuZ2VuZXJhdGUoeG1sRmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTBmMWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL09iamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwdWJsaWMgT2JqZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9ICgoSVRyZWVTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5leGVjdXRlKChJRmlsZSlzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIyM2ZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQnVpbGRlclhtbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdERid3NVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogIEJ1aWxkZXJYbWxXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZGVyWG1sV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQotCXByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIElQcm9qZWN0IHRhcmdldFByb2plY3Q7Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFNvdXJjZVBhbmVsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VYTUxGaWx0ZXJFeHRlbnNpb25zID0geyIueG1sIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZCAqKioqKioqKioqCi0JCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCVN0cmluZyBlbGVtZW50RXh0ZW5zaW9uID0gKChJRmlsZSlmaXJzdEVsZW1lbnQpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmKGVsZW1lbnRFeHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWlmKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnNbMF0uZW5kc1dpdGgoZWxlbWVudEV4dGVuc2lvbikpIHsKLQkJCQkJcmV0dXJuICgoSUZpbGUpZmlyc3RFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0gICAgCi0JQnVpbGRlclhtbFdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCJCdWlsZGVyWG1sV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChjb21wb3NpdGUsIHRoaXMuaW5pdGlhbFNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5QYW5lbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLlBhbmVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCXNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmKHZpc2libGUpIHsKLQotCSAgICAJaWYodGhpcy5nZXRCdWlsZGVyWG1sKCkgIT0gbnVsbCkgewotCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuZ2V0QnVpbGRlclhtbCgpKSk7Ci0JICAgIAl9Ci0JICAgIAllbHNlIHsKLQkgICAgCQl0aGlzLnVwZGF0ZVRhcmdldFByb2plY3QoKTsKLQkJICAgIAlJRmlsZSBzY2hlbWEgPSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbih0aGlzLmluaXRpYWxTZWxlY3Rpb24pOwotCQkgICAgCWlmKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYSkpOwotCQkgICAgCX0KLQkJICAgIAllbHNlIHsKLQkJICAgIAkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy50YXJnZXRQcm9qZWN0KSk7Ci0JCSAgICAJfQotCSAgICAJfQotCSAgICAJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC51cGRhdGUoKTsKLQkJCQotCQkJdGhpcy5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5CdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZSk7Ci0JCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Rlc2MpOwotCQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnMpOwotCQl9Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0VmlzaWJsZUhlbHBlcih2aXNpYmxlKTsKLQl9Ci0gICAgCi0JLy8gKioqKioqKioqKiBJV2l6YXJkUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCi0JCXJldHVybiB0aGlzLnNjaGVtYU9yVXJpU2VsZWN0ZWQoKSAmJiAodGhpcy5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUZpbGUgZ2V0QnVpbGRlclhtbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotCQlTdHJpbmcgdXJpID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCWlmKHVyaSA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRGaWxlKCk7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldFByb2plY3QoKSB7Ci0gICAgCUlXaXphcmRQYWdlIHByZXZpb3VzUGFnZSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlKCk7Ci0gICAgCQotCQlpZihwcmV2aW91c1BhZ2UgaW5zdGFuY2VvZiBKYXZhUHJvamVjdFdpemFyZFBhZ2UpIHsKLQkJCS8vIGdldCBwcm9qZWN0IGZyb20gcHJldmlvdXNQYWdlCi0JCQl0aGlzLnRhcmdldFByb2plY3QgPSAoKChKYXZhUHJvamVjdFdpemFyZFBhZ2UpcHJldmlvdXNQYWdlKS5nZXRKYXZhUHJvamVjdCgpKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgISB0aGlzLmluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkvLyBubyBwcmV2aW91c1BhZ2UgLSBnZXQgcHJvamVjdCBmcm9tIGluaXRpYWxTZWxlY3Rpb24KLQkJCXRoaXMudGFyZ2V0UHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KWZpcnN0RWxlbWVudDsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcmV0dXJuICgoSUphdmFFbGVtZW50KWZpcnN0RWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JcHJpdmF0ZSBib29sZWFuIHNjaGVtYU9yVXJpU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoKHRoaXMuZ2V0QnVpbGRlclhtbCgpICE9IG51bGwpIHx8ICh0aGlzLmdldFNvdXJjZVVSSSgpICE9IG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IHRoaXMuZ2V0U291cmNlVVJJKCk7Ci0JCWlmKHVyaSAhPSBudWxsKSB7Ci0JCQlpZiggISBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRoaXMuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl0aGlzLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGJ3c0dlbmVyYXRvcldpemFyZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzc5OGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkRid3NHZW5lcmF0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLS8qKgotICogIERid3NHZW5lcmF0b3JXaXphcmQKLSAqLwotcHVibGljIGNsYXNzIERid3NHZW5lcmF0b3JXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJV29ya2JlbmNoV2l6YXJkIHsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlIHByb2plY3RXaXphcmRQYWdlOwotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRlclhtbFdpemFyZFBhZ2U7Ci0KLQkvLyBEaWFsb2cgc3RvcmUgaWQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX05BTUUgPSBEYndzR2VuZXJhdG9yV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJXU19TRUNUSU9OX05BTUUgPSAiRGJ3c1NldHRpbmdzIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSmRiY0RyaXZlcldpemFyZFBhZ2UgamRiY0RyaXZlcnNQYWdlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIERid3NHZW5lcmF0b3JXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXB1YmxpYyBEYndzR2VuZXJhdG9yV2l6YXJkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gYnVpbGRlclhtbEZpbGU7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZih0aGlzLmdldERpYWxvZ1NldHRpbmdzKCkgPT0gbnVsbCkgewotCQkJSURpYWxvZ1NldHRpbmdzIGRid3NTZXR0aW5ncyA9IEpwdERid3NVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuZ2V0U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQlpZih3aXphcmRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQl9Ci0JCQl0aGlzLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogSVdvcmtiZW5jaFdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaUljb25zLkRCV1NfR0VOX1dJWl9CQU5ORVIpKTsKLQkJdGhpcy5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElXaXphcmQgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZih0aGlzLnNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0RnJvbVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbik7Ci0KLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2UgPSB0aGlzLmJ1aWxkV2ViRHluYW1pY1Byb2plY3RQYWdlKHRoaXMuamF2YVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMucHJvamVjdFdpemFyZFBhZ2UpOwotCi0JCQkvLyBCdWlsZGVyWG1sV2l6YXJkUGFnZQotCQkJSUZpbGUgYnVpbGRlclhtbFNlbGVjdGVkID0gQnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbEZyb21TZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pOwotCQkJaWYoYnVpbGRlclhtbFNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxXaXphcmRQYWdlID0gdGhpcy5idWlsZEJ1aWxkZXJYbWxQYWdlKHRoaXMuc2VsZWN0aW9uKTsKLQkJCQl0aGlzLmFkZFBhZ2UodGhpcy5idWlsZGVyWG1sV2l6YXJkUGFnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gdGhpcy5tYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKGJ1aWxkZXJYbWxTZWxlY3RlZC5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQkvLyBKZGJjRHJpdmVyV2l6YXJkUGFnZQotCQl0aGlzLmpkYmNEcml2ZXJzUGFnZSA9IHRoaXMuYnVpbGRKZGJjRHJpdmVyc1BhZ2UoKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuamRiY0RyaXZlcnNQYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJCi0JCVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSAoV2l6YXJkUGFnZSlnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZihjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiggISBjdXJyZW50UGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGRyaXZlckphckxpc3QgPSB0aGlzLmpkYmNEcml2ZXJzUGFnZS5nZXREcml2ZXJKYXJMaXN0KCk7Ci0JCXRoaXMuamRiY0RyaXZlcnNQYWdlLmZpbmlzaCgpOwkvLyBwZXJzaXN0IHNldHRpbmdzCi0KLQkJaWYoRGJ3c0dlbmVyYXRvclVpLmRpc3BsYXlPdmVycmlkaW5nV2ViQ29udGVudFdhcm5pbmcodGhpcy5nZXRTaGVsbCgpKSkgewotCQkJdGhpcy5nZW5lcmF0ZURid3MoZHJpdmVySmFyTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCWlmKHRoaXMucHJvamVjdFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMucHJvamVjdFdpemFyZFBhZ2UuZ2V0SmF2YVByb2plY3QoKTsKLQkJfQotICAgIAlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1aWxkZXJYbWxQYXRoT3JVcmkoKSB7Ci0JCWlmKHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJSUZpbGUgeG1sRmlsZSA9IHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbCgpOwotCQkJaWYoeG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aCh4bWxGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0U291cmNlVVJJKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbEZpbGU7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBidWlsZFdlYkR5bmFtaWNQcm9qZWN0UGFnZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJCi0JCVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0V2l6YXJkUGFnZSA9IG5ldyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UoamF2YVByb2plY3QpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JCXByb2plY3RXaXphcmRQYWdlLnNldERlc3RpbmF0aW9uTGFiZWwoSnB0RGJ3c1VpTWVzc2FnZXMuV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCk7Ci0KLQkJcmV0dXJuIHByb2plY3RXaXphcmRQYWdlOwotCX0KLQotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRCdWlsZGVyWG1sUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBCdWlsZGVyWG1sV2l6YXJkUGFnZShzZWxlY3Rpb24pOwotCX0KLQkKLQlwcml2YXRlIEpkYmNEcml2ZXJXaXphcmRQYWdlIGJ1aWxkSmRiY0RyaXZlcnNQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpkYmNEcml2ZXJXaXphcmRQYWdlKFdJWkFSRF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKElQYXRoIHBhdGgpIHsKLQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcGF0aC5tYWtlUmVsYXRpdmVUbyh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOwotCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRGJ3cyhTdHJpbmcgZHJpdmVySmFyTGlzdCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBEYndzR2VuZXJhdG9yVWkuR2VuZXJhdGVEYndzSm9iKAotCQkJdGhpcy5nZXRKYXZhUHJvamVjdCgpLAotCQkJdGhpcy5nZXRCdWlsZGVyWG1sUGF0aE9yVXJpKCksCi0JCQlzdGFnZURpck5hbWUsCi0JCQlkcml2ZXJKYXJMaXN0Ci0JCSk7Ci0JCWdlbmVyYXRlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlpZihzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElKYXZhUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3RGcm9tKHByb2plY3QpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotICAgIAlyZXR1cm4gKElKYXZhUHJvamVjdCkoKElKYXZhRWxlbWVudCkoKElBZGFwdGFibGUpcHJvamVjdCkuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pkYmNEcml2ZXJXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pkYmNEcml2ZXJXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWM5ZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9KZGJjRHJpdmVyV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5KcHREYndzVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RGJ3c1VpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RGJ3c1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqICBKZGJjRHJpdmVyc1dpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEpkYmNEcml2ZXJXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0b3JlZERyaXZlckNsYXNzcGF0aElkOwotCXByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gamFyUGF0aHM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQklORElOR1NfRklMRV9GSUxURVIgPSAiKi5qYXI7Ki56aXAiOyAgIC8vJE5PTi1OTFMtMSQKLQkvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfSUQgPSAiRFJJVkVSX0NMQVNTUEFUSF9JRCI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CS8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEpkYmNEcml2ZXJXaXphcmRQYWdlKFN0cmluZyB3aXphcmROYW1lKSB7Ci0JCXN1cGVyKCJKZGJjIERyaXZlciIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JCQotCQl0aGlzLmphclBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuc3RvcmVkRHJpdmVyQ2xhc3NwYXRoSWQgPSB3aXphcmROYW1lICsgIi4iICsgUEFHRV9JRDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc2V0VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfdGl0bGUpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2MpOwotCQl0aGlzLnNldEltYWdlRGVzY3JpcHRvcihKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaUljb25zLkRCV1NfR0VOX1dJWl9CQU5ORVIpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLQkJdGhpcy5zYXZlV2lkZ2V0VmFsdWVzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZERyaXZlckphckxpc3RTdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICoJSW5pdGlhbGl6ZXMgdGhlIEpBUiBwYWNrYWdlIGZyb20gbGFzdCB1c2VkIHdpemFyZCBwYWdlIHZhbHVlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphclBhdGhzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IHRoaXMuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gZGVzdGluYXRpb24KLQkJCVN0cmluZ1tdIGRyaXZlclBhdGhzID0gc2V0dGluZ3MuZ2V0QXJyYXkodGhpcy5zdG9yZWREcml2ZXJDbGFzc3BhdGhJZCk7Ci0JCQlpZihkcml2ZXJQYXRocyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCQkJfQotCQkJdGhpcy5qYXJQYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCi0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuamFyUGF0aHMsIGRyaXZlclBhdGhzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSB0aGlzLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0KLQkJaWYoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gZHJpdmVyUGF0aHMgPSB0aGlzLmphclBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQlzZXR0aW5ncy5wdXQodGhpcy5zdG9yZWREcml2ZXJDbGFzc3BhdGhJZCwgZHJpdmVyUGF0aHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREcml2ZXJKYXJMaXN0U3RyaW5nKCkgewotCQlpZih0aGlzLmphclBhdGhzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklORzsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoU3RyaW5nIGphciA6IHRoaXMuamFyUGF0aHMpIHsKLQkJCXJlc3VsdC5hcHBlbmQoamFyKS5hcHBlbmQoUEFUSF9TRVBBUkFUT1IpOwotCQl9Ci0JCXJlc3VsdC5kZWxldGVDaGFyQXQocmVzdWx0Lmxlbmd0aCgpIC0gMSk7CS8vIHJlbW92ZSBsYXN0IHNlcGFyYXRvcgotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5pbml0aWFsaXplSmFyUGF0aHMoKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCW5ldyBKYXJzR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUphckZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCXRoaXMuamFyUGF0aHMucmVtb3ZlKGZpbGVQYXRoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEphckZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCWlmKCAhIHRoaXMuamFyUGF0aHMuY29udGFpbnMoZmlsZVBhdGgpKSB7Ci0JCQl0aGlzLmphclBhdGhzLmFkZChmaWxlUGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBKYXJzR3JvdXAgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKYXJzR3JvdXAgewotCi0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIEphcnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsgLy9tdXN0IGJlIDQgZm9yIHRoZSBwYWNrYWdlIGNvbnRyb2xzCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ncm91cCwgSEVMUF9DT05URVhUX0lEKTsKLQotCQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgMiwgSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfZHJpdmVyRmlsZXMpOwotCQkJCi0JCQl0aGlzLmJ1aWxkRHJpdmVyRmlsZXNUYWJsZShjb21wb3NpdGUpOwotCQl9Ci0JICAgIAotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkgICAgCi0JCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlJV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCSAgICAJCi0JCQlpZiggISAod2l6YXJkIGluc3RhbmNlb2YgRGJ3c0dlbmVyYXRvcldpemFyZCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiAoKERid3NHZW5lcmF0b3JXaXphcmQpd2l6YXJkKS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBnZXRKYXJQYXRocygpIHsKLQkJCXJldHVybiBqYXJQYXRoczsKLQkJfQotCi0JCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkRHJpdmVyRmlsZXNUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gdGhpcy5idWlsZFRhYmxlVmlld2VyKHBhcmVudCwgdGhpcy5nZXRKYXJQYXRocygpKTsKLQkJCQotCQkJdGhpcy5idWlsZEFkZFJlbW92ZUJ1dHRvbnMocGFyZW50LCB0YWJsZVZpZXdlcik7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JCX0KLQkJCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBBcnJheUxpc3Q8U3RyaW5nPiB0YWJsZURhdGFNb2RlbCkgewkKLQkJCQotCQkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0aGlzLmFkZENvbHVtbnNEYXRhKHRhYmxlTGF5b3V0KTsKLQkJCQotCQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUodGFibGVMYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCQkKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQotCQkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludD0gU1dUVXRpbC5nZXRUYWJsZUhlaWdodEhpbnQodGFibGUsIDcpOwotCQkJdGFibGVMYXlvdXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQkKLQkJCXRhYmxlVmlld2VyLnNldElucHV0KHRhYmxlRGF0YU1vZGVsKTsKLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGJ1aWxkQWRkUmVtb3ZlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotCQkJCi0JCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJLy8gQWRkIGJ1dHRvbnMKLQkJCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfYWRkQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJCUFycmF5TGlzdDxTdHJpbmc+IGphckZpbGVzID0gcHJvbXB0SmFyRmlsZXMoKTsKLQkJCQkJZm9yKFN0cmluZyBqYXJGaWxlIDogamFyRmlsZXMpIHsKLQkJCQkJCWFkZEphckZpbGUoamFyRmlsZSk7Ci0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gUmVtb3ZlIGJ1dHRvbnMKLQkJCUJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgamFyRmlsZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlyZW1vdmVKYXJGaWxlKGphckZpbGUpOwotCQkJCQkKLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYWRkQnV0dG9uLnNldEZvY3VzKCk7Ci0JCX0KLQotCQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IHByb21wdEphckZpbGVzKCkgewotCQkJU3RyaW5nIHByb2plY3RQYXRoPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuTVVMVEkpOwotCQkJZGlhbG9nLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfY2hvb3NlQURyaXZlckZpbGUpOwotCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHJvamVjdFBhdGgpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHtCSU5ESU5HU19GSUxFX0ZJTFRFUn0pOwotCi0JCQlkaWFsb2cub3BlbigpOwotCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmaWxlTmFtZXMubGVuZ3RoKTsKLQkJCWZvcihTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLQkJCQlyZXN1bHRzLmFkZChwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb2x1bW5zRGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIGxhYmVsCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiAoU3RyaW5nKWVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJCVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzZjYzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHVibGljIGludGVyZmFjZSBQYW5lbExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbmVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JcHJvdGVjdGVkIFNlbGVjdEZpbGVQYW5lbCBzZWxlY3RGaWxlUGFuZWw7Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCS8vIGNvbnRhaW5lciBncm91cAotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA0MDA7Ci0JCWdkLndpZHRoSGludCA9IDQwMDsKLQkJc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RGaWxlUGFuZWwgPSBuZXcgU2VsZWN0RmlsZVBhbmVsKHBhZ2VCb29rLCBzZWxlY3Rpb24pOwotCQl0aGlzLnNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkKLQkJLy8gQ2F0YWxvZwotCQlJQ2F0YWxvZyB4bWxDYXRhbG9nID0gSnB0RGJ3c1VpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwocGFnZUJvb2ssIHhtbENhdGFsb2cpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3RGaWxlUGFuZWwuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0RmlsZVBhbmVsLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dVUkkoKSB7Ci0JCXJldHVybiBudWxsOwkJLy8gWE1MQ2F0YWxvZyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RGaWxlUGFuZWwucmVzZXRGaWx0ZXJzKCk7Ci0JCXNlbGVjdEZpbGVQYW5lbC5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCi0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihQYW5lbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSGVscGVyKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCXNlbGVjdEZpbGVQYW5lbC5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbGlzdGVuZXIuY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCi0JCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBjbGFzcyBTZWxlY3RGaWxlUGFuZWwgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZSBpbXBsZW1lbnRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgU2VsZWN0RmlsZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc2VsZWN0aW9uLCB0cnVlKTsKLQkJCS8vIFN0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy8gYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlTZWxlY3RGaWxlUGFuZWwudGhpcy5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpIHsKLQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTM2M2Q1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAqICAKLSAqICBGYedhZGUgY2xhc3MgdG8gY2hhbmdlIGFjY2Vzc2liaWxpdHkgb2YgU2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIKLQl7fQotCi0JcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzdXBlci5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkgewotCQlzdXBlci5yZXNldEZpbHRlcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWVjNDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdERid3NVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlhtbENhdGFsb2c7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgeG1sQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mWG1sQ2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDcwMDsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1RhYmxlVGl0bGUpOwotCi0JCXRhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIodGhpcyk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoImR1bW15Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JCWhlYWRpbmdzWzFdID0gSnB0RGJ3c1VpTWVzc2FnZXMuQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsKLQotCQlYTUxDYXRhbG9nVGFibGVWaWV3ZXIgdGhlVGFibGVWaWV3ZXIgPSBuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKHBhcmVudCwgaGVhZGluZ3MpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkWE1MQ2F0YWxvZ0VudHJpZXMoTGlzdCBsaXN0LCBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gMCkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gZW50cnkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKSB7Ci0JCQkJTGlzdCByZXN1bHQgPSBudWxsOwotCi0JCQkJaWYgKChmWG1sQ2F0YWxvZyA9PSBudWxsKSB8fCBkb1RhYmxlU2l6ZUhhY2spIHsKLQkJCQkJLy8gdGhpcyBsZXRzIHVzIGNyZWF0ZSBhIHRhYmxlIHdpdGggYW4gaW5pdGlhbCBoZWlnaHQgb2YKLQkJCQkJLy8gMTAgcm93cwotCQkJCQkvLyBvdGhlcndpc2Ugd2UgZ2V0IHN0dWNrIHdpdGggMCByb3cgaGVpZ2ggdGFibGUuLi4gdGhhdCdzCi0JCQkJCS8vIHRvbyBzbWFsbAotCQkJCQlkb1RhYmxlU2l6ZUhhY2sgPSBmYWxzZTsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotCQkJCQkJcmVzdWx0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBmWG1sQ2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJCWlmIChKcHREYndzVWlQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCBzeXN0ZW1DYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCkpOwotCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKEpwdERid3NVaVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCQkJCWFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgdXNlckNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHRoZVRhYmxlVmlld2VyOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEtleSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgZW50cnkgPSBnZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJcmVzdWx0ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzJiZmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5EYndzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlIGV4dGVuZHMgSmF2YVByb2plY3RXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SVByb2plY3Q+IGdldEphdmFQcm9qZWN0cygpIHsKLQkgICByZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQcm9qZWN0PihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFByb2plY3RzKCkpKSB7Ci0JICAgICAgQE92ZXJyaWRlCi0JICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElQcm9qZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gRGJ3c0dlbmVyYXRvclVpLnByb2plY3RJc1dlYkR5bmFtaWMobmV4dCk7Ci0JICAgICAgfQotCSAgIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1NjU2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLkpwdERid3NVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVSUk9SX1NUQVRFX0tFWSA9ICJlcnJvcnN0YXRla2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBkdGRGaWxlSW1hZ2UgPSBKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgdW5rbm93bkZpbGVJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB4c2RGaWxlSW1hZ2UgPSBKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJoZWxsbyIpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicnVuISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQlyZXNldEZpbHRlcnMoKTsKLQkJYWRkRmlsdGVyKG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IGdldFhNTENhdGFsb2dFbnRyaWVzKCkudG9BcnJheSgpOwotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAoKG8xIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgJiYgKG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkpIHsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8xID0gKElDYXRhbG9nRW50cnkpIG8xOwotCQkJCQkJSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbzIgPSAoSUNhdGFsb2dFbnRyeSkgbzI7Ci0JCQkJCQlyZXN1bHQgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUobWFwcGluZ0luZm8xLmdldEtleSgpLCBtYXBwaW5nSW5mbzIuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfTsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3b2JqKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJSW1hZ2UgYmFzZSA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCQlTdHJpbmcgdXJpID0gY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCQlpZiAodXJpLmVuZHNXaXRoKCJkdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQliYXNlID0gZHRkRmlsZUltYWdlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHVyaS5lbmRzV2l0aCgieHNkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IHhzZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJhc2UgPSB1bmtub3duRmlsZUltYWdlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJaWYgKFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIFRPRE8uLi4gU1NFIHBvcnQKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOy8vIGltYWdlRmFjdG9yeS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLAotCQkJCQkJCS8vIGVycm9ySW1hZ2UsCi0JCQkJCQkJLy8gSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9IGNvbHVtbkluZGV4ID09IDAgPyBjYXRhbG9nRW50cnkuZ2V0S2V5KCkgOiBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJcmVzdWx0ID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXN1bHQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NjA5Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhZTEyNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDlkZjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTAuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNGU0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI3NWE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU0NzdmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1Y2IzYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNGM5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jTW9uIE1hciAyMiAxMjoxNjowMyBFRFQgMjAxMAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNTYyNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLmJpbmQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmNTg2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYzRhNDkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3ZGZjYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQgLSBTY2hlbWEgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNmE5MjIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuU2NoZW1hT3V0cHV0UmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5Ub29sczsKLQotLyoqCi0gKiAgR2VuZXJhdGUgYSBKQVhCIFNjaGVtYQotICogIAotICogQ3VycmVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgotICogICAgIFstcyBzY2hlbWEueHNkXSAtIHNwZWNpZmllcyB0aGUgdGFyZ2V0IHNjaGVtYQotICogICAgIFstYyBjbGFzc05hbWVdIC0gc3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZQotICogICAgIAotICogICAgIFstcCBwYWNrYWdlTmFtZV0gLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBwYWNrYWdlIC8vIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJpdmF0ZSBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTk9fRkFDVE9SWV9DTEFTUyA9ICJkb2VzbnQgY29udGFpbiBPYmplY3RGYWN0b3J5LmNsYXNzIjsgICAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBNYWluKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQkKLQkJdGhpcy5pbml0aWFsaXplV2l0aChhcmdzKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aChTdHJpbmdbXSBhcmdzKSB7Ci0gICAgCXRoaXMuc291cmNlQ2xhc3NOYW1lcyA9IHRoaXMuZ2V0U291cmNlQ2xhc3NOYW1lcyhhcmdzKTsKLSAgICAJdGhpcy50YXJnZXRTY2hlbWFOYW1lID0gdGhpcy5nZXRUYXJnZXRTY2hlbWFOYW1lKGFyZ3MpOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldERlYnVnTW9kZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGUoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQKLQkJSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSB0aGlzLmJ1aWxkSmF4YkNvbnRleHQoKTsKLQkJCi0gICAgICAgIC8vIEdlbmVyYXRlIGFuIFhNTCBTY2hlbWEKLQkJaWYoamF4YkNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZVNjaGVtYShqYXhiQ29udGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oVG9vbHMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9OT1RfQ1JFQVRFRCwgdGhpcy50YXJnZXRTY2hlbWFOYW1lKSk7Ci0JCX0KLSAgICB9Ci0JCi0JcHJpdmF0ZSBKQVhCQ29udGV4dCBidWlsZEpheGJDb250ZXh0KCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEpheGJDb3JlTWVzc2FnZXMuTE9BRElOR19DTEFTU0VTKSk7Ci0JCUpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQkJCQkKLQkJCQlDbGFzc1tdIHNvdXJjZUNsYXNzZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3Nlcyh0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIGxvYWRlcik7Ci0JCQkJCi0JCQkJamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShzb3VyY2VDbGFzc2VzKTsKLQkJCX0KLQkJCWNhdGNoKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJCQl0aGlzLmhhbmRsZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gamF4YkNvbnRleHQ7Ci0JIH0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVTY2hlbWEoSkFYQkNvbnRleHQgamF4YkNvbnRleHQpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRvb2xzLmdldFN0cmluZyhKcHRKYXhiQ29yZU1lc3NhZ2VzLkdFTkVSQVRJTkdfU0NIRU1BKSk7Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJCi0JCVNjaGVtYU91dHB1dFJlc29sdmVyIHNjaGVtYU91dHB1dFJlc29sdmVyID0gCi0JCQluZXcgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIodGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLQotCQl0cnkgewotCQkJamF4YkNvbnRleHQuZ2VuZXJhdGVTY2hlbWEoc2NoZW1hT3V0cHV0UmVzb2x2ZXIpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotICAgIAotICAgIHByaXZhdGUgQ2xhc3NbXSBidWlsZFNvdXJjZUNsYXNzZXMoU3RyaW5nW10gY2xhc3NOYW1lcywgQ2xhc3NMb2FkZXIgbG9hZGVyKSB7Ci0KLQkJQXJyYXlMaXN0PENsYXNzPiBzb3VyY2VDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzcz4oY2xhc3NOYW1lcy5sZW5ndGgpOwotCQlmb3IoU3RyaW5nIGNsYXNzTmFtZTogY2xhc3NOYW1lcykgewotCQkJdHJ5IHsKLQkJCQlzb3VyY2VDbGFzc2VzLmFkZChsb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oY2xhc3NOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oVG9vbHMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLk5PVF9GT1VORCwgY2xhc3NOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQlyZXR1cm4gc291cmNlQ2xhc3Nlcy50b0FycmF5KG5ldyBDbGFzc1swXSk7Ci0gICAgfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oSkFYQkV4Y2VwdGlvbiBleCkgewotCQlTdHJpbmcgbWVzc2FnZSA9IGV4LmdldE1lc3NhZ2UoKTsKLQkJVGhyb3dhYmxlIGxpbmtlZEV4ID0gZXguZ2V0TGlua2VkRXhjZXB0aW9uKCk7Ci0JCWlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmluZGV4T2YoTk9fRkFDVE9SWV9DTEFTUykgPiAtMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgaWYobGlua2VkRXggIT0gbnVsbCAmJiBsaW5rZWRFeCBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBUb29scy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCwgbGlua2VkRXguZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJvck1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGFyZ3VtZW50IHF1ZXJpZXMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgU3RyaW5nW10gZ2V0U291cmNlQ2xhc3NOYW1lcyhTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QWxsQXJndW1lbnRWYWx1ZSgiLWMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhcmdldFNjaGVtYU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1zIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsQXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlMaXN0PFN0cmluZz4gYXJnVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCWFyZ1ZhbHVlcy5hZGQoYXJnc1tqXSk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFyZ1ZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi1jbGFzcyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlciBleHRlbmRzIFNjaGVtYU91dHB1dFJlc29sdmVyIHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcihTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUpIHsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hTmFtZSA9IGRlZmF1bHRTY2hlbWFOYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQkgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3VsdCBjcmVhdGVPdXRwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IChUb29scy5zdHJpbmdJc0VtcHR5KG5hbWVzcGFjZVVSSSkpID8gCi0gICAgICAgIAkJdGhpcy5idWlsZEZpbGVOYW1lRnJvbSh0aGlzLmRlZmF1bHRTY2hlbWFOYW1lLCBzdWdnZXN0ZWRGaWxlTmFtZSkgOiAKLSAgICAgICAgCQl0aGlzLm1vZGlmeUZpbGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0JICAgICAgICAJCi0gICAgICAgIGZpbGVQYXRoID0gdGhpcy5jYW5vbmljYWxGaWxlTmFtZShmaWxlUGF0aCk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLQkJU3RyZWFtUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQoZmlsZSk7Ci0JCXJlc3VsdC5zZXRTeXN0ZW1JZChmaWxlLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0KLQkJU3lzdGVtLm91dC5wcmludChUb29scy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuU0NIRU1BX0dFTkVSQVRFRCwgZmlsZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCSBwcml2YXRlIFN0cmluZyBidWlsZEZpbGVOYW1lRnJvbShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBzdWdnZXN0ZWRGaWxlTmFtZSkgewotCi0JCSBmaWxlTmFtZSA9IFRvb2xzLnN0cmlwRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShmaWxlTmFtZSkpIHsKLQkJCSByZXR1cm4gc3VnZ2VzdGVkRmlsZU5hbWU7Ci0JCSB9Ci0JCSBTdHJpbmcgbnVtYmVyID0gVG9vbHMuZXh0cmFjdEZpbGVOdW1iZXIoc3VnZ2VzdGVkRmlsZU5hbWUpOwotCi0JCSBmaWxlTmFtZSA9IHRoaXMuYnVpbGRGaWxlTmFtZShmaWxlTmFtZSwgbnVtYmVyKTsKLQkJIHJldHVybiBUb29scy5hcHBlbmRYc2RFeHRlbnNpb24oZmlsZU5hbWUpOwotCSB9Ci0KLQkgcHJpdmF0ZSBTdHJpbmcgYnVpbGRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBudW1iZXIpIHsKLQotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShudW1iZXIpKSB7Ci0JCQkgcmV0dXJuIGZpbGVOYW1lOwotCQkgfQotCQkgcmV0dXJuIChudW1iZXIuZXF1YWxzKCIwIikpID8gZmlsZU5hbWUgOiBmaWxlTmFtZSArIG51bWJlcjsgICAvLyROT04tTkxTLTEkCi0JIH0KLQkgCi0JIHByaXZhdGUgU3RyaW5nIG1vZGlmeUZpbGVOYW1lKFN0cmluZyBuYW1lc3BhY2VVUkkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJIFN0cmluZyBkaXIgPSBUb29scy5leHRyYWN0RGlyZWN0b3J5KHRoaXMuZGVmYXVsdFNjaGVtYU5hbWUpOwotCi0JCSBTdHJpbmcgZmlsZU5hbWUgPSBUb29scy5zdHJpcFByb3RvY29sKG5hbWVzcGFjZVVSSSk7Ci0JCSBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2VBbGwoIi8iLCAiXyIpOwkJLy8kTk9OLU5MUy0xJAotCQkgZmlsZU5hbWUgPSBUb29scy5hcHBlbmRYc2RFeHRlbnNpb24oZmlsZU5hbWUpOwotCi0JCVN0cmluZyByZXN1bHQgPSAoVG9vbHMuc3RyaW5nSXNFbXB0eShkaXIpKSA/IGZpbGVOYW1lIDogZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQkJCi0JCXJldHVybiByZXN1bHQ7Ci0JIH0KLQotCSBwcml2YXRlIFN0cmluZyBjYW5vbmljYWxGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZShuZXcgRmlsZShmaWxlTmFtZSkpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQkgcHJpdmF0ZSBGaWxlIGNhbm9uaWNhbEZpbGUoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0JCX0gCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvSnB0SmF4YkNvcmVNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTcwNTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIEpBWEIgY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpheGJDb3JlTWVzc2FnZXMKLXsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURJTkdfQ0xBU1NFUyA9ICJMT0FESU5HX0NMQVNTRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRJTkdfU0NIRU1BID0gIkdFTkVSQVRJTkdfU0NIRU1BIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfR0VORVJBVEVEID0gIlNDSEVNQV9HRU5FUkFURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OT1RfQ1JFQVRFRCA9ICJTQ0hFTUFfTk9UX0NSRUFURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GT1VORCA9ICJOT1RfRk9VTkQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQgPSAiQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuanB0X2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHRKYXhiQ29yZU1lc3NhZ2VzKCkgewotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUkVTT1VSQ0VfQlVORExFLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICchJyArIGtleSArICchJzsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0Mjc2NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotLyoqCi0gKiAgVG9vbHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRvb2xzCi17Ci0JLyoqIGRlZmF1bHQgZmlsZSBuYW1lIHVzZWQgYnkgdGhlIHNjaGVtYWdlbiAqLwotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEdFTl9ERUZBVUxUX05BTUUgPSAic2NoZW1hIjsgICAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGVtcHR5IHN0cmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgbnVsbCwgZW1wdHksIG9yIGNvbnRhaW5zCi0JICogb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoU3RyaW5nIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ0lzRW1wdHlfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4pOwotCX0JCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHlfKGNoYXJbXSBzLCBpbnQgbGVuKSB7Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBuYW1lIG1hbmlwdWxhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpcCB0aGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlIG5hbWUgaGFzIG5vCi0JICogZXh0ZW5zaW9uLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQKLQkgKiBGaWxlI2Jhc2VQYXRoKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcEV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBQcm90b2NvbChTdHJpbmcgdXJpKSB7Ci0KLQkJIHJldHVybiB1cmkucmVwbGFjZUZpcnN0KCJodHRwOi8vIiwgRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZFhzZEV4dGVuc2lvbihTdHJpbmcgbmFtZSkgewotCi0JCSByZXR1cm4gbmFtZSArICIueHNkIjsJCS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0RmlsZU51bWJlcihTdHJpbmcgZmlsZU5hbWUpIHsKLQotCQkgU3RyaW5nIHJlc3VsdCA9IHN0cmlwRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkocmVzdWx0KSkgewotCQkJIHJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCSB9Ci0JCSByZXR1cm4gcmVzdWx0LnJlcGxhY2VGaXJzdChHRU5fREVGQVVMVF9OQU1FLCBFTVBUWV9TVFJJTkcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3REaXJlY3RvcnkoU3RyaW5nIHBhdGgpIHsKLQkJaWYoICEgcGF0aC5jb250YWlucyhGaWxlLnNlcGFyYXRvcikpIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7CQotCQl9Ci0JCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTkxTIHV0aWxpdGllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5nZXRTdHJpbmcoa2V5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmd1bWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxMTJjZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1MT0FESU5HX0NMQVNTRVMgPSBsb2FkaW5nLi4uCi1HRU5FUkFUSU5HX1NDSEVNQSA9IFxuZ2VuZXJhdGluZyBzY2hlbWEuLi4KLVNDSEVNQV9HRU5FUkFURUQgPSAgXG5TY2hlbWEgezB9IGdlbmVyYXRlZAotU0NIRU1BX05PVF9DUkVBVEVEID0gIFxuU2NoZW1hIHswfSBub3QgY3JlYXRlZAotTk9UX0ZPVU5EID0gIFxuXHROb3QgZm91bmQ6IHswfQotQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCA9ICBcblRoZSBKQVhCQ29udGV4dEZhY3RvcnkgezB9IFxuXAotc3BlY2lmaWVkIGluIHRoZSBqYXhiLnByb3BlcnRpZXMgZmlsZSBjb3VsZCBub3QgYmUgbG9jYXRlZCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguIFxuXAotVGhlIEpBWEIgcHJvdmlkZXIgdGhhdCBkZWZpbmVzIHRoaXMgZmFjdG9yeSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHByb2plY3QgY2xhc3NwYXRoLCBcblwKLW9yIHRoZSBqYXhiLnByb3BlcnRpZXMgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZCB0byB1c2UgdGhlIGRlZmF1bHQgcHJvdmlkZXIuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjNmYjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjZlYmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWUzMDdkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmQwM2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGIyZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjY4ZTkwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZjljZWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL2VjbGlwc2VsaW5rLmphciIgc291cmNlcGF0aD0ibGliL2VjbGlwc2VsaW5rLXNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MmMzNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZiNGZmNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEFwciAxMyAxMjoxMjoyNyBFRFQgMjAxMAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhMzQzMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvZWNsaXBzZWxpbmsuamFyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2ZmZTcxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2U9MS41Ci1qYXZhY1RhcmdldD0xLjUKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBsaWIvZWNsaXBzZWxpbmsuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9saWIvZWNsaXBzZWxpbmstc3JjLnppcCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9saWIvZWNsaXBzZWxpbmstc3JjLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhNTM5My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLXNyYy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vbGliL2VjbGlwc2VsaW5rLmphciBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9saWIvZWNsaXBzZWxpbmsuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlNjQ0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9saWIvZWNsaXBzZWxpbmsuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDU3NDExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpBWEIgU3VwcG9ydCAtIFNjaGVtYSBHZW5lcmF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFlMDVmMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuU2NoZW1hT3V0cHV0UmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3Rvcnk7Ci0KLS8qKgotICogIEdlbmVyYXRlIGEgRWNsaXBzZUxpbmsgSkFYQiBTY2hlbWEKLSAqICAKLSAqIEN1cnJlbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKLSAqICAgICBbLXMgc2NoZW1hLnhzZF0gLSBzcGVjaWZpZXMgdGhlIHRhcmdldCBzY2hlbWEKLSAqICAgICBbLWMgY2xhc3NOYW1lXSAtIHNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIFN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBOT19GQUNUT1JZX0NMQVNTID0gImRvZXNudCBjb250YWluIE9iamVjdEZhY3RvcnkuY2xhc3MiOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBDQU5OT1RfQkVfQ0FTVF9UT19KQVhCQ09OVEVYVCA9ICJjYW5ub3QgYmUgY2FzdCB0byBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0IjsgICAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBNYWluKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQkKLQkJdGhpcy5pbml0aWFsaXplV2l0aChhcmdzKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aChTdHJpbmdbXSBhcmdzKSB7Ci0gICAgCXRoaXMuc291cmNlQ2xhc3NOYW1lcyA9IHRoaXMuZ2V0U291cmNlQ2xhc3NOYW1lcyhhcmdzKTsKLSAgICAJdGhpcy50YXJnZXRTY2hlbWFOYW1lID0gdGhpcy5nZXRUYXJnZXRTY2hlbWFOYW1lKGFyZ3MpOwotCi0JCXRoaXMuaXNEZWJ1Z01vZGUgPSB0aGlzLmdldERlYnVnTW9kZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGUoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSB0aGUgSkFYQkNvbnRleHQKLSAgICAgICAgSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSB0aGlzLmJ1aWxkSmF4YkNvbnRleHQoKTsKLQotICAgICAgICAvLyBHZW5lcmF0ZSBhbiBYTUwgU2NoZW1hCi0gICAgICAgIGlmKGpheGJDb250ZXh0ICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdGVTY2hlbWEoamF4YkNvbnRleHQpOwotCQl9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAJVG9vbHMuYmluZChKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuU0NIRU1BX05PVF9DUkVBVEVELCB0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotICAgICAgICB9Ci0JfQotCQotCXByaXZhdGUgSkFYQkNvbnRleHQgYnVpbGRKYXhiQ29udGV4dCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRvb2xzLmdldFN0cmluZyhKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuTE9BRElOR19DTEFTU0VTKSk7Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUNsYXNzTG9hZGVyIGxvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCQkKLQkJCUNsYXNzW10gc291cmNlQ2xhc3NlcyA9IHRoaXMuYnVpbGRTb3VyY2VDbGFzc2VzKHRoaXMuc291cmNlQ2xhc3NOYW1lcywgbG9hZGVyKTsKLQkJCQotCQkJLy9jYWxsIE1PWHkgSkFYQkNvbnRleHRGYWN0b3J5IGRpcmVjdGx5LiAgVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIHRvIGhhdmUgdGhlIEpBWEIgcHJvcGVydGllcyBmaWxlIGluIHBsYWNlCi0JCQkvL2luIHRpbWUgZm9yIHRoZSBnZW5lcmF0aW9uLgotCQkJamF4YkNvbnRleHQgPSAoSkFYQkNvbnRleHQpSkFYQkNvbnRleHRGYWN0b3J5LmNyZWF0ZUNvbnRleHQoc291cmNlQ2xhc3NlcywgQ29sbGVjdGlvbnMuPFN0cmluZyxPYmplY3Q+ZW1wdHlNYXAoKSk7Ci0JCX0KLQkJY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMuaGFuZGxlSmF4YkV4Y2VwdGlvbihleCk7Ci0JCX0KLQkJY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBleCkgewotCQkJdGhpcy5oYW5kbGVDbGFzc0Nhc3RFeGNlcHRpb24oZXgpOwotCQl9Ci0JCXJldHVybiBqYXhiQ29udGV4dDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlU2NoZW1hKEpBWEJDb250ZXh0IGpheGJDb250ZXh0KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkdFTkVSQVRJTkdfU0NIRU1BKSk7Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgIAlTY2hlbWFPdXRwdXRSZXNvbHZlciBzY2hlbWFPdXRwdXRSZXNvbHZlciA9IAotICAgIAkJbmV3IEpwdFNjaGVtYU91dHB1dFJlc29sdmVyKHRoaXMudGFyZ2V0U2NoZW1hTmFtZSk7Ci0KLQkJdHJ5IHsKLQkJCWpheGJDb250ZXh0LmdlbmVyYXRlU2NoZW1hKHNjaGVtYU91dHB1dFJlc29sdmVyKTsKLQkJfQotCQljYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLSAgICAKLSAgICBwcml2YXRlIENsYXNzW10gYnVpbGRTb3VyY2VDbGFzc2VzKFN0cmluZ1tdIGNsYXNzTmFtZXMsIENsYXNzTG9hZGVyIGxvYWRlcikgewotCi0JCUFycmF5TGlzdDxDbGFzcz4gc291cmNlQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3M+KGNsYXNzTmFtZXMubGVuZ3RoKTsKLQkJZm9yKFN0cmluZyBjbGFzc05hbWU6IGNsYXNzTmFtZXMpIHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlQ2xhc3Nlcy5hZGQobG9hZGVyLmxvYWRDbGFzcyhjbGFzc05hbWUpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKFRvb2xzLmJpbmQoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLk5PVF9GT1VORCwgY2xhc3NOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQlyZXR1cm4gc291cmNlQ2xhc3Nlcy50b0FycmF5KG5ldyBDbGFzc1swXSk7Ci0gICAgfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVKYXhiRXhjZXB0aW9uKEpBWEJFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCVRocm93YWJsZSBsaW5rZWRFeCA9IGV4LmdldExpbmtlZEV4Y2VwdGlvbigpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKE5PX0ZBQ1RPUllfQ0xBU1MpID4gLTEpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKLQkJfQotCQllbHNlIGlmKGxpbmtlZEV4ICE9IG51bGwgJiYgbGlua2VkRXggaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gVG9vbHMuYmluZCgKLQkJCQlKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCwgbGlua2VkRXguZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlcnJvck1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzQ2FzdEV4Y2VwdGlvbihDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBleC5nZXRNZXNzYWdlKCk7Ci0JCWlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmluZGV4T2YoQ0FOTk9UX0JFX0NBU1RfVE9fSkFYQkNPTlRFWFQpID4gLTEpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLlBST1BFUlRJRVNfRklMRV9OT1RfRk9VTkQpKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZ1tdIGdldFNvdXJjZUNsYXNzTmFtZXMoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFsbEFyZ3VtZW50VmFsdWVzKCItYyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0U2NoZW1hTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxBcmd1bWVudFZhbHVlcyhTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlMaXN0PFN0cmluZz4gYXJnVmFsdWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCWFyZ1ZhbHVlcy5hZGQoYXJnc1tqXSk7Ci0JCQkJCWkrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFyZ1ZhbHVlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19Ci0KLS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi1jbGFzcyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlciBleHRlbmRzIFNjaGVtYU91dHB1dFJlc29sdmVyIHsKLQkKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcihTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWUpIHsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hTmFtZSA9IGRlZmF1bHRTY2hlbWFOYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCSBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gKFRvb2xzLnN0cmluZ0lzRW1wdHkobmFtZXNwYWNlVVJJKSkgPyAKLSAgICAgICAgCQl0aGlzLmJ1aWxkRmlsZU5hbWVGcm9tKHRoaXMuZGVmYXVsdFNjaGVtYU5hbWUsIHN1Z2dlc3RlZEZpbGVOYW1lKSA6IAotICAgICAgICAJCXRoaXMubW9kaWZ5RmlsZU5hbWUobmFtZXNwYWNlVVJJKTsKLQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGZpbGUpOwotICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoZmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludChUb29scy5iaW5kKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5TQ0hFTUFfR0VORVJBVEVELCBmaWxlKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCSBwcml2YXRlIFN0cmluZyBidWlsZEZpbGVOYW1lRnJvbShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBzdWdnZXN0ZWRGaWxlTmFtZSkgewotCi0JCSBmaWxlTmFtZSA9IFRvb2xzLnN0cmlwRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShmaWxlTmFtZSkpIHsKLQkJCSByZXR1cm4gc3VnZ2VzdGVkRmlsZU5hbWU7Ci0JCSB9Ci0JCSBTdHJpbmcgbnVtYmVyID0gVG9vbHMuZXh0cmFjdEZpbGVOdW1iZXIoc3VnZ2VzdGVkRmlsZU5hbWUpOwotCi0JCSBmaWxlTmFtZSA9IHRoaXMuYnVpbGRGaWxlTmFtZShmaWxlTmFtZSwgbnVtYmVyKTsKLQkJIHJldHVybiBUb29scy5hcHBlbmRYc2RFeHRlbnNpb24oZmlsZU5hbWUpOwotCSB9Ci0KLQkgcHJpdmF0ZSBTdHJpbmcgYnVpbGRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyBudW1iZXIpIHsKLQotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShudW1iZXIpKSB7Ci0JCQkgcmV0dXJuIGZpbGVOYW1lOwotCQkgfQotCQkgcmV0dXJuIChudW1iZXIuZXF1YWxzKCIwIikpID8gZmlsZU5hbWUgOiBmaWxlTmFtZSArIG51bWJlcjsgICAvLyROT04tTkxTLTEkCi0JIH0KLQotCSBwcml2YXRlIFN0cmluZyBtb2RpZnlGaWxlTmFtZShTdHJpbmcgbmFtZXNwYWNlVVJJKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCSBTdHJpbmcgZGlyID0gVG9vbHMuZXh0cmFjdERpcmVjdG9yeSh0aGlzLmRlZmF1bHRTY2hlbWFOYW1lKTsKLQotCQkgU3RyaW5nIGZpbGVOYW1lID0gVG9vbHMuc3RyaXBQcm90b2NvbChuYW1lc3BhY2VVUkkpOwotCQkgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlQWxsKCIvIiwgIl8iKTsJCS8vJE5PTi1OTFMtMSQKLQkJIGZpbGVOYW1lID0gVG9vbHMuYXBwZW5kWHNkRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQotCQlTdHJpbmcgcmVzdWx0ID0gKFRvb2xzLnN0cmluZ0lzRW1wdHkoZGlyKSkgPyBmaWxlTmFtZSA6IGRpciArIEZpbGUuc2VwYXJhdG9yICsgZmlsZU5hbWU7Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwotCSB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE5ZTJlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIEVjbGlwc2VMaW5rIEpBWEIgY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQURJTkdfQ0xBU1NFUyA9ICJMT0FESU5HX0NMQVNTRVMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRJTkdfU0NIRU1BID0gIkdFTkVSQVRJTkdfU0NIRU1BIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfR0VORVJBVEVEID0gIlNDSEVNQV9HRU5FUkFURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OT1RfQ1JFQVRFRCA9ICJTQ0hFTUFfTk9UX0NSRUFURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GT1VORCA9ICJOT1RfRk9VTkQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQgPSAiQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCA9ICJQUk9QRVJUSUVTX0ZJTEVfTk9UX0ZPVU5EIjsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcygpIHsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIFJFU09VUkNFX0JVTkRMRS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAnIScgKyBrZXkgKyAnISc7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9Ub29scy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTMyZTRjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLS8qKgotICogIFRvb2xzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUb29scwotewotCS8qKiBkZWZhdWx0IGZpbGUgbmFtZSB1c2VkIGJ5IHRoZSBzY2hlbWFnZW4gKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBHRU5fREVGQVVMVF9OQU1FID0gInNjaGVtYSI7ICAgLy8kTk9OLU5MUy0xJAotCQotCS8qKiBlbXB0eSBzdHJpbmcgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG51bGwsIGVtcHR5LCBvciBjb250YWlucwotCSAqIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKTsKLQl9CQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5XyhjaGFyW10gcywgaW50IGxlbikgewotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vICoqKioqKioqKiogc2hvcnQgbmFtZSBtYW5pcHVsYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lCi0JICogYW5kIHJldHVybiB0aGUgcmVzdWx0LiBJZiB0aGUgZmlsZSBuYW1lIGhhcyBubwotCSAqIGV4dGVuc2lvbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkCi0JICogRmlsZSNiYXNlUGF0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwUHJvdG9jb2woU3RyaW5nIHVyaSkgewotCi0JCSByZXR1cm4gdXJpLnJlcGxhY2VGaXJzdCgiaHR0cDovLyIsIEVNUFRZX1NUUklORyk7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRYc2RFeHRlbnNpb24oU3RyaW5nIG5hbWUpIHsKLQotCQkgcmV0dXJuIG5hbWUgKyAiLnhzZCI7CQkvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdEZpbGVOdW1iZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0KLQkJIFN0cmluZyByZXN1bHQgPSBzdHJpcEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCSBpZihUb29scy5zdHJpbmdJc0VtcHR5KHJlc3VsdCkpIHsKLQkJCSByZXR1cm4gRU1QVFlfU1RSSU5HOwotCQkgfQotCQkgcmV0dXJuIHJlc3VsdC5yZXBsYWNlRmlyc3QoR0VOX0RFRkFVTFRfTkFNRSwgRU1QVFlfU1RSSU5HKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCWlmKCAhIHBhdGguY29udGFpbnMoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwkKLQkJfQotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIE5MUyB1dGlsaXRpZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5nZXRTdHJpbmcoa2V5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmd1bWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL2pwdF9lY2xpcHNlbGlua19qYXhiX2NvcmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNzY2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL2pwdF9lY2xpcHNlbGlua19qYXhiX2NvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1MT0FESU5HX0NMQVNTRVMgPSBsb2FkaW5nLi4uCi1HRU5FUkFUSU5HX1NDSEVNQSA9IFxuTU9YeSBnZW5lcmF0aW5nIHNjaGVtYS4uLgotU0NIRU1BX0dFTkVSQVRFRCA9ICBcblNjaGVtYSB7MH0gZ2VuZXJhdGVkCi1TQ0hFTUFfTk9UX0NSRUFURUQgPSAgXG5TY2hlbWEgezB9IG5vdCBjcmVhdGVkCi1OT1RfRk9VTkQgPSAgXG5cdE5vdCBmb3VuZDogezB9Ci1QUk9QRVJUSUVTX0ZJTEVfTk9UX0ZPVU5EID0gIFxuRWNsaXBzZUxpbmsgSkFYQkNvbnRleHRGYWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBqYXhiLnByb3BlcnRpZXMgZmlsZSB0byB1c2UgRWNsaXBzZUxpbmsgTU9YeSBmb3Igc2NoZW1hIGdlbmVyYXRpb24uXG5cCi1qYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3Rvcnk9b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3RvcnkKLUNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQgPSAgXG5UaGUgSkFYQkNvbnRleHRGYWN0b3J5IHswfSBcblwKLXNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgY291bGQgbm90IGJlIGxvY2F0ZWQgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLiBcblwKLVRoZSBKQVhCIHByb3ZpZGVyIHRoYXQgZGVmaW5lcyB0aGlzIGZhY3Rvcnkgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0IGNsYXNzcGF0aCwgXG5cCi1vciB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgc2hvdWxkIGJlIHJlbW92ZWQgdG8gdXNlIHRoZSBkZWZhdWx0IHByb3ZpZGVyLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2Q3ZWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk5YTM2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NWEyNDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1RodSBGZWIgMTcgMTY6NDk6NTggRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwYzE3OS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5KcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWwsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUzYTRmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA3NzFhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBNT1h5IFN1cHBvcnQgLSBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1NT1hZX1BMQVRGT1JNX0dST1VQX0xBQkVMID0gRWNsaXBzZUxpbmsgTU9YeQotTU9YWV8yXzNfUExBVEZPUk1fTEFCRUwgPSBFY2xpcHNlTGluayBNT1h5IDIuMy54CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkYmE3YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlBsYXRmb3JtcyI+Ci0JCQotCQk8amF4YlBsYXRmb3JtR3JvdXAKLSAgICAgICAgCWlkPSJtb3h5IgotICAgICAgICAJbGFiZWw9IiVNT1hZX1BMQVRGT1JNX0dST1VQX0xBQkVMIi8+Ci0JCQotCQk8amF4YlBsYXRmb3JtCi0JCQlpZD0ibW94eV8yXzMiCi0JCQlsYWJlbD0iJU1PWFlfMl8zX1BMQVRGT1JNX0xBQkVMIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzMuTW94eV8yXzNfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSIKLQkJCWdyb3VwPSJtb3h5IgotCQkJamF4YkZhY2V0VmVyc2lvbj0iMi4yIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0ibW94eVVzZXJMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsLk1veHlVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuZXh0ZW5kc0lkIiB2YWx1ZT0iamF4Yi11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQkJPC93aXRoPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0iY29uZmlnIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmpheGJQbGF0Zm9ybUdyb3VwIiB2YWx1ZT0ibW94eSIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC9hbmQ+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbGlicmFyeVZhbGlkYXRvcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0pwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0pwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5NjgxODAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4KLQkJZXh0ZW5kcyBQbHVnaW4gewotCQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gSlBUIEVjbGlwc2VMaW5rIHBsdWctaW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIG51bGwpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgkKLQkKLQlwdWJsaWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvTW94eVBsYXRmb3JtLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9Nb3h5UGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNDg4MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9Nb3h5UGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLQotcHVibGljIGNsYXNzIE1veHlQbGF0Zm9ybSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIEdST1VQIAotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtR3JvdXAoIm1veHkiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzMKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybSgibW94eV8yXzMiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qKgotCSAqIE5vdCBmb3IgaW5zdGFudGlhdGlvbgotCSAqLwotCXByaXZhdGUgTW94eVBsYXRmb3JtKCkge30KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9Nb3h5VXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9Nb3h5VXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmYTY5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvTW94eVVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsLkVjbGlwc2VMaW5rTGliVmFsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3YuSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5Nb3h5UGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotCi0vKioKLSAqIExpYnJhcnkgdmFsaWRhdG9yIGZvciBNb3h5IHVzZXIgbGlicmFyaWVzLgotICogCi0gKiBJbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZSBjb3JyZWN0IGVjbGlwc2VsaW5rLmphciBpcyBwcmVzZW50IGluIHRoZSB1c2VyIGxpYnJhcnksIHRoZSB2ZXJzaW9uCi0gKiBjbGFzcyB3aGljaCBhcHBlYXJzIGluIHN0YW5kYXJkIEVjbGlwc2VMaW5rIGxpYnJhcmllcyB3aWxsIGJlIGV4YW1pbmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHRoZQotICogdW5pb24gb2YgY2FsY3VsYXRlZCB2ZXJzaW9uIHJhbmdlcywgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZy4KLSAqLwotcHVibGljIGNsYXNzIE1veHlVc2VyTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqYXhiQ29uZmlnIAotCQkJCT0gKEpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSA9IGpheGJDb25maWcuZ2V0SmF4YlBsYXRmb3JtKCk7Ci0JCVNldDxWZXJzaW9uUmFuZ2U+IHZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaFNldDxWZXJzaW9uUmFuZ2U+KCk7Ci0JCQotCQlpZiAoTW94eVBsYXRmb3JtLlZFUlNJT05fMl8zLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjMsIDMuMCkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTGliVmFsVXRpbC52YWxpZGF0ZShqYXhiQ29uZmlnLnJlc29sdmUoKSwgdmVyc2lvblJhbmdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9Nb3h5XzJfM19QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvTW94eV8yXzNfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MjQ4MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9Nb3h5XzJfM19QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMi5BYnN0cmFjdEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLk1veHlQbGF0Zm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgTW94eV8yXzNfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEFic3RyYWN0SmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE1veHlfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgTW94eV8yXzNfUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBNb3h5UGxhdGZvcm0uVkVSU0lPTl8yXzM7Ci0JfQotCi0JcHVibGljIEpheGJGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfRmFjdG9yeS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvTW94eV8yXzNfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9Nb3h5XzJfM19QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjM0ODQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9Nb3h5XzJfM19QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBNb3h5XzJfM19QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Ci0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgewotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIE1veHlfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNjViZWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNjQ0Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWEyNGQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ5NTQzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNGcmkgRmViIDE4IDE2OjA0OjAwIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzNjAzZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5KcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmMzM1NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjBiN2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBNT1h5IFN1cHBvcnQgLSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGIxZTFlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmpheGJQbGF0Zm9ybVVpcyI+Ci0JCQotCQk8amF4YlBsYXRmb3JtVWkKLQkJCWlkPSJtb3h5XzJfMy51aSIKLQkJCWpheGJQbGF0Zm9ybT0ibW94eV8yXzMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMy5Nb3h5XzJfM19QbGF0Zm9ybVVpIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0FjdGl2YXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllODE1OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0Jc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhNTZkOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0pwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luCi0JCWV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkiOwotCQotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbiBJTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGVycm9yIGxvZ2dpbmcgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8zL01veHlfMl8zX1BsYXRmb3JtVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMy9Nb3h5XzJfM19QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTFkOTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8zL01veHlfMl8zX1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLkpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIE1veHlfMl8zX1BsYXRmb3JtVWkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JVaSBnZXROYXZpZ2F0b3JVaSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxMjNjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YTAzZjAuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzZTlkZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVjMzEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjQ3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjY2ZhZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQxYTIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAoT3B0aW9uYWwpCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MDFlNmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIgdmVyc2lvbj0iMy4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkiCi0gICAgICAgICB2ZXJzaW9uPSIwLjguMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0iCi0gICAgICAgICB2ZXJzaW9uPSIwLjguMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkucGF0dGVybiIKLSAgICAgICAgIHZlcnNpb249IjAuOC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aSIKLSAgICAgICAgIHZlcnNpb249IjAuOC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1OWU1Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjA4MmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1NDJmZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IChPcHRpb25hbCkKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1OWU1Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjA4MmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjNzAwMS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Yjg0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZkZTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjYxN2QuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBDb3JlIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgSlVuaXQgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ2MzkzZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNjVkM2QuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmVfMS4wLjEuKgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmNDg2Mi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNTowOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxNjk4Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiZDI4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCBTREsgKE9wdGlvbmFsKQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdjMTZjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZDk1ZDcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjU4MzcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjQ3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjY2ZhZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZTBkMDcuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNGMyMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmZlYXR1cmUiIHZlcnNpb249IjEuOC4wIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5mZWF0dXJlIiB2ZXJzaW9uPSIxLjguMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmZlYXR1cmUiIHZlcnNpb249IjEuOC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sYW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUudmVsb2NpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS41LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5vcm8iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjgucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmpkb20iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyODhhZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc1OTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmEzZWYwLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDdhZDRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNjM0ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAxMC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5NTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc1OTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDY2ZmE1Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzViODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMToxNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmRlNzQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiYjgxMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBBbmQgSlBBIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgQ29tbW9uIEFuZCBKUEEgSlVuaXQgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyOTNhNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMC4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdhZWJlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZV8xLjAuMS4qCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTMzYjVlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNjN2Q0Yi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjA5OjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDYxMGMzLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJmOTMuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmZmJhYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZG9jLmlzdiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU3MGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1MjNjZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMzE1ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNTY1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YTU1NzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjZmNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2NzBmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTIzYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuNC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuaGVscDtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cztidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTkxMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjk1IiBuYW1lPSJzdGhyZWYyOTUiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+Tm92ZW1iZXIsIDIwMDk8L3A+Ci08YSBpZD0ic3RocmVmMjk2IiBuYW1lPSJzdGhyZWYyOTYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhODRlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWJvdXQgdGhpcyBjb250ZW50PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIEJ1aWxkIDAwNCIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMDktMTEtMTZUOTo1NjoyM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJBYm91dCB0aGlzIGNvbnRlbnQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMy4wIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+Ci08aDE+QWJvdXQgdGhpcyBjb250ZW50PC9oMT4KLTxwPk5vdmVtYmVyLCAyMDA5PC9wPgotPGEgaWQ9InN0aHJlZjI5MSIgbmFtZT0ic3RocmVmMjkxIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkxpY2Vuc2U8L3A+Ci08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+PC9jb2RlPi4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCBhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT48L2NvZGU+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAwOSwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNDIxMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gY2hlYXRzaGVldHMvLFwKLSAgICAgICAgICAgICAgIGRjb21tb24vLFwKLSAgICAgICAgICAgICAgIGltZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb25jZXB0X21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBjb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMi5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAzLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIGluZGV4LnhtbCxcCi0gICAgICAgICAgICAgICBsZWdhbC5odG0sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICByZWZfZGV0YWlsc19vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qcGFfZmFjZXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3QuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wcmltYXJ5X2tleS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDEyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgdGFza19pbmhlcml0YW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYW5hZ2Vfb3JtLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgdGFza19tYXBwaW5nLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDExLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTYuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIwLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHRpcHNfYW5kX3RyaWNrcy5odG0sXAotICAgICAgICAgICAgICAgdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMS5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAyLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIxLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjguaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMzEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI0Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hZGRfY29udmVydGVyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfamF2YV9wYWdlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfam9pbl9jb2x1bW5zLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdFRhYmxlcy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMy5odG0sXAotICAgICAgICAgICAgICAgdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDI2Lmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDYuaHRtCi1nZW5lcmF0ZVNvdXJjZUJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2FkZF9wZXJzaXN0ZW5jZS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZWVkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMsIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1UaGUgRGF0YWJhc2UgQ29ubmVjdGlvbiBkaWFsb2cgYXV0b21hdGljYWxseSBhcHBlYXJzIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8Y29tbWFuZCBzZXJpYWxpemF0aW9uPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuc3FsZWRpdG9yLmF0dGFjaFByb2ZpbGVBY3Rpb24iIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvY29tbWFuZD4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1PbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd2l6YXJkLCBlbnRlciBhIHByb2plY3QgbmFtZSBhbmQgbG9jYXRpb24sIHNlbGVjdCB5b3VyIHRhcmdldCBydW50aW1lLCBhbmQgc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24uCi0KLUNsaWNrIDxiPk5leHQ8L2I+IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IlNlbGVjdCBQcm9qZWN0IEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy9waC1wcm9qZWN0cy5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgUHJvamVjdCBGYWNldCBwYWdlIHRvIHNlbGVjdCBhIHByZWRlZmluZWQgcHJvamVjdCBjb25maWd1cmF0aW9uIG9yIHNwZWNpZmljIHNwZWNpZmljIGZhY2V0cyB0byBpbmNsdWRlIGluIHRoZSBwcm9qZWN0LiAKLQotQ2xpY2sgJnF1b3Q7TmV4dCZxdW90OyB0byBkaXNwbGF5IHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIHdpemFyZC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU3BlY2lmeSB0aGUgSlBBIEZhY2V0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpkdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIEpQQSBGYWNldCBwYWdlIHRvIHNwZWNpZnkgdGhlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtLCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UsIGFuZCB0aGUgc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkuIAotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgYW4gb3JtLnhtbCBmaWxlLgotCi1JZiB5b3UgZG8gbm90IGhhdmUgYW4gYWN0aXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxiPkFkZCBDb25uZWN0aW9uczwvYj4gdG8gY3JlYXRlIG9uZS4gCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhIGRlZmluZWQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnksIGNsaWNrIDxiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9iPiBvciA8Yj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L2I+IHRvIGRlZmluZSBvbmUuIAotCi1DbGljayA8Yj5GaW5pc2g8L2I+IHRvIGNvbXBsZXRlIHRoZSB3aXphcmQgYW5kIG9wZW4gdGhlIG9wZW4gdGhlIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gYWRkIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgbWFwIHRob3NlIGVudGl0aWVzIHRvIGRhdGFiYXNlIHRhYmxlcy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NGU4YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL2NyZWF0ZV9lbnRpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0JPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gYWRkIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byB5b3VyIEphdmEgcHJvamVjdC4gCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgPGI+Q2xpY2sgdG8gQmVnaW48L2I+IGJ1dHRvbiBiZWxvdy4gCi1MZXQncyBnZXQgc3RhcnRlZCEKLSAgPC9kZXNjcmlwdGlvbj4KLQk8L2ludHJvPgotCTxpdGVtIHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCIgc2tpcD0idHJ1ZSI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRvIGNyZWF0ZSBhIFBlcnNpc3RlbnQgZW50aXR5LCB5b3UgbXVzdCBjcmVhdGUgYSBKUEEgcHJvamVjdC4gSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLgotSWYgbm90LCBzZWxlY3QgPGI+RmlsZS0+TmV3LT5Qcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0+SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiBDb21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIENyZWF0ZSBKUEEgUHJvamVjdCB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLQkJPGFjdGlvbiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5qcHQudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSIvPgotCQk8ZGVzY3JpcHRpb24+Ci1XaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgIkNsaWNrIHRvIFNraXAiIGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctPk9wZW4gUGVyc3BlY3RpdmUtPk90aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgIkNsaWNrIHRvIFBlcmZvcm0iIGJ1dHRvbiB0byBoYXZlIHRoZSAiUGVyc2lzdGVuY2UiIHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiPgotCQk8ZGVzY3JpcHRpb24+Ci1UaGUgbmV4dCBzdGVwIGlzIHRvIGNyZWF0ZSBhIG5ldyBKYXZhIGNsYXNzLiBJbiB0aGUgbWFpbiB0b29sYmFyIGFnYWluLCBjbGljayBvbiA8Yj5OZXcgSmF2YSBDbGFzczwvYj4gYnV0dG9uIChvciB0aGUgbGluayBiZWxvdykuCi1UaGUgSmF2YSBlZGl0b3Igd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gc2hvd2luZyB5b3VyIG5ldyBjbGFzcy4gICAgICAKLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPgotRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICJNYXAgQXMiIGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgPC9kZXNjcmlwdGlvbj4KLQk8L2l0ZW0+Ci0JPGl0ZW0gdGl0bGU9IkZpbmlzaCI+Ci0JCTxkZXNjcmlwdGlvbj4KLUNvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgSlBBIGVudGl0eSB0byB5b3VyIEpQQSBwcm9qZWN0LiBDb21wbGV0ZSB0aGUgYWRkaXRpb25hbCBjaGVhdCBzaGVldHMgdG8gbWFwIHRoZSBlbnRpdHkncyBmaWVsZHMgdG8gZGF0YWJhc2UgdGFibGVzLgotICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMDdmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvbWFwX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9Ik1hcCBhIEphdmEgUGVyc2lzdGVudCBFbnRpdHkiPgotICAgPGludHJvIGhyZWY9Ii9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9yZWZlcmVuY2UvcmVmLWNoZWF0c2hlZXRzLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBUaGlzIGNoZWF0IHNoZWV0IHdpbGwgYXV0b21hdGljYWxseSBsYXVuY2ggd2l6YXJkcywgcGVyZm9ybSBhY3Rpb25zLCBhbmQgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHN0ZXBzIHRvIG1hcCB0aGUgZmllbGRzIG9mIGEgSlBBIGVudGl0eSBlbnRpdHkgdG8geW91ciBkYXRhYmFzZS4KLQotVG8gbGVhcm4gbW9yZSBhYm91dCB1c2luZyBjaGVhdCBzaGVldHMgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCwgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIEJlZ2luJnF1b3Q7IGJ1dHRvbiBiZWxvdy4gCi0KLUxldCZhcG9zO3MgZ2V0IHN0YXJ0ZWQhCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pbnRybz4KLSAgIDxpdGVtIHRpdGxlPSJTZXR1cCB0aGUgRW52aXJvbm1lbnQiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIvY19kYXRhYmFzZV9kZXZlbG9wbWVudF9zZXR1cC5odG1sIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFlvdXIgZW52aXJvbm1lbnQgbXVzdCBiZSBzZXQgdXAgYmVmb3JlIHlvdSBjYW4gcGVyZm9ybSB0aGUgc3RlcHMgaW4gdGhpcyBjaGVhdCBzaGVldC4gCi0KLUNyZWF0ZSBhIGRhdGFiYXNlIHByb2ZpbGUgYW5kIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCi1JZiB5b3UgYWxyZWFkeSBoYXZlIChhbmQgYXJlIGNvbm5lY3RlZCB0bykgYSBkYXRhYmFzZSBjb25uZWN0aW9uLCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0KLVRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGRpYWxvZyBhdXRvbWF0aWNhbGx5IGFwcGVhcnMgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxjb21tYW5kIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5zcWxlZGl0b3IuYXR0YWNoUHJvZmlsZUFjdGlvbiIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBVc2UgdGhlIE5ldyBQcm9qZWN0IFdpemFyZCB0byBjcmVhdGUgYSBKUEEgcHJvamVjdC4gCi1TZWxlY3QgPGI+RmlsZS0mZ3Q7TmV3LSZndDtQcm9qZWN0Li4uPC9iPiBhbmQgY2hvb3NlIDxiPkpQQS0mZ3Q7SlBBIFByb2plY3Q8L2I+IGluIHRoZSBsaXN0LiAKLQotQ29tcGxldGUgZWFjaCBwYWdlIG9mIHRoZSB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IEpQQSBwcm9qZWN0LgotCi1UaGUgJnF1b3Q7TmV3IEpQQSBQcm9qZWN0JnF1b3Q7IHdpemFyZCBpcyBhdXRvbWF0aWNhbGx5IGRpc3BsYXllZCB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgYSBKUEEgcHJvamVjdCwgeW91ICBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICZxdW90O0NsaWNrIHRvIFNraXAmcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk9wZW5Qcm9qZWN0V2l6YXJkQWN0aW9uIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UuamR0LnVpIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJPcGVuIHRoZSBKUEEgRGV2ZWxvcG1lbnQgUGVyc3BlY3RpdmUiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBXaGVuIHdvcmtpbmcgd2l0aCBKUEEgIHBlcnNpc3RlbmNlLCB5b3Ugc2hvdWxkIHVzZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUuIElmIHlvdSBhbHJlYWR5IGhhdmUgdGhlIFBlcnNpc3RlbmNlIHBlcnNwZWN0aXZlIGFjdGl2ZSwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIAotSWYgbm90LCBzZWxlY3QgPGI+V2luZG93LSZndDtPcGVuIFBlcnNwZWN0aXZlLSZndDtPdGhlcjwvYj4gaW4gdGhlIG1lbnViYXIgYXQgdGhlIHRvcCBvZiB0aGUgd29ya2JlbmNoLiBJbiB0aGUgU2VsZWN0IFBlcnNwZWN0aXZlcyBkaWFsb2csIHNlbGVjdCA8Yj5KUEEgRGV2ZWxvcG1lbnQ8L2I+IGFuZCBjbGljayBPSy4gVGhpcyBzdGVwIGNoYW5nZXMgdGhlIHBlcnNwZWN0aXZlIHRvIHNldCB1cCB0aGUgRWNsaXBzZSB3b3JrYmVuY2ggZm9yIEpQQSBkZXZlbG9wbWVudC4KLVlvdSBjYW4gY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uIHRvIGhhdmUgdGhlICZxdW90O1BlcnNpc3RlbmNlJnF1b3Q7IHBlcnNwZWN0aXZlIG9wZW5lZCBhdXRvbWF0aWNhbGx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmpwdC51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEphdmEgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIGEgbmV3IEphdmEgY2xhc3MuIEluIHRoZSBtYWluIHRvb2xiYXIgYWdhaW4sIGNsaWNrIG9uIDxiPk5ldyBKYXZhIENsYXNzPC9iPiBidXR0b24gKG9yIHRoZSBsaW5rIGJlbG93KS4KLVRoZSBKYXZhIGVkaXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBzaG93aW5nIHlvdXIgbmV3IGNsYXNzLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJDcmVhdGUgYSBQZXJzaXN0ZW50IEVudGl0eSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgRmluYWxseSB3ZSB3aWxsIG1ha2UgdGhlIEphdmEgY2xhc3MgYSBwZXJzaXN0ZW50IGVudGl0eS4KLUluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLUluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCB1c2UgdGhlICZxdW90O01hcCBBcyZxdW90OyBmaWVsZCB0byBzZWxlY3QgPGI+RW50aXR5PC9iPi4gRGFsaSBhdXRvbWF0aWNhbGx5IGFkZHMgdGhlIEBFbnRpdHkgYW5ub3RhdGlvbiB0byB0aGUgY2xhc3MgaW4gdGhlIEphdmEgZWRpdG9yLiAKLVVzZSB0aGUgVGFibGUsIENhdGFsb2csIGFuZCBTY2hlbWEgZmllbGRzIHRvIGFzc29jaWF0ZSB0aGUgZW50aXR5IHdpdGggYSBzcGVjaWZpYyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkFkZCBGaWVsZHMgdG8gdGhlIENsYXNzIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJ0cnVlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIE5vdyB5b3Ugd2lsbCBhZGQgc29tZSBmaWVsZHMgdG8gdGhlIGVudGl0eSB0byBtYXAgdG8gcm93cyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuICAgCi0KLUlmIHlvdXIgcGVyc2lzdGVudCBlbnRpdHkgYWxyZWFkeSBoYXMgZmllbGRzIHRvIG1hcCwgeW91IG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uIElmIG5vdCwgdXNlIHRoZSBKYXZhIGVkaXRvciB0byBhZGQgZmllbGRzIHRvIHRoZSBlbnRpdHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSB0aGUgTWFwcGluZyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiIGhyZWY9Ii9vcmcuZWNsaXBzZS5kYWxpLmRvYy51c2VyL3JlZl9lbnRpdHlfcGFnZS5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSBhcmUgcmVhZHkgdG8gbWFwIHRoZSBlbnRpdHkgZmllbGRzIHRvIGNvbHVtbnMgaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBJbiB0aGUgUGFja2FnZSBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKYXZhIGNsYXNzLiAKLQotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgZXhwYW5kIHRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byBkaXNwbGF5IHRoZSBmaWVsZHMuIFNlbGVjdCBhIGZpZWxkLiAKLQotVGhlIEpQQSBEZXRhaWxzIHZpZXcgZGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQuIFVzZSB0aGUgTWFwIEFzIGZpZWxkIHRvIHNlbGVjdCB0aGUgQmFzaWMgbWFwcGluZy4gVXNlIHRoZSBDb2x1bW4gZmllbGQgdG8gc2VsZWN0IGEgY29sdW1uIGZyb20gdGhlIGRhdGFiYXNlIHRhYmxlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwbHVnaW5JZD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMiIGNvbmZpcm09ImZhbHNlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmRhbGkudWkuUGVyc2lzdGVuY2VQZXJzcGVjdGl2ZSI+Ci0gICAgICA8L2FjdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJGaW5pc2giIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIENvbmdyYXR1bGF0aW9ucyEgWW91IGhhdmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCB0aGUgZmllbGRzIGZyb20gYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIGEgY29sdW1uIGluIGEgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfbWFwcGluZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmN2Q5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkRKRkkiIG5hbWU9IkJBQkJESkZJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIxIiBuYW1lPSJzdGhyZWYyMSI+PC9hPjxhIGlkPSJzdGhyZWYyMiIgbmFtZT0ic3RocmVmMjIiPjwvYT5UaGUgRGFsaSBPUiAob2JqZWN0LXJlbGF0aW9uYWwpIE1hcHBpbmcgVG9vbCBhbGxvd3MgeW91IHRvIGRlc2NyaWJlIGhvdyB5b3VyIGVudGl0eSBvYmplY3RzIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1hcDwvc3Bhbj4gdG8gdGhlIGRhdGEgc291cmNlIChvciBvdGhlciBvYmplY3RzKS4gVGhpcyBhcHByb2FjaCBpc29sYXRlcyBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgbW9kZWwmbmRhc2g7ZGV2ZWxvcGVycyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgb2JqZWN0IG1vZGVsLCBhbmQgREJBcyBhcmUgZnJlZSB0byBkZXNpZ24gdGhlaXIgaWRlYWwgc2NoZW1hLjwvcD4KLTxwPlRoZXNlIG1hcHBpbmdzIHRyYW5zZm9ybSBhbiBvYmplY3QgZGF0YSBtZW1iZXIgdHlwZSB0byBhIGNvcnJlc3BvbmRpbmcgcmVsYXRpb25hbCBkYXRhYmFzZSBkYXRhIHNvdXJjZSByZXByZXNlbnRhdGlvbi4gVGhlc2UgT1IgbWFwcGluZ3MgY2FuIGFsc28gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgc3RvcmVkIGluIG90aGVyIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UgYW5kIGFyZSByZWxhdGVkIHRocm91Z2ggZm9yZWlnbiBrZXlzLjwvcD4KLTxwPllvdSBjYW4gdXNlIHRoZXNlIG1hcHBpbmdzIHRvIG1hcCBzaW1wbGUgZGF0YSB0eXBlcyBpbmNsdWRpbmcgcHJpbWl0aXZlcyAoc3VjaCBhcyA8Y29kZT5pbnQ8L2NvZGU+KSwgSkRLIGNsYXNzZXMgKHN1Y2ggYXMgPGNvZGU+U3RyaW5nPC9jb2RlPiksIGFuZCBsYXJnZSBvYmplY3QgKExPQikgdmFsdWVzLiBZb3UgY2FuIGFsc28gdXNlIHRoZW0gdG8gdHJhbnNmb3JtIG9iamVjdCBkYXRhIG1lbWJlcnMgdGhhdCByZWZlcmVuY2Ugb3RoZXIgZG9tYWluIG9iamVjdHMgYnkgd2F5IG9mIGFzc29jaWF0aW9uIHdoZXJlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9ucyByZXF1aXJlIG9iamVjdCBpZGVudGl0eSBtYWludGVuYW5jZSAoc3VjaCBhcyBzZXF1ZW5jaW5nIGFuZCBiYWNrIHJlZmVyZW5jZXMpIGFuZCBwb3NzZXNzIHZhcmlvdXMgdHlwZXMgb2YgbXVsdGlwbGljaXR5IGFuZCBuYXZpZ2FiaWxpdHkuIFRoZSBhcHByb3ByaWF0ZSBtYXBwaW5nIGNsYXNzIGlzIGNob3NlbiBwcmltYXJpbHkgYnkgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSByZWxhdGlvbnNoaXAuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2Y4MGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRfcGVyc2lzdGVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0FISUMiIG5hbWU9IkJBQkNBSElDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTkiIG5hbWU9InN0aHJlZjE5Ij48L2E+PHNwYW4gY2xhc3M9Iml0YWxpYyI+UGVyc2lzdGVuY2U8L3NwYW4+IHJlZmVycyB0byB0aGUgYWJpbGl0eSB0byBzdG9yZSBvYmplY3RzIGluIGEgZGF0YWJhc2UgYW5kIHVzZSB0aG9zZSBvYmplY3RzIHdpdGggdHJhbnNhY3Rpb25hbCBpbnRlZ3JpdHkuIEluIGEgSjJFRSBhcHBsaWNhdGlvbiwgZGF0YSBpcyB0eXBpY2FsbHkgc3RvcmVkIGFuZCBwZXJzaXN0ZWQgaW4gdGhlIGRhdGEgdGllciwgaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWYyMCIgbmFtZT0ic3RocmVmMjAiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5FbnRpdHkgYmVhbnM8L3NwYW4+IGFyZSBlbnRlcnByaXNlIGJlYW5zIHRoYXQgY29udGFpbiBwZXJzaXN0ZW50IGRhdGEgYW5kIHRoYXQgY2FuIGJlIHNhdmVkIGluIHZhcmlvdXMgcGVyc2lzdGVudCBkYXRhIHN0b3Jlcy4gVGhlIGVudGl0eSBiZWFucyByZXByZXNlbnQgZGF0YSBmcm9tIGEgZGF0YWJhc2U7IGVhY2ggZW50aXR5IGJlYW4gY2FycmllcyBpdHMgb3duIGlkZW50aXR5LiBFbnRpdHkgYmVhbnMgY2FuIGJlIGRlcGxveWVkIHVzaW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmFwcGxpY2F0aW9uLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmNvbnRhaW5lci1tYW5hZ2VkIHBlcnNpc3RlbmNlPC9zcGFuPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNDBiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Db25jZXB0czwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgQ29uY2VwdHMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYxOCIgbmFtZT0ic3RocmVmMTgiPjwvYT48L3A+Ci08aDE+Q29uY2VwdHM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGFuIG92ZXJ2aWV3IG9mIGNvbmNlcHRzIHlvdSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCB3aGVuIHVzaW5nIERhbGkgdG8gY3JlYXRlIG1hcHBpbmdzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5JbiBhZGRpdGlvbiB0byB0aGVzZSBzZWN0aW9ucywgeW91IHNob3VsZCByZXZpZXcgdGhlIGZvbGxvd2luZyByZXNvdXJjZXMgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246PC9wPgotPHVsPgotPGxpPgotPHA+RWNsaXBzZSBEYWxpIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkpTUiAyMjAgRUpCIDMuMCBzcGVjaWZpY2F0aW9uOiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmpjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0yMjAiPmh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMDwvYT48L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2VMaW5rIHByb2plY3Q6IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbms8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTA0ZGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCR0ZKRyIgbmFtZT0iQkFCQkdGSkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9oMT4KLTxwPlRoZSBKYXZhIDIgRW50ZXJwcmlzZSBFZGl0aW9uKEoyRUUpIEVudGVycHJpc2UgSmF2YUJlYW5zIChFSkIpIGFyZSBhIGNvbXBvbmVudCBhcmNoaXRlY3R1cmUgdGhhdCB5b3UgdXNlIHRvIGRldmVsb3AgYW5kIGRlcGxveSBvYmplY3Qtb3JpZW50ZWQsIGRpc3RyaWJ1dGVkLCBlbnRlcnByaXNlLXNjYWxlIGFwcGxpY2F0aW9ucy4gQW4gYXBwbGljYXRpb24gd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIEVudGVycHJpc2UgSmF2YUJlYW5zIGFyY2hpdGVjdHVyZSBpcyBzY2FsYWJsZSwgdHJhbnNhY3Rpb25hbCwgYW5kIHNlY3VyZS48L3A+Ci08cD5UaGUgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBpbXByb3ZlcyB0aGUgRUpCIGFyY2hpdGVjdHVyZSBieSByZWR1Y2luZyBpdHMgY29tcGxleGl0eSB0aHJvdWdoIHRoZSB1c2Ugb2YgbWV0YWRhdGEgKGFubm90YXRpb25zKSBhbmQgc3BlY2lmeWluZyBwcm9ncmFtbWF0aWMgZGVmYXVsdHMgb2YgdGhhdCBtZXRhZGF0YS48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMWU0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hESEFHSUgiIG5hbWU9IkNIREhBR0lIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjMiIG5hbWU9InN0aHJlZjIzIj48L2E+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9oMT4KLTxwPlRoZSBKUEEgc3BlY2lmaWNhdGlvbiByZXF1aXJlcyB0aGUgdXNlIG9mIGEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGZvciBkZXBsb3ltZW50LiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZGF0YWJhc2UgYW5kIGVudGl0eSBtYW5hZ2VyIG9wdGlvbnMsIGFuZCBtYXkgY29udGFpbiBtb3JlIHRoYW4gb25lIHBlcnNpc3RlbmNlIHVuaXQuIFRvIGVuYWJsZSB5b3UgdG8gZWFzaWx5IGVkaXQgdGhpcyBpbmZvcm1hdGlvbiwgRGFsaSBwcm92aWRlcyB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbGxfZWRpdG9yLmh0bSNDSUFDQ0hJRCI+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvYT4uIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGlzIGluZm9ybWF0aW9uLiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVG8gd29yayB3aXRoIG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLCBjb21tZW50IG91dCBhbGwgYnV0IG9uZSBwZXJzaXN0ZW5jZSB1bml0IGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODg3YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VGhlIG9ybS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUaGUgb3JtLnhtbCBmaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0hEQklKQUMiIG5hbWU9IkNIREJJSkFDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT48YSBpZD0ic3RocmVmMjQiIG5hbWU9InN0aHJlZjI0Ij48L2E+VGhlIG9ybS54bWwgZmlsZTwvaDE+Ci08cD5BbHRob3VnaCB0aGUgSlBBIHNwZWNpZmljYXRpb24gZW1waGFzaXplcyB0aGUgdXNlIG9mIGFubm90YXRpb25zIHRvIHNwZWNpZnkgcGVyc2lzdGVuY2UsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdG8gc3RvcmUgdGhpcyBtZXRhZGF0YS4gRGFsaSBlbmFibGVzIHlvdSB0byBjcmVhdGUgYSBzdHViIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZm9yIGEgSlBBIHByb2plY3QgdXNpbmcgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+LiBTZWUgPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBtZXRhZGF0YSBtdXN0IG1hdGNoIHRoZSBYU0Qgc3BlY2lmaWNhdGlvbiBvZiB5b3VyIHNlbGVjdGVkIEpQQSBpbXBsZW1lbnRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPkRhbGkgcHJvdmlkZXMgY29tcHJlaGVuc2l2ZSBzdXBwb3J0IGZvciBjb25maWd1cmluZyBYTUwgbWFwcGluZyBmaWxlcyB0aHJvdWdoIHRoZSA8YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+IHRoYXQgaXMgbmVhcmx5IGlkZW50aWNhbCB0byB0aGUgYW5ub3RhdGlvbi1iYXNlZCBjb25maWd1cmF0aW9uIGluIHRoZSBKYXZhIHNvdXJjZS4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgRWNsaXBzZSBYTUwgRWRpdG9yIHRvIGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIG1ldGFkYXRhIGluZm9ybWF0aW9uIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjxiciAvPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YTY2MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYWNjZXNzVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdmFyaWFibGUgaXMgYWNjZXNzZWQ6IFByb3BlcnR5IChkZWZhdWx0KSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X25hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGVudGl0eSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHRhYmxlIGFzc2lnbmVkIHRvIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgb3ZlcnJpZGVzIGEgcHJvcGVydHkgb3IgZmllbGQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNJbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hdHRyaWJ1dGVPdmVycmlkZXNVcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBBcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0aGlzIGF0dHJpYnV0ZSBtYXBzIHRvIHRoZSBkYXRhYmFzZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVGFibGUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uSW5zZXJ0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIElOU0VSVCBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uVXBkYXRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgVVBEQVRFIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19mZXRjaFR5cGUiPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2U6IEVhZ2VyIChkZWZhdWx0KSBvciBMYXp5PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcHRpb25hbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlU3RyYXRlZ3kiPgotCQk8ZGVzY3JpcHRpb24+RGV0ZXJtaW5lcyBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDogQXV0byAoZGVmYXVsdCksIFNlcXVlbmNlLCBJZGVudGl0eSwgb3IgVGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VW5pcXVlIG5hbWUgb2YgdGhlIGdlbmVyYXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhcmdldEVudGl0eSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jYXNjYWRlVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgZW50aXR5OiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBvciBNb3ZlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbWFwcGVkQnkiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5Db2x1bW5OYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IGFzc29jaWF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblJlZmVyZW5jZWRDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgam9pbiB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICBtYXBwaW5nIG9mIGFuIGVudGl0eeKAmXMgYXR0cmlidXRlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGlzIGJlaW5nIG1hcHBlZCB0byB0aGUgZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0IGZvciB0aGUgSmF2YSBjbGFzczogUGVyc2lzdGVudCwgRW1iZWRkZWQsIG9yIE1hcHBlZCBTdXBlcmNsYXNzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyBhbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzOiBTaW5nbGUgdGFibGUsIE9uZSB0YWJsZSBwZXIgY2xhc3MsIG9yIEpvaW5lZCB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvckNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2hlbiB1c2luZyBhIFNpbmdsZSBvciBKb2luZWQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclR5cGUiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZmllbGQgdG8gc2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gQ0hBUiBvciBJTlRFR0VSIChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiBTdHJpbmcpLiBUaGUgZGlzY3JpbWluYXRvciB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU3BlY2lmeWluZyBpbmhlcml0YW5jZSIgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19vcmRlckJ5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3JkZXIgZm9yIG9iamVjdHMgcmV0dXJuZWQgZnJvbSBhIHF1ZXJ5LiAgCQotb3JkZXJieV9saXN0Ojo9IG9yZGVyYnlfaXRlbSBbLG9yZGVyYnlfaXRlbV0gICAgIAotb3JkZXJieV9pdGVtOjo9IFtwcm9wZXJ0eV9vcl9maWVsZF9uYW1lXSBbQVNDIHwgREVTQ10gICAgIAotRm9yIGV4YW1wbGU6ICJsYXN0TmFtZSBBU0MgLHNhbGFyeSBERVNDIgk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gRW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgZm9yZWlnbiBrZXkgZm9yIGEgbWFueS10by1tYW55IG9yIGEgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW1hbnkgYXNzb2NpYXRpb24uIFlvdSBjYW4gY29uZmlndXJlIHRoZSBqb2luIHRhYmxlIHdpdGggYSBzcGVjaWZpYyBjYXRhbG9nIG9yIHNjaGVtYSwgY29uZmlndXJlIG9uZSBvciBtb3JlIGpvaW4gdGFibGUgY29sdW1ucyB3aXRoIGEgdW5pcXVlIGNvbnN0cmFpbnQsIGFuZCB1c2UgbXVsdGlwbGUgam9pbiBjb2x1bW5zIHBlciBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5ICB0d28gb3IgbW9yZSBqb2luIGNvbHVtbnMgKHRoYXQgaXMsIGEgY29tcG9zaXRlIHByaW1hcnkga2V5KS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUludmVyc2VKb2luQ29sdW1ucyI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgb3duZWQgKG9yIGludmVyc2Ugc2lkZSkgb2YgdGhlIGFzc29jaWF0aW9uOiB0aGUgb3duZWQgZW50aXR5J3MgcHJpbWFyeSBrZXkgY29sdW1uLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEphdmEgUGVyc2lzdGVuY2Ugb3B0aW9ucyBvbiB0aGUgUHJvcGVydGllcyBwYWdlIHRvIHNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VDb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlU2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZFBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW5jZSBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VPdXRsaW5lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBKUEEgU3RydWN0dXJlIHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZyB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGJhc2VkIG9uIHlvdXIgZGF0YWJhc2UgdGFibGVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBwcm9qZWN0IGZvbGRlciBuYW1lIGluIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIENsaWNrIEJyb3dzZSB0byBzZWxlY3QgYW4gZXhpc3RpbmcgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHBhY2thZ2UgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcywgb3IgY2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBwYWNrYWdlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgaHJlZj0idGFza19nZW5lcmF0ZV9lbnRpdGllcy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3RhYmxlcyI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzIGFuZCB0byBjcmVhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZGVmaW5lIHRoZSBuZXcgSlBBIHByb2plY3QgbmFtZSwgaXRzIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfZGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZXNlIGZpZWxkcyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIHByb2plY3QiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBsaWJyYXJpZXMgb3IgSkFScyB0aGF0IGNvbnRhaW4gdGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGFuZCBlbnRpdGllcyB0byB0aGUgcHJvamVjdOKAmXMgSmF2YSBCdWlsZCBQYXRoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuIFNlbGVjdCB0aGUgcGVyc2lzdGVuY2UgdmVyc2lvbiwgdGhlIG5hbWUgb2YgdGhlIEpQQSBwcm92aWRlciwgYW5kIGEgdW5pcXVlIG5hbWUgdG8gaWRlbnRpZnkgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vcHRpb25zICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBzY3JpcHQgb3B0aW9ucyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPcHRpb25zIHBhZ2UgIiBocmVmPSJyZWZfb3B0aW9ucy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfb2JqZWN0cyAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3Qgd2hpY2ggZWxlbWVudHMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgdGFibGVzIChEREwpIGZyb20gZW50aXRpZXMgIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2RkbC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iT2JqZWN0cyBwYWdlICIgaHJlZj0icmVmX29iamVjdHMuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3NhdmUgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHRoZSBmaWxlbmFtZSBhbmQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRlZCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBwcmV2aWV3IHRoZSBzY3JpcHQgYW5kIHNwZWNpZnkgdG8gcnVuIG9yIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHNjcmlwdCBhZnRlciBnZW5lcmF0aW9uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJTYXZlIGFuZCBSdW4gRERMIHBhZ2UgIiBocmVmPSJyZWZfc2F2ZV9hbmRfcnVuLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9zdW1tYXJ5ICI+Ci0JCTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2Ugc2hvd3MgdGhlIHNldHRpbmdzIHRoYXQgeW91IHNlbGVjdGVkIGZvciB0aGUgZ2VuZXJhdGVkIERETC4gVG8gY2hhbmdlIGFueSBvcHRpb24gY2xpY2sgIkJhY2siIG9yIGNsaWNrICJGaW5pc2giIHRvIGNvbnRpbnVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZSBzZXF1ZW5jZSBnZW5lcmF0b3IuIFRoaXMgbmFtZSBpcyBnbG9iYWwgdG8gdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKGFjcm9zcyBhbGwgZ2VuZXJhdG9yIHR5cGVzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbHVtbiBvZiB0aGUgZ2VuZXJhdG9yIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclZhbHVlQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBuYW1lIGZvciB0aGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclByaW1hcnlLZXlDb2x1bW5WYWx1ZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBwcmltYXJ5IGtleSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19kYXRhYmFzZUF1dGhvcml6YXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRvIGNvbm5lY3QgKGxvZyBpbikgdG8gYSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHlvdXIgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiAKLQkJWW91IG11c3QgaGF2ZSBhIGRlZmluZWQgZGF0YWJhc2UgY29ubmVjdGlvbiAoYW5kIGJlIGNvbm5lY3RlZCkgdG8gYWRkIHBlcnNpc3RlbmNlLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBwZXJzaXN0ZW5jZSB0byBhIEphdmEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2VfcHJvamVjdC5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGVtcG9yYWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgbWFwcGVkIGZpZWxkIGNvbnRhaW5zIGEgRGF0ZSAoamF2YS5zcWwuRGF0ZSksIFRpbWUgKGphdmEuc3FsLlRpbWUpLCBvciBUaW1lc3RhbXAgKGphdmEuc3FsLlRpbWVzdGFtcCkgdmFsdWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPkRlZmluZSBob3cgdGhlIHByaW1hcnkga2V5IGlzIGdlbmVyYXRlZDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFibGVHZW5lcmF0b3IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0byB1c2UgYSBzcGVjaWZpYyBkYXRhYmFzZSB0YWJsZSBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19zZXF1ZW5jZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBzZXF1ZW5jZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfbG9iIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byBqYXZhLnNxbC5DbG9iIG9yIGphdmEuc3FsLkJsb2IuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZW51bWVyYXRlZCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGhvdyB0byBwZXJzaXN0IGVudW1lcmF0ZWQgY29uc3RyYWludHMgaWYgdGhlIFN0cmluZyB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lZGl0SW52ZXJzZUpvaW5Db2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRoYXQgY29udGFpbnMgdGhlIFRhYmxlLiBUaGlzIGZpZWxkIG92ZXJyaWRlcyB0aGUgZGVmYXVsdHMgaW4gdGhlIG9ybS54bWwgZmlsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3BhY2thZ2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEphdmEgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIHRvIHdoaWNoIHRoZSBvcm0ueG1sIGZpbGUgYXBwbGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3NjaGVtYSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2Ugc2NoZW1hIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2F0YWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0byB1c2UgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCBlbnRpdGllcyBtYW5hZ2VkIGJ5IHRoaXMgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2FjY2VzcyI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGVmYXVsdCBhY2Nlc3MgbWV0aG9kIGZvciB2YXJpYWJsZXMgaW4gdGhpcyBwcm9qZWN0OiBQcm9wZXJ0eSBvciBGaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX2Nhc2NhZGUiPgotCQk8ZGVzY3JpcHRpb24+QWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMgaW4gZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV94bWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX0pQQVBsYXRmb3JtIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24uRGVmYXVsdCBpcyBHZW5lcmljLi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZU9STSI+Ci0JCTxkZXNjcmlwdGlvbj5DcmVhdGUgYW4gaW5pdGlhbCBvcm0ueG1sIGZpbGUuIFVzZSB0aGlzIGZpbGUgdG8gc3BlY2lmeSBwcm9qZWN0IGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIvPgotCTwvY29udGV4dD4KLQotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgZGVmYXVsdCBjYWNoaW5nIHN0cmF0ZWd5IGZvciB0aGUgcHJvamVjdC4gVGhlIGRlZmF1bHQgaXMgV2VhayB3aXRoIFNvZnQgU3ViY2FjaGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY2FjaGluZ19kZWZhdWx0U2l6ZSI+Ci0JCTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgY2FjaGUuIFRoZSBkZWZhdWx0IGlzIDEwMCBpdGVtcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRTaGFyZWQiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImxvZ2dpbmdfbGV2ZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsLiBEZWZhdWx0IGlzIEluZm8gbGV2ZWwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aW1lU3RhbXAiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIHRoZSB0aW1lc3RhbXAgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ190aHJlYWQiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIGEgdGhyZWFkIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19zZXNzaW9uIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciBhbiBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIgaXMgbG9nZ2VkIGluIGVhY2ggbG9nIGVudHJ5LiBEZWZhdWx0IGlzIFRydWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19leGNlcHRpb25zIj4KLQkJPGRlc2NyaXB0aW9uPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuLiBEZWZhdWx0IGlzIEZhbHNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfc2Vzc2lvbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc19zZXNzaW9uc1htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiPgotCQk8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc190YXJnZXRTZXJ2ZXIiPgotCQk8ZGVzY3JpcHRpb24+IDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0SmF2YSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gaW5jbHVkZSBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyBpbiB0aGlzIHByb2plY3QuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKYXZhIHBhZ2UiIGhyZWY9InJlZl9qYXZhX3BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCB3aXphcmQiIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfbmV3SlBBUHJvamVjdEZhY2V0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHlvdXIgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRmFjZXQgcGFnZSIgaHJlZj0icmVmX2pwYV9mYWNldC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlDbGFzc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgcGFja2FnZSwgY2xhc3MgbmFtZSwgYW5kIGluaGVyaXRhbmNlIHByb3BlcnRpZXMgb2YgdGhlIGVudGl0eSB0byBjcmVhdGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJFbnRpdHkgQ2xhc3MgcGFnZSIgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBFbnRpdHkgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgZW50aXR5IiBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgZW50aXR5IG5hbWUsIGFzc29jaWF0ZWQgdGFibGUsIGFuZCBtYXBwZWQgZmllbGRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIEVudGl0eSB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBlbnRpdHkiIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IFRhYmxlcyBwYWdlIiBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ190YWJsZUFzc29jaWF0aW9uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGNyZWF0ZSBvciBlZGl0IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkYXRhYmFzZSB0YWJsZSBhbmQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iVGFibGUgQXNzb2NpYXRpb25zIHBhZ2UiIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIHRhYmxlIG1hcHBpbmcgYW5kIGRvbWFpbiBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiBwYWdlIiBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2N1c3RvbWl6ZUluZGl2aWR1YWxFbnRpdGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdGFibGUgbWFwcGluZyBhbmQgZG9tYWluIGNsYXNzIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIHBhZ2UiIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcyBmb3IgYW4gZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIHBhZ2UiIGhyZWY9InJlZl9hc3NvY2lhdGlvbl90YWJsZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucyBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpvaW4gQ29sdW1ucyBwYWdlIiBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfYXNzb2NpYXRpb25DYXJkaW5hbGl0eVBhZ2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgY2FyZGluYWxpdHkgb2YgYW4gYXNzb2NpYXRpb24gdGFibGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSBwYWdlIiBocmVmPSJyZWZfYXNzb2NpYXRpb25fY2FyZGluYWxpdHkuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19zZWxlY3RDYXNjYWRlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBhc3NvY2lhdGlvbjogQWxsLCBQZXJzaXN0LCBNZXJnZSwgUmVtb3ZlLCBvciBSZWZyZXNoLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2VsZWN0IENhc2NhZGUgcGFnZSIgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfZ2VuZXJhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBnZW5lcmFsIHBlcnNpc3RlbmNlIG9wdGlvbnMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmFsIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jb25uZWN0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29ubmVjdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY29ubmVjdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfY3VzdG9taXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDdXN0b21pemF0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jb25uZWN0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jYWNoaW5nIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgc2Vzc2lvbiBvciBlbnRpdHkgc3BlY2lmaWMgRWNsaXBzZUxpbmsgY2FjaGluZyBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ2FjaGluZyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfY2FjaGluZyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfbG9nZ2luZyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIGxvZ2dpbmcgcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkxvZ2dpbmcgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2xvZ2dpbmciIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX29wdGlvbnMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGFuZCBtaXNjZWxsYW5vdXMgb3B0aW9ucy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX29wdGlvbnMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iU2NoZW1hIEdlbmVyYXRpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3NjaGVtYUdlbmVyYXRpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcGVydGllcyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQkJPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX3NvdXJjZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZSI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIHBhZ2UiIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2NyZWF0ZV9uZXdfY29udmVydGVycyI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIGEgbmV3IEVjbGlwc2VMaW5rIGNvbnZldGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIGhyZWY9InJlZl9hZGRfY29udmVydGVyIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybSIgLz4KLQk8L2NvbnRleHQ+Ci0KLTwhLS0gQWRkZWQgZm9yIDIuMyAtLT4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19jYW5vbmljYWxNZXRhbW9kZWwiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBwcm9qZWN0IG1vZGVsIHVzZXMgdGhlIENhbm9uaWNhbCBNZXRhbW9kZWwuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9jYWNoZWFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHVzZXMgdGhlIEBDYWNoYWJsZSBhbm5vdGF0aW9uLiBEZWZhdWx0IGlzIEBDYWNoYWJsZShmYWxzZSkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X3ByaW1hcnlLZXlDbGFzcyI+Ci0JCTxkZXNjcmlwdGlvbj5DbGljayBCcm93c2UgYW5kIHNlbGVjdCB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSBlbnRpdHkuIENsaWNraW5nIHRoZSBmaWVsZCBuYW1lLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBuZXcgY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfamF4YnNjaGVtYV9jbGFzc2VzIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgcHJvamVjdCwgcGFja2FnZSwgb3IgY2xhc3NlcyBmcm9tIHdoaWNoIHRvIGdlbmVyYXRlIHRoZSBYTUwgc2NoZW1hLiBDbGljayBGaW5pc2ggdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCIgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHNjaGVtYSBmcm9tIGNsYXNzZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2ciPgotCQk8ZGVzY3JpcHRpb24+RW50ZXIgdGhlIEpBWEIgY2xhc3MgZ2VuZXJhdGlvbiBzZXR0aW5ncyBhbmQgY2xpY2sgRmluaXNoIHRvIGdlbmVyYXRlIGNsYXNzZXMuICBBbGwgZmllbGRzIGFyZSBvcHRpb25hbCBleGNlcHQgZm9yIHRoZSBzb3VyY2UgZm9sZGVyLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIGhyZWY9InJlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtIi8+Ci0JPC9jb250ZXh0PgotCQotCQotCQotCQotCQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmNjEyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1AaW1wb3J0ICIuLi8uLi8uLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLXNwYW4uY29udHJvbCwgc3Bhbi5ndWktb2JqZWN0LWFjdGlvbiwgcC5zdWJoZWFkMiwgc3Bhbi5ib2xkLCBwLm5vdGVwMSB7Ci0gIGZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLm5hbWUsIHAudGl0bGVpbmZpZ3VyZSwgc3Bhbi5pdGFsaWMgewotICBmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXAudGl0bGVpbmZpZ3VyZSwgcC5zdWJoZWFkMiB7Ci0gIHBhZGRpbmctdG9wOiAxMHB4OwotfQotCi1zcGFuLmNvZGUgewotICBmb250LWZhbWlseTogbW9ub3NwYWNlOwotfQotCi1zcGFuLmNvcHlyaWdodGxvZ28ge2ZvbnQtc2l6ZTogMC44ZW19Ci0KLS5mb290ZXIge21hcmdpbi10b3A6IDJlbTtib3JkZXItdG9wOjFweCBzb2xpZCAjY2NjY2NjO3BhZGRpbmctdG9wOjFlbTt9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2h0bWwvY3B5ci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MmVjNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci0KLTxoZWFkPgotPCEtLSAgPG1ldGEgaHR0cC1lcXVpdj0icmVmcmVzaCIgY29udGVudD0iMDt1cmw9Li4vLi4vbGVnYWwuaHRtIj4gLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGhyZWY9Ii4uLy4uL2xlZ2FsLmh0bSI+TGljZW5zZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkzYWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZXR0aW5nIHN0YXJ0ZWQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIEdldHRpbmcgc3RhcnRlZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjIiIG5hbWU9InN0aHJlZjIiPjwvYT48L3A+Ci08aDE+R2V0dGluZyBzdGFydGVkPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBnZXR0aW5nIHN0YXJ0ZWQgd2l0aCB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBUb29scy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI0JBQkVGSENEIj5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNCQUJJR0NKQSI+RGFsaSBxdWljayBzdGFydDwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlzaXQgdGhlIERhbGkgaG9tZSBwYWdlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaSI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpPC9hPjwvY29kZT4uPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2Y5NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUZIQ0QiIG5hbWU9IkJBQkVGSENEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5SZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbjxhIGlkPSJzdGhyZWYzIiBuYW1lPSJzdGhyZWYzIj48L2E+PGEgaWQ9InN0aHJlZjQiIG5hbWU9InN0aHJlZjQiPjwvYT48L2gxPgotPHA+QmVmb3JlIGluc3RhbGxpbmcgRGFsaSwgZW5zdXJlIHRoYXQgeW91ciBlbnZpcm9ubWVudCBtZWV0cyB0aGUgZm9sbG93aW5nIDxzcGFuIGNsYXNzPSJpdGFsaWMiPm1pbmltdW08L3NwYW4+IHJlcXVpcmVtZW50czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIDMuNiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUnVudGltZSBFbnZpcm9ubWVudCAoSlJFKSAxLjUgKDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly9qYXZhLmNvbSI+aHR0cDovL2phdmEuY29tPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIDMuMiAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29sczwvYT48L2NvZGU+KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBmb3IgSmF2YSBFRSA1LiBGb3IgZXhhbXBsZSwgdGhlIEVjbGlwc2VMaW5rIGltcGxlbWVudGF0aW9uIGZvciBKUEEgY2FuIGJlIG9idGFpbmVkIGZyb206IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5SZWZlciB0byA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZ2V0dGluZ3N0YXJ0ZWRfbWFpbi5odG1sPC9hPjwvY29kZT4gZm9yIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIGluZm9ybWF0aW9uLjwvcD4KLTxwPjxhIGlkPSJzdGhyZWY1IiBuYW1lPSJzdGhyZWY1Ij48L2E+RGFsaSBpcyBpbmNsdWRlZCBhcyBwYXJ0IG9mIFdUUCAzLjIuIE5vIGFkZGl0aW9uYWwgaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuPC9wPgotPGEgaWQ9InN0aHJlZjYiIG5hbWU9InN0aHJlZjYiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+QWNjZXNzaWJpbGl0eSBGZWF0dXJlczwvcD4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkIGFjY2Vzc2liaWxpdHkgZmVhdHVyZXMgaW4gRWNsaXBzZSwgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+TmF2aWdhdGluZyB0aGUgdXNlciBpbnRlcmZhY2UgdXNpbmcgdGhlIGtleWJvYXJkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TcGVjaWZ5aW5nIGdlbmVyYWwgYWNjZXNzaWJpbGl0eSBwcmVmZXJlbmNlcyBmb3IgdGhlIGVkaXRvci48L3A+Ci08L2xpPgotPC91bD4KLTxwPlNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9hY2Nlc3NpYmlsaXR5L2FjY2Vzc21haW4uaHRtIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzIGluIEVjbGlwc2U8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPGEgaWQ9InN0aHJlZjciIG5hbWU9InN0aHJlZjciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+SGVscCBBY2Nlc3NpYmlsaXR5PC9wPgotPHA+VGhlIGRvY3VtZW50YXRpb24gYW5kIGhlbHAgY29udGFpbnMgbWFya3VwIHRvIGZhY2lsaXRhdGUgYWNjZXNzIGJ5IHRoZSBkaXNhYmxlZCBjb21tdW5pdHkuIFNlZSA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci90YXNrcy9oZWxwX2FjY2Vzc2liaWxpdHkuaHRtIj5IZWxwIEFjY2Vzc2liaWxpdHk8L2E+IGluIHRoZSA8c3BhbiBjbGFzcz0iaXRhbGljIj5Xb3JrYmVuY2ggVXNlciBHdWlkZTwvc3Bhbj4gZm9yIGRldGFpbHMuPC9wPgotPHA+V2hlbiB1c2luZyB0aGUgaGVscCwgYmUgYXdhcmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyBjb3JyZWN0bHkgcmVhZCB0aGUgY29kZSBleGFtcGxlcyBpbiB0aGlzIGRvY3VtZW50LiBUaGUgY29udmVudGlvbnMgZm9yIHdyaXRpbmcgY29kZSByZXF1aXJlIHRoYXQgY2xvc2luZyBicmFjZXMgc2hvdWxkIGFwcGVhciBvbiBhbiBvdGhlcndpc2UgZW1wdHkgbGluZTsgaG93ZXZlciwgc29tZSBzY3JlZW4gcmVhZGVycyBtYXkgbm90IGFsd2F5cyByZWFkIGEgbGluZSBvZiB0ZXh0IHRoYXQgY29uc2lzdHMgc29sZWx5IG9mIGEgYnJhY2tldCBvciBicmFjZS48L3A+Ci08L2xpPgotPGxpPgotPHA+VGhpcyBkb2N1bWVudGF0aW9uIG1heSBjb250YWluIGxpbmtzIHRvIFdlYiBzaXRlcyBvZiBvdGhlciBjb21wYW5pZXMgb3Igb3JnYW5pemF0aW9ucyB0aGF0IHdlIGRvIG5vdCBjb250cm9sLiBXZSBuZWl0aGVyIGV2YWx1YXRlIG5vciBtYWtlIGFueSByZXByZXNlbnRhdGlvbnMgcmVnYXJkaW5nIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZXNlIFdlYiBzaXRlcy48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyODUzMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkRhbGkgcXVpY2sgc3RhcnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRGFsaSBxdWljayBzdGFydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklHQ0pBIiBuYW1lPSJCQUJJR0NKQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RGFsaSBxdWljayBzdGFydDwvaDE+Ci08cD48YSBpZD0ic3RocmVmOCIgbmFtZT0ic3RocmVmOCI+PC9hPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiB0byBoZWxwIHlvdSBxdWlja2x5IHN0YXJ0IHVzaW5nIERhbGkgdG8gY3JlYXRlIHJlbGF0aW9uYWwgbWFwcGluZ3MgYmV0d2VlbiBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYW5kIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGlwc19hbmRfdHJpY2tzLmh0bSNDSERIR0hCRiI+VGlwcyBhbmQgdHJpY2tzPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmFjNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRGSERBIiBuYW1lPSJCQUJERkhEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkiIG5hbWU9InN0aHJlZjkiPjwvYT5UaGlzIHF1aWNrIHN0YXJ0IHNob3dzIGhvdyB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuPC9wPgotPG9sPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNlbGVjdCBGaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgUHJvamVjdDwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciBhIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+UHJvamVjdCBuYW1lPC9zcGFuPiAoc3VjaCBhcyA8Y29kZT5RdWlja1N0YXJ0PC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPklmIG5lZWRlZCwgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFyZ2V0IFJ1bnRpbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPkFwYWNoZSBUb21jYXQ8L2NvZGU+KSBhbmQgY29uZmlndXJhdGlvbiwgc3VjaCBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+VXRpbGl0eSBKUEEgUHJvamVjdCB3aXRoIEphdmEgNS4wPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBKYXZhIHNvdXJjZSBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPklmIHlvdSBoYXZlIGV4aXN0aW5nIEphdmEgc291cmNlIGZpbGVzLCBhZGQgdGhlbSB0byB5b3VyIGNsYXNzcGF0aCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSBKUEEgRmFjZXQgZGlhbG9nLCBzZWxlY3QgeW91ciB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIChvciBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+KSwgZGF0YWJhc2UgY29ubmVjdGlvbiAob3IgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24pLCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSAoc3VjaCBhcyBFY2xpcHNlTGluayksIGRlZmluZSBob3cgRGFsaSBzaG91bGQgbWFuYWdlIHBlcnNpc3RlbnQgY2xhc3NlcywgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSB0aGUgRGVmYXVsdCBTY2hlbWEgZm9yIENvbm5lY3Rpb248L3NwYW4+IGlmIHlvdSByZXF1aXJlIGEgc2NoZW1hIG90aGVyIHRoYW4gdGhlIG9uZSB0aGF0IERhbGkgZGVyaXZlcyBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLCB3aGljaCBtYXkgYmUgaW5jb3JyZWN0IGluIHNvbWUgY2FzZXMuIFVzaW5nIHRoaXMgb3B0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIGRldmVsb3BtZW50IHRpbWUgc2NoZW1hIGZvciBkZWZhdWx0cyBhbmQgdmFsaWRhdGlvbi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgcHJvamVjdCB0byB0aGUgd29ya2JlbmNoIGFuZCBvcGVucyB0aGUgSlBBIHBlcnNwZWN0aXZlLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjEwIiBuYW1lPSJzdGhyZWYxMCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBQcm9qZWN0IGluIFByb2plY3QgRXhwbG9yZXI8L3A+Ci08aW1nIHNyYz0iaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmciIGFsdD0iUGFja2FnZSBFeHBsb3JlciBzaG93aW5nIHRoZSBKUEEgcHJvamVjdC4iIHRpdGxlPSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Ob3cgdGhhdCB5b3UgaGF2ZSBjcmVhdGVkIGEgcHJvamVjdCB3aXRoIHBlcnNpc3RlbmNlLCB5b3UgY2FuIGNvbnRpbnVlIHdpdGggPGEgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNCQUJGR0RERyI+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2E+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OWVhNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZHRERHIiBuYW1lPSJCQUJGR0RERyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjExIiBuYW1lPSJzdGhyZWYxMSI+PC9hPlRoaXMgcXVpY2sgc3RhcnQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIG5ldyBwZXJzaXN0ZW50IEphdmEgZW50aXR5LiBXZSB3aWxsIGNyZWF0ZSBhbiBlbnRpdHkgdG8gYXNzb2NpYXRlIHdpdGggYSBkYXRhYmFzZSB0YWJsZS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgQUREUkVTUyB0YWJsZSB0byB5b3VyIGRhdGFiYXNlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgSlBBIHByb2plY3QgaW4gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXcgJmd0OyBPdGhlcjwvc3Bhbj4uIFRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBICZndDsgRW50aXR5PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNDSUFGRUlHRiI+RW50aXR5IENsYXNzIHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBwYWNrYWdlIG5hbWUgKHN1Y2ggYXMgPGNvZGU+cXVpY2tzdGFydC5kZW1vLm1vZGVsPC9jb2RlPiksIHRoZSBjbGFzcyBuYW1lIChzdWNoIGFzIDxjb2RlPkFkZHJlc3M8L2NvZGU+KSBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiBhcHBlYXJzLCB3aGljaCBlbmFibGVzIHlvdSB0byBkZWZpbmUgdGhlIHBlcnNpc3RlbmNlIGZpZWxkcywgd2hpY2ggeW91IHdpbGwgbWFwIHRvIHRoZSBjb2x1bW5zIG9mIGEgZGF0YWJhc2UgdGFibGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMiIgbmFtZT0ic3RocmVmMTIiPjwvYT48YSBpZD0ic3RocmVmMTMiIG5hbWU9InN0aHJlZjEzIj48L2E+VXNlIHRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZyAoaW52b2tlZCBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPikgdG8gYWRkIHBlcnNpc3RlbmNlIGZpZWxkcyB0byB0aGUgQWRkcmVzcyBjbGFzczo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1wcml2YXRlIExvbmcgaWQ7Ci1wcml2YXRlIFN0cmluZyBjaXR5OwotcHJpdmF0ZSBTdHJpbmcgY291bnRyeTsKLXByaXZhdGUgU3RyaW5nIHN0YXRlT3JQcm92aW5jZTsKLXByaXZhdGUgU3RyaW5nIHBvc3RhbENvZGU7Ci1wcml2YXRlIFN0cmluZyBzdHJlZXQ7Ci08L3ByZT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotWW91IHdpbGwgYWxzbyBuZWVkIHRvIGFkZCB0aGUgZm9sbG93aW5nIGNvbHVtbnMgdG8gdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGU6Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1OVU1CRVIoMTAsMCkgQUREUkVTU19JRCAocHJpbWFyeSBrZXkpCi1WQVJDSEFSMig4MCkgUFJPVklOQ0UKLVZBUkNIQVIyKDgwKSBDT1VOVFJZCi1WQVJDSEFSMigyMCkgUF9DT0RFCi1WQVJDSEFSMig4MCkgU1RSRUVUCi1WQVJDSEFSMig4MCkgQ0lUWQotPC9wcmU+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci08L3ByZT48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gV2l0aCB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgY29tcGxldGVkLCBFY2xpcHNlIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPHA+QWRkcmVzcy5qYXZhIGluY2x1ZGVzIHRoZSA8Y29kZT5ARW50aXR5PC9jb2RlPiBhbm5vdGF0aW9uLCB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCBhcyB3ZWxsIGFzIDxjb2RlPmdldHRlcjwvY29kZT4gYW5kIDxjb2RlPnNldHRlcjwvY29kZT4gbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzLjwvcD4KLTwvbGk+Ci08L29sPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTQiIG5hbWU9InN0aHJlZjE0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gQWRkcmVzcy5qYXZhPC9wPgotPGltZyBzcmM9ImltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZyIgYWx0PSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIHRpdGxlPSJKYXZhIGVkaXRvciB3aXRoIHRoZSBBZGRyZXNzIGVudGl0eS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhbHNvIGRpc3BsYXlzIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkcmVzczwvc3Bhbj4gZW50aXR5IGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXc6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTUiIG5hbWU9InN0aHJlZjE1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+QWRkcmVzcyBFbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiB0aXRsZT0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgU3RydWN0dXJlIFZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGRyZXNzPC9zcGFuPiBjbGFzcyBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBub3RpY2UgdGhhdCBEYWxpIGhhcyBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZWQgdGhlIEFERFJFU1MgZGF0YWJhc2UgdGFibGUgd2l0aCB0aGUgZW50aXR5IGJlY2F1c2UgdGhleSBhcmUgbmFtZWQgaWRlbnRpY2FsbHkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1EZXBlbmRpbmcgb24geW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIHR5cGUsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2IiBuYW1lPSJzdGhyZWYxNiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIFZpZXcgZm9yIEFkZHJlc3MgRW50aXR5PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIiBhbHQ9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLUFmdGVyIGFzc29jaWF0aW5nIHRoZSBlbnRpdHkgd2l0aCB0aGUgZGF0YWJhc2UgdGFibGUsIHlvdSBzaG91bGQgdXBkYXRlIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgdG8gaW5jbHVkZSB0aGlzIEpQQSBlbnRpdHkuCi08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzIExpc3Q8L3NwYW4+LiBEYWxpIGFkZHMgdGhlIGZvbGxvd2luZyB0byB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxwPjxjb2RlPiZsdDtjbGFzcyZndDtxdWlja3N0YXJ0LmRlbW8ubW9kZWwuQWRkcmVzcyZsdDsvY2xhc3MmZ3Q7PC9jb2RlPjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTxwPk5vdyB3ZSBhcmUgcmVhZHkgdG8gbWFwIGVhY2ggZmllbGRzIGluIHRoZSBBZGRyZXNzIGNsYXNzIHRvIGEgY29sdW1uIGluIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+aWQ8L3NwYW4+IGZpZWxkIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodCBjbGljayBpZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IGlkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QUREUkVTU19JRDwvc3Bhbj4gaW4gdGhlIE5hbWUgZmllbGQ6PC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTciIG5hbWU9InN0aHJlZjE3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgdGhlIGFkZHJlc3NJZCBGaWVsZDwvcD4KLTxpbWcgc3JjPSJpbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciB0aGUgQWRkcmVzcyBlbnRpdHkmcnNxdW87cyBpZCBhdHRyaWJ1dGUuIiB0aXRsZT0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIEFkZHJlc3MgZW50aXR5OjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJZAotQENvbHVtbihuYW1lPSJBRERSRVNTX0lEIikKLTwvcHJlPjwvbGk+Ci08bGk+Ci08cD5NYXAgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGZpZWxkcyAoYXMgPHNwYW4gY2xhc3M9ImJvbGQiPkJhc2ljPC9zcGFuPiBtYXBwaW5ncykgdG8gdGhlIGFwcHJvcHJpYXRlIGRhdGFiYXNlIGNvbHVtbjo8L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBtYXBwaW5ncyBmb3IgZWFjaCBvZiB0aGUgZmllbGRzIGluIHRoZSBBZGRyZXNzIGVudGl0eS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTxjb2wgd2lkdGg9IjMzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPkZpZWxkPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5NYXAgQXM8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDgiPkRhdGFiYXNlIENvbHVtbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y2l0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPkNJVFk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Y291bnRyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ4IHIxYzMtdDgiPkNPVU5UUlk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+cG9zdGFsQ29kZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPlBfQ09ERTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wcm92aW5jZU9yU3RhdGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMzLXQ4Ij5QUk9WSU5DRTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5zdHJlZXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzItdDgiPkJhc2ljPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10OCByMWMzLXQ4Ij5TVFJFRVQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkRhbGkgYXV0b21hdGljYWxseSBtYXBzIHNvbWUgZmllbGRzIHRvIHRoZSBjb3JyZWN0IGRhdGFiYXNlIGNvbHVtbiAoc3VjaCBhcyB0aGUgY2l0eSBmaWVsZCB0byB0aGUgQ2l0eSBjb2x1bW4pIGlmIHRoZSBuYW1lcyBhcmUgaWRlbnRpY2FsLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZjAwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfaWRfZGV0YWlsc19xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWY0MGNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19qYXZhX0pQQV9zdHJ1Y3R1cmVfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjUxYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2MGUwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc5N2E4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2NzYxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2luZGl2aWR1YWxfZW50aXRpZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzN2JkZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9kZXRhaWxzX2VudGl0eW1hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2MzAwZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5NjQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZXJyb3Jfc2FtcGxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTExZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2dlbmVyYXRlX2VudGl0aWVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGFhMjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTM3NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9qb2luLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiNjg3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2NDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfc2luZ2xlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZGQ5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3RhYi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXZhX2VkaXRvcl9hZGRyZXNzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0Mjg5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qYXhiX3NjaG1lYV9nZW5lcmF0aW9uX2RpYWxvZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMjIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1NTBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pwYV93aXphcmRfY3JlYXRlX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBlZF9lbnRpdHlfdHlwZV9saW5rLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYxNjAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ19maWxlX25ldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNTU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW1iZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODZlYTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjA0ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhlOGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9zdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21vZGlmeV9mYWNldGVkX3Byb2plY3QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM3OTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9iYXNpY21hcHBpbmdzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIwYjdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgyOTRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRpZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTlkYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUyYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGVmYjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODAyMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhY2MxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThlYTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZHN1cGVyY2xhc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3Y2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkYzk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ5YmJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3RyYW5zaWVudG1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0ODhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX3ZlcnNpb25tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODczNzEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjA3ODA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NDI1YWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjA3OWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODM4MWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxjLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiYzc0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYWYyMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjlhYTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1NTdlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Byb2plY3RfcHJvcGVydGllc190YXNrcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4Y2EwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9xdWlja3N0YXJ0X3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2Vjb25kYXJ5X3RhYmxlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MWY5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9lbnRpdHkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ViZTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjM1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfanBhX3Byb2plY3QucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODdlNjFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3YzkzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc3luY2hvcm5pemVfY2xhc3Nlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTlmNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNDBiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2Fzc29jaWF0aW9ucy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTFkYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9lbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YmVhY2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmYTRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZjliZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+Ci08aW5kZXggdmVyc2lvbj0iMS4wIj4KLSAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAQ29sdW1uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk2IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBEaXNjcmltaW5hdG9yVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk4IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRhYmxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZElkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnRpdHkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBFbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEdlbmVyYXRlZFZhbHVlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEpvaW5Db2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzOSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ5IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI3N0aHJlZjI2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQExvYiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBOYW1lZFF1ZXJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9yZGVyQnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAU2VxdWVuY2VHZW5lcmF0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUZW1wb3JhbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBWZXJzaW9uIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXJjaGl0ZWN0dXJlIG9mIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb24gdGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiI+PHRvcGljIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jc3RocmVmMjIxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgb3ZlcnJpZGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgT3ZlcnJpZGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMzAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiPjx0b3BpYyBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI3N0aHJlZjIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImJhc2ljIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAQmFzaWMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkJhc2ljIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMC5odG0jc3RocmVmMTE1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iKFNlZSBhbHNvIG1hcHBpbmdzKSI+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhY2hpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDYWNoaW5nIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNzdGhyZWYyNzgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNhbm9uaWNhbCBtZXRhbW9kZWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2FyZGluYWxpdHkgLSBhc3NvY2lhdGlvbiB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBc3NvY2lhdGlvbiBDYXJkaW5hbGl0eSI+PHRvcGljIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jc3RocmVmMjI0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjbGFzc2VzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHBlcnNpc3RlbmNlIHRvIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbnRpdHkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgc2NoZW1hIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTAiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2VkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyBwZXJzaXN0ZW50IGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjg2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjUyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbHVtbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkaXNjcmltaW5hdG9yIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjI0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW4iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM4IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0OCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gVGFibGUgSW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTEuaHRtI3N0aHJlZjI2MCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyB0byI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InZhbHVlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIHBvb2wiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNTEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgSmF2YSBwcm9qZWN0IHRvIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIGEgSlBBIFByb2plY3QgV2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMjkiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5NCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYyMDIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jc3RocmVmMjA0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIGVudGl0aWVzIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTYxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIC0gcGVyc2lzdGVuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb25uZWN0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGVyaXZlZCBJRCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRldmVsb3BlciBkb2N1bWVudGF0aW9uIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZWFnZXIgZmV0Y2giPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRhYmxlIGNsYXNzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY3OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIElEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMi5odG0jc3RocmVmMTIzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTIxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGVkIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jc3RocmVmMTE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSBhbm5vdGF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlIj48dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmMjAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjdXN0b21pemluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMiPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI3N0aHJlZjIyMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVtYmVkZGFibGUiPjx0b3BpYyBocmVmPSJ0YXNrczAwNy5odG0jc3RocmVmODMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtI3N0aHJlZjIxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjExIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjcwIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjc2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMzMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRW50aXR5IENsYXNzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jc3RocmVmNDMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWY0MyZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjQzJnF1b3Q7Jmd0OyZsdDsvYSZndDtUaGUgRW50aXR5IENsYXNzIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0NSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW51bWVyYXRlZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTQiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXJyb3IgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE2NyIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFcnJvciBtZXNzYWdlcyI+PHRvcGljIGhyZWY9InRhc2tzMDI0Lmh0bSNzdGhyZWYxNzIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImV4dGVuc2lvbiBwb2ludHMgLSBEYWxpIGZlYXR1cmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDMzLmh0bSNzdGhyZWYzMDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImZldGNoIHR5cGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBkaWFsb2ciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE2MCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWxlY3QgVGFibGVzIj48dG9waWMgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jc3RocmVmMjE1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIHdpemFyZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTIiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYSI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jc3RocmVmMjAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0ZWQgdmFsdWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZ3MiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI2NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlcXVlbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iaGludHMgLSBxdWVyeSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQElkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWY5MyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMjA5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbmdsZSB0YWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA5Lmh0bSNzdGhyZWYyMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Imluc3RhbGxhdGlvbiAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmMyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YSBwcm9qZWN0IC0gY29udmVydGluZyB0byBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpBWEIiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jc3RocmVmMTkxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjE5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iam9pbiBjb2x1bW5zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIj48dG9waWMgaHJlZj0icmVmX2pvaW5fY29sdW1ucy5odG0jc3RocmVmMjIzIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjYyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJqb2luZWQgdGFibGVzIC0gaW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTaW5nbGUgVGFibGUgSW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0aWVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jc3RocmVmMjI1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jc3RocmVmMzAwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBKYXZhIFNvdXJjZSBQYWdlIj48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjM0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgcHJvamVjdCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnZlcnRpbmcgZnJvbSBKYXZhIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrczAwMS5odG0jc3RocmVmMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBuZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wbGVtZW50YXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGFnZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmMjkmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYyOSZxdW90OyZndDsmbHQ7L2EmZ3Q7U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzEiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWYxOTQmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWYxOTQmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O1NlbGVjdGluZyB0aGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwbGF0Zm9ybSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI3MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibGF6eSBmZXRjaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImxpYnJhcnkgLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjIwNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFueS10by1tYW55IG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvTWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW9uZSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGVkIHN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFwcGVkU3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBlbnRpdGllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iJmx0O2EgaWQ9JnF1b3Q7c3RocmVmNTgmcXVvdDsgbmFtZT0mcXVvdDtzdGhyZWY1OCZxdW90OyZndDsmbHQ7L2EmZ3Q7TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA0Lmh0bSNzdGhyZWY2MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI3N0aHJlZjIxMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFwcGluZ3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyI+PHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jc3RocmVmMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJiYXNpYyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbWJlZGRlZCBJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNzdGhyZWYxMjYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTQuaHRtI3N0aHJlZjEzMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1tYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tbWFueSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTYuaHRtI3N0aHJlZjE0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9ibGVtcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE3MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTUwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtZXRhbW9kZWwgLSBjYW5vbmljYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmFtZWQgcXVlcmllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJoaW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibmF0aXZlIHF1ZXJpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibm9ucGVyc2lzdGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZmllbGRzLiBTZWUgdHJhbnNpZW50Ij48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb01hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9uZS10by1vbmUgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBPbmVUb09uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im9yZGVyaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JtLnhtbCBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMy5odG0jc3RocmVmMjQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYyMDgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNTgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzYW1wbGUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI3N0aHJlZjU5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im92ZXJyaWRlcyAtIEpQQSBhdHRyaWJ1dGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQXR0cmlidXRlIG92ZXJyaWRlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jc3RocmVmMjI5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYxOSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIGNvbm5lY3Rpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2Ugc2NoZW1hIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSBjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvcHRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI4NyIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjg5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvdmlkZXIiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY0OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJjb25jZXB0czAwMi5odG0jc3RocmVmMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYW5hZ2luZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyB3aXRoIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50IGVudGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGVyc3BlY3RpdmUgLSBKUEEgRGV2ZWxvcG1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtI3N0aHJlZjMwMSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icGxhdGZvcm0gLSBKUEEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icHJvYmxlbXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jc3RocmVmMTY5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0cyAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI3N0aHJlZjkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjkwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNzdGhyZWYyODgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVlcnkgaGludHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjEwOSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icXVpY2sgc3RhcnQgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBxdWljayBzdGFydCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMi5odG0jc3RocmVmOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVxdWlyZW1lbnRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jc3RocmVmNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJmcm9tIGNsYXNzZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxODkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYxOTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIC0gZGF0YWJhc2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2Vjb25kYXJ5IHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgVGFibGVzIC0gaW4gSmF2YSBEZXRhaWxzIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIzNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlIGluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY5MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3luY2hyb25pemluZyBjbGFzc2VzIHdpdGggcGVyc2lzdGVuY2UueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFzc29jaWF0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGFibGUgQXNzb2NpYXRpb25zIj48dG9waWMgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSNzdGhyZWYyMTgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMjIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBlbnRpdGllcyBmcm9tIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE1OSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmhlcml0YW5jZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2UiPjx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNzdGhyZWYxMDIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjMyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBvcmFsIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1MSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjUzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0cmFuc2llbnQgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBUcmFuc2llbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idmVyc2lvbiBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFZlcnNpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlZlcnNpb24gbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE5Lmh0bSNzdGhyZWYxNTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2aWV3cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjYiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI3N0aHJlZjI0MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBTdHJ1Y3R1cmUgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI3N0aHJlZjI2OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ3YXJuaW5nIG1lc3NhZ2VzIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNzdGhyZWYxNjgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgZWRpdG9yIj4KLSAgICA8ZW50cnkga2V5d29yZD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA1Lmh0bSNzdGhyZWY2NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvbGVnYWwuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmEwMDA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkxlZ2FsPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBMZWdhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjI5NCIgbmFtZT0ic3RocmVmMjk0Ij48L2E+PC9wPgotPGgxPkxlZ2FsPC9oMT4KLTxwPkNvcHlyaWdodCAmY29weTsgMjAwNiwgMjAxMCwgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KLTxwPlRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0OjwvcD4KLTxwPjxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+PC9wPgotPHA+PGEgaHJlZj0iYWJvdXQuaHRtIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzIGd1aWRlLjwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWVhMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWpwYURldmVsb3BtZW50PUpQQSBEZXZlbG9wbWVudAotY3JlYXRlQUpwYVByb2plY3Q9Q3JlYXRlIGEgSlBBIHByb2plY3QKLWNyZWF0ZUFKcGFQcm9qZWN0RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgY3JlYXRlIGEgSlBBIHByb2plY3QuCi1jcmVhdGVBUGVyc2lzdGVudEVudGl0eT1DcmVhdGUgYSBwZXJzaXN0ZW50IGVudGl0eQotY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5LgotTWFwQVBlcnNpc3RlbnRFbnRpdHk9TWFwIGEgcGVyc2lzdGVudCBlbnRpdHkKLU1hcEFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb249VGhpcyBjaGVhdCBzaGVldCBoZWxwcyB5b3UgbWFwIHRoZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBkYXRhYmFzZSB0YWJsZS4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmM1MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIFRPQyAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgRjEgICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotCQk8Y29udGV4dHMgZmlsZT0iY29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC51aSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgS2V5d29yZCBJbmRleCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0iaW5kZXgueG1sIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIENoZWF0c2hlZXRzIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iJWpwYURldmVsb3BtZW50IiBpZD0iY29tLmpwYS5jYXRlZ29yeSIvPgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQUpwYVByb2plY3QiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQuY3JlYXRlcHJvamVjdDEiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBSnBhUHJvamVjdERlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmFkZGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVNYXBBUGVyc2lzdGVudEVudGl0eSIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQubWFwZW50aXR5Ij4KLQkJCTxkZXNjcmlwdGlvbj4lTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3OGYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVudGl0eSBDbGFzcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkVJR0YiIG5hbWU9IkNJQUZFSUdGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgQ2xhc3MgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NSIgaGVhZGVycz0icjFjMS10NSI+U291cmNlIEZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMi10NSI+VGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NSIgaGVhZGVycz0icjFjMS10NSI+SmF2YSBQYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5DbGFzcyBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5TdXBlcmNsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMyLXQ1Ij5TZWxlY3QgdGhlIHN1cGVyY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+SW5oZXJpdGFuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ1IHIxYzItdDUiPkJlY2F1c2UgdGhlIHdpemFyZCBjcmVhdGVzIGEgSmF2YSBjbGFzcyB3aXRoIGFuIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uLCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBpZiB5b3UgZGVmaW5lZCBhIHN1cGVyY2xhc3MuPC9wPgotPHA+VG8gYWRkIGFuIDxjb2RlPkBJbmhlcml0YW5jZTwvY29kZT4gbm90YXRpb24gdG8gdGhlIGVudGl0eSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChkZXNjcmliZWQgaW4gSlNSIDIyMCk6PC9wPgotPHVsPgotPGxpPgotPHA+U0lOR0xFX1RBQkxFIC0tIEFsbCBjbGFzc2VzIGluIGEgaGllcmFyY2h5IGFzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS4gVGhpcyBhbm5vdGF0aW9uIGlzIHdpdGhvdXQgYW4gYXR0cmlidXRlIGZvciB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRBQkxFX1BFUl9DTEFTUyAtLSBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KT0lORUQgLS0gVGhlIHJvb3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0YWJsZS4gRWFjaCBzdWJjbGFzcyBpcyByZXByZXNlbnRlZCBieSBhIHNlcGFyYXRlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhvc2UgZmllbGRzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzdWJjbGFzcyAobm90IGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcmNsYXNzKSwgYXMgd2VsbCBhcyB0aGUgY29sdW1uKHMpIHRoYXQgcmVwcmVzZW50IGl0cyBwcmltYXJ5IGtleS4gVGhlIHByaW1hcnkga2V5IGNvbHVtbihzKSBvZiB0aGUgc3ViY2xhc3MgdGFibGUgc2VydmVzIGFzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHByaW1hcnkga2V5IG9mIHRoZSBzdXBlcmNsYXNzIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NSByMWMzLXQ1Ij5FbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+WE1MIEVudGl0eSBNYXBwaW5nczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMi10NSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTDwvc3Bhbj4gdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuCi08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwaW5nIGZpbGU8L3NwYW4+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdG8gdXNlLiBCeSBkZWZhdWx0LCBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIHRoZSA8Y29kZT5NRVRBLUlORi9vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTRmODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFERUNJQSIgbmFtZT0iQ0lBREVDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT48YSBpZD0ic3RocmVmMTk4IiBuYW1lPSJzdGhyZWYxOTgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIHRvIGJlIGNvbnZlcnRlZCB0byBpbmZvcm1hbC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5FbnRpdHkgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZW50ZXJlZCBhcyB0aGUgY2xhc3MgbmFtZS4gSWYgdGhlIGVudGl0eSBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY2xhc3MgbmFtZSwgdGhlbiB0aGUgZW50aXR5IG5hbWUgaXMgYWRkZWQgYXMgYW4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZTogPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMy10NiI+Ci08cD5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5UYWJsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMyLXQ2Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUgbmFtZSB0byB0aGUgZW50aXR5IG5hbWUuIE90aGVyd2lzZSwgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBlbnRlciB0aGUgbmFtZSBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+VGFibGUgTmFtZTwvc3Bhbj4gZmllbGQuIFRoZXNlIG9wdGlvbnMgcmVzdWx0IGluIHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBvcHRpb24gdG8gdGhlIEphdmEgY2xhc3MgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ2IHIxYzMtdDYiPgotPHA+VXNlIGRlZmF1bHQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IEZpZWxkczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMi10NiI+Ci08cD5DbGljayB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gYnV0dG9uIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdXNpbmcgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiBUaGlzIGRpYWxvZyBlbmFibGUgeW91IHRvIGJ1aWxkIGEgZmllbGQgYnkgZW50ZXJpbmcgYSBmaWVsZCBuYW1lIGFuZCBzZWxlY3RpbmcgYW1vbmcgcGVyc2lzdGVuY2UgdHlwZXMuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gbWFyayBhIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuIFRoZSBkaWFsb2cncyA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbiBlbmFibGVzIHlvdSB0byBhZGQgb3RoZXIgcGVyc2lzdGVuY2UgdHlwZXMgZGVzY3JpYmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FZGl0PC9zcGFuPiBidXR0b24gZW5hYmxlcyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9yIHR5cGUgc2V0IGZvciBhIHBlcnNpc3RlbnQgZmllbGQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NiByMWMzLXQ2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5BY2Nlc3MgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzMtdDYiPgotPHA+RmllbGQ8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTIyNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkIENvbnZlcnRlciBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHQ0dJSiIgbmFtZT0iQ0lBR0NHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBjcmVhdGUgYSBuZXcgRWNsaXBzZUxpbmsgY29udmVydGVyLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsTWF4IiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIG9uIHRoZSBOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDAgcjFjMi10NDAiPkVudGVyIHRoZSBuYW1lIGZvciB0aGlzIGNvbnZlcnRlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPlR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0MCByMWMyLXQ0MCI+U2VsZWN0IHRoZSBjb252ZXJ0ZXIgdHlwZToKLTx1bD4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PYmplY3QgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TdHJ1Y3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+VHlwZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiOGU1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gQ2FyZGluYWxpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXNzb2NpYXRpb24gQ2FyZGluYWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSUlGSCIgbmFtZT0iQ0lBRklJRkgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTAiIG5hbWU9InN0aHJlZjIxMCI+PC9hPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IGNhcmRpbmFsaXR5IG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLiBEZXBlbmRpbmcgb24gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Bc3NvY2lhdGlvbiBLaW5kPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW4gQ29sdW1uczwvc3Bhbj4gdGhhdCB5b3Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgc29tZSBhc3NvY2lhdGlvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuPC9wPgotPHVsPgotPGxpPgotPHA+TWFueSB0byBvbmU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG1hbnk8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG9uZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NYW55IHRvIG1hbnk8L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTdmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFzc29jaWF0aW9uIFRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdKSERDIiBuYW1lPSJDSUFHSkhEQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXNzb2NpYXRpb24gVGFibGVzPC9oMT4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGZvciBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEFzc29jaWF0aW9uIFRhYmxlcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiBraW5kPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMi10MTIiPlNwZWNpZnkgaWYgdGhlIGFzc29jaWF0aW9uIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5TaW1wbGU8L3NwYW4+ICgxOk0pIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IChNOk0pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMiIgaGVhZGVycz0icjFjMS10MTIiPkFzc29jaWF0aW9uIHRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEyIHIxYzItdDEyIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGUgU2VsZWN0aW9uPC9zcGFuPiwgdGhlbiBzZWxlY3QgdGhlIHR3byB0YWJsZXMgdG8gYXNzb2NpYXRlLgotPHA+V2hlbiBjcmVhdGluZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IGFzc29jaWF0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luIFRhYmxlPC9zcGFuPiBmb3IgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmYzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE5OjMzOjdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNISEhKQSIgbmFtZT0iQ0FDSEhISkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+U291cmNlIGZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQxIHIxYzItdDQxIj5Mb2NhdGlvbiBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY2xhc3Nlcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGEgbG9jYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQxIHIxYzItdDQxIj5OYW1lIG9mIHRoZSBwYWNrYWdlLiBDbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NDEgcjFjMi10NDEiPk5hbWUgb2YgdGhlIGNhdGFsb2cgZmlsZSB0byB1c2UgdG8gcmVzb2x2ZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5CaW5kaW5ncyBmaWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQxIHIxYzItdDQxIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgdGhlIGV4dGVybmFsIGJpbmRpbmdzIGZpbGVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI0NJSENCSEpEIj5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1Njk0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdCRkpFIiBuYW1lPSJDSUFHQkZKRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIFdpemFyZCB0byBjcmVhdGUgZW50aXRpZXMgZnJvbSB5b3VyIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiPlNlbGVjdCBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiPlRhYmxlIEFzc29jaWF0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkYTc0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHR0dERiIgbmFtZT0iQ0lBR0dHREYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIEpQQSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gcXVpY2tseSBhZGQgYW4gZW50aXR5IGFuZCBhbHNvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhhdCBlbnRpdHkuIEluIGFkZGl0aW9uLCB0aGlzIHdpemFyZCBhZGRzIHRoZSBhY2Nlc3NvciBtZXRob2RzICg8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+KSBpbiB0aGUgY2xhc3MgZmlsZS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhYTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0hJRiIgbmFtZT0iQ0lBRkdISUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+PGEgaWQ9InN0aHJlZjIwOCIgbmFtZT0ic3RocmVmMjA4Ij48L2E+VXNlIHRoZSBDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCB0byBzcGVjaWZ5IGFzc29jaWF0aW9uIHRhYmxlcyB3aGVuIGdlbmVyYXRpbmcgYW4gZW50aXR5LjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIj5Bc3NvY2lhdGlvbiBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qb2luX2NvbHVtbnMuaHRtI0NJQUVHRUVHIj5Kb2luIENvbHVtbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jQ0lBRklJRkgiPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDdkYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0lHRUUiIG5hbWU9IkNJQUNJR0VFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA2IiBuYW1lPSJzdGhyZWYyMDYiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIGN1c3RvbWl6ZSBlYWNoIGdlbmVyYXRlZCBlbnRpdHkuIFNlbGVjdCBhbiBpdGVtIGluIHRoZSBUYWJsZSBhbmQgY29sdW1ucyBhcmVhLCB0aGVuIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzIGZvciBlYWNoIGl0ZW0uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDExIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPlRhYmxlIE1hcHBpbmc8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSB0YWJsZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO0tleSZuYnNwO2dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDExIHIxYzItdDExIj5TZWxlY3QgdGhlIGdlbmVyYXRvciB1c2VkIGZvciB0aGlzIG1hcHBpbmcuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2UmbmJzcDtuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTEgcjFjMi10MTEiPkVudGVyIGEgbmFtZSBmb3IgdGhlIHNlcXVlbmNlLgotPHA+WW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImJvbGQiPiR0YWJsZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj4kcGs8L3NwYW4+IGFzIHZhcmlhYmxlcyBpbiB0aGUgbmFtZS4gVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKHJlc3BlY3RpdmVseSkgd2hlbiBEYWxpIGdlbmVyYXRlcyBhIHRhYmxlIG1hcHBpbmcuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7RW50aXR5Jm5ic3A7YWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTEgcjFjMi10MTEiPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW50aXR5IGFjY2VzcyBtZXRob2Q6IDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gKGRlZmF1bHQpIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlN1cGVyY2xhc3M8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg4MDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVKREJFIiBuYW1lPSJDSUFFSkRCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNSIgbmFtZT0ic3RocmVmMjA1Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uIERhbGkgd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBlbnRpdGllcyBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZXMuIFlvdSB3aWxsIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcyBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZW50aXRpZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQ3VzdG9tIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24gZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+VGFibGUgTWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEwIHIxYzItdDEwIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIHRhYmxlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7S2V5Jm5ic3A7Z2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMi10MTAiPlNlbGVjdCB0aGUgZ2VuZXJhdG9yIHVzZWQgZm9yIHRoaXMgbWFwcGluZy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO25hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMCByMWMyLXQxMCI+RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VxdWVuY2UuCi08cD5Zb3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0iYm9sZCI+JHRhYmxlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPiRwazwvc3Bhbj4gYXMgdmFyaWFibGVzIGluIHRoZSBuYW1lLiBUaGVzZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAocmVzcGVjdGl2ZWx5KSB3aGVuIERhbGkgZ2VuZXJhdGVzIGEgdGFibGUgbWFwcGluZy48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtFbnRpdHkmbmJzcDthY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbnRpdHkgYWNjZXNzIG1ldGhvZDogPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAoZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtBc3NvY2lhdGlvbnMmbmJzcDtmZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGZldGNoIG1vZGUgZm9yIGFzc29jaWF0aW9uczogPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQ8L3NwYW4+LCBhcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5MYXp5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtDb2xsZWN0aW9uJm5ic3A7dHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGlmIHRoZSBjb2xsZWN0aW9uIHByb3BlcnRpZXMgYXJlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNldDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkxpc3Q8L3NwYW4+LgotPHA+RW5hYmxlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnM8L3NwYW4+IG9wdGlvbiB0byBoYXZlIERhbGkgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMCByMWMyLXQxMCI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlBhY2thZ2U8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+U3VwZXJjbGFzczwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4NTk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dER0hDIiBuYW1lPSJDQUNHREdIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9oMT4KLTxwPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIGRlZmF1bHQgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMy5odG0jQ0FDQ0FDR0giPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDRUFHQkciPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiPkdlbmVyYXRvcnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNi5odG0jQ0lBSUJBQUoiPlF1ZXJpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0lBREdDSUQiPkNvbnZlcnRlcnM8L2E+ICh3aGVuIHVzaW5nIEVjbGlwc2VMaW5rKTwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhlc2UgZGVmYXVsdHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHNldHRpbmdzIG9uIGEgc3BlY2lmaWMgZW50aXR5IG9yIG1hcHBpbmcuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhNjMwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRURFSkYiIG5hbWU9IkNJQUVERUpGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHRoZSBsb2NhdGlvbiBhbmQgcHJvcGVydGllcyBvZiB0aGUgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlICg8Y29kZT5lY2xpc3BlbGluay1vcm0ueG1sPC9jb2RlPikuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWxNYXgiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgb24gdGhlIE5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJyb3dzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlByb2plY3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzOSByMWMyLXQzOSI+U2VsZWN0IHRoZSBwcm9qZWN0IGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlNvdXJjZSBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzOSByMWMyLXQzOSI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgc291cmNlIGZpbGUgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPi4uLzwvY29kZT48Y29kZT48c3BhbiBjbGFzcz0iY29kZWlubGluZWl0YWxpYyI+Jmx0O1BST0pFQ1QmZ3Q7PC9zcGFuPjwvY29kZT48Y29kZT4vc3JjPC9jb2RlPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5GaWxlIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzOSByMWMyLXQzOSI+RW50ZXIgdGhlIGZpbGVuYW1lIGFuZCBwYXRoIG9mIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPkRlZmF1bHQgYWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzkgcjFjMi10MzkiPlNlbGVjdCB3aGV0aGVyIHRoZSBlbnRpdHkncyBhY2Nlc3MgdG8gaW5zdGFuY2UgdmFyaWFibGVzIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5maWVsZDwvc3Bhbj4tYmFzZWQgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByb3BlcnR5PC9zcGFuPi1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+QWRkIHRvIHBlcnNpc3RlbmNlIHVuaXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzOSByMWMyLXQzOSI+U3BlY2lmeSBpZiB0aGlzIG1hcHBpbmcgZmlsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPiZuYnNwOyZuYnNwO1BlcnNpc3RlbmNlJm5ic3A7VW5pdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDM5IHIxYzItdDM5Ij5TZWxlY3QgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFKRUlESiI+TWFwcGluZyBGaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiZjNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkphdmEgUGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKYXZhIFBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHRUJBQSIgbmFtZT0iQ0lBR0VCQUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkphdmEgUGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YSBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPlNvdXJjZSBmb2xkZXJzIG9uIGJ1aWxkIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzItdDMiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgRm9sZGVyPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgSmF2YSBzb3VyY2UgZm9sZGVyIHRvIGFkZCB0byB0aGlzIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MyByMWMzLXQzIj5FY2xpcHNlTGluazwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5EZWZhdWx0IG91dHB1dCBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSZuYnNwOzxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj5idWlsZFxjbGFzc2VzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmViNWJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTY6MTg6MTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dBREZIIiBuYW1lPSJDQUNHQURGSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQgY3JlYXRlIGFuIFhNTCBzY2hlbWEgKCZuYnNwOy54c2QpIGZvciBhIHNldCBvZiBKQVhCIG1hcHBlZCBjbGFzc2VzLjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfc2NoZW1hX2Zyb21fY2xhc3Nlc19wYWdlLmh0bSNDQUNIQkVHSiI+R2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNDSUhIQkpDSiI+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9IiNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMmNiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFR0VFRyIgbmFtZT0iQ0lBRUdFRUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA5IiBuYW1lPSJzdGhyZWYyMDkiPjwvYT5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvcD4KLTxwPkNsaWNrIEFkZCB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgYmV0d2VlbiB0aGUgdHdvIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNGZmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRmFjZXQgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRmFjZXQgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lGRElGIiBuYW1lPSJDQUNJRkRJRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIEZhY2V0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NCByMWMyLXQ0Ij5WZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMy10NCI+RWNsaXBzZUxpbms8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MSIgbmFtZT0ic3RocmVmMTkxIj48L2E+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMi10NCI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NCByMWMzLXQ0Ij5Vc2VyIExpYnJhcnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSBsaWJyYXJpZXMgd2l0aCB0aGlzIGFwcGxpY2F0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0IHIxYzItdDQiPlNlbGVjdCBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMzLXQ0Ij5UaGUgdmFsdWUgY2FsY3VsYXRlZCBieSBEYWxpLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5KUEEgSW1wbGVtZW50YXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0byB1c2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBhdCBydW50aW1lPC9zcGFuPiwgb3Igc2VsZWN0IGEgc3BlY2lmaWMgPHNwYW4gY2xhc3M9ImJvbGQiPmltcGxlbWVudGF0aW9uIGxpYnJhcnk8L3NwYW4+IHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgSmF2YSBCdWlsZCBQYXRoLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0byBjcmVhdGUgYSBkZWZhdWx0IGxpYnJhcnkgZm9yIHRoZSBwcm9qZWN0IG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L3NwYW4+IHRvIGRlZmluZSBhZGRpdGlvbmFsIGxpYnJhcmllcy48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIHdvcmtpbmcgd2l0aCBKUEEgcHJvamVjdHMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMzLXQ0Ij5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5DcmVhdGUgPGNvZGU+b3JtLnhtbDwvY29kZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMy10NCI+U2VsZWN0ZWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDJiYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkhGSUoiIG5hbWU9IkNBQ0JIRklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KYXZhIERldGFpbHMgdmlldzwvc3Bhbj4gZm9yIGVhY2ggbWFwcGluZyB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjclIiAvPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxNiI+QXZhaWxhYmxlIGZvciBNYXBwaW5nIFR5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWM0LXQxNiI+QWxsIG1hcHBpbmcgdHlwZXM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDR0NCSEIiIG5hbWU9IkNBQ0dDQkhCIj48L2E+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMi10MTYiPjxhIGlkPSJzdGhyZWYyMzEiIG5hbWU9InN0aHJlZjIzMSI+PC9hPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMi10MTYiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWMyLXQxNiI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0luc2VydGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VwZGF0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBVUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VuaXF1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSA8Y29kZT5VTklRVUU8L2NvZGU+IGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjMy10MTYiPkZhbHNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOdWxsYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBhbGxvd3MgbnVsbCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtMZW5ndGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIGNvbHVtbiBsZW5ndGguPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzMtdDE2Ij4yNTU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7UHJlY2lzaW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBwcmVjaXNpb24gZm9yIHRoZSBjb2x1bW4gdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWMzLXQxNiI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtTY2FsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzMtdDE2Ij4wPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0NvbHVtbiBEZWZpbml0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmUgdGhlIERETCBmb3IgYSBjb2x1bW4uIFRoaXMgaXMgdXNlZCB3aGVuIGEgdGFibGUgaXMgYmVpbmcgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNHR0dIQiIgbmFtZT0iQ0FDR0dHSEIiPjwvYT48YSBpZD0ic3RocmVmMjMzIiBuYW1lPSJzdGhyZWYyMzMiPjwvYT48YSBpZD0ic3RocmVmMjM0IiBuYW1lPSJzdGhyZWYyMzQiPjwvYT48YSBpZD0ic3RocmVmMjM1IiBuYW1lPSJzdGhyZWYyMzUiPjwvYT5GZXRjaCBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLTx1bD4KLTxsaT4KLTxwPkVhZ2VyICZuZGFzaDsgRGF0YSBpcyBsb2FkZWQgaW4gYmVmb3JlIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eSAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTYgcjFjMy10MTYiPkVhZ2VyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjMy10MTYiPlllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNCQklCSSIgbmFtZT0iQ0FDQkJJQkkiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT5Mb2I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byA8Y29kZT5qYXZhLnNxbC5DbG9iPC9jb2RlPiBvciA8Y29kZT5qYXZhLnNxbC5CbG9iPC9jb2RlPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBMb2I8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE3YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0VBSkdEIiBuYW1lPSJDQUNFQUpHRCI+PC9hPjxhIGlkPSJzdGhyZWYyMzciIG5hbWU9InN0aHJlZjIzNyI+PC9hPjxhIGlkPSJzdGhyZWYyMzgiIG5hbWU9InN0aHJlZjIzOCI+PC9hPjxhIGlkPSJzdGhyZWYyMzkiIG5hbWU9InN0aHJlZjIzOSI+PC9hPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLTxwPkRhdGUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFRlbXBvcmFsPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDAiIG5hbWU9InN0aHJlZjI0MCI+PC9hPjxhIGlkPSJzdGhyZWYyNDEiIG5hbWU9InN0aHJlZjI0MSI+PC9hPjxhIGlkPSJzdGhyZWYyNDIiIG5hbWU9InN0aHJlZjI0MiI+PC9hPkVudW1lcmF0ZWQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuCi08dWw+Ci08bGk+Ci08cD5vcmRpbmFsPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPlN0cmluZzwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbnVtZXJhdGVkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWMzLXQxNiI+T3JkaW5hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWM0LXQxNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMi10MTYiPlRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+IDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDMiIG5hbWU9InN0aHJlZjI0MyI+PC9hPklEPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkncyBJRCBpcyBkZXJpdmVkIGZyb20gdGhlIGlkZW50aXR5IG9mIGFub3RoZXIgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzQtdDE2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIxYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pBSUhCIiBuYW1lPSJDQUNKQUlIQiI+PC9hPkNhc2NhZGUgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eS4KLTx1bD4KLTxsaT4KLTxwPkFsbCAmbmRhc2g7IEFsbCBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+TW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVmcmVzaDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pESkpBIiBuYW1lPSJDQUNKREpKQSI+PC9hPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMyLXQxNiI+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0ICJvd25zIiB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9ubHkgb24gdGhlIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0RBRElIIiBuYW1lPSJDQUNEQURJSCI+PC9hPjxhIGlkPSJzdGhyZWYyNDQiIG5hbWU9InN0aHJlZjI0NCI+PC9hPjxhIGlkPSJzdGhyZWYyNDUiIG5hbWU9InN0aHJlZjI0NSI+PC9hPk9yZGVyIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeToKLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbSBvcmRlcmluZzwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9yZGVyQnk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzMtdDE2Ij5QcmltYXJ5IGtleTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPi4gPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjI0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMyLXQxNiI+T3ZlcnJpZGVzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3Mgb2YgYSBtYXBwZWQgc3VwZXJjbGFzcyAoZm9yIGV4YW1wbGUsIGlmIHRoZSBpbmhlcml0ZWQgY29sdW1uIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggYSBwcmUtZXhpc3RpbmcgZGF0YSBtb2RlbCwgb3IgaW52YWxpZCBhcyBhIGNvbHVtbiBuYW1lIGluIHlvdXIgZGF0YWJhc2UpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1NzZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgSlBBIFByb2plY3QgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKQUdDIiBuYW1lPSJDQUNCSkFHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIE5ldyBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+TmFtZSBvZiB0aGUgRWNsaXBzZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IGNvbnRlbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5Mb2NhdGlvbiBvZiB0aGUgd29ya3NwYWNlIGluIHdoaWNoIHRvIHNhdmUgdGhlIHByb2plY3QuCi08cD5VbnNlbGVjdCBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBEZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzMtdDIiPkN1cnJlbnQgd29ya3NwYWNlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlRhcmdldCBydW50aW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcmUtZGVmaW5lZCB0YXJnZXQgZm9yIHRoZSBwcm9qZWN0LgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGVudmlyb25tZW50IHdpdGggdGhlIE5ldyBTZXJ2ZXIgUnVudGltZSB3aXphcmQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MiIgaGVhZGVycz0icjFjMS10MiI+Q29uZmlndXJhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByb2plY3QgY29uZmlndXJhdGlvbiB3aXRoIHByZS1kZWZpbmVkIGZhY2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Jmx0O2N1c3RvbSZndDs8L3NwYW4+IHRvIG1hbnVhbGx5IHNlbGVjdCB0aGUgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMzLXQyIj5VdGlsaXR5IEpQQSBwcm9qZWN0IHdpdGggSmF2YSA1LjA8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MiIgaGVhZGVycz0icjFjMS10MiI+RUFSIG1lbWJlcnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzItdDIiPlNwZWNpZnkgaWYgdGhpcyBwcm9qZWN0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+LCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgRUFSIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MiIgaGVhZGVycz0icjFjMS10MiI+V29ya2luZyBzZXRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gZXhpc3Rpbmcgd29ya2luZyBzZXQuIFRoZSBkcm9wIGRvd24gZmllbGQgc2hvd3MgYSBsaXN0IG9mIHByZXZpb3VzIHNlbGVjdGVkIHdvcmtpbmcgc2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzPC9zcGFuPiwgdGhlbiBzZWxlY3QgYSB3b3JraW5nIHNldCBpbiB3aGljaCB0byBhZGQgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTMyMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkdCRyIgbmFtZT0iQ0FDQkpHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPlRoZSBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBKYXZhIHByb2plY3QgdXNpbmcgSlBBLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfamF2YV9wYWdlLmh0bSNDSUFHRUJBQSI+SmF2YSBQYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmYwOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWw8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJRkdKIiBuYW1lPSJDSUFDSUZHSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbDwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI1OCIgbmFtZT0ic3RocmVmMjU4Ij48L2E+PGEgaWQ9InN0aHJlZjI1OSIgbmFtZT0ic3RocmVmMjU5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYWwgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCZyc3F1bztzIEdlbmVyYWwgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMzLXQyNCI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjQgcjFjMi10MjQiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMzLXQyNCI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNCByMWMyLXQyNCI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzMtdDI0Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkpBUiBGaWxlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI0IHIxYzItdDI0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQyNjczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCQUYiIG5hbWU9IkJBQklGQkFGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIyOCIgbmFtZT0ic3RocmVmMjI4Ij48L2E+PGEgaWQ9InN0aHJlZjIyOSIgbmFtZT0ic3RocmVmMjI5Ij48L2E+PGEgaWQ9InN0aHJlZjIzMCIgbmFtZT0ic3RocmVmMjMwIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFwcGVkIGF0dHJpYnV0ZSBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhZmNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBTdHJ1Y3R1cmUgdmlldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFR0dGRSIgbmFtZT0iQkFCRUdHRkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBTdHJ1Y3R1cmUgdmlldzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjU1IiBuYW1lPSJzdGhyZWYyNTUiPjwvYT48YSBpZD0ic3RocmVmMjU2IiBuYW1lPSJzdGhyZWYyNTYiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBTdHJ1Y3R1cmU8L3NwYW4+IHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIHNob3duIGluIHRoZSBvdXRsaW5lIGFyZSB0aGUgZW50aXR5IGFuZCBpdHMgZmllbGRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyIgYWx0PSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiB0aXRsZT0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlOGNhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkRCIiBuYW1lPSJCQUJJRkJEQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyODYiIG5hbWU9InN0aHJlZjI4NiI+PC9hPjxhIGlkPSJzdGhyZWYyODciIG5hbWU9InN0aHJlZjI4NyI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBkZWZpbmVzIHRoZSBpbml0aWFsIHNldCBhbmQgbGF5b3V0IG9mIHZpZXdzIGluIHRoZSBXb3JrYmVuY2ggd2luZG93IHdoZW4gdXNpbmcgRGFsaS4gQnkgZGVmYXVsdCwgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgdmlld3M6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jb25jZXB0cy00Lmh0bSI+UGVyc3BlY3RpdmVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZTAxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBRUJCIiBuYW1lPSJCQUJGQUVCQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjExIiBuYW1lPSJzdGhyZWYyMTEiPjwvYT48YSBpZD0ic3RocmVmMjEyIiBuYW1lPSJzdGhyZWYyMTIiPjwvYT48YSBpZD0ic3RocmVmMjEzIiBuYW1lPSJzdGhyZWYyMTMiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbnRpdHkgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdGFiczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIj5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDRkhHSEUiPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzkwMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDSElEIiBuYW1lPSJDSUFDQ0hJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBlbmFibGVzIHlvdSB0byB1cGRhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBGb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgcGVyaXNpc3RlbmNlLnhtbCBFZGl0b3IgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZXNlIHBhZ2VzIGlzIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlMDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNDQUIiIG5hbWU9IkNBQ0ZDQ0FCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC9zcGFuPiBhcmVhIGluIEpQQSBEZXRhaWxzIHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4gdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTkiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDQkFKQkMiIG5hbWU9IkNBQ0JBSkJDIj48L2E+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij48YSBpZD0ic3RocmVmMjUxIiBuYW1lPSJzdGhyZWYyNTEiPjwvYT48YSBpZD0ic3RocmVmMjUyIiBuYW1lPSJzdGhyZWYyNTIiPjwvYT5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLiBUaGVzZSBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QEdlbmVyYXRlZFZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5HZW5lcmF0ZWQgVmFsdWU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDSkVFRUMiIG5hbWU9IkNBQ0pFRUVDIj48L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMyLXQxOSI+Ci08dWw+Ci08bGk+QXV0bzwvbGk+Ci08bGk+Ci08cD5JZGVudGl0eSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgdGhlIGRhdGFiYXNlJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPklkZW50aXR5PC9zcGFuPiBjb2x1bW4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIHNlcXVlbmNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0ZGSEVIIj5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBkYXRhYmFzZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNHRkVBSCI+VGFibGUgR2VuZXJhdG9yPC9hPikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMzLXQxOSI+QXV0bzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJCQUJFRUFISiIgbmFtZT0iQkFCRUVBSEoiPjwvYT4mbmJzcDsmbmJzcDtHZW5lcmF0b3IgTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHZhbHVlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDR0ZFQUgiIG5hbWU9IkNBQ0dGRUFIIj48L2E+VGFibGUgR2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMi10MTkiPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIGRhdGFiYXNlIHRhYmxlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AVGFibGVHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4mbmJzcDs9Jm5ic3A7PHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtUYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE5IHIxYzItdDE5Ij5EYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMi10MTkiPlRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIGdlbmVyYXRvcidzIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4gdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ZhbHVlIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE5IHIxYzItdDE5Ij5UaGUgdmFsdWUgZm9yIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJpbWFyeSBLZXkgQ29sdW1uPC9zcGFuPiBpbiB0aGUgZ2VuZXJhdG9yIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJDQUNGRkhFSCIgbmFtZT0iQ0FDRkZIRUgiPjwvYT5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI1MyIgbmFtZT0ic3RocmVmMjUzIj48L2E+PGEgaWQ9InN0aHJlZjI1NCIgbmFtZT0ic3RocmVmMjU0Ij48L2E+VGhlc2UgZmllbGRzIGRlZmluZSB0aGUgc3BlY2lmaWMgc2VxdWVuY2UgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBTZXF1ZW5jZUdlbmVyYXRvcjwvY29kZT4gYW5ub3RhdGlvbi4KLTxwPlRoZXNlIGZpZWxkcyBhcHBseSBvbmx5IHdoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJib2xkIj5TZXF1ZW5jZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMyLXQxOSI+TmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUgdG8gdXNlIGZvciBkZWZpbmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMi10MTkiPlVuaXF1ZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTZhYTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJKSEJDSSIgbmFtZT0iQkFCSkhCQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNzMiIG5hbWU9InN0aHJlZjI3MyI+PC9hPjxhIGlkPSJzdGhyZWYyNzQiIG5hbWU9InN0aHJlZjI3NCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkVycm9ycy9XYXJuaW5nczwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc3BlY2lmeSB0aGUgdmFsaWRhdGlvbiBvcHRpb25zIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzYiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPkVuYWJsZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYWwgc2V0dGluZ3MgZm9yIHRoaXMgcHJvamVjdC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtQcm9qZWN0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7UGVyc2lzdGVudCB1bml0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7VHlwZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0F0dHJpYnV0ZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1NjaGVtYSBtYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7SW1wbGllZCZuYnNwO2F0dHJpYnV0ZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtJbXBsaWVkJm5ic3A7YXNzb2NpYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0luaGVyaXRhbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtRdWVyaWVzJm5ic3A7YW5kJm5ic3A7Z2VuZXJhdG9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZmY4MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxNjoxODoxM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSEJFR0oiIG5hbWU9IkNBQ0hCRUdKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBzZWxlY3QgdGhlIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBhIHNjaGVtYS4gWW91IGNhbiBzZWxlY3QgYW4gZW50aXJlIHByb2plY3QsIGEgcGFja2FnZSwgb3Igc3BlY2lmaWMgY2xhc3Nlcy48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2QzYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RUYWJsZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWxlY3QgVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlbGVjdCBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0dFRSIgbmFtZT0iQ0lBSENHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBUYWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwMSIgbmFtZT0ic3RocmVmMjAxIj48L2E+PGEgaWQ9InN0aHJlZjIwMiIgbmFtZT0ic3RocmVmMjAyIj48L2E+PGEgaWQ9InN0aHJlZjIwMyIgbmFtZT0ic3RocmVmMjAzIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2VsZWN0IFRhYmxlczwvc3Bhbj4gZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBlbnRpdGllcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPlNlbGVjdCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBDb25uZWN0aW9uPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHdoaWNoIHRvIHNlbGVjdCB0YWJsZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEgc2VsZWN0aW9ucy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U3luY2hyb25pemUgQ2xhc3NlcyBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YmYxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGREdJSiIgbmFtZT0iQ0lBRkRHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgYXNzb2NpYXRpb246IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIFJlbW92ZSwgb3IgUmVmcmVzaC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYWJsZSBBc3NvY2lhdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGFibGUgQXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0RJQ0IiIG5hbWU9IkNJQUNESUNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UYWJsZSBBc3NvY2lhdGlvbnM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNCIgbmFtZT0ic3RocmVmMjA0Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBjcmVhdGUgb3IgZWRpdCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZGF0YWJhc2UgdGFibGUgYW5kIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBUYWJsZSBBc3NvY2lhdGlvbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5UYWJsZSBhc3NvY2lhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ5IHIxYzItdDkiPlNlbGVjdCBhbiBhc3NvY2lhdGlvbiB0byBtb2RpZnkgb3IgY2xpY2sgdG8gY3JlYXRlIGEgbmV3IHRhYmxlIGFzc29jaWF0aW9uIHdpdGggdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OSIgaGVhZGVycz0icjFjMS10OSI+R2VuZXJhdGUgdGhpcyBhc3NvY2lhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgdGhlIHNlbGVjdGVkIGFzc29jaWF0aW9uLiBJZiBlbmFibGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhlIENhcmRpbmFsaXR5IGFuZCBKb2luIHRhYmxlIGZvciB0aGUgdGFibGUgYXNzb2NpYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvIDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtST1cmZ3Q7PC9zcGFuPiBpbiA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEUmZ3Q7PC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHNob3VsZCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdGFibGUuCi08cD5JZiBlbmFibGVkLCB5b3UgY2FuIGFsc28gZW50ZXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4gbmFtZSBhbmQgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q2FzY2FkZTwvc3Bhbj4gbWV0aG9kIChhbGwsIHBlcnNpc3QsIG1lcmdlLCByZW1vdmUsIG9yIHJlZnJlc2gpIGZvciB0aGUgcmVmZXJlbmNlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGIwMjdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4OSIgbmFtZT0ic3RocmVmMTg5Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI2Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MDIyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTk6MzM6M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXaXphcmRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSkpKSkgiIG5hbWU9IkNBQ0pKSkpIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5XaXphcmRzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHdpemFyZHM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSI+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MzY0MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlKQ0NFIiBuYW1lPSJDSUFJSkNDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFwcGluZyBGaWxlIFdpemFyZDwvaDE+Ci08cD5UaGUgTWFwcGluZyBGaWxlIHdpemFyZCBlbmFibGVzIHlvdSB0byBhZGQgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBhIEpQQSBwcm9qZWN0IGlmIG5vIG9iamVjdCBtYXAgZXhpc3RzIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgY2xlYXJlZCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gb24gdGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4sIHlvdSBjYW4gbGF0ZXIgYWRkIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRvIHRoZSBzcmMgZmlsZSBvZiB0aGUgcHJvamVjdCB1c2luZyB0aGlzIHdpemFyZC48L3A+Ci08cD5UaGUgPGEgaHJlZj0iI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPiBjb25zaXN0cyBvZiB0aGUgTWFwcGluZyBGaWxlIHBhZ2UuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzczY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkVJREoiIG5hbWU9IkNJQUpFSURKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYXBwaW5nIEZpbGU8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk5IiBuYW1lPSJzdGhyZWYxOTkiPjwvYT48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPk1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllczwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iTWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNYXBwaW5nIEZpbGUgV2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPlByb2plY3Q8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzItdDciPgotPHA+VGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5Tb3VyY2UgZm9sZGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCdzIHNyYyBmb2xkZXIuIElmIG5lZWRlZCwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gcG9pbnQgdGhlIHdpemFyZCB0byB0aGUgc3JjIGZpbGUncyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+RmlsZSBQYXRoPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5EZWZhdWx0IEFjY2VzczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjMi10NyI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgYWNjZXNzIHRvIHRoZSBlbnRpdHkgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+Tm9uZSAmbmRhc2g7IE5vIGFjY2VzcyB0eXBlIHNwZWNpZmllZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzMtdDciPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMyLXQ3Ij4KLTxwPkRlc2lnbmF0ZXMgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZm9yIHRoaXMgb2JqZWN0IG1hcCBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwMGNkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdIQ0dBIiBuYW1lPSJDSUFHSENHQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTQwMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb3BlcnR5IHBhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpJSUciIG5hbWU9IkNBQ0RKSUlHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0eSBwYWdlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmMyNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUdHQyIgbmFtZT0iQ0FDQ0FHR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTMiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDEzIj5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzItdDEzIj5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGVudGl0eTogTWFwcGVkIFN1cGVyY2xhc3MsIEVtYmVkZGFibGUgb3IgdGhlIGRlZmF1bHQgbWFwcGluZyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj5FbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+LCA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+LCBhbmQgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj5UaGUgZGVmYXVsdCBkYXRhYmFzZSB0YWJsZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuIFRoZXNlIGZpZWxkcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2E+IGFyZWEuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGRhdGFiYXNlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtTY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMyLXQxMyI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBlbnRpdHkgbmFtZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzItdDEzIj5UaGUgYWNjZXNzIG1ldGhvZCBmb3IgdGhpcyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjMy10MTMiPkZpZWxkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPlByaW1hcnkmbmJzcDtrZXkmbmJzcDtjbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEzIHIxYzItdDEzIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBhbmQgc2VsZWN0IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS4gQ2xpY2tpbmcgdGhlIGZpZWxkIG5hbWUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjNC10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5DYWNoYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWMyLXQxMyI+U3BlY2lmaWVzIGlmIHRoZSBlbnRpdHkgaXMgY2FjaGFibGUuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ2FjaGFibGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzMtdDEzIj5AQ2FjaGFibGUoZmFsc2UpPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDBhY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkF0dHJpYnV0ZSBvdmVycmlkZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lKQkdIIiBuYW1lPSJDQUNJSkJHSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXR0cmlidXRlIG92ZXJyaWRlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT48YSBpZD0ic3RocmVmMjE1IiBuYW1lPSJzdGhyZWYyMTUiPjwvYT48YSBpZD0ic3RocmVmMjE2IiBuYW1lPSJzdGhyZWYyMTYiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBhcmVhIG9mIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlIG92ZXJyaWRlcyBnZW5lcmFsbHkgb3ZlcnJpZGUvY29uZmlndXJlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgaW5oZXJpdGVkIG9yIGVtYmVkZGVkLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEF0dHJpYnV0ZSBvdmVycmlkZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDE0Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSB0aGUgam9pbmluZyBzdHJhdGVneS4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiB0byBhZGQgYSBkaWZmZXJlbnQgam9pbmluZyBzdHJhdGVneS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+Sm9pbiBjb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjNC10MTQiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDBmOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSElEQSIgbmFtZT0iQ0FDQkhJREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE3IiBuYW1lPSJzdGhyZWYyMTciPjwvYT48YSBpZD0ic3RocmVmMjE4IiBuYW1lPSJzdGhyZWYyMTgiPjwvYT48YSBpZD0ic3RocmVmMjE5IiBuYW1lPSJzdGhyZWYyMTkiPjwvYT48YSBpZD0ic3RocmVmMjIwIiBuYW1lPSJzdGhyZWYyMjAiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5TZWNvbmRhcnkgVGFibGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gYXNzb2NpYXRlIGFkZGl0aW9uYWwgdGFibGVzIHdpdGggYW4gZW50aXR5LiBVc2UgdGhpcyBhcmVhIGlmIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwNTM4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkhHSEUiIG5hbWU9IkNBQ0ZIR0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjIxIiBuYW1lPSJzdGhyZWYyMjEiPjwvYT48YSBpZD0ic3RocmVmMjIyIiBuYW1lPSJzdGhyZWYyMjIiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SW5oZXJpdGFuY2U8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmeSB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWFwcGluZyBhIGNsYXNzIG9yIGNsYXNzIGhpZXJhcmNoeToKLTx1bD4KLTxsaT4KLTxwPlNpbmdsZSB0YWJsZSAmbmRhc2g7IEFsbCBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkICZuZGFzaDsgVGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGU7IGVhY2ggY2hpbGQgbWFwcyB0byBpdHMgb3duIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSBwZXIgY2xhc3MgJm5kYXNoOyBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzMtdDE1Ij5TaW5nbGUgdGFibGU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjIzIiBuYW1lPSJzdGhyZWYyMjMiPjwvYT48YSBpZD0ic3RocmVmMjI0IiBuYW1lPSJzdGhyZWYyMjQiPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjI1IiBuYW1lPSJzdGhyZWYyMjUiPjwvYT48YSBpZD0ic3RocmVmMjI2IiBuYW1lPSJzdGhyZWYyMjYiPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGVzZSBmaWVsZHMgYXJlIGF2YWlsYWJsZSB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EZXRhaWxzPC9zcGFuPiBhcmVhIHRvIGRlZmluZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhpcyBEaXNjcmltaW5hdG9yIENvbHVtbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij4mbmJzcDsmbmJzcDtUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMi10MTUiPlNldCB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMyLXQxNSI+VXNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgbmV3IEpvaW4gQ29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB3aXRoIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIzZTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5RdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjIyNyIgbmFtZT0ic3RocmVmMjI3Ij48L2E+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5Vc2UgdGhlIHF1ZXJpZXMgYXJlYSBvZiB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjcmVhdGUgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuIFJlZmVyIHRvIDxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZGNlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkFFQkMiIG5hbWU9IkNBQ0JBRUJDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9oMT4KLTxwPlVzZSBhcmVhIHRvIHNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gQnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gVGFibGU8L3NwYW4+IGFyZWEgaW4gPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPnRoZSBKUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4gbWFwcGluZyB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzItdDE3Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPjxhIGlkPSJDQUNCQkRGRyIgbmFtZT0iQ0FDQkJERkciPjwvYT5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMyLXQxNyI+PGEgaWQ9InN0aHJlZjI0NiIgbmFtZT0ic3RocmVmMjQ2Ij48L2E+PGEgaWQ9InN0aHJlZjI0NyIgbmFtZT0ic3RocmVmMjQ3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTkwNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGQ0VKQyIgbmFtZT0iQ0FDRkNFSkMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBUYWJsZTwvc3Bhbj4gYXJlYSBpbiA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiBtYXBwaW5nIHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+PGEgaWQ9InN0aHJlZjI0OSIgbmFtZT0ic3RocmVmMjQ5Ij48L2E+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOS5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA4OTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUNHSCIgbmFtZT0iQ0FDQ0FDR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjAiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMi10MjAiPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMi10MjAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcHJvamVjdDoKLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5PC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7YWNjZXNzJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNGQzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0VBR0JHIiBuYW1lPSJDQUNFQUdCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS4gVGhlc2UgZmllbGRzIGFyZSBjb250YWluZWQgaW4gdGhlIDxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIxIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlhNTCBNYXBwaW5nIERhdGEgQ29tcGxldGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDt4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGUgUGVyc2lzdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXNjYWRlLXBlcnNpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMi10MjEiPlNwZWNpZnkgaG93IHRoZSBlbnRpdHkgaXRzIGFjY2VzcyBpbnN0YW5jZSB2YXJpYWJsZXMuCi08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eSAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPlByb3BlcnR5PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwYzg4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRvcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdG9ycyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZHQUlKIiBuYW1lPSJDSUFGR0FJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdG9yczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmF0b3IgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+R2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMi10MjIiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBTZXF1ZW5jZSBhbmQgVGFibGUgZ2VuZXJhdG9ycy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgU2VxdWVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgVGFibGU8L3NwYW4+IHRvIGFkZCBhIG5ldyBnZW5lcmF0b3IuPC9wPgotPHA+Rm9yIHNlcXVlbmNlIGdlbmVyYXRvcnMsIHlvdSBtdXN0IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5hbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+U2NoZW1hPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhdGFsb2c8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsb2NhdGlvbiBzaXplPC9wPgotPC9saT4KLTxsaT4KLTxwPkluaXRpYWwgdmFsdWU8L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciB0YWJsZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPlNjaGVtYTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXRhbG9nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5WYWx1ZSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbG9jYXRpb24gc2l6ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2EyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUXVlcmllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlCQUFKIiBuYW1lPSJDSUFJQkFBSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBRdWVyeSBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5RdWVyaWVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBOYW1lZCBhbmQgTmF0aXZlIHF1ZXJpZXMuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhZGQgYSBuYW1lZCBxdWVyeSwgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBOYXRpdmU8L3NwYW4+IGZvciBhIG5hdGl2ZSBxdWVyeS48L3A+Ci08cD5Gb3IgbmFtZWQgcXVlcmllcywgZW50ZXIgdGhlIHF1ZXJ5IGluIHRoZSBRdWVyeSBmaWVsZC48L3A+Ci08cD5Gb3IgbmF0aXZlIHF1ZXJpZXMsIHNlbGVjdCBhIHJlc3VsdCBjbGFzcywgdGhlbiBlbnRlciB0aGUgcXVlcnkgaW4gdGhlIFF1ZXJ5IGZpZWxkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlF1ZXJ5IEhpbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBxdWVyeSBoaW50cyAoTmFtZSBhbmQgVmFsdWUpLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gYWRkIGEgbmV3IHF1ZXJ5IGhpbnQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMjFhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGVyczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb252ZXJ0ZXJzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREdDSUQiIG5hbWU9IkNJQURHQ0lEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Db252ZXJ0ZXJzPC9oMT4KLTxwPlRoZSBDb252ZXJ0ZXJzIGluZm9ybWF0aW9uIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3IGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIEVjbGlwc2VMaW5rPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNvbnZlcnRlciwgdXNpbmcgdGhlIDxhIGhyZWY9InJlZl9hZGRfY29udmVydGVyLmh0bSNDSUFHQ0dJSiI+QWRkIENvbnZlcnRlciBkaWFsb2c8L2E+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNWI3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbm5lY3Rpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjAiIG5hbWU9InN0aHJlZjI2MCI+PC9hPjxhIGlkPSJzdGhyZWYyNjEiIG5hbWU9InN0aHJlZjI2MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yJnJzcXVvO3MgY29ubmVjdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+VHJhbnNhY3Rpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCB1c2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0PC9zcGFuPiAtLSBTZWxlY3QgdG8gdXNlIHRoZSBjb250YWluZXIgdXNlZCBieSB0aGUgY29udGFpbmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIC0tIFRyYW5zYWN0aW9ucyBvZiB0aGUgSmF2YSBFRSBzZXJ2ZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gLS0gTmF0aXZlIGFjdGlvbnMgb2YgYSBKREJDIGRyaXZlciB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkJhdGNoIFdyaXRpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IHRoZSB1c2Ugb2YgYmF0Y2ggd3JpdGluZyB0byBvcHRpbWl6ZSB0cmFuc2FjdGlvbnMgd2l0aCBtdWx0aXBsZSB3cml0ZSBvcGVyYXRpb25zLjwvcD4KLTxwPlNldCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpbnRvIHRoZSBzZXNzaW9uIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgd2hlbiB1c2VkIGJvdGggaW4gYSBKYXZhIFNFIGFuZCBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIG9yYWNsZS50b3BsaW5rLmNvbmZpZy5CYXRjaFdyaXRpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBKREJDIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5CdWZmZXJlZDwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBlaXRoZXIgSkRCQyBiYXRjaCB3cml0aW5nIG5vciBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9yYWNsZUpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBib3RoIEpEQkMgYmF0Y2ggd3JpdGluZyBhbmQgT3JhY2xlIG5hdGl2ZSBwbGF0Zm9ybSBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBiYXRjaCB3cml0aW5nICh0dXJuIGl0IG9mZikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5TdGF0ZW1lbnQgY2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5OYXRpdmUgU1FMPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzMtdDI1Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBKVEEgZGF0YSBzb3VyY2UgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPk5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGFzIHRoZSB0cmFuc2FjdGlvbiB0eXBlLCB0aGVuIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBub24tSlRBIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7QmluZCZuYnNwO1BhcmFtZXRlcnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNSByMWMyLXQyNSI+Ci08cD5Db250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBxdWVyeSB1c2VzIHBhcmFtZXRlciBiaW5kaW5nLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+RWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjUgcjFjMi10MjUiPgotPHA+RGVmaW5lIHRoZSBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90ZSBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtSZWFkJm5ic3A7Q29ubmVjdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNSByMWMyLXQyNSI+Ci08cD5UaGUgbWF4aW11bSBhbmQgbWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGUgSkRCQyByZWFkIGNvbm5lY3Rpb24gcG9vbC48L3A+Ci08cD5Ob3RlOiBUaGVzZSBwcm9wZXJ0eSBhcHBseSB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtXcml0ZSZuYnNwO0Nvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjUgcjFjMi10MjUiPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydHkgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTEzZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkFGRUciIG5hbWU9IkNJQUpBRkVHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemF0aW9uPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBDdXN0b21pemF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2MiIgbmFtZT0ic3RocmVmMjYyIj48L2E+PGEgaWQ9InN0aHJlZjI2MyIgbmFtZT0ic3RocmVmMjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEN1c3RvbWl6YXRpb24gUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciZyc3F1bztzIEN1c3RvbWl6YXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+Ci08cD5TcGVjaWZpZXMgaWYgd2VhdmluZyBvZiB0aGUgZW50aXR5IGNsYXNzZXMgaXMgcGVyZm9ybWVkLiBUaGUgRWNsaXBzZUxpbmsgSlBBIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHVzZXMgd2VhdmluZyB0byBlbmhhbmNlIEpQQSBlbnRpdGllcyBmb3Igc3VjaCBwcm9wZXJ0aWVzIGFzIGxhenkgbG9hZGluZywgY2hhbmdlIHRyYWNraW5nLCBmZXRjaCBncm91cHMsIGFuZCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zLiBTZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vIFdlYXZpbmc8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBEeW5hbWljYWxseTwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYXZlIFN0YXRpY2FsbHk8L3NwYW4+IC0tIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgcGxhbiB0byBleGVjdXRlIHlvdXIgYXBwbGljYXRpb24gb3V0c2lkZSBvZiBhIEphdmEgRUUgNSBjb250YWluZXIgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBwZXJtaXQgdGhlIHVzZSBvZiA8Y29kZT4tamF2YWFnZW50OmVjbGlwc2VsaW5rLmphcjwvY29kZT4gb24gdGhlIEpWTSBjb21tYW5kIGxpbmUuIFRoaXMgYXNzdW1lcyB0aGF0IGNsYXNzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhdGljYWxseSB3b3Zlbi4gUnVuIHRoZSBzdGF0aWMgd2VhdmVyIG9uIHRoZSBjbGFzc2VzIGJlZm9yZSBkZXBsb3lpbmcgdGhlbS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPldlYXZlIER5bmFtaWNhbGx5PC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7TGF6eTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgbGF6eSB3ZWF2aW5nLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtGZXRjaCZuYnNwO0dyb3VwczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgZmV0Y2ggZ3JvdXBzIHRocm91Z2ggd2VhdmluZy4gU2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIGlmOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlRoZXJlIGlzIG5vIHdlYXZpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsYXNzZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGR1cmluZyB3ZWF2aW5nIChmb3IgZXhhbXBsZSwgd2hlbiBkZWJ1Z2dpbmcpLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmcmbmJzcDtpbnRlcm5hbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI2IHIxYzItdDI2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nJm5ic3A7ZWFnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjYgcjFjMy10MjYiPgotPHA+RmFsc2U8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtDaGFuZ2UmbmJzcDtUcmFja2luZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2Ugd2VhdmluZyB0byBkZXRlY3Qgd2hpY2ggZmllbGRzIG9yIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBjaGFuZ2UuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjYgcjFjMy10MjYiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+Jm5ic3A7Jm5ic3A7VGhyb3cmbmJzcDtFeGNlcHRpb25zPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIHNldCBFY2xpcHNlTGluayB0byB0aHJvdyBhbiBleGNlcHRpb24gb3IgbG9nIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBwcm9ibGVtIHdpdGggYW55IG9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gYSA8c3BhbiBjbGFzcz0iYm9sZCI+cGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlIDxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPkV4Y2VwdGlvbiBoYW5kbGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IChvciBjcmVhdGUpIGEgSmF2YSBjbGFzcyB0byBoYW5kbGUgZXhjZXB0aW9ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+U2Vzc2lvbiBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCBhIHNlc3Npb24gY3VzdG9taXplciBjbGFzczogYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uU2Vzc2lvbkN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MnIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBBUEkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzMtdDI2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5EZXNjcmlwdG9yIEN1c3RvbWl6ZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IGFuIEVjbGlwc2VMaW5rIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyZuZGFzaDthIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay50b29scy5zZXNzaW9uY29uZmlndXJhdGlvbi5EZXNjcmlwdG9yQ3VzdG9taXplcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBVc2UgdGhpcyBjbGFzcydzIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3I8L2NvZGU+LCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhZHZhbmNlZCBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGFuZCBtYXBwaW5nIEFQSSBmb3IgdGhlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgZW50aXR5IG5hbWVkIDxjb2RlPiZsdDtFTlRJVFkmZ3Q7PC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPlZhbGlkYXRpb24gb25seTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQyNiByMWMyLXQyNiI+Ci08dWw+Ci08bGk+Ci08cD5ObyBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJmb3JtYW5jZSBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5RdWVyeSBNb25pdG9yPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MjYgcjFjMy10MjYiPgotPHA+Tm9Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZTZkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNhY2hpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ2FjaGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJFRENIIiBuYW1lPSJDSUFCRURDSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjI2NCIgbmFtZT0ic3RocmVmMjY0Ij48L2E+Q2FjaGluZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2NSIgbmFtZT0ic3RocmVmMjY1Ij48L2E+PGEgaWQ9InN0aHJlZjI2NiIgbmFtZT0ic3RocmVmMjY2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgQ2FjaGluZyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrIFN1YmNhY2hlPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4gZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEgbW9zdCBmcmVxdWVudGx5IHVzZWQgc3ViY2FjaGUgdGhhdCB1c2VzIHNvZnQgcmVmZXJlbmNlcy4gVGhlIHNpemUgb2YgdGhlIHN1YmNhY2hlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwLiBUaGUgc3ViY2FjaGUgdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuPC9wPgotPHA+VXNlIHRoaXMgaWRlbnRpdHkgbWFwIGluIG1vc3QgY2lyY3Vtc3RhbmNlcyBhcyBhIG1lYW5zIHRvIGNvbnRyb2wgbWVtb3J5IHVzZWQgYnkgdGhlIGNhY2hlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VlayB3aXRoIEhhcmQgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrPC9zcGFuPiBzdWJjYWNoZSBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgaGFyZCByZWZlcmVuY2VzLiBVc2UgdGhpcyBpZGVudGl0eSBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGFyZSBub3Qgc3VpdGFibGUgZm9yIHlvdXIgcGxhdGZvcm0uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgZXhjZXB0IHRoYXQgb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgb3B0aW9uIHVzZXMgbGVzcyBtZW1vcnkgdGhhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RnVsbDwvc3Bhbj4sIGFsbG93cyBjb21wbGV0ZSBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgZm9yIHRyYW5zYWN0aW9ucyB0aGF0LCBvbmNlIHN0YXJ0ZWQsIHN0YXkgb24gdGhlIHNlcnZlciBzaWRlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdDwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+V2Vhazwvc3Bhbj4gZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUgb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgaWRlbnRpdHkgbWFwIGVuYWJsZXMgZnVsbCBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93LiBJdCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHk6IGFsbCBvYmplY3RzIGFyZSBjYWNoZWQgYW5kIG5vdCByZW1vdmVkLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvY2VzcyBtYXkgYmUgbWVtb3J5LWludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgcmVhZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGRvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgb2JqZWN0cy5UaGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyOCByMWMzLXQyOCI+Ci08cD5XZWFrIHdpdGggc29mdCBzdWJjYWNoZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPgotPHA+U2V0IHRoZSBzaXplIChtYXhpbXVtIG51bWJlciBvZiBvYmplY3RzKSBvZiB0aGUgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMy10MjgiPgotPHA+MTAwPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5EZWZhdWx0IFNoYXJlZCBDYWNoZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNwZWNpZmllcyBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzMtdDI4Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkVudGl0eSBDYWNoaW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMi10MjgiPgotPHA+U3BlY2lmeSB0aGUgZW50aXR5LXNwZWNpZmljIGNhY2hpbmcgaW5mb3JtYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgVHlwZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgU2l6ZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7U2hhcmVkJm5ic3A7Q2FjaGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+RGVmYXVsdCBTaGFyZWQgQ2FjaGU8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkZsdXNoIGNsZWFyIGNhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3A8L3NwYW4+ICZuZGFzaDsgVGhpcyBtb2RlIGlzIHRoZSBmYXN0ZXN0IGFuZCB1c2VzIHRoZSBsZWFzdCBtZW1vcnkuIEhvd2V2ZXIsIGFmdGVyIGNvbW1pdCB0aGUgc2hhcmVkIGNhY2hlIG1pZ2h0IHBvdGVudGlhbGx5IGNvbnRhaW4gc3RhbGUgZGF0YS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3AgSW52YWxpZGF0ZTwvc3Bhbj4gJm5kYXNoOyBDbGFzc2VzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgb2JqZWN0IHVwZGF0ZWQgb3IgZGVsZXRlZCBhcmUgaW52YWxpZGF0ZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBhdCBjb21taXQgdGltZS4gVGhpcyBtb2RlIGlzIHNsb3dlciB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wPC9zcGFuPiwgYnV0IGFzIGVmZmljaWVudCBtZW1vcnkgdXNhZ2Utd2lzZSwgYW5kIHByZXZlbnRzIHN0YWxlIGRhdGEuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5NZXJnZTwvc3Bhbj4gJm5kYXNoOyBEcm9wIGNsYXNzZXMgZnJvbSB0aGUgRW50aXR5TWFuYWdlcidzIGNhY2hlIG9mIG9iamVjdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGZsdXNoZWQuIFRoaXMgbW9kZSBsZWF2ZXMgdGhlIHNoYXJlZCBjYWNoZSBpbiBhIHBlcmZlY3Qgc3RhdGUgYWZ0ZXIgY29tbWl0LiBIb3dldmVyLCBpdCBpcyB0aGUgbGVhc3QgbWVtb3J5LWVmZmljaWVudCBtb2RlOyB0aGUgbWVtb3J5IG1pZ2h0IGV2ZW4gcnVuIG91dCBpbiBhIHZlcnkgbGFyZ2UgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyOCByMWMzLXQyOCI+Ci08cD5Ecm9wIEludmFsaWRhdGU8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmMzNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkxvZ2dpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY3IiBuYW1lPSJzdGhyZWYyNjciPjwvYT48YSBpZD0ic3RocmVmMjY4IiBuYW1lPSJzdGhyZWYyNjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MzEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnaW5nIExldmVsPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzEgcjFjMi10MzEiPgotPHA+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsIChpbiBhc2NlbmRpbmcgb3JkZXIgb2YgaW5mb3JtYXRpb24pOjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT46PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9GRjwvc3Bhbj4mbmRhc2g7ZGlzYWJsZXMgbG9nZ2luZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U0VWRVJFPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBUb3BMaW5rIGNhbm5vdCBjb250aW51ZSwgYXMgd2VsbCBhcyBhbnkgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZHVyaW5nIGxvZ2luLiBUaGlzIGluY2x1ZGVzIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XQVJOSU5HPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgdGhhdCBkbyBub3QgZm9yY2UgVG9wTGluayB0byBzdG9wLCBpbmNsdWRpbmcgYWxsIGV4Y2VwdGlvbnMgbm90IGxvZ2dlZCB3aXRoIHNldmVyZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5JTkZPPC9zcGFuPiZuZGFzaDtsb2dzIHRoZSBsb2dpbi9sb2dvdXQgcGVyIHNldmVyIHNlc3Npb24sIGluY2x1ZGluZyB0aGUgdXNlciBuYW1lLiBBZnRlciBhY3F1aXJpbmcgdGhlIHNlc3Npb24sIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIGxvZ2dlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNPTkZJRzwvc3Bhbj4mbmRhc2g7bG9ncyBvbmx5IGxvZ2luLCBKREJDIGNvbm5lY3Rpb24sIGFuZCBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkU8L3NwYW4+Jm5kYXNoO2xvZ3MgU1FMLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVI8L3NwYW4+Jm5kYXNoO3NpbWlsYXIgdG8gd2FybmluZy4gSW5jbHVkZXMgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FU1Q8L3NwYW4+Jm5kYXNoO2luY2x1ZGVzIGFkZGl0aW9uYWwgbG93IGxldmVsIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbCIgdmFsdWU9IklORk8iLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzMtdDMxIj4KLTxwPkluZm88L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RpbWVzdGFtcDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgdGltZXN0YW1wIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRpbWVzdGFtcC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzMtdDMxIj4KLTxwPnRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RocmVhZDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhIHRocmVhZCBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aHJlYWQgaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMSByMWMzLXQzMSI+Ci08cD50cnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtTZXNzaW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMi10MzEiPgotPHA+Q29udHJvbCB3aGV0aGVyIGFuIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iIHZhbHVlPSJmYWxzZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMy10MzEiPgotPHA+dHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+Jm5ic3A7Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIEVjbGlwc2VMaW5rIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGFsbCBleGNlcHRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzMtdDMxIj4KLTxwPmZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2cgZmlsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMxIHIxYzItdDMxIj4KLTxwPlNwZWNpZnkgYSBmaWxlIGxvY2F0aW9uIGZvciB0aGUgbG9nIG91dHB1dCAoaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgb3V0KS48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmZpbGUiIHZhbHVlPSJDOlxteW91dFwiIC8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMzLXQzMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMSByMWMyLXQzMSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgbG9nZ2VyIHRvIHVzZTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0TG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgRWNsaXBzZUxpbmsgbmF0aXZlIGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkphdmFMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuSmF2YUxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZXJ2ZXJMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJMb2c8L2NvZGU+LiBJbnRlZ3JhdGVzIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIGxvZ2dpbmcgYXMgZGVmaW5lIGluIHRoZSA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyUGxhdGZvcm0uPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBsb2dnZXIuIFRoZSBjdXN0b20gbG9nZ2VyIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLlNlc3Npb25Mb2c8L2NvZGU+IGludGVyZmFjZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIiB2YWx1ZT0iYWNtZS5sb2dnZXJzLk15Q3VzdG9tTG9nZ2VyIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMy10MzEiPgotPHA+RGVmYXVsdExvZ2dlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYjdjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT3B0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZKQ0hFIiBuYW1lPSJDSUFGSkNIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T3B0aW9uczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjkiIG5hbWU9InN0aHJlZjI2OSI+PC9hPjxhIGlkPSJzdGhyZWYyNzAiIG5hbWU9InN0aHJlZjI3MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIHN1bW1hcnk9IlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZSIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbiBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIEVjbGlwc2VMaW5rIHNoYXJlZCBzZXNzaW9uIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhlIEpQQSBvciB0byB1c2UgYSBwcmUtZXhpc3RpbmcgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmVkIHRocm91Z2ggYSBFY2xpcHNlTGluayA8Y29kZT5zZXNzaW9ucy54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cD5WYWxpZCB2YWx1ZXM6IGEgdmFsaWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBuYW1lIHRoYXQgaXMgdW5pcXVlIGluIGEgc2VydmVyIGRlcGxveW1lbnQuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1uYW1lIiB2YWx1ZT0iTXlTZXNzaW9uIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5TZXNzaW9ucyBYTUw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMyLXQzMyI+Ci08cD5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZSAoPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPikuPC9wPgotPHA+WW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLiBJZiB5b3Ugc3BlY2lmeSB0aGlzIHByb3BlcnR5LCBFY2xpcHNlTGluayB3aWxsIG92ZXJyaWRlIGFsbCBjbGFzcyBhbm5vdGF0aW9uIGFuZCB0aGUgb2JqZWN0IHJlbGF0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LCBhcyB3ZWxsIGFzIDxjb2RlPk9STS54bWw8L2NvZGU+IGFuZCBvdGhlciBtYXBwaW5nIGZpbGVzLCBpZiBwcmVzZW50LjwvcD4KLTxwPkluZGljYXRlIHRoZSBzZXNzaW9uIGJ5IHNldHRpbmcgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZTwvY29kZT4gcHJvcGVydHkuPC9wPgotPHA+Tm90ZTogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSwgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlIHdpbGwgbm90IGJlIHVzZWQuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgc2Vzc2lvbnMgWE1MIGZpbGUuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0idG9wbGluay5zZXNzaW9uLXhtbCIgdmFsdWU9Im15c2Vzc2lvbi54bWwiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlRhcmdldCBEYXRhYmFzZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNlbGVjdCB0aGUgdGFyZ2V0IGRhdGFiYXNlLiBZb3UgY2FuIGFsc28gc2V0IHRoZSB2YWx1ZSB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBzdWJjbGFzcyBvZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uRGF0YWJhc2VQbGF0Zm9ybSBjbGFzczwvY29kZT4uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LWRhdGFiYXNlIiB2YWx1ZT0iT3JhY2xlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMzLXQzMyI+Ci08cD5BdXRvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgU2VydmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzMgcjFjMi10MzMiPgotPHA+U2VsZWN0IHRoZSB0YXJnZXQgc2VydmVyIGZvciB5b3VyIEpQQSBhcHBsaWNhdGlvbi48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIiB2YWx1ZT0iT0M0Sl8xMF8xXzMiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzMtdDMzIj4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPkV2ZW50IExpc3RlbmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBhIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgdG8gYmUgYWRkZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciIgdmFsdWU9Im15cGFja2FnZS5NeUNsYXNzLmNsYXNzIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5JbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzItdDMzIj4KLTxwPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWZhdWx0IGNvcHlpbmcgb2YgYWxsIG5hbWVkIHF1ZXJpZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNlc3Npb24uIFRoZXNlIHF1ZXJpZXMgaW5jbHVkZSB0aGUgb25lcyBkZWZpbmVkIHVzaW5nIEVjbGlwc2VMaW5rIEFQSSwgZGVzY3JpcHRvciBhbWVuZG1lbnQgbWV0aG9kcywgYW5kIHNvIG9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPk1pc2NlbGxhbmVvdXMgT3B0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDMzIHIxYzItdDMzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD4mbmJzcDsmbmJzcDtUZW1wb3JhbCBtdXRhYmxlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBpZiBhbGwgPGNvZGU+RGF0ZTwvY29kZT4gYW5kIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiBwZXJzaXN0ZW50IGZpZWxkcyBzaG91bGQgYmUgaGFuZGxlZCBhcyBtdXRhYmxlIG9iamVjdHMuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzMtdDMzIj4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVjNDA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U2NoZW1hIEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDQ0ZDQiIgbmFtZT0iQ0lBQ0NGQ0IiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNjaGVtYSBHZW5lcmF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFNjaGVtYSBHZW5lcmF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNzEiIG5hbWU9InN0aHJlZjI3MSI+PC9hPjxhIGlkPSJzdGhyZWYyNzIiIG5hbWU9InN0aHJlZjI3MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+Jm5ic3A7PC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSIiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDM1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RERMIEdlbmVyYXRpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBEREwgZ2VuZXJhdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4gLS0gRG8gbm90IGdlbmVyYXRlIERETDsgbm8gc2NoZW1hIGlzIGdlbmVyYXRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIG5vbi1leGlzdGVudCB0YWJsZXM7IGxlYXZlIGV4aXN0aW5nIHRhYmxlcyB1bmNoYW5nZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIGFuZCBDcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBhbGwgdGFibGVzOyBkcm9wIGFsbCBleGlzdGluZyB0YWJsZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNSByMWMzLXQzNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5PdXRwdXQgTW9kZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgRERMIGdlbmVyYXRpb24gdGFyZ2V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Cb3RoPC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZTwvc3Bhbj4gLS0gRXhlY3V0ZSBTUUwgb24gdGhlIGRhdGFiYXNlIG9ubHkgKGRvIG5vdCBnZW5lcmF0ZSBTUUwgZmlsZXMpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U1FMIFNjcmlwdDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIG9ubHkgKGRvIG5vdCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRETCBHZW5lcmF0aW9uIExvY2F0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB3aGVyZSBFY2xpcHNlTGluayB3cml0ZXMgRERMIG91dHB1dC4gU3BlY2lmeSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MuIFRoZSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGJlIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvciBhYnNvbHV0ZS4gSWYgaXQgZG9lcyBub3QgZW5kIGluIGEgZmlsZSBzZXBhcmF0b3IsIHRoZW4gRWNsaXBzZUxpbmsgYXBwZW5kcyBvbmUgdGhhdCBpcyB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkNyZWF0ZSBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBjcmVhdGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy4gU3BlY2lmeSBhIGZpbGUgbmFtZSB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmNyZWF0ZURETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5Ecm9wIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNSByMWMyLXQzNSI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGRyb3BwaW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmRyb3BEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMGYwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvcGVydGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSEpERkYiIG5hbWU9IkNJQUhKREZGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0aWVzPC9oMT4KLTxwPlRoaXMgcGFnZSBlbmFibGVzIHlvdSB0byBhZGQgb3IgcmVtb3ZlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvcD4KLTxwPlRvIGFkZCBhIHByb3BlcnR5LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0aGVuIGVudGVyIHRoZSBwcm9wZXJ0eSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5WYWx1ZTwvc3Bhbj4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiOTg0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U291cmNlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhDSkFIIiBuYW1lPSJDSUFIQ0pBSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U291cmNlPC9oMT4KLTxwPlVzaW5nIHRoaXMgcGFnZSwgeW91IGNhbiBtYW51YWxseSBlZGl0IHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWJhODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREVJRUUiIG5hbWU9IkNBQ0RFSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmVmZXJlbmNlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNDQUNGQkFFSCI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGQ0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkJBRUgiIG5hbWU9IkNBQ0ZCQUVIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI3NSIgbmFtZT0ic3RocmVmMjc1Ij48L2E+PGEgaWQ9InN0aHJlZjI3NiIgbmFtZT0ic3RocmVmMjc2Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBQZXJzaXN0ZW5jZTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+PGEgaWQ9InN0aHJlZjI3NyIgbmFtZT0ic3RocmVmMjc3Ij48L2E+PGEgaWQ9InN0aHJlZjI3OCIgbmFtZT0ic3RocmVmMjc4Ij48L2E+PGEgaWQ9InN0aHJlZjI3OSIgbmFtZT0ic3RocmVmMjc5Ij48L2E+PGEgaWQ9InN0aHJlZjI4MCIgbmFtZT0ic3RocmVmMjgwIj48L2E+UGxhdGZvcm08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNyByMWMyLXQzNyI+U2VsZWN0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+TGlicmFyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZXIgTGlicmFyeTwvc3Bhbj4gdG8gc2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB1c2VyLWRlZmluZWQgb3IgZG93bmxvYWRlZCBsaWJyYXJpZXMuCi08cD5JZiB5b3Ugc2VsZWN0IERpc2FibGUsIHlvdSBtdXN0IG1hbnVhbGx5IGluY2x1ZGUgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtJbmNsdWRlJm5ic3A7bGlicmFyaWVzJm5ic3A7d2l0aCZuYnNwO3RoaXMmbmJzcDthcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij48YSBpZD0ic3RocmVmMjgxIiBuYW1lPSJzdGhyZWYyODEiPjwvYT48YSBpZD0ic3RocmVmMjgyIiBuYW1lPSJzdGhyZWYyODIiPjwvYT48YSBpZD0ic3RocmVmMjgzIiBuYW1lPSJzdGhyZWYyODMiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzcgcjFjMi10MzciPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtjYXRhbG9nJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgY2F0YWxvZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtzY2hlbWEmbmJzcDtmcm9tJm5ic3A7Y29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+UGVyc2lzdGVudCBDbGFzcyBNYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzcgcjFjMi10MzciPlNwZWNpZnkgaWYgRGFsaSB3aWxsIDxzcGFuIGNsYXNzPSJib2xkIj5kaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhdXRvbWF0aWNhbGx5PC9zcGFuPiwgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5hbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlLgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vdGU8L3NwYW4+OiBUbyBpbnN1cmUgYXBwbGljYXRpb24gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPjxhIGlkPSJzdGhyZWYyODQiIG5hbWU9InN0aHJlZjI4NCI+PC9hPjxhIGlkPSJzdGhyZWYyODUiIG5hbWU9InN0aHJlZjI4NSI+PC9hPkNhbm9uaWNhbCBNZXRhbW9kZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MzcgcjFjMi10MzciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzcxYjI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EaWFsb2dzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRpYWxvZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUpEQSIgbmFtZT0iQ0FDR0VKREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRpYWxvZ3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtI0NJQUZER0lKIj5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIj5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY2Njc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0dFSEMiIG5hbWU9IkNBQ0NHRUhDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2gxPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIG9yIG1vZGlmeSB0aGUgam9pbiB0YWJsZXMgYW5kIGNvbHVtbnMgaW4gcmVsYXRpb25zaGlwIG1hcHBpbmdzLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzggcjFjMi10MzgiPk5hbWUgb2YgdGhlIGpvaW50IHRhYmxlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM4IHIxYzItdDM4Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IHJlbGF0aW9uc2hpcC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3OTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29ucyBhbmQgYnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyBhbmQgYnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RIQ0lBIiBuYW1lPSJDQUNESENJQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnMgYW5kIGJ1dHRvbnM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIGljb25zIGFuZCBidXR0b25zIHVzZWQgaW4gdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciPkljb25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0RKQ0VJIj5CdXR0b25zPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzYwZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFQUNHIiBuYW1lPSJDQUNHRUFDRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBpY29ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDQxIj5JY29uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmciIGFsdD0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgdGl0bGU9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4gZW50aXR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyIgYWx0PSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiB0aXRsZT0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NDEgcjFjMi10NDEiPkJhc2ljIGNvbGxlY3Rpb24gbWFwcGluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0MSByMWMyLXQ0MSI+QmFzaWMgbWFwIG1hcHBpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIHRpdGxlPSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZyIgYWx0PSJJRCBtYXBwaW5nIGljb24iIHRpdGxlPSJJRCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE1YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10NDEgcjFjMi10NDEiPlRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmciIGFsdD0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJUcmFuc2llbnQgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDQxIHIxYzItdDQxIj5WYXJpYWJsZSBvbmUtdG8tb25lIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIiBhbHQ9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgdGl0bGU9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYjU0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCdXR0b25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpDRUkiIG5hbWU9IkNBQ0RKQ0VJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CdXR0b25zPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgYnV0dG9ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MiI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0MiIgaGVhZGVycz0icjFjMS10NDIiPjxpbWcgc3JjPSJpbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIiBhbHQ9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgdGl0bGU9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MiByMWMyLXQ0MiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0RIQ0lBIj5JY29ucyBhbmQgYnV0dG9uczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTcwNmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCQkRJQiIgbmFtZT0iQ0FDQkJESUIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI4OCIgbmFtZT0ic3RocmVmMjg4Ij48L2E+PGEgaWQ9InN0aHJlZjI4OSIgbmFtZT0ic3RocmVmMjg5Ij48L2E+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+QWRkaXRpb25hbCBEYWxpIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIG9ubGluZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbiI+aHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvaW5kZXgucGhwL0RhbGlfRGV2ZWxvcGVyX0RvY3VtZW50YXRpb248L2E+PC9jb2RlPjwvcD4KLTxwPlRoaXMgZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQ6PC9wPgotPHVsPgotPGxpPgotPHA+RGFsaSBhcmNoaXRlY3R1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UGx1Z2lucyB0aGF0IGNvbXByaXNlIHRoZSBEYWxpIEpQQSBFY2xpcHNlIGZlYXR1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+RXh0ZW5zaW9uIHBvaW50czwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTg0MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY3IiBuYW1lPSJzdGhyZWY2NyI+PC9hPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT48YSBpZD0ic3RocmVmNjkiIG5hbWU9InN0aHJlZjY5Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNTg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIR0JJRUkiIG5hbWU9IkNJSEdCSUVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9oMT4KLTxwPkFkZCBhIHNlY29uZGFyeSB0YWJsZSBhbm5vdGF0aW9uIHRvIGFuIGVudGl0eSBpZiBpdHMgZGF0YSBpcyBzcGxpdCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSB0YWJsZS48L3A+Ci08cD5UbyBhZGQgYSBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSw8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTIiIG5hbWU9InN0aHJlZjkyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBTZWNvbmRhcnkgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyIgYWx0PSJTZWNvbmRhcnkgVGFibGVzIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIHRhYmxlIHdpdGggdGhlIGVudGl0eS4gVGhlIEVkaXQgU2Vjb25kYXJ5IFRhYmxlIGRpYWxvZyBhcHBlYXJzPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+Q2F0YWxvZzwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPiBvZiB0aGUgYWRkaXRpb25hbCB0YWJsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZW50aXR5LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AU2Vjb25kYXJ5VGFibGUobmFtZT0iTkFNRSIsIGNhdGFsb2cgPSAiQ0FUQUxPRyIsIHNjaGVtYSA9ICJTQ0hFTUEiKQotCi08L3ByZT4KLTxwPlRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPkVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJ3cml0ZSBkZWZhdWx0PC9zcGFuPiBvcHRpb24sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gc3BlY2lmeSBhIG5ldyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbi4gVGhlIENyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5SZWZlcmVuY2VkIGNvbHVtbiBuYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgZW50aXR5LjwvcD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIiwgcGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iaWQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9ICJpZCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPSJOQU1FIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiUkVGRVJFTkNFRCBDT0xVTU4gTkFNRSIsIGNvbHVtbkRlZmluaXRpb24gPSAiQ09MVU1OIERFRklOSVRJT04iKX0pCi0KLTwvcHJlPjwvbGk+Ci08L29sPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2Y3ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZCSkJHIiBuYW1lPSJCQUJGQkpCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQwIiBuYW1lPSJzdGhyZWY0MCI+PC9hPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvaDE+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGEgSlBBIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKUEEgcHJvamVjdCBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MSIgbmFtZT0ic3RocmVmNDEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSAmZ3Q7IEVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQyIiBuYW1lPSJzdGhyZWY0MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWY0MyIgbmFtZT0ic3RocmVmNDMiPjwvYT5UaGUgRW50aXR5IENsYXNzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmciIGFsdD0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIHRpdGxlPSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Db21wbGV0ZSB0aGlzIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvamVjdDwvc3Bhbj4gZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U291cmNlIEZvbGRlcjwvc3Bhbj4gZmllbGQsIHNlbGVjdCwgb3IgZW50ZXIsIHRoZSBsb2NhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QncyA8Y29kZT5zcmM8L2NvZGU+IGZvbGRlci48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0LCBvciBlbnRlciwgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHBhY2thZ2UgZm9yIHRoaXMgZW50aXR5IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SmF2YSBQYWNrYWdlPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DbGFzcyBuYW1lPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciwgb3Igc2VsZWN0IGEgc3VwZXJjbGFzcy48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBjb21wbGV0ZSB0aGUgSW5oZXJpdGFuY2Ugc2VjdGlvbiBhcyBmb2xsb3dzICh0aGVzZSBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCk6PC9wPgotPHVsPgotPGxpPgotPHA+QWNjZXB0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBvcHRpb24gKHRoZSBkZWZhdWx0KSB0byBjcmVhdGUgYSBKYXZhIGNsYXNzIHdpdGggdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG9wdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+QWx0ZXJuYXRpdmVseSwgc2VsZWN0IDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+IChpZiB5b3UgZGVmaW5lZCBhIHN1cGVyIGNsYXNzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgSlNSIDIyMCBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKFNJTkdMRV9UQUJMRSwgVEFCTEVfUEVSX0NMQVNTLCBKT0lORUQpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gWE1MPC9zcGFuPiB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPiB0byBwcm9jZWVkIHRvIHRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiB3aGVyZSB5b3UgZGVmaW5lIHRoZSBwZXJzaXN0ZW50IGZpZWxkcyBmb3IgdGhlIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0NCIgbmFtZT0ic3RocmVmNDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmNDUiIG5hbWU9InN0aHJlZjQ1Ij48L2E+VGhlIEVudGl0eSBQcm9wZXJ0aWVzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyIgYWx0PSJUaGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkFsdGVybmF0aXZlbHksIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+IHRvIGNvbXBsZXRlIHRoZSBlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPG9sPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciBhIG5ldyBuYW1lIGZvciB0aGUgZW50aXR5LiBEb2luZyBzbyByZXN1bHRzIGluIGFkZGluZyBhIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gbm90YXRpb24gKDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPkFjY2VwdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+ICh0aGUgZGVmYXVsdCBzZXR0aW5nKSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUuIEVudGVyaW5nIGEgZGlmZmVyZW50IG5hbWUgcmVzdWx0cyBpbiBhZGRpbmcgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gbm90YXRpb24gd2l0aCBpdHMgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGRlZmluZWQgYXMgdGhlIG5ldyB0YWJsZSAoPGNvZGU+QFRhYmxlKG5hbWU9IlRhYmxlTmFtZSIpPC9jb2RlPikuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgRW50aXR5IE5hbWUtcmVsYXRlZCBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiBvbiB0aGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIGVudGl0eSBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi4gVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDYiIG5hbWU9InN0aHJlZjQ2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBGaWVsZHMgRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIHRpdGxlPSJUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IGEgcGVyc2lzdGVuY2UgdHlwZSBmcm9tIHRoZSBUeXBlIGxpc3QuIFlvdSBjYW4gcmV0cmlldmUgYWRkaXRpb25hbCB0eXBlcyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBmaWVsZCBuYW1lIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uIFJlcGVhdCB0aGlzIHByb2NlZHVyZSBmb3IgZWFjaCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gdG8gZGVzaWduYXRlIHRoZSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgZWl0aGVyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlICh0aGUgZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiBhY2Nlc3MgdHlwZS48L3A+Ci08L2xpPgotPC9vbD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gRWNsaXBzZSBhZGRzIHRoZSBlbnRpdHkgdG8geW91ciBwcm9qZWN0LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZTFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhIRUpDSiIgbmFtZT0iQ0lISEVKQ0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNiIgbmFtZT0ic3RocmVmMjYiPjwvYT48YSBpZD0ic3RocmVmMjciIG5hbWU9InN0aHJlZjI3Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOCIgbmFtZT0ic3RocmVmMjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMjkiIG5hbWU9InN0aHJlZjI5Ij48L2E+U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBKUEEgcHJvamVjdCBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMCIgbmFtZT0ic3RocmVmMzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMzEiIG5hbWU9InN0aHJlZjMxIj48L2E+VGhlIEpQQSBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiB0byBzcGVjaWZ5IHRoZSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIEphdmEgc291cmNlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMiIgbmFtZT0ic3RocmVmMzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSmF2YSBTb3VyY2UgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBGb2xkZXI8L3NwYW4+IHRvIGFkZCBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyB0byB0aGUgcHJvamVjdC48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzMiIG5hbWU9InN0aHJlZjMzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM0IiBuYW1lPSJzdGhyZWYzNCI+PC9hPlRoZSBKUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JZiB0aGUgc2VydmVyIHJ1bnRpbWUgZG9lcyBub3QgcHJvdmlkZSBhIEpQQSBpbXBsZW1lbnRhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBzZWxlY3QgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLTxwPlRvIGluc3VyZSB0aGUgcG9ydGFiaWxpdHkgb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRUpCIDMuMCwgdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyB3aWxsIGJlIGRpc2NvdmVyZWQgYXV0b21hdGljYWxseS48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIGNyZWF0aW5nIEpQQSBwcm9qZWN0cy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gWW91IHNob3VsZCBub3cgb3BlbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjllZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMzozWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhDQkhKRCIgbmFtZT0iQ0lIQ0JISkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5NyIgbmFtZT0ic3RocmVmMTk3Ij48L2E+PGEgaWQ9InN0aHJlZjE5OCIgbmFtZT0ic3RocmVmMTk4Ij48L2E+PGEgaWQ9InN0aHJlZjE5OSIgbmFtZT0ic3RocmVmMTk5Ij48L2E+VXNlIHRoZSBHZW5lcmF0ZSBDbGFzc2VzIGZyb20gWFNEIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhbiBYTUwgc2NoZW1hICgmbmJzcDsueHNkKS48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQtY2xpY2sgYSBzY2hlbWEgKCZuYnNwOy54c2QgZmlsZSkgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhdGUgJmd0OyBKQVhCIENsYXNzZXM8L3NwYW4+LiBUaGUgR2VuZXJhdGUgQ2xhc3NlcyBmcm9tIFNjaGVtYSBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyMDEiIG5hbWU9InN0aHJlZjIwMSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWYyMDIiIG5hbWU9InN0aHJlZjIwMiI+PC9hPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLnBuZyIgYWx0PSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIHRpdGxlPSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgSkFYQiBzZXR0aW5ncyBpbmZvcm1hdGlvbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bSNDQUNISEhKQSI+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3Y2YxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE2OjE4OjEyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEhCSkNKIiBuYW1lPSJDSUhIQkpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPjxhIGlkPSJzdGhyZWYxOTEiIG5hbWU9InN0aHJlZjE5MSI+PC9hPlVzZSB0aGUgR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCBjcmVhdGUgYW4gWE1MIHNjaGVtYSAoJm5ic3A7LnhzZCkgZm9yIGEgc2V0IG9mIEpBWEIgbWFwcGVkIGNsYXNzZXMuPGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIHdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIGZyb20gYSBzcGVjaWZpYyBwcm9qZWN0IG9yIHBhY2thZ2UuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTkzIiBuYW1lPSJzdGhyZWYxOTMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5TZWxlY3RpbmcgdGhlIFNjaGVtYSBGcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SkFYQiAmZ3Q7IFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3Nlczwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+IHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+VGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF4Yl9zY2htZWFfZ2VuZXJhdGlvbl9kaWFsb2cucG5nIiBhbHQ9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIHByb2plY3QsIHBhY2thZ2UsIG9yIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNGQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSENDQ0pEIiBuYW1lPSJDSUhDQ0NKRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPjxhIGlkPSJzdGhyZWY5NCIgbmFtZT0ic3RocmVmOTQiPjwvYT5BbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzLiBZb3UgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBzdHJhdGVneSB0byB1c2UgZm9yIGluaGVyaXRhbmNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzcGVjaWZ5IGluaGVyaXRhbmNlICg8Y29kZT5ASW5oZXJpdGFuY2UpPC9jb2RlPiBmb3IgYW4gZXhpc3RpbmcgZW50aXR5ICg8Y29kZT5ARW50aXR5PC9jb2RlPik6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkluaGVyaXRhbmNlPC9zcGFuPiBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5NSIgbmFtZT0ic3RocmVmOTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TcGVjaWZ5aW5nIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV90YWIucG5nIiBhbHQ9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJTZWxlY3RpbmcgdGhlIEluaGVyaXRhbmNlIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gbGlzdCwgc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVnaWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkEgc2luZ2xlIHRhYmxlIChkZWZhdWx0KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Kb2luZWQgdGFibGU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRhYmxlIHBlciBjbGFzczwvcD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgZm9sbG93aW5nIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSB0YWIuIFNlZSA8YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIj4iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0ic3RocmVmOTYiIG5hbWU9InN0aHJlZjk2Ij48L2E+PGEgaWQ9InN0aHJlZjk3IiBuYW1lPSJzdGhyZWY5NyI+PC9hPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPk5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5EaXNjcmltaW5hdG9yIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMyLXQxMyI+U2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPlN0cmluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJzdGhyZWY5OCIgbmFtZT0ic3RocmVmOTgiPjwvYT48YSBpZD0ic3RocmVmOTkiIG5hbWU9InN0aHJlZjk5Ij48L2E+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzItdDEzIj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBUeXBlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yVmFsdWU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk92ZXJyaWRlIERlZmF1bHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMyLXQxMyI+VXNlIHRoaXMgZmllbGQgdG8gc3BlY2lmeSBjdXN0b20gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFByaW1hcnlLZXlKb2luQ2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5IGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOSEVSSVRBTkNFX1NUUkFURUdZJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9DT0xVTU4mZ3Q7PC9zcGFuPiIsCi0gICAgZGlzY3JpbWluYXRvclR5cGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVFlQRSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZS0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVkFMVUUmZ3Q7PC9zcGFuPiIpCi1AUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKQotCi08L3ByZT4KLTxwPjxhIGlkPSJzdGhyZWYxMDAiIG5hbWU9InN0aHJlZjEwMCI+PC9hPjxhIGlkPSJzdGhyZWYxMDEiIG5hbWU9InN0aHJlZjEwMSI+PC9hPjxhIGlkPSJzdGhyZWYxMDIiIG5hbWU9InN0aHJlZjEwMiI+PC9hPlRoZSBmb2xsb3dpbmcgZmlndXJlcyBpbGx1c3RyYXRlcyB0aGUgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAzIiBuYW1lPSJzdGhyZWYxMDMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TaW5nbGUgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgZW50aXR5IGluaGVyaXRhbmNlIGluIGEgc2luZ2xlIHRhYmxlLiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTA0IiBuYW1lPSJzdGhyZWYxMDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTA1IiBuYW1lPSJzdGhyZWYxMDUiPjwvYT48YSBpZD0ic3RocmVmMTA2IiBuYW1lPSJzdGhyZWYxMDYiPjwvYT5Kb2luZWQgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Njg3MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERHRENEIiBuYW1lPSJDSUhER0RDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjU4IiBuYW1lPSJzdGhyZWY1OCI+PC9hPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+V2hlbiBjcmVhdGluZyBhIEpQQSBwcm9qZWN0LCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pIHlvdSBjYW4gYWxzbyBjcmVhdGUgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIG1ldGFkYXRhIGFuZCBkZWZhdWx0cy48L3A+Ci08cD48YSBpZD0ic3RocmVmNTkiIG5hbWU9InN0aHJlZjU5Ij48L2E+RWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxvcm0ueG1sPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O3BlcnNpc3RlbmNlIHZlcnNpb249IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9WRVJTSU9OJmd0Ozwvc3Bhbj4iCi0gICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCImZ3Q7Ci0gICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfUFJPVklERVImZ3Q7PC9zcGFuPiIgLyZndDsKLSAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0Jmd0OwotJmx0Oy9wZXJzaXN0ZW5jZSZndDsKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiI+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwNS5odG0jQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjYxOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhEQUpJRCIgbmFtZT0iQ0lIREFKSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY0NyIgbmFtZT0ic3RocmVmNDciPjwvYT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjQ4IiBuYW1lPSJzdGhyZWY0OCI+PC9hPldoZW4geW91IGNyZWF0ZSBhIHByb2plY3QsIEVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZccGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBwcm9qZWN0J3MgZGlyZWN0b3J5LjwvcD4KLTxwPllvdSBjYW4gY3JlYXRlIGEgc3R1YiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pLiBZb3UgY2FuIG1hbmFnZSB0aGlzIGZpbGUgZWl0aGVyIHRocm91Z2ggdGhlIFhNTCBlZGl0b3IgKHNlZSApIG9yIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotRGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgRWNsaXBzZUxpbmspLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFnZXMgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcjoKLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2hhbmdlLXRyYWNraW5nIGFuZCBzZXNzaW9uIGN1c3RvbWl6ZXItcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNhY2hpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBsb2dnaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgc2Vzc2lvbiBhbmQgdGFyZ2V0IGRhdGFiYXNlIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIERETC1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIEpQQSBpbXBsZW1lbnRhdGlvbiwgdGhlIENvbm5lY3Rpb25zIHBhZ2UgYWxzbyBpbmNsdWRlcyBKREJDIGNvbm5lY3Rpb24gcG9vbCBwcm9wZXJ0aWVzLjwvcD4KLTxwPklmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZW4gb25seSB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiwgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4sIDxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+IGFuZCA8YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+IHBhZ2VzIGFyZSBhdmFpbGFibGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5UbyB1c2UgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gRWRpdG9yOjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIDxjb2RlPnBlcmlzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiBwYWdlIG9mIHRoZSBlZGl0b3IgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhbDwvc3Bhbj4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZXMgPGNvZGU+Jmx0O3BlcnNpc3RlbnQtdW5pdCZndDs8L2NvZGU+LXJlbGF0ZWQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIChkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IncyBTb3VyY2UgcGFnZSBlbmFibGVzIHlvdSB0byB2aWV3IGFuZCBlZGl0IHRoZSByYXcgWE1MIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGVkaXRvci4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RWxlbWVudCBEZWZpbmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWUgPSAiJmx0O05hbWUmZ3Q7IiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY0OSIgbmFtZT0ic3RocmVmNDkiPjwvYT5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+RGVzY3JpcHRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY1MCIgbmFtZT0ic3RocmVmNTAiPjwvYT5NYW5hZ2VkIENsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Jm5ic3A7Jm5ic3A7RXhjbHVkZSZuYnNwO1VubGlzdGVkJm5ic3A7Q2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5YTUwmbmJzcDtNYXBwaW5nJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIGRlZmluZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10OCIgaGVhZGVycz0icjFjMS10OCI+SkFSJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgYWRkaXRpb25hbCBKQVIgZmlsZXMgYW5kIGxpYnJhcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMy10OCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+IHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT4mbHQ7anRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtub24tanRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+Ci08cD5UbyBjb25maWd1cmUgdGhlIEpUQSAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIHNvdXJjZSB1c2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlcjo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyBjb25maWd1cmUgYSBub24tSlRBIGRhdGEgc291cmNlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0KCk8L3NwYW4+IHRvIHVzZSB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+PGEgaWQ9InN0aHJlZjUxIiBuYW1lPSJzdGhyZWY1MSI+PC9hPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgeW91IGNhbiBhbHNvIGRlZmluZSB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgVVJMLCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIHRhYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2V0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTxwPlRvIGFkZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08b2w+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIDxjb2RlPiZsdDtuYW1lJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHVzaW5nIHRoZSB0YWJsZSdzIE5hbWUgYW5kIFZhbHVlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIHJlbW92ZSBhIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQsIHNlbGVjdCBhIGRlZmluZWQgcHJvcGVydHkgaW4gdGhlIHRhYmxlIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZW1vdmU8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHByb2plY3QgdXNlcyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBjb25uZWN0aW9uIHBhZ2UgYWxzbyBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciBKREJDIGNvbm5lY3Rpb24gcG9vbGluZy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiPlN5bmNocm9uaXppbmcgY2xhc3NlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGQ4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgYW4gZW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgYW4gZW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREdCSUoiIG5hbWU9IkJBQkRHQklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPk1hcHBpbmcgYW4gZW50aXR5PC9oMT4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtYXBwaW5nIHR5cGVzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+RW1iZWRkZWQgSUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QWRkaXRpb25hbCBtYXBwaW5nIHR5cGVzIChzdWNoIGFzIEJhc2ljIENvbGxlY3Rpb24gbWFwcGluZ3MpIG1heSBiZSBhdmFpbGFibGUgd2hlbiB1c2luZyBEYWxpIHdpdGggRWNsaXBzZUxpbmsuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUyMTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhc2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMjo1OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNSIgbmFtZT0ic3RocmVmMjUiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI0NJSEhCSkNKIj5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jQ0lIQ0JISkQiPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjA0MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJFSUJBREhIIiBuYW1lPSJCRUlCQURISCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNSIgbmFtZT0ic3RocmVmMzUiPjwvYT48YSBpZD0ic3RocmVmMzYiIG5hbWU9InN0aHJlZjM2Ij48L2E+PGEgaWQ9InN0aHJlZjM3IiBuYW1lPSJzdGhyZWYzNyI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjb252ZXJ0IGFuIGV4aXN0aW5nIEphdmEgcHJvamVjdCB0byBhIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IGV4cGxvcmVyLCByaWdodC1jbGljayB0aGUgSmF2YSBwcm9qZWN0IGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlICZndDsgQ29udmVydCB0byBKUEEgUHJvamVjdC48L3NwYW4+IFRoZSBQcm9qZWN0IEZhY2V0cyBwYWdlIG9mIHRoZSBNb2RpZnkgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM4IiBuYW1lPSJzdGhyZWYzOCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1vZGlmeSBGYWNldGVkIFByb2plY3QgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQgSlBBIENvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOSIgbmFtZT0ic3RocmVmMzkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGFkZHMgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMgdG8geW91ciBwcm9qZWN0IGFuZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgPGNvZGU+b3JtLnhtbDwvY29kZT4gYW5kIDxjb2RlPnBlcmlzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY5YmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRUJBSSIgbmFtZT0iQ0lIRkVCQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlN5bmNocm9uaXppbmcgY2xhc3NlczwvaDE+Ci08cD5BcyB5b3Ugd29yayB3aXRoIHRoZSBjbGFzc2VzIGluIHlvdXIgSmF2YSBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMuIDxhIGlkPSJzdGhyZWY1MiIgbmFtZT0ic3RocmVmNTIiPjwvYT48YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzeW5jaHJvbml6ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3MgTGlzdDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Vc2UgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgb3B0aW9uPC9zcGFuPiBpbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPi4gSW4gZ2VuZXJhbCwgeW91IGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGFpbmVyLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNTUiIG5hbWU9InN0aHJlZjU1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3luY2hyb25pemluZyB0aGUgcGVyc2lzdGVuY2UueG1sIEZpbGU8L3A+Ci08aW1nIHNyYz0iaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkRhbGkgYWRkcyB0aGUgbmVjZXNzYXJ5IDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBlcnNpc3RlbmNlIFhNTCBFZGl0b3I8L3NwYW4+IHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ZjE0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNTYiIG5hbWU9InN0aHJlZjU2Ij48L2E+Ci08aDE+VXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb248L2gxPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1pZ3JhdGUgeW91ciBwcm9qZWN0IGZyb20gSlBBIDEuMCB0byBKUEEgMi4wLiBZb3UgbXVzdCBjb21wbGV0ZSB0aGlzIHVwZ3JhZGUgdG8gdXNlIHRoZSBjdXJyZW50IEpQQSAyLjAgZmVhdHVyZXMgaW4gRGFsaS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY1NyIgbmFtZT0ic3RocmVmNTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5VcGdyYWRpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBGaWxlPC9wPgotPGltZyBzcmM9ImltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDQxYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNjAiIG5hbWU9InN0aHJlZjYwIj48L2E+Ci08aDE+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2MSIgbmFtZT0ic3RocmVmNjEiPjwvYT5JZiB5b3Ugb3B0IG5vdCB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCwgeW91IGNhbiBjcmVhdGUgb25lIHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2MiIgbmFtZT0ic3RocmVmNjIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgU2VsZWN0IGEgV2l6YXJkIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGluZyBGaWxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBNYXBwaW5nIEZpbGUgcGFnZSBhcHBlYXJzLjwvcD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgRWNsaXBzZUxpbmssIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FY2xpcHNlTGluayAmZ3Q7IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjMiIG5hbWU9InN0aHJlZjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgRmlsZSBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyIgYWx0PSJUaGUgTWFwcGluZyBGaWxlIHBhZ2UuIiB0aXRsZT0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkRlZmluZSB0aGUgcHJvcGVydGllcyBpbiB0aGUgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGFwcGVhcnMgaW4gdGhlIHNyYyBkaXJlY3Rvcnkgb2YgdGhlIHNlbGVjdGVkIEpQQSBwcm9qZWN0LiBZb3UgY2FuIG1hbmFnZSB0aGUgb3JtLnhtbCBmaWxlIHVzaW5nIHRoZSBKUEEgRGV0YWlscyB2aWV3IG9yIHRocm91Z2ggdGhlIFhNTCBFZGl0b3IuIFNlZSBhbHNvIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5NjA4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCQ0RDRSIgbmFtZT0iQ0lIQkNEQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY0IiBuYW1lPSJzdGhyZWY2NCI+PC9hPjxhIGlkPSJzdGhyZWY2NSIgbmFtZT0ic3RocmVmNjUiPjwvYT5Zb3UgY2FuIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5PcGVuPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHlNYXBwaW5nczwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjb25maWd1cmUgdGhlIGVudGl0eSBtYXBwaW5nIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjY2IiBuYW1lPSJzdGhyZWY2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIHZpZXcgZm9yIEVudGl0eU1hcHBpbmdzIChvcm0ueG1sKTwvcD4KLTxpbWcgc3JjPSJpbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmciIGFsdD0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgdGl0bGU9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjxiciAvPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCI+V29ya2luZyB3aXRoIFhNTCBGaWxlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhMGQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjcwIiBuYW1lPSJzdGhyZWY3MCI+PC9hPjxhIGlkPSJzdGhyZWY3MSIgbmFtZT0ic3RocmVmNzEiPjwvYT48YSBpZD0ic3RocmVmNzIiIG5hbWU9InN0aHJlZjcyIj48L2E+PGEgaWQ9InN0aHJlZjczIiBuYW1lPSJzdGhyZWY3MyI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjc0IiBuYW1lPSJzdGhyZWY3NCI+PC9hPjxhIGlkPSJzdGhyZWY3NSIgbmFtZT0ic3RocmVmNzUiPjwvYT48YSBpZD0ic3RocmVmNzYiIG5hbWU9InN0aHJlZjc2Ij48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXIuPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBhY2Nlc3MgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBJbiB0aGUgZm9sbG93aW5nIGZpZ3VyZSwgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+ZW50aXR5PC9zcGFuPiBpbnZva2VzIHRoZSBkaWFsb2cgZnJvbSB0aGUgSlBBIERldGFpbHMgVmlldy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY3NyIgbmFtZT0ic3RocmVmNzciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBUeXBlIEh5cGVybGluazwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciBhbiBlbnRpdHkgc2hvd2luZyB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluay4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBjaGFuZ2UgKG9yIGFkZCkgcGVyc2lzdGVuY2UgZm9yIGFuIGVudGl0eSBieSByaWdodC1jbGlja2luZyB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW50aXR5PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGZyb20gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzgiIG5hbWU9InN0aHJlZjc4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDRhMTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkYWJsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZFSUNFIiBuYW1lPSJCQUJGRUlDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkYWJsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNzkiIG5hbWU9InN0aHJlZjc5Ij48L2E+PGEgaWQ9InN0aHJlZjgwIiBuYW1lPSJzdGhyZWY4MCI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4gY2xhc3MgaXMgYSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIGFuIG93bmluZyBlbnRpdHk7IGl0IHNoYXJlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIG93bmluZyBlbnRpdHkuIEVhY2ggZmllbGQgb2YgdGhlIGVtYmVkZGVkIGNsYXNzIGlzIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcgZW50aXR5LjwvcD4KLTxwPlRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHN1YmNsYXNzLCB1c2UgdGhlIDxjb2RlPkBBdHRyaWJ1dGVPdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBjbGFzcy48L3A+Ci08cD48YSBpZD0ic3RocmVmODEiIG5hbWU9InN0aHJlZjgxIj48L2E+PGEgaWQ9InN0aHJlZjgyIiBuYW1lPSJzdGhyZWY4MiI+PC9hPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT5BbiBlbWJlZGRhYmxlIGVudGl0eSBpcyBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW1iZWRkYWJsZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIGVtYmVkZGFibGUgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRhYmxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjg0IiBuYW1lPSJzdGhyZWY4NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChFbWJlZGRhYmxlKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBFbWJlZGRhYmxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGRsPgotPGRkPjxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PC9kZD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTA1NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGVkIHN1cGVyY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQUdDSSIgbmFtZT0iQkFCREFHQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBlZCBzdXBlcmNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4NSIgbmFtZT0ic3RocmVmODUiPjwvYT48YSBpZD0ic3RocmVmODYiIG5hbWU9InN0aHJlZjg2Ij48L2E+QW4gZW50aXR5IHRoYXQgZXh0ZW5kcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gY2xhc3MgaW5oZXJpdHMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgYW5kIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHN1cGVyY2xhc3MuIFlvdSBzaG91bGQgdXNlIGEgbWFwcGVkIHN1cGVyY2xhc3MgdG8gZGVmaW5lIG1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21tb24gdG8gbXVsdGlwbGUgZW50aXR5IGNsYXNzZXMuPC9wPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXM8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2Fubm90IGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5CZSBxdWVyaWVkIG9yIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBFbnRpdHktTWFuYWdlciBvciBRdWVyeSBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPkJlIHRoZSB0YXJnZXQgb2YgYSBwZXJzaXN0ZW50IHJlbGF0aW9uc2hpcDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSB0YWJsZS4gSW5zdGVhZCwgaXRzIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiBUbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjg3IiBuYW1lPSJzdGhyZWY4NyI+PC9hPjxhIGlkPSJzdGhyZWY4OCIgbmFtZT0ic3RocmVmODgiPjwvYT48YSBpZD0ic3RocmVmODkiIG5hbWU9InN0aHJlZjg5Ij48L2E+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+PC9hPkEgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QE1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBNYXBwZWQgU3VwZXJjbGFzcyBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5MSIgbmFtZT0ic3RocmVmOTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoTWFwcGVkIFN1cGVyY2xhc3MpPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlODY5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwNyIgbmFtZT0ic3RocmVmMTA3Ij48L2E+PGEgaWQ9InN0aHJlZjEwOCIgbmFtZT0ic3RocmVmMTA4Ij48L2E+TmFtZWQgcXVlcmllcyBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlIGJlY2F1c2UgdGhleSBhcmUgcHJlcGFyZWQgb25jZSBhbmQgdGhleSAoYW5kIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIHN1cHBvcnRpbmcgb2JqZWN0cykgY2FuIGJlIGVmZmljaWVudGx5IHJldXNlZCB0aGVyZWFmdGVyLCBtYWtpbmcgdGhlbSB3ZWxsIHN1aXRlZCBmb3IgY29tcGxleCBhbmQgZnJlcXVlbnRseSBleGVjdXRlZCBvcGVyYXRpb25zLiBOYW1lZCBxdWVyaWVzIHVzZSB0aGUgSlBBIHF1ZXJ5IGxhbmd1YWdlIGZvciBwb3J0YWJsZSBleGVjdXRpb24gb24gYW55IHVuZGVybHlpbmcgZGF0YWJhc2U7IG5hbWVkIG5hdGl2ZSBxdWVyaWVzIHVzZSB0aGUgU1FMIGxhbmd1YWdlIG5hdGl2ZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIDxjb2RlPkBOYW1lZFF1ZXJ5PC9jb2RlPiBhbmQgPGNvZGU+QE5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+IGFubm90YXRpb25zIHRvIHRoZSBlbnRpdHkuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmFtZWQgcXVlcnk6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMDkiIG5hbWU9InN0aHJlZjEwOSI+PC9hPjxhIGlkPSJzdGhyZWYxMTAiIG5hbWU9InN0aHJlZjExMCI+PC9hPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPjxhIGlkPSJzdGhyZWYxMTIiIG5hbWU9InN0aHJlZjExMiI+PC9hPlRvIGFkZCBhIFF1ZXJ5IGhpbnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjExMyIgbmFtZT0ic3RocmVmMTEzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMjJkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QmFzaWMgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCYXNpYyBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFCQ0UiIG5hbWU9IkJBQkJBQkNFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CYXNpYyBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTQiIG5hbWU9InN0aHJlZjExNCI+PC9hPjxhIGlkPSJzdGhyZWYxMTUiIG5hbWU9InN0aHJlZjExNSI+PC9hPjxhIGlkPSJzdGhyZWYxMTYiIG5hbWU9InN0aHJlZjExNiI+PC9hPjxhIGlkPSJzdGhyZWYxMTciIG5hbWU9InN0aHJlZjExNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPiB0byBtYXAgYW4gYXR0cmlidXRlIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UgY29sdW1uLiBCYXNpYyBtYXBwaW5ncyBtYXkgYmUgdXNlZCBvbmx5IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+SmF2YSBwcmltaXRpdmUgdHlwZXMgYW5kIHdyYXBwZXJzIG9mIHRoZSBwcmltaXRpdmUgdHlwZXM8L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0ludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkNhbGVuZGFyLCBqYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Qnl0ZVtdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5jaGFyW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkNoYXJhY3RlcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5lbnVtczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5hbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgPGNvZGU+U2VyaWFsaXphYmxlPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgYmFzaWMgbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCByaWdodC1jbGljayB0aGUgZmllbGQgdG8gbWFwLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEJhc2ljPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5FbnRpdHkgTWFwIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBCYXNpYzwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMzLXQxNCI+QmFzaWM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzMtdDE0Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZSBhbmQgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5JTlNFUlQ8L2NvZGU+IGFuZCA8Y29kZT5VUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMyLXQxNCI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMi10MTQiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMzLXQxNCI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNCByMWMzLXQxNCI+WWVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YToKLTx1bD4KLTxsaT4KLTxwPkRlZmF1bHQ8L3A+Ci08L2xpPgotPGxpPgotPHA+TE9CICZuZGFzaDsgU3BlY2lmaWVzIGlmIHRoaXMgaXMgYSBsYXJnZSBvYmplY3RzIChCTE9CIG9yIENMT0IpLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkJJQkkiPiJMb2IiPC9hPiBmb3IgZGV0YWlscy48L3A+Ci08L2xpPgotPGxpPgotPHA+VGVtcG9yYWwgJm5kYXNoOyBTcGVjaWZ5IGlmIHRoaXMgaXMgYSBEYXRlLCBUaW1lLCBvciBUaW1lc3RhbXAgb2JqZWN0LiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnVtZXJhdGVkICZuZGFzaDsgU3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGFzIG9yZGluYWwgb3Igc3RyaW5nLCBpbiBvcmRlciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIAotICAgIGluc2VydGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgb3B0aW9uYWwgPSA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1BUSU9OQUwmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbChUZW1wb3JhbFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RFTVBPUkFMJmd0Ozwvc3Bhbj4pCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzRkNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0JIREYiIG5hbWU9IkJBQkNCSERGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTgiIG5hbWU9InN0aHJlZjExOCI+PC9hPjxhIGlkPSJzdGhyZWYxMTkiIG5hbWU9InN0aHJlZjExOSI+PC9hPjxhIGlkPSJzdGhyZWYxMjAiIG5hbWU9InN0aHJlZjEyMCI+PC9hPjxhIGlkPSJzdGhyZWYxMjEiIG5hbWU9InN0aHJlZjEyMSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSBhIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgb2YgYW4gZW50aXR5IHdob3NlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGFuIGVtYmVkZGFibGUgY2xhc3MuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBFbWJlZGRlZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMi10MTUiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+RW1iZWRkZWQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBlbnRpdHkncyBhdHRyaWJ1dGUuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWZiNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRElBRUUiIG5hbWU9IkNJSERJQUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBJRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjIiIG5hbWU9InN0aHJlZjEyMiI+PC9hPjxhIGlkPSJzdGhyZWYxMjMiIG5hbWU9InN0aHJlZjEyMyI+PC9hPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgSUQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgb2YgYW4gZW1iZWRkZWQgSUQuIFRoZXNlIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0aWVzLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBFbWJlZGRlZCBJZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMi10MTYiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzMtdDE2Ij5FbWJlZGRlZCBJZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkSWQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWRmODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPklEIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkdDQkhHIiBuYW1lPSJCQUJHQ0JIRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTI2IiBuYW1lPSJzdGhyZWYxMjYiPjwvYT48YSBpZD0ic3RocmVmMTI3IiBuYW1lPSJzdGhyZWYxMjciPjwvYT48YSBpZD0ic3RocmVmMTI4IiBuYW1lPSJzdGhyZWYxMjgiPjwvYT48YSBpZD0ic3RocmVmMTI5IiBuYW1lPSJzdGhyZWYxMjkiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IG9mIGFuIGVudGl0eS4gSUQgbWFwcGluZ3MgbWF5IGJlIHVzZWQgd2l0aCBhIDxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiBvciA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPi4gRWFjaCA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gbXVzdCBoYXZlIGFuIElEIG1hcHBpbmcuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWxlZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBhcyAmZ3Q7IElEPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5FbnRpdHkgTWFwcGluZyBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzMtdDE3Ij5JRDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzItdDE3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlRoZSBkYXRhYmFzZSB0YWJsZSBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBUYWJsZSBpcyBhc3N1bWVkIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMyLXQxNyI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGEuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EYXRlPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiA8YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQSyBHZW5lcmF0aW9uIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzItdDE4Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4mbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzItdDE4Ij5TZWUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNCQUpCQyI+IlByaW1hcnkgS2V5IEdlbmVyYXRpb24iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkF1dG88L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+SWRlbnRpdHk8L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yJm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij5OYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBnZW5lcmF0b3Igc3BlY2lmaWVkIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5BZGRpdGlvbmFsIGZpZWxkcyB3aWxsIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSwgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBTdHJhdGVneS4gU2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sCi0gICAgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbCg8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0b3JUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTVFJBVEVHWSZndDs8L3NwYW4+LCBnZW5lcmF0b3I9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IilAVGFibGVHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QSyZndDs8L3NwYW4+IiwgCi0gICAgdmFsdWVDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtblZhbHVlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFJmd0Ozwvc3Bhbj4iKUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHNlcXVlbmNlTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSZndDs8L3NwYW4+IikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTgxOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbnktdG8tbWFueSBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUlFR0QiIG5hbWU9IkJBQkVJRUdEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMwIiBuYW1lPSJzdGhyZWYxMzAiPjwvYT48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1NYW55IE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIG1hbnktdmFsdWVkIGFzc29jaWF0aW9uIHdpdGggbWFueS10by1tYW55IG11bHRpcGxpY2l0eS4gQSBtYW55LXRvLW1hbnkgbWFwcGluZyBoYXMgdHdvIHNpZGVzOiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+b3duaW5nIHNpZGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iaXRhbGljIj5ub24tb3duaW5nIHNpZGU8L3NwYW4+LiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBqb2luIHRhYmxlIG9uIHRoZSBvd25pbmcgc2lkZS4gRm9yIGJpZGlyZWN0aW9uYWwgbWFwcGluZ3MsIGVpdGhlciBzaWRlIG1heSBiZSB0aGUgb3duaW5nIHNpZGUuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tTWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIG9mIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTkgcjFjMi10MTkiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnkgdG8gTWFueSBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5NYW55IHRvIE1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPkxhenk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMyLXQxOSI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTkgcjFjMy10MTkiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+WW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuCi08cD5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VG8gYWRkIGEgbmV3IEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGQ8L3NwYW4+LjwvcD4KLTxwPlRvIGVkaXQgYW4gZXhpc3RpbmcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBzZWxlY3QgdGhlIGZpZWxkIHRvIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkVkaXQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LAotICAgIHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmE2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZBRkoiIG5hbWU9IkJBQkhGQUZKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzQiIG5hbWU9InN0aHJlZjEzNCI+PC9hPjxhIGlkPSJzdGhyZWYxMzUiIG5hbWU9InN0aHJlZjEzNSI+PC9hPjxhIGlkPSJzdGhyZWYxMzYiIG5hbWU9InN0aHJlZjEzNiI+PC9hPjxhIGlkPSJzdGhyZWYxMzciIG5hbWU9InN0aHJlZjEzNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4gbWFwcGluZyB0byBkZWZpbmVzIGEgc2luZ2xlLXZhbHVlZCBhc3NvY2lhdGlvbiB0byBhbm90aGVyIGVudGl0eSBjbGFzcyB0aGF0IGhhcyBtYW55LXRvLW9uZSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW9uIHRoZSBHZW5lcmFsIHRhYiBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5NYXBwaW5nIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9PbmU8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPk1hbnktdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMzLXQyMSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzMtdDIxIj5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMy10MjEiPkRlZmF1bHQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIxIHIxYzItdDIxIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMzLXQyMSI+WWVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPiB0YWIgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5Kb2luIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj48YSBpZD0ic3RocmVmMTM4IiBuYW1lPSJzdGhyZWYxMzgiPjwvYT48YSBpZD0ic3RocmVmMTM5IiBuYW1lPSJzdGhyZWYxMzkiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMzLXQyMiI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASm9pblRhYmxlKGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fVEFCTEVfTkFNRSZndDs8L3NwYW4+IikKLUBNYW55VG9PbmUodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4sIGZldGNoPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIAotICAgIGNhc2NhZGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+KQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3Yzc0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T25lLXRvLW1hbnkgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEdFQkQiIG5hbWU9IkJBQkhHRUJEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNDAiIG5hbWU9InN0aHJlZjE0MCI+PC9hPjxhIGlkPSJzdGhyZWYxNDEiIG5hbWU9InN0aHJlZjE0MSI+PC9hPjxhIGlkPSJzdGhyZWYxNDIiIG5hbWU9InN0aHJlZjE0MiI+PC9hPjxhIGlkPSJzdGhyZWYxNDMiIG5hbWU9InN0aHJlZjE0MyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSByZWxhdGlvbnNoaXAgd2l0aCBvbmUtdG8tbWFueSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE9uZS10by1tYW55PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPk1hcHBpbmcgRW50aXR5IFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnk8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT25lVG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzMtdDIzIj5PbmUtdG8tTWFueTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMyLXQyMyI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMyByMWMyLXQyMyI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMzLXQyMyI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMyLXQyMyI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIzIHIxYzItdDIzIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjMgcjFjMy10MjMiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMi10MjQiPlNwZWNpZnkgdHdvIG9yIG1vcmUgam9pbiBjb2x1bW5zICh0aGF0IGlzLCBhIHByaW1hcnkga2V5KS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+SW52ZXJzZSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+VGhlIGpvaW4gY29sdW1uIG9uIHRoZSBvd25lZCAob3IgaW52ZXJzZSkgc2lkZSBvZiB0aGUgYXNzb2NpYXRpb246IHRoZSBvd25lZCBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPikKLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTiZndDs8L3NwYW4+IikKLQotCi1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LmNsYXNzLCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IilAT3JkZXJCeSgiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09SREVSX0JZJmd0Ozwvc3Bhbj4iKQotQEpvaW5UYWJsZShuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPQotICAgICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU4mZ3Q7PC9zcGFuPiIpKQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU4ZjhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5PbmUtdG8tb25lIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+PGEgaWQ9InN0aHJlZjE0NiIgbmFtZT0ic3RocmVmMTQ2Ij48L2E+PGEgaWQ9InN0aHJlZjE0NyIgbmFtZT0ic3RocmVmMTQ3Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1PbmUgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij5PbmUtdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzItdDI1Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMy10MjUiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+PGEgaWQ9InN0aHJlZjE0OCIgbmFtZT0ic3RocmVmMTQ4Ij48L2E+PGEgaWQ9InN0aHJlZjE0OSIgbmFtZT0ic3RocmVmMTQ5Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMy10MjYiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgCi0gICAgdXBkYXRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRiZGIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRyYW5zaWVudCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZIRUkiIG5hbWU9IkJBQkhGSEVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UcmFuc2llbnQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTUwIiBuYW1lPSJzdGhyZWYxNTAiPjwvYT48YSBpZD0ic3RocmVmMTUxIiBuYW1lPSJzdGhyZWYxNTEiPjwvYT48YSBpZD0ic3RocmVmMTUyIiBuYW1lPSJzdGhyZWYxNTIiPjwvYT48YSBpZD0ic3RocmVmMTUzIiBuYW1lPSJzdGhyZWYxNTMiPjwvYT5Vc2UgdGhlIFRyYW5zaWVudCBNYXBwaW5nIHRvIHNwZWNpZnkgYSBmaWVsZCBvZiB0aGUgZW50aXR5IGNsYXNzIHRoYXQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+aXMgbm90PC9zcGFuPiBwZXJzaXN0ZW50LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIHRyYW5zaWVudCBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgVHJhbnNpZW50PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb24gdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBUcmFuc2llbnQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjMyMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlZlcnNpb24gbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWZXJzaW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUJJSSIgbmFtZT0iQkFCSElCSUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlZlcnNpb24gbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTU0IiBuYW1lPSJzdGhyZWYxNTQiPjwvYT48YSBpZD0ic3RocmVmMTU1IiBuYW1lPSJzdGhyZWYxNTUiPjwvYT48YSBpZD0ic3RocmVmMTU2IiBuYW1lPSJzdGhyZWYxNTYiPjwvYT48YSBpZD0ic3RocmVmMTU3IiBuYW1lPSJzdGhyZWYxNTciPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+VmVyc2lvbiBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBmaWVsZCB1c2VkIGZvciBvcHRpbWlzdGljIGxvY2tpbmcuIElmIHRoZSBlbnRpdHkgaXMgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIHRhYmxlcywgeW91IHNob3VsZCB1c2UgYSB2ZXJzaW9uIG1hcHBpbmcgb25seSB3aXRoIHRoZSBwcmltYXJ5IHRhYmxlLiBZb3Ugc2hvdWxkIGhhdmUgb25seSBhIHNpbmdsZSB2ZXJzaW9uIG1hcHBpbmcgcGVyIHBlcnNpc3RlbnQgZW50aXR5LiBWZXJzaW9uIG1hcHBpbmdzIG1heSBiZSB1c2VkIG9ubHkgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48Y29kZT5pbnQ8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPnNob3J0LCBTaG9ydDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+bG9uZywgTG9uZzwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+VGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgdmVyc2lvbiBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBWZXJzaW9uPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMyLXQyNyI+RGVmaW5lcyB0aGUgbWFwcGluZyBhcyBWZXJzaW9uLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AVmVyc2lvbjwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+VmVyc2lvbjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzItdDI3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjcgcjFjMy10MjciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlIGFuZCBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPklOU0VSVDwvY29kZT4gYW5kIDxjb2RlPlVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzItdDI3Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZS4gVGhpcyBtdXN0IGJlIHRoZSBwcmltYXJ5IHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlJ3MgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzItdDI3Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0VBSkdEIj4iVGVtcG9yYWwiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRhdGU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lc3RhbXA8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBWZXJzaW9uCi1AQ29sdW1uKHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCBuYW1lPSImbHQ7PHNwYW4gY2xhc3M9Iml0YWxpYyI+Q09MVU1OX05BTUU8L3NwYW4+Jmd0OyIpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODVjZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCREVBSiIgbmFtZT0iQ0lIQkRFQUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9oMT4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThlYmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBR0ZJIiBuYW1lPSJCQUJCQUdGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNTgiIG5hbWU9InN0aHJlZjE1OCI+PC9hPjxhIGlkPSJzdGhyZWYxNTkiIG5hbWU9InN0aHJlZjE1OSI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIFlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IGFuZCBlc3RhYmxpc2ggYSBkYXRhYmFzZSBjb25uZWN0aW9uIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmJlZm9yZTwvc3Bhbj4gZ2VuZXJhdGluZyBwZXJzaXN0ZW50IGVudGl0aWVzLiBTZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48YSBpZD0ic3RocmVmMTYwIiBuYW1lPSJzdGhyZWYxNjAiPjwvYT48YSBpZD0ic3RocmVmMTYxIiBuYW1lPSJzdGhyZWYxNjEiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXM8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2MiIgbmFtZT0ic3RocmVmMTYyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllczwvcD4KLTxpbWcgc3JjPSJpbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nIiBhbHQ9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIHRpdGxlPSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI0NJQUhDR0VFIj5TZWxlY3QgVGFibGVzPC9hPiBwYWdlLCBzZWxlY3QgeW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4uPC9wPgotPHA+SWYgeW91IGFyZSBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgZGF0YWJhc2UsIHRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIHBhZ2UgYXBwZWFycy4gU2VsZWN0IHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYzIiBuYW1lPSJzdGhyZWYxNjMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3QgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfdGFibGVzLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBzZWxlY3RpbmcgYSBzY2hlbWEsIHNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIj5UYWJsZSBBc3NvY2lhdGlvbnM8L2E+IHBhZ2UsIHNlbGVjdCB0aGUgYXNzb2NpYXRpb25zIHRvIGdlbmVyYXRlLiBZb3UgY2FuIHNwZWNpZnkgdG8gZ2VuZXJhdGUgc3BlY2lmaWMgcmVmZXJlbmNlcyBmb3IgZWFjaCBhc3NvY2lhdGlvbi48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQXNzb2NpYXRpb248L3NwYW4+LiBVc2UgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZCB0byBkZWZpbmUgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NCIgbmFtZT0ic3RocmVmMTY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGFibGUgQXNzb2NpYXRpb25zPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIGVkaXRpbmcgdGhlIHRhYmxlIGFzc29jaWF0aW9ucywgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+IHBhZ2UsIGN1c3RvbWl6ZSB0aGUgbWFwcGluZyBhbmQgY2xhc3MgaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZXJhdGVkIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjUiIG5hbWU9InN0aHJlZjE2NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgY3VzdG9taXppbmcgdGhlIG1hcHBpbmdzLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI0NJQUNJR0VFIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvYT4gcGFnZSwgcmV2aWV3IHRoZSBtYXBwaW5nIGFuZCBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgY3JlYXRlcyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgZm9yIGVhY2ggZGF0YWJhc2UgdGFibGUuIEVhY2ggZW50aXR5IGNvbnRhaW5zIGZpZWxkcyBiYXNlZCBvbiB0aGUgdGFibGUncyBjb2x1bW5zLiBFY2xpcHNlIHdpbGwgYWxzbyBnZW5lcmF0ZSBlbnRpdHkgcmVsYXRpb25zaGlwcyAoc3VjaCBhcyBvbmUtdG8tb25lKSBiYXNlZCBvbiB0aGUgdGFibGUgY29uc3RyYWludHMuIDxhIGhyZWY9IiNDSUhKSUpKQyI+RmlndXJlOiBHZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9hPiBpbGx1c3RyYXRlcyBob3cgRWNsaXBzZSBnZW5lcmF0ZXMgZW50aXRpZXMgZnJvbSB0YWJsZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0iQ0lISklKSkMiIG5hbWU9IkNJSEpJSkpDIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllcyBmcm9tIFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvdGFibGVfZW50aXR5LnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgRU1QTE9ZRUUgYW5kIEFERFJFU1MgZW50aXRpZXMgZ2VuZXJhdGVkIGZyb20gZGF0YWJhc2UgdGFibGVzLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDFlODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISklHQkUiIG5hbWU9IkNJSEpJR0JFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC9oMT4KLTxwPldoZW4gdXNpbmcgYSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0sIHlvdSBjYW4gY3JlYXRlIGEgRERMIHNjcmlwdCBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBEREwgc2NyaXB0IHdpdGggRFJPUCBleGlzdGluZyB0YWJsZXMgb24gdGhlIGRhdGFiYXNlIGFuZCBDUkVBVEUgbmV3IHRhYmxlcywgYmFzZWQgb24gdGhlIGVudGl0aWVzIGluIHlvdXIgcHJvamVjdC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODcwZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBSUJBIiBuYW1lPSJCQUJGQUlCQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5WYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE2NyIgbmFtZT0ic3RocmVmMTY3Ij48L2E+PGEgaWQ9InN0aHJlZjE2OCIgbmFtZT0ic3RocmVmMTY4Ij48L2E+PGEgaWQ9InN0aHJlZjE2OSIgbmFtZT0ic3RocmVmMTY5Ij48L2E+PGEgaWQ9InN0aHJlZjE3MCIgbmFtZT0ic3RocmVmMTcwIj48L2E+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncyBhcmUgaW5kaWNhdGVkIHdpdGggYSByZWQgZXJyb3Igb3IgeWVsbG93IHdhcm5pbmcgbmV4dCB0byB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IsIGFzIHdlbGwgYXMgdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE3MSIgbmFtZT0ic3RocmVmMTcxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEVycm9ycyBhbmQgV2FybmluZ3M8L3A+Ci08aW1nIHNyYz0iaW1nL2Vycm9yX3NhbXBsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3Mgc2FtcGxlIGVycm9yIGFuZCB3YXJuaW5nIGljb25zIGluIHRoZSBFeHBsb3JlciB2aWV3LiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjQuaHRtI0NJSEZFREVJIj5FcnJvciBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjUuaHRtI0NJSEdFQUlKIj5XYXJuaW5nIG1lc3NhZ2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmVlMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RXJyb3IgbWVzc2FnZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRURFSSIgbmFtZT0iQ0lIRkVERUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVycm9yIG1lc3NhZ2VzPGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlcnJvciBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9fTkFNRSZndDs8L3NwYW4+IiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0PC9wPgotPHA+VGhlIG1hcHBlZCBhdHRyaWJ1dGUgaXMgaW52YWxpZC4gRWl0aGVyIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9yIGNoYW5nZSB0aGUgZW50aXR5IHR5cGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzQiIG5hbWU9InN0aHJlZjE3NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+RGFsaSBjYW5ub3QgbWFwIHRoZSBhdHRyaWJ1dGUgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29sdW1uLiBWZXJpZnkgdGhhdCB5b3UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzUiIG5hbWU9InN0aHJlZjE3NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5DbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFubm90YXRlZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuPC9wPgotPHA+VGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpZGVudGlmaWVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy4gQ29uZmlndXJlIHRoZSBjbGFzcyBhcyBhbiBFbnRpdHksIE1hcHBlZCBTdXBlcmNsYXNzLCBvciBFbWJlZGRhYmxlIHBlcnNpc3RlbnQgZW50aXR5LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzYiIG5hbWU9InN0aHJlZjE3NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IG1hcHBlZCBhbiBlbnRpdHkncyBmaWVsZCB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBtYXAgZWFjaCBmaWVsZCBpbiB0aGUgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGZpZWxkJ3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHJvdydzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBtYXBwaW5nLjwvcD4KLTxwPk1hcCB0aGUgZmllbGQgdG8gYSB2YWxpZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzciIG5hbWU9InN0aHJlZjE3NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5EdXBsaWNhdGUgY2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iLjwvcD4KLTxwPllvdSBjcmVhdGVkIHRvIHBlcnNpc3RlbmNlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBFYWNoIEphdmEgY2xhc3MgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuIFNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5FbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBJZCBvciBFbWJlZGRlZCBJZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGhvdXQgaWRlbnRpZnlpbmcgaXRzIHByaW1hcnkga2V5LiBBIHBlcnNpc3RlbnQgZW50aXR5IG11c3QgaGF2ZSBhIHByaW1hcnkga2V5IGZpZWxkIGRlc2lnbmF0ZWQgd2l0aCBhbiA8Y29kZT5ASWQ8L2NvZGU+IG9yIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPkFkZCBhbiBJRCBtYXBwaW5nIHRvIHRoZSBlbnRpdHkgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj4iSUQgbWFwcGluZyI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+IkVtYmVkZGVkIElEIG1hcHBpbmciPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTc5IiBuYW1lPSJzdGhyZWYxNzkiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRoIG1vcmUgdGhhbiBvbmUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgwIiBuYW1lPSJzdGhyZWYxODAiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkLjwvcD4KLTxwPlRoZXJlIGlzIG5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBVc2UgdGhlICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiIgdGFnIHRvIGRlZmluZSB0aGUgcGVyc2lzdGVudCB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODEiIG5hbWU9InN0aHJlZjE4MSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MiIgbmFtZT0ic3RocmVmMTgyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlJlZmVyZW5jZWQgY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgaW4gam9pbiBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+VGhlIGNvbHVtbiB0aGF0IHlvdSBzZWxlY3RlZCB0byBqb2luIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRhdGFiYXNlIHRhYmxlLiBFaXRoZXIgc2VsZWN0IGEgZGlmZmVyZW50IGNvbHVtbiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29sdW1uIG9uIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5TY2hlbWEgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5TQ0hFTUFfTkFNRTwvc3Bhbj4mZ3Q7IiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlL2pvaW4gdGFibGUgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5UQUJMRV9OQU1FPC9zcGFuPiZndDsiLjwvcD4KLTxwPkRlZmluZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4NCIgbmFtZT0ic3RocmVmMTg0Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlRhYmxlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IGFzc29jaWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gYXNzb2NpYXRlIGVhY2ggcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGVudGl0eSdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSB0YWJsZSdzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08cD5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgdmFsaWQgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTg1IiBuYW1lPSJzdGhyZWYxODUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VW5yZXNvbHZlZCBnZW5lcmF0b3IgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiBpcyBkZWZpbmVkIGluIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBwZXJzaXN0ZW5jZSBlbnRpdHkgdGhhdCB1c2VzIHNlcXVlbmNpbmcgb3IgYSB0YWJsZSBnZW5lcmF0b3IsIGJ1dCBkaWQgbm90IGRlZmluZSB0aGUgZ2VuZXJhdG9yIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBFaXRoZXIgZGVmaW5lIHRoZSBnZW5lcmF0b3IgYnkgdXNpbmcgYW4gYW5ub3RhdGlvbiBvciBpbmNsdWRpbmcgaXQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGUuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYmFjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XYXJuaW5nIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhHRUFJSiIgbmFtZT0iQ0lIR0VBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldhcm5pbmcgbWVzc2FnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdhcm5pbmcgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxODYiIG5hbWU9InN0aHJlZjE4NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db25uZWN0aW9uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09OTkVDVElPTl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHlvdSBzcGVjaWZpZWQgdG8gdXNlIHdpdGggdGhlIEpQQSBwcm9qZWN0IGlzIG5vdCBhY3RpdmUuIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTg3IiBuYW1lPSJzdGhyZWYxODciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBwcm9qZWN0LiBObyBkYXRhLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMjYuaHRtI0JBQkRCQ0JJIj4iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWEwM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRCQ0JJIiBuYW1lPSJCQUJEQkNCSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLTxwPkVhY2ggcGVyc2lzdGVudCBwcm9qZWN0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4gVG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+RGF0YWJhc2UgQ29ubmVjdGlvbjwvc3Bhbj4gdXNlIHRoZSBOZXcgQ29ubmVjdGlvbiB3aXphcmQuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1vZGlmeSB0aGUgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB5b3VyIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+RXhwbG9yZXI8L3NwYW4+IHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByb3BlcnRpZXM8L3NwYW4+LiBUaGUgUHJvcGVydGllcyBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTg4IiBuYW1lPSJzdGhyZWYxODgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgUHJvcGVydGllcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIiBhbHQ9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgdGl0bGU9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIGVhY2ggZmllbGQgb24gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc5MTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaXBzIGFuZCB0cmlja3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRpcHMgYW5kIHRyaWNrcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhHSEJGIiBuYW1lPSJDSERIR0hCRiI+PC9hPjwvcD4KLTxoMT5UaXBzIGFuZCB0cmlja3M8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0aXBzIGFuZCB0cmlja3MgZ2l2ZSBzb21lIGhlbHBmdWwgaWRlYXMgZm9yIGluY3JlYXNpbmcgeW91ciBwcm9kdWN0aXZpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkZJSUhBIj48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSIjQkFCQ0hBSEYiPjxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWEtYmFzZWQgcGVyc2lzdGVuY2UueG1sPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdGlwcyBhbmQgdHJpY2tzIGluIHRoaXMgY2F0ZWdvcnkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5UaXA8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCRklJSEEiIG5hbWU9IkJBQkZJSUhBIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+V2hlbiBzdGFydGluZyBhIG5ldyB3b3JrYmVuY2ggc2Vzc2lvbiwgYmUgc3VyZSB0byA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRvYy51c2VyL2RvYy9odG1sL2FzYzEyMjk3MDAzNDMzNTIuaHRtbCI+cmVjb25uZWN0IHRvIHlvdXIgZGF0YWJhc2U8L2E+IChpZiB5b3UgYXJlIHdvcmtpbmcgb25saW5lKS4gVGhpcyBhbGxvd3MgRGFsaSB0byBwcm92aWRlIGRhdGFiYXNlLXJlbGF0ZWQgbWFwcGluZyBhc3Npc3RhbmNlIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCQ0hBSEYiIG5hbWU9IkJBQkNIQUhGIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYS1iYXNlZCBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5JZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCB5b3UgbWF5IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgRWNsaXBzZSB3b3Jrc3BhY2UgcHJveHkgaW4gdGhlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtNzIuaHRtIj5QcmVmZXJlbmNlcyBkaWFsb2c8L2E+ICg8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByZWZlcmVuY2VzICZndDsgSW50ZXJuZXQgJmd0OyBQcm94eSBTZXR0aW5nczwvc3Bhbj4pIHRvIHByb3Blcmx5IHZhbGlkYXRlIGEgc2NoZW1hLWJhc2VkIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmRlYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgotPCEtLSBVc2VyIEd1aWRlIC0tPgotICA8dG9jIGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVXNlciBHdWlkZSI+Ci0gICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZC5odG0iIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jQkFCRUZIQ0QiIGxhYmVsPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtI0JBQklHQ0pBIiBsYWJlbD0iRGFsaSBxdWljayBzdGFydCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzLmh0bSIgbGFiZWw9IiBDb25jZXB0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJIj4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCIgbGFiZWw9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyIgbGFiZWw9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzLmh0bSIgbGFiZWw9IiBUYXNrcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIiBsYWJlbD0iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiIGxhYmVsPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNTYiIGxhYmVsPSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI3N0aHJlZjYwIiBsYWJlbD0iQ3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI0NJSEJDRENFIiBsYWJlbD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIiBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIiBsYWJlbD0iRW50aXR5IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIiBsYWJlbD0iRW1iZWRkYWJsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSIgbGFiZWw9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIiBsYWJlbD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCIgbGFiZWw9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyIgbGFiZWw9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiIgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSIgbGFiZWw9IkJhc2ljIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiIGxhYmVsPSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIiBsYWJlbD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyIgbGFiZWw9IklEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiIGxhYmVsPSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiIgbGFiZWw9Ik1hbnktdG8tb25lIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiIGxhYmVsPSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIiBsYWJlbD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTguaHRtI0JBQkhGSEVJIiBsYWJlbD0iVHJhbnNpZW50IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiIGxhYmVsPSJWZXJzaW9uIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiIGxhYmVsPSJFbGVtZW50IENvbGxlY3Rpb24gbWFwcGluZyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIiBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jQ0lISklHQkUiIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSIgbGFiZWw9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNC5odG0jQ0lIRkVERUkiIGxhYmVsPSJFcnJvciBtZXNzYWdlcyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI1Lmh0bSNDSUhHRUFJSiIgbGFiZWw9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI2Lmh0bSNCQUJEQkNCSSIgbGFiZWw9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jQ0lISEJKQ0oiIGxhYmVsPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNDSUhDQkhKRCIgbGFiZWw9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9IiBSZWZlcmVuY2UiPgotICAgICAgPHRvcGljIGxhYmVsPSJXaXphcmRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyIgbGFiZWw9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiIGxhYmVsPSJKYXZhIFBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiIgbGFiZWw9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIiBsYWJlbD0iRW50aXR5IENsYXNzIHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiIGxhYmVsPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSIgbGFiZWw9Ik1hcHBpbmcgRmlsZSBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUpFSURKIiBsYWJlbD0iTWFwcGluZyBGaWxlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSIgbGFiZWw9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiIGxhYmVsPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSIgbGFiZWw9IlNlbGVjdCBUYWJsZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiIGxhYmVsPSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSIgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiIgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIiBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyIgbGFiZWw9IkpvaW4gQ29sdW1ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNDSUFGSUlGSCIgbGFiZWw9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0jQ0FDR0FERkgiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvcGVydHkgcGFnZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giIGxhYmVsPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIiBsYWJlbD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIiBsYWJlbD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jc3RocmVmMjQxIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiIGxhYmVsPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIiBsYWJlbD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIiBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIiBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNFQUdCRyIgbGFiZWw9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiIGxhYmVsPSJHZW5lcmF0b3JzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE3Lmh0bSNDSUFER0NJRCIgbGFiZWw9IkNvbnZlcnRlcnMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIiBsYWJlbD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiIgbGFiZWw9IkdlbmVyYWwiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiIGxhYmVsPSJDb25uZWN0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIiBsYWJlbD0iQ3VzdG9taXphdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCIgbGFiZWw9IkNhY2hpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiIGxhYmVsPSJMb2dnaW5nIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIiBsYWJlbD0iT3B0aW9ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiIgbGFiZWw9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIiBsYWJlbD0iUHJvcGVydGllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCIgbGFiZWw9IlNvdXJjZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NBQ0ZCQUVIIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGlhbG9ncyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIiBsYWJlbD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0jQ0lBRkRHSUoiIGxhYmVsPSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiIgbGFiZWw9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIuaHRtI0NJQUdDR0lKIiBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtI0NBQ0hISEpBIiBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiIGxhYmVsPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIGFuZCBidXR0b25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciIGxhYmVsPSJJY29ucyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDREpDRUkiIGxhYmVsPSJCdXR0b25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI0NBQ0JCRElCIiBsYWJlbD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI3N0aHJlZjMwNiIgbGFiZWw9IkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNDSkFDRURERSIgbGFiZWw9Ik11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDMuaHRtI0NKQURJRkhKIiBsYWJlbD0iU3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbmsiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNDSkFCSUpFQyIgbGFiZWw9IkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNDSkFDSkJEQSIgbGFiZWw9IkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNi5odG0jc3RocmVmMzA3IiBsYWJlbD0iVGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImxlZ2FsLmh0bSIgbGFiZWw9IiBMZWdhbCI+Ci0gICAgICA8dG9waWMgaHJlZj0iYWJvdXQuaHRtI3N0aHJlZjMwOSIgbGFiZWw9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLSAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5NGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XaGF0J3MgbmV3PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBXaGF0J3MgbmV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjkxIiBuYW1lPSJzdGhyZWYyOTEiPjwvYT4gV2hhdCdzIG5ldzwvcD4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBuZXcgZmVhdHVyZXMgYW5kIHNpZ25pZmljYW50IGNoYW5nZXMgbWFkZSB0byB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgZm9yIFJlbGVhc2UgMi4zOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQ0pBQ0VEREUiPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNDSkFESUZISiI+U3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbms8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQ0pBQklKRUMiPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNS5odG0jQ0pBQ0pCREEiPkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2E0NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjkyIiBuYW1lPSJzdGhyZWYyOTIiPjwvYT4KLTxoMT5JbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uPC9oMT4KLTxwPlRoaXMgcmVsZWFzZSBvZiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgcHJvdmlkZXMgaW1wcm92ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIGFuZCBsb2NhbGl6YXRpb24gc3VwcG9ydC4gRGFsaSBwcm9qZWN0cyBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBhbmQgcHJvY2Vzc2luZyBvZiBpbnRlcm5hdGlvbmFsIGRhdGEgKHN1Y2ggYXMgZGF0ZXMgYW5kIHN0cmluZ3MpLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjE1ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFDRURERSIgbmFtZT0iQ0pBQ0VEREUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvaDE+Ci08cD5UaGVyZSBoYXZlIGJlZW4gbXVsdGlwbGUgaW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIHBlcnNwZWN0aXZlcyB0byBpbXByb3ZlIGl0cyBlYXNlLW9mLXVzZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5UaGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4gbm93IGFjY2VwdHMgc2hvcnQgbmFtZXMgYXMgYXR0cmlidXRlIHR5cGVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgcGVyZm9ybSB2YWxpZGF0aW9uIGFmdGVyIHJlZnJlc2hpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkRhbGkgYWxsb3dzIHByb2plY3QtbGV2ZWwgY3VzdG9taXphdGlvbiBmb3IgdmFsaWRhdGlvbiAoZXJyb3IgYW5kIHdhcm5pbmcgcmVwb3J0cyk8L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjFjYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBRElGSEoiIG5hbWU9IkNKQURJRkhKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvaDE+Ci08cD5UaGlzIHJlbGVhc2Ugb2YgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIHN1cHBvcnRzIGdlbmVyaWMgSlBBIDIuMCBhcyB3ZWxsIGFzIHNwZWNpZmljIGl0ZW1zIGZvciBFY2xpc3BlTGluayAxLjIuPC9wPgotPHVsPgotPGxpPgotPHA+RGVyaXZlZCBJRHM8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2FjaGluZyAoU2hhcmVkIENhY2hlIGFuZCBDYWNoYWJsZSk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2Fub25pY2FsIG1ldGFtb2RlbCBnZW5lcmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9yZGVyIENvbHVtbiBjb25maWd1cmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVsZW1lbnRDb2xsZWN0aW9uIG1hcHBpbmcgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXNjYWRlIGRldGFjaDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgdXBncmFkZSB5b3VyIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZnJvbSBKUEEgMS4wIHRvIDIuMC48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDU0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUJJSkVDIiBuYW1lPSJDSkFCSUpFQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHVzZXMgdGhlIEVjbGlwc2UgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZTwvc3Bhbj4gbWVudSB0byBjb252ZXJ0IGV4aXN0aW5nIEphdmEgcHJvamVjdHMgdG8gSlBBIHByb2plY3RzLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrczAwMS5odG0jQkVJQkFESEgiPiJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmOTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FY2xpcHNlTGluayAyLnggU3VwcG9ydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFY2xpcHNlTGluayAyLnggU3VwcG9ydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUNKQkRBIiBuYW1lPSJDSkFDSkJEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWNsaXBzZUxpbmsgMi54IFN1cHBvcnQ8L2gxPgotPHA+UmVsZWFzZSAyLjMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgRWNsaXBzZUxpbmsgMi54IGZlYXR1cmVzLjwvcD4KLTxwPkVjbGlwc2VMaW5rICh0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0KSBpcyBhIGNvbXBsZXRlIHBlcnNpc3RlbmNlIGZyYW1lIHdvcmsuIFJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjg2N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MyIgbmFtZT0ic3RocmVmMjkzIj48L2E+Ci08aDE+VGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlPC9oMT4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBub3cgc3VwcG9ydHMgdGhlIEpQQSAxLjAtb3B0aW9uYWwgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlIG9wdGlvbi4gVGhpcyBmdW5jdGlvbmFsaXR5IG1heSBiZSByZXF1aXJlZCBpbiBKUEEgMi4wLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYzVhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MzU5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE0NTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGUyMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4gYW5kIG1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjU4NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODIyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmdlbjwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NTJmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW48L25hbWU+Ci0JPGNvbW1lbnQ+bW92ZWQgdG8gamF4YiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzMwMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpPC9uYW1lPgotCTxjb21tZW50Pm1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF8xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTYzNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjMjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkYTMyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaW5pIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI4MjFlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDYsIDIwMDkuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTA4OWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTExMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYWRkMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZTg2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZGFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmE3ZGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMToyMiBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJjMjg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1OTo0MiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ODVmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzN2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzYzk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFlOTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzNmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aS53aXphcmQuTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIHdhcyBjYW5jZWxsZWQuCi0JICogVGhlIG5hbWUgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSBmcm9tCi0JICogSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCQlOZXdKREJDRmlsdGVyZWRDUFdpemFyZCAgd2l6YXJkID0gbmV3IE5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHZpZXdlciBmaWx0ZXIgKioqKioqKioqKgotLy8KLS8vCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0vLwotLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlMb2NhbFZpZXdlckZpbHRlcigpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoQ1BXaXphcmROb2RlKSBlbGVtZW50OwotLy8JCQlJUHJvZmlsZVdpemFyZFByb3ZpZGVyIHdpemFyZFByb3ZpZGVyID0gd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpOwotLy8JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotLy8JCQkJCQkJKChQcm9maWxlV2l6YXJkUHJvdmlkZXIpIHdpemFyZFByb3ZpZGVyKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0vLwkJCQotLy8JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLS8vCQkJd2hpbGUgKGNhdGVnb3J5ICE9IG51bGwpIHsKLS8vCQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhEQVRBQkFTRV9DQVRFR09SWV9JRCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkuZ2V0UGFyZW50KCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKLWphdmFDb21waWxlci4uLmFyZ3MuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2I4ZTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmRiPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWJiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjAyIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ1NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjE4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjg4ZTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5kYgotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5qZHQuY2xhc3NwYXRoO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsdG9vbHMuZWRpdG9yLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MjkwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJiNGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYiI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Mjg4ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERCCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0NhdGFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUxMjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIGNhdGFsb2cKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2F0YWxvZyBleHRlbmRzIFNjaGVtYUNvbnRhaW5lciB7Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0NvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWEwMzI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW4gZXh0ZW5kcyBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RyYWludHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGl0cyB0YWJsZSdzIHByaW1hcnkga2V5LgotCSAqLwotCWJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHBhcnQgb2Ygb25lIG9mIGl0cyB0YWJsZSdzIGZvcmVpZ24ga2V5cy4KLQkgKi8KLQlib29sZWFuIGlzUGFydE9mRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIGEgdW5pcXVlIGNvbnN0cmFpbnQgZGVmaW5lZCBmb3IgaXRzCi0JICogdGFibGUuCi0JICovCi0JYm9vbGVhbiBpc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbnVsbGFibGUuCi0JICovCi0JYm9vbGVhbiBpc051bGxhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgZGF0YXR5cGUuCi0JICovCi0JU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbidzIHR5cGUgaXMgbnVtZXJpYy4KLQkgKi8KLQlib29sZWFuIGlzTnVtZXJpYygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBwcmVjaXNpb24gaWYgaXQgaXMgYSBOdW1lcmljYWxEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyBzY2FsZSBpZiBpdCBpcyBhbiBFeGFjdE51bWVyaWNEYXRhVHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNjYWxlKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgY29sdW1uIGlzIGEgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUsIHJldHVybiBpdHMgbGVuZ3RoOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIC0xLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uJ3MgZGF0YXR5cGUgaXMgYSBMT0IgdHlwZQotCSAqIChpLmUuIEJMT0IsIENMT0IsIG9yIE5DTE9CKS4KLQkgKi8KLQlib29sZWFuIGlzTE9CKCk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JU3RyaW5nIGdldEphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUuCi0JICovCi0JSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSBkZWNsYXJhdGlvbiB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgYW5kIHN1aXRhYmxlIGZvciB1c2UgYXMgYQotCSAqIHByaW1hcnkga2V5IGZpZWxkLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgSmF2YSB0eXBlIHRoYXQgaXMgcmVhc29uYWJseQotCSAqIHNpbWlsYXIgdG8gdGhlIGNvbHVtbidzIGRhdGEgdHlwZSBhbmQgc3VpdGFibGUgZm9yIHVzZSBhcyBhCi0JICogcHJpbWFyeSBrZXkgZmllbGQuCi0JICovCi0JSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBjNDBiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogQW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbm5lY3Rpb25MaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uQWRhcHRlciBpbXBsZW1lbnRzIENvbm5lY3Rpb25MaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmJkNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIEEgPGNvZGU+Q29ubmVjdGlvbkxpc3RlbmVyPC9jb2RlPiBpcyBub3RpZmllZCBvZiBhbnkgY2hhbmdlcyB0byBhIGNvbm5lY3Rpb24uCi0gKiA8cD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgYWJvdXRUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSk7Ci0JcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKTsKLQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpOwotCXB1YmxpYyB2b2lkIHNlcXVlbmNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTZXF1ZW5jZSBzZXF1ZW5jZSk7Ci0JcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKTsKLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pOwotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwMDQ4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLmpkYmMuSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uUHJvZmlsZSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIGRhdGFiYXNlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgaW5hY3RpdmUuCi0JICovCi0JRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiBJRCBvZiB0aGUgcHJvdmlkZXIgbWFuYWdpbmcgdGhlIERUUCBwcm9maWxlLgotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlcklEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIHN0YXRpYyBJRC4KLQkgKi8KLQlTdHJpbmcgZ2V0SW5zdGFuY2VJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGRhdGFiYXNlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBwcm9kdWN0IG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlUHJvZHVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHZlcnNpb24uCi0JICovCi0JU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkcml2ZXIgY2xhc3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgY29ubmVjdGlvbiBVUkwuCi0JICovCi0JU3RyaW5nIGdldFVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHVzZXIgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlck5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB1c2VyIHBhc3N3b3JkLgotCSAqLwotCVN0cmluZyBnZXRVc2VyUGFzc3dvcmQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGRlZmluaXRpb24uCi0JICovCi0JU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqYXIgbGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgRHJpdmVyIGFzIGEgCi0JICogY29tbWEtZGVsaW1pdGVkIHN0cmluZy4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIERyaXZlciBkZWZpbml0aW9uLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG9yIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gaXQgaGFzIGFjY2VzcyB0byBtZXRhLWRhdGEpLgotCSAqIEBzZWUgaXNDb25uZWN0ZWQoKQotCSAqIEBzZWUgaXNXb3JraW5nT2ZmbGluZSgpCi0JICovCi0JYm9vbGVhbiBpc0FjdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgbmVpdGhlciBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlCi0JICogc2Vzc2lvbiBub3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICogQHNlZSBpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNDb25uZWN0ZWQoKQotCSAqLwotCWJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgY29ubmVjdCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCBmcm9tIHRoZSBkYXRhYmFzZS4KLQkgKiBAc2VlICNjb25uZWN0KCkKLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBvZmYtbGluZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gdGhlIG1ldGEtZGF0YQotCSAqIGNvbWVzIGZyb20gYSBsb2NhbCBjYWNoZSksIGFzIG9wcG9zZWQgdG8gY29ubmVjdGVkIHRvIGEgbGl2ZQotCSAqIGRhdGFiYXNlIHNlc3Npb24uCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNXb3JraW5nT2ZmbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gZmFjdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUncyBwcm92aWRlciBzdXBwb3J0IHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCk7Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGZvciB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZS4KLQkgKiBJZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRvZXMgbm90IHN1cHBvcnQgd29ya2luZyBpbiBhbiBvZmZsaW5lIG1vZGUsIG5vCi0JICogZXhjZXB0aW9uIGlzIHRocm93biBhbmQgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlJU3RhdHVzIHNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc3VwcG9ydHMgd29ya2luZyBvZmZsaW5lIGFuZCBkYXRhCi0JICogaGFzIGJlZW4gc2F2ZWQgZm9yIHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIGNhbldvcmtPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBCZWdpbiB3b3JraW5nIG9mZi1saW5lLgotCSAqLwotCUlTdGF0dXMgd29ya09mZmxpbmUoKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlTdHJpbmcgQ09OTkVDVElPTl9QUk9GSUxFX1RZUEUgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlckRlZmluaXRpb25JRCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuZGVmblR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfSkFSX0xJU1RfUFJPUF9JRCA9ICJqYXJMaXN0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCA9IElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QUk9QX1BSRUZJWCArICJzYXZlUFdEIjsgIC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2E4MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBBbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZUFkYXB0ZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5ODU2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcyB0aGUgZmFjdG9yeSBjYW4gd3JhcCB3aXRoCi0JICogbmV3IGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29ubmVjdGlvbiBwcm9maWxlIHRoYXQgd3JhcHMgdGhlIERUUCBjb25uZWN0aW9uCi0JICogcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyIHRvIGFsbG93IGNsaWVudHMgdG8gY29udHJvbCBob3cKLQkgKiBkYXRhYmFzZSBpZGVudGlmaWVycyBhcmUgY29udmVydGVkIHRvIG5hbWVzIGFuZCB2aWNlIHZlcnNhLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgYWRhcHRlcik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29ubmVjdGlvbiBwcm9maWxlIHRoYXQgd3JhcHMgdGhlIERUUCBjb25uZWN0aW9uCi0JICogcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHdoZW4gYSBKUEEgcGxhdGZvcm0gaXMgdW5hdmFpbGFibGUKLQkgKiAoZS5nLiBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbikuIFRoZSByZXR1cm5lZCBjb25uZWN0aW9uIHByb2ZpbGUgd2lsbAotCSAqIHVzZSB0aGUgZGVmYXVsdCBjb252ZXJzaW9ucyBmb3IgaWRlbnRpZmllcnMgYW5kIG5hbWVzLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMgdG8gdGhlIERUUAotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0JICovCi0Jdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIuCi0JICovCi0Jdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWUzNDM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogQSA8Y29kZT5Qcm9maWxlTGlzdGVuZXI8L2NvZGU+IGlzIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcy4KLSAqIDxwPgotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIGFkZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9maWxlIGhhcyBiZWVuIHJlbW92ZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiByZW5hbWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGUxOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotCi0vKioKLSAqIERhdGFiYXNlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlIGV4dGVuZHMgU2NoZW1hQ29udGFpbmVyIHsKLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlJ3MgdmVuZG9yLgotCSAqLwotCVN0cmluZyBnZXRWZW5kb3JOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgdmVyc2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2dzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjYXRhbG9ncy4gSWYgaXQgZG9lcywgYWxsIGRhdGFiYXNlCi0JICogb2JqZWN0cyBhcmUgY29udGFpbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzOyBvdGhlcndpc2UgYWxsIGRhdGFiYXNlCi0JICogb2JqZWN0cyBhcmUgY29udGFpbmVkIGJ5IHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhLgotCSAqIDxicj4KLQkgKiBQcmFjdGljYWxseSBzcGVha2luZzo8dWw+Ci0JICogICAgIDxsaT5JZiB7QGxpbmsgI3N1cHBvcnRzQ2F0YWxvZ3MoKX0gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPjx1bD4KLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldENhdGFsb2dzKCl9IHJldHVybnMgY2F0YWxvZ3MgdGhhdCBjb250YWluIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhCi0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRTY2hlbWF0YSgpfSByZXR1cm5zIGFuIGVtcHR5IGl0ZXJhYmxlCi0JICogICAgIDwvdWw+Ci0JICogICAgIDxsaT5lbHNlPHVsPgotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0Q2F0YWxvZ3MoKX0gcmV0dXJucyBhbiBlbXB0eSBpdGVyYWJsZQotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0U2NoZW1hdGEoKX0gcmV0dXJucyB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YQotCSAqICAgICA8L3VsPgotCSAqIDwvdWw+Ci0JICogVGhpcyBpcyBjb21wbGljYXRlZCBieSB0aGUgcHJlc2VuY2Ugb2YgYSAiZGVmYXVsdCIgY2F0YWxvZyB0aGF0IGNsaWVudHMgY2FuCi0JICogdXNlIHRvIGFsbG93IHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgY2F0YWxvZyB0byBiZSBvcHRpb25hbDsgYnV0IGNsaWVudHMKLQkgKiBtdXN0IG1hbmFnZSB0aGlzIGV4cGxpY2l0bHkuCi0JICogCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNjaGVtYXRhKCkKLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBjYXRhbG9ncy4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICovCi0JSXRlcmFibGU8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNhdGFsb2dzIHRoZSBkYXRhYmFzZSBjb250YWlucy4KLQkgKiBSZXR1cm4gemVybyBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlpbnQgZ2V0Q2F0YWxvZ3NTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZyBuYW1lcywgc29ydGVkLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYWJsZSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHNlbGVjdGluZyBhIGNhdGFsb2cgZnJvbSBhIHJlYWQtb25seQotCSAqIGNvbWJvLWJveCAoZS5nLiBpbiBhIHdpemFyZCkuCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nTmFtZWQoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkQ2F0YWxvZ05hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhdGFsb2cgd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhbiBleGFjdCBtYXRjaAotCSAqIG9mIHRoZSBjYXRhbG9nJ3MgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlDYXRhbG9nIGdldENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZyBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhYmxlIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGFuIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlCi0JICogcGxhY2VkIGluIGEgdGV4dCBmaWxlIChlLmcuIGluIGEgSmF2YSBhbm5vdGF0aW9uKS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRDYXRhbG9nTmFtZWQoU3RyaW5nKQotCSAqLwotCUNhdGFsb2cgZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzICJkZWZhdWx0IiBjYXRhbG9nLCBhcyBkZWZpbmVkIGJ5IHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgZGVmYXVsdCBjYXRhbG9nJ3MgbmFtZSB3aWxsIG1hdGNoIHRoZSB1c2VyIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3Mgb3IgaWYgdGhlIGRlZmF1bHQKLQkgKiBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IChlLmcuIHRoZSBkYXRhYmFzZSBoYXMgbm8gY2F0YWxvZyB3aG9zZSBuYW1lCi0JICogbWF0Y2hlcyB0aGUgdXNlciBuYW1lKS4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKQotCSAqLwotCUNhdGFsb2cgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyAiZGVmYXVsdCIgY2F0YWxvZyBpZGVudGlmaWVyLgotCSAqIFRoZSBkYXRhYmFzZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGEgY2F0YWxvZyB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZygpCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOwotCi0KLQkvLyAqKioqKioqKioqIHV0aWxpdHkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZWxlY3QgYW5kIHJldHVybiBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkYXRhYmFzZSBvYmplY3RzIHRoZQotCSAqIGRhdGFiYXNlIG9iamVjdCBpZGVudGlmaWVkIGJ5IHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4KLQkgKiBUaGUgaWRlbnRpZmllciBzaG91bGQgYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gZGVsaW1pdGVkIHdoZW4KLQkgKiBub24tIm5vcm1hbCIpLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5hbWUgdG8gYSBkYXRhYmFzZS1hcHByb3ByaWF0ZSBTUUwgaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODQwZjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnRzIG9mIHRoZSBEYWxpIGRiIHBhY2thZ2UgdG8gcGx1ZyBpbiBhIGN1c3RvbQotICogc3RyYXRlZ3kgZm9yIGNvbnZlcnRpbmcgYSBkYXRhYmFzZSBpZGVudGlmaWVyIHRvIGEgZGF0YWJhc2UgbmFtZSBhbmQgdmljZQotICogdmVyc2EuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJpZGVudGlmaWVyIiB0byBhICJuYW1lIi4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIERlZmF1bHRDYWxsYmFjayBkZWZhdWx0Q2FsbGJhY2spOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJuYW1lIiB0byBhbiAiaWRlbnRpZmllciIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKTsKLQotCS8qKgotCSAqIFRoZSBjbGllbnQtcHJvdmlkZWQgZmluZGVyIGlzIHBhc3NlZCBhICJkZWZhdWx0IiBjYWxsYmFjayB0aGF0IGNhbiBiZQotCSAqIHVzZWQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JaW50ZXJmYWNlIERlZmF1bHRDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiaWRlbnRpZmllciIgdG8gYSAibmFtZSIuCi0JCSAqLwotCQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JCS8qKgotCQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgIm5hbWUiIHRvIGFuICJpZGVudGlmaWVyIi4KLQkJICovCi0JCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFkYXB0ZXIgc2ltcGx5IHVzZXMgdGhlIHBhc3NlZCBpbiBkZWZhdWx0IGNhbGxiYWNrLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgdXNlIHRoZSBkZWZhdWx0IGNhbGxiYWNrCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWUoU3RyaW5nIGlkZW50aWZpZXIsIERlZmF1bHRDYWxsYmFjayBkZWZhdWx0Q2FsbGJhY2spIHsKLQkJCXJldHVybiBkZWZhdWx0Q2FsbGJhY2suY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcik7Ci0JCX0KLQkJLy8gc2ltcGx5IHVzZSB0aGUgZGVmYXVsdCBjYWxsYmFjawotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBEZWZhdWx0Q2FsbGJhY2sgZGVmYXVsdENhbGxiYWNrKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdENhbGxiYWNrLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5OTdkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIENvbW1vbiBiZWhhdmlvciB0byBhbGwgZGF0YWJhc2Ugb2JqZWN0cwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgImlkZW50aWZpZXIiLCB3aGljaCBpcyB0aGUgb2JqZWN0J3MgbmFtZQotCSAqIG1vZGlmaWVkIHNvIGl0IGNhbiBiZSB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQgKGUuZy4gaWYgdGhlIG5hbWUgY29udGFpbnMKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgaXMgbWl4ZWQgY2FzZSwgaXQgd2lsbCBiZSBkZWxpbWl0ZWQsIHR5cGljYWxseSBieQotCSAqIGRvdWJsZS1xdW90ZXMpLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBvYmplY3QncyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIHNwZWNpZmllZAotCSAqICJkZWZhdWx0IG5hbWUiLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgb2xkIGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlIGRhdGFiYXNlIG9iamVjdAotCSAqICh0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIGNhc2Utc2Vuc2l0aXZpdHkgYW5kIHNwZWNpYWwgY2hhcmFjdGVycykuCi0JICovCi0JU3RyaW5nIGdldElkZW50aWZpZXIoU3RyaW5nIGRlZmF1bHROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgImlkZW50aWZpZXIiLCB3aGljaCBpcyB0aGUgb2JqZWN0J3MgbmFtZQotCSAqIG1vZGlmaWVkIHNvIGl0IGNhbiBiZSB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQgKGUuZy4gaWYgdGhlIG5hbWUgY29udGFpbnMKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgaXMgbWl4ZWQgY2FzZSwgaXQgd2lsbCBiZSBkZWxpbWl0ZWQsIHR5cGljYWxseSBieQotCSAqIGRvdWJsZS1xdW90ZXMpLgotCSAqLwotCVN0cmluZyBnZXRJZGVudGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIGRhdGFiYXNlLgotCSAqLwotCURhdGFiYXNlIGdldERhdGFiYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0KLQlDb21wYXJhdG9yPERhdGFiYXNlT2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGF0YWJhc2VPYmplY3Q+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEYXRhYmFzZU9iamVjdCBkYk9iamVjdDEsIERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0MikgewotCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRiT2JqZWN0MS5nZXROYW1lKCksIGRiT2JqZWN0Mi5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlT2JqZWN0LkRFRkFVTFRfQ09NUEFSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCi0JVHJhbnNmb3JtZXI8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4gTkFNRV9UUkFOU0ZPUk1FUiA9Ci0JCQluZXcgVHJhbnNmb3JtZXI8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oRGF0YWJhc2VPYmplY3QgZGJPYmplY3QpIHsKLQkJCQkJcmV0dXJuIGRiT2JqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEYXRhYmFzZU9iamVjdC5OQU1FX1RSQU5TRk9STUVSIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0KLQlUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPiBJREVOVElGSUVSX1RSQU5TRk9STUVSID0KLQkJCW5ldyBUcmFuc2Zvcm1lcjxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShEYXRhYmFzZU9iamVjdCBkYk9iamVjdCkgewotCQkJCQlyZXR1cm4gZGJPYmplY3QuZ2V0SWRlbnRpZmllcigpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlT2JqZWN0LklERU5USUZJRVJfVFJBTlNGT1JNRVIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Gb3JlaWduS2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0ZvcmVpZ25LZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiMGQ4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0ZvcmVpZ25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogRGF0YWJhc2UgZm9yZWlnbiBrZXkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRm9yZWlnbktleSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgdGFibGUuCi0JICovCi0JVGFibGUgZ2V0QmFzZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgInJlZmVyZW5jZWQiIHRhYmxlLgotCSAqLwotCVRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgY29sdW1uIHBhaXJzLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZvcmVpZ24ga2V5J3MgY29sdW1uIHBhaXJzLgotCSAqLwotCWludCBnZXRDb2x1bW5QYWlyc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyBzaW5nbGUgY29sdW1uIHBhaXIuIFRocm93IGFuCi0JICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgdGhlIGZvcmVpZ24ga2V5IGhhcyBtb3JlIHRoYW4gb25lIGNvbHVtbiBwYWlyLgotCSAqLwotCUNvbHVtblBhaXIgZ2V0Q29sdW1uUGFpcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzICJiYXNlIiBjb2x1bW5zLgotCSAqLwotCUl0ZXJhYmxlPENvbHVtbj4gZ2V0QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAiYmFzZSIgY29sdW1ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYmFzZQotCSAqIHRhYmxlJ3MgcHJpbWFyeSBrZXkuIChUaGUgbm9uLXByaW1hcnkga2V5IGJhc2UgY29sdW1ucyBhcmUgbm90IHVzZWQgdG8KLQkgKiBnZW5lcmF0ZSBiYXNpYyBhdHRyaWJ1dGVzIGR1cmluZyBlbnRpdHkgZ2VuZXJhdGlvbi4pCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgY29sdW1ucy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlcyB0aGUgcHJpbWFyeSBrZXkgb2YgdGhlCi0JICogInJlZmVyZW5jZWQiIHRhYmxlIGFuZCB0aGF0IHByaW1hcnkga2V5IGhhcyBvbmx5IGEgc2luZ2xlIGNvbHVtbi4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgSlBBIGRlZmF1bHRzLgotCSAqLwotCWJvb2xlYW4gcmVmZXJlbmNlc1NpbmdsZUNvbHVtblByaW1hcnlLZXkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXBwcm9wcmlhdGUgbmFtZSBmb3IgYW4gYXR0cmlidXRlIHRoYXQgaG9sZHMgdGhlIGVudGl0eQotCSAqIG1hcHBlZCB0byB0aGUgZm9yZWlnbiBrZXkncyAicmVmZXJlbmNlZCIgdGFibGUuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSAiYmFzZSIgY29sdW1uIGFkaGVyZXMgdG8gdGhlIEpQQSBzcGVjIGZvciBhCi0JICogZGVmYXVsdCBtYXBwaW5nIChpLmUuIGl0IGVuZHMgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IHRoZSBuYW1lCi0JICogb2YgdGhlICJyZWZlcmVuY2VkIiBjb2x1bW4sIGFuZCB0aGUgInJlZmVyZW5jZWQiIGNvbHVtbiBpcyB0aGUgc2luZ2xlCi0JICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSAicmVmZXJlbmNlZCIgdGFibGUpLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBkZWZhdWx0IGF0dHJpYnV0ZSBuYW1lOjxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogPC9wcmU+Ci0JICogUmV0dXJuIGEgPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgZG9lcyBub3QgYWRoZXJlIHRvIHRoZSBKUEEgc3BlYzo8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuQ1VCSUNMRV9JRCkgPT4gbnVsbAotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFID0+IENVQklDTEUuSUQpID0+IG51bGwKLQkgKiA8L3ByZT4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIHRoYXQgaXMgbWFwcGVkIHRvIHRoZQotCSAqIGZvcmVpZ24ga2V5LAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIDxjb2RlPkBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uJ3MgPGNvZGU+bmFtZTwvY29kZT4gZWxlbWVudC4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogPHA+Ci0JICogUHJlY29uZGl0aW9uOiBUaGUgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBvbGQgZW50aXR5IGdlbmVyYXRpb24gY29kZSB0byBkZXRlcm1pbmUgd2hldGhlcgotCSAqIGEgZ2VuZXJhdGVkIGFubm90YXRpb24gbXVzdCBleHBsaWNpdGx5IGlkZW50aWZ5IHRoZSBqb2luIGNvbHVtbgotCSAqIG9yIHRoZSBjYWxjdWxhdGVkIGRlZmF1bHQgYWRlcXVhdGVseSBpZGVudGlmaWVzIHRoZSBqb2luIGNvbHVtbgotCSAqICh0YWtpbmcgaW50byBjb25zaWRlcmF0aW9uIGNhc2Utc2Vuc2l0aXZpdHkgYW5kIHNwZWNpYWwgY2hhcmFjdGVycykuCi0JICovCi0JU3RyaW5nIGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcihTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBwYWlyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWlyIHVwIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycywgbWF0Y2hpbmcgZWFjaCAiYmFzZSIgY29sdW1uIHdpdGgKLQkgKiB0aGUgYXBwcm9wcmlhdGUgInJlZmVyZW5jZWQiIGNvbHVtbi4KLQkgKiBAc2VlICNjb2x1bW5QYWlycygpCi0JICovCi0JaW50ZXJmYWNlIENvbHVtblBhaXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgImJhc2UiIGNvbHVtbi4KLQkJICovCi0JCUNvbHVtbiBnZXRCYXNlQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY29sdW1uIHBhaXIncyAicmVmZXJlbmNlZCIgY29sdW1uLgotCQkgKi8KLQkJQ29sdW1uIGdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQotCQlDb21wYXJhdG9yPENvbHVtblBhaXI+IEJBU0VfQ09MVU1OX0NPTVBBUkFUT1IgPQotCQkJCW5ldyBDb21wYXJhdG9yPENvbHVtblBhaXI+KCkgewotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29sdW1uUGFpciBjcDEsIENvbHVtblBhaXIgY3AyKSB7Ci0JCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGNwMS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpLCBjcDIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCQlyZXR1cm4gIkZvcmVpZ25LZXkuQ29sdW1uUGFpci5CQVNFX0NPTFVNTl9DT01QQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9KcHRKcGFEYlBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9KcHRKcGFEYlBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmM4ODdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvSnB0SnBhRGJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkdC5jbGFzc3BhdGguRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIEpQVCBEQiBwbHVnLWluIGxpZmVjeWNsZSBpbXBsZW1lbnRhdGlvbi4KLSAqIEdsb2JhbGx5IGF2YWlsYWJsZSBjb25uZWN0aW9uIHByb2ZpbGUgZmFjdG9yeS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYURiUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQlwcml2YXRlIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBjb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBKcHRKcGFEYlBsdWdpbiBJTlNUQU5DRTsgIC8vIHNvcnRhLWZpbmFsCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBKUFQgREIgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYURiUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSU5TVEFOQ0UuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5XygpOwotCX0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0SnBhRGJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LnN0b3AoKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeV8oKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9IGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JICAgICAgICB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5zdGFydCgpOwkJCQotCQl9Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLQl9Ci0KLQlwcml2YXRlIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBidWlsZENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBqYXIgbGlzdCBjb250YWluZXIgZm9yIHRoZSBnaXZlbiBEVFAgZHJpdmVyLgotCSAqLwotCXB1YmxpYyBJQ2xhc3NwYXRoQ29udGFpbmVyIGJ1aWxkRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyRm9yKFN0cmluZyBkcml2ZXJOYW1lKSB7Ci0JCXJldHVybiBuZXcgRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyKGRyaXZlck5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGQzN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBzY2hlbWEKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hIGV4dGVuZHMgRGF0YWJhc2VPYmplY3QgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBjb250YWluZXI7IGVpdGhlciBhIGNhdGFsb2cgb3IgYSBkYXRhYmFzZS4KLQkgKi8KLQlTY2hlbWFDb250YWluZXIgZ2V0Q29udGFpbmVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3MgdGFibGVzLgotCSAqLwotCUl0ZXJhYmxlPFRhYmxlPiBnZXRUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhYmxlcyB0aGUgc2NoZW1hIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRUYWJsZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgdGFibGUncyBuYW1lLgotCSAqIEBzZWUgI2dldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JIFRhYmxlIGdldFRhYmxlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZSBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRUYWJsZU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkKLQkgKi8KLQlUYWJsZSBnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHNlcXVlbmNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIHNlcXVlbmNlcy4KLQkgKi8KLQlJdGVyYWJsZTxTZXF1ZW5jZT4gZ2V0U2VxdWVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgdGhlIHNjaGVtYSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSB3aXRoIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIHNlcXVlbmNlJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCVNlcXVlbmNlIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyBzZXF1ZW5jZSBpZGVudGlmZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlTmFtZWQoU3RyaW5nKQotCSAqIEBzZWUgI2dldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKQotCSAqLwotCVNlcXVlbmNlIGdldFNlcXVlbmNlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU5MzlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogU2NoZW1hICJjb250YWluZXIiIChpLmUuIERhdGFiYXNlIG9yIENhdGFsb2cpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYUNvbnRhaW5lciBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3Mgc2NoZW1hdGEuCi0JICovCi0JSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2NoZW1hdGEgaW4gdGhlIGNvbnRhaW5lci4KLQkgKi8KLQlpbnQgZ2V0U2NoZW1hdGFTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYSBuYW1lcywgc29ydGVkLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGEgc2NoZW1hIGZyb20gYSByZWFkLW9ubHkKLQkgKiBjb21iby1ib3ggKGUuZy4gaW4gYSB3aXphcmQpLgotCSAqIEBzZWUgI2dldFNjaGVtYU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgd2l0aCBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhbiBleGFjdCBtYXRjaAotCSAqIG9mIHRoZSBzY2hlbWEncyBuYW1lLgotCSAqIEBzZWUgI2dldFNvcnRlZFNjaGVtYU5hbWVzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzY2hlbWEgaWRlbnRpZmllcnMsIHNvcnRlZCBieSBuYW1lLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGFuIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlCi0JICogcGxhY2VkIGluIGEgdGV4dCBmaWxlIChlLmcuIGluIGEgSmF2YSBhbm5vdGF0aW9uKS4KLQkgKiBAc2VlICNnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFOYW1lcygpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0U2NoZW1hTmFtZWQoU3RyaW5nKQotCSAqLwotCVNjaGVtYSBnZXRTY2hlbWFGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgImRlZmF1bHQiIHNjaGVtYSwgYXMgZGVmaW5lZCBieSB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqIEluIG1vc3QgY2FzZXMgdGhlIGRlZmF1bHQgc2NoZW1hJ3MgbmFtZSB3aWxsIG1hdGNoIHRoZSB1c2VyIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGRvZXMgbm90IGV4aXN0IChlLmcuIHRoZSBjb250YWluZXIgaGFzCi0JICogbm8gc2NoZW1hIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgdXNlciBuYW1lKS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpCi0JICovCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgImRlZmF1bHQiIHNjaGVtYSBpZGVudGlmaWVyLgotCSAqIFRoZSBjb250YWluZXIgbWF5IG9yIG1heSBub3QgaGF2ZSBhIHNjaGVtYSB3aXRoIGEgbWF0Y2hpbmcgbmFtZS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U2NoZW1hKCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TZXF1ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TZXF1ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc4NTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2VxdWVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSBzZXF1ZW5jZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2UncyBzY2hlbWEuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1RhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1RhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2MyZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBEYXRhYmFzZSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZSBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUncyBzY2hlbWEuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRDb2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjb2x1bW5zIHRoZSB0YWJsZSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0Q29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIHdpdGggc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgY29sdW1uJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlDb2x1bW4gZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbiBpZGVudGlmZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpCi0JICovCi0JQ29sdW1uIGdldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5IGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyB0aGUgdGFibGUgY29udGFpbnMuCi0JICovCi0JaW50IGdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4uIFRocm93IGFuCi0JICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgdGhlIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5IGNvbHVtbi4KLQkgKi8KLQlDb2x1bW4gZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIGZvcmVpZ24ga2V5cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgZm9yZWlnbiBrZXlzLgotCSAqLwotCUl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmb3JlaWduIGtleXMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRGb3JlaWduS2V5c1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRhYmxlIGlzIHBvc3NpYmx5IGEgImpvaW4iIHRhYmxlCi0JICogKGkuZS4gaXQgY29udGFpbnMgb25seSAyIGZvcmVpZ24ga2V5cykuIFdoZXRoZXIgdGhlIHRhYmxlIDxlbT5hY3R1YWxseTwvZW0+IGlzCi0JICogYSAiam9pbiIgdGFibGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2VtYW50aWNzIG9mIHRoZSBkYXRhYmFzZSBkZXNpZ24uCi0JICovCi0JYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBBc3N1bWluZyB0aGUgdGFibGUgaXMgYSAiam9pbiIgdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogIm93bmluZyIgdGFibGUuCi0JICogQHNlZSAjaXNQb3NzaWJsZUpvaW5UYWJsZSgpCi0JICovCi0JRm9yZWlnbktleSBnZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0KLQkvKioKLQkgKiBBc3N1bWluZyB0aGUgdGFibGUgaXMgYSAiam9pbiIgdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogIm5vbi1vd25pbmciIHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgImpvaW4iIHRhYmxlLCByZXR1cm4gd2hldGhlciBpdHMgbmFtZSBtYXRjaGVzCi0JICogdGhlIEpQQSBkZWZhdWx0IChpLmUuIDxjb2RlPiJPV05JTkdUQUJMRV9OT05PV05JTkdUQUJMRSI8L2NvZGU+KS4KLQkgKiBAc2VlICNpc1Bvc3NpYmxlSm9pblRhYmxlKCkKLQkgKi8KLQlib29sZWFuIGpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzA0NmI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ2F0YWxvZ1dyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotCi0vKioKLSAqIFdyYXAgYSBEVFAgQ2F0YWxvZwotICovCi1maW5hbCBjbGFzcyBEVFBDYXRhbG9nV3JhcHBlcgotCWV4dGVuZHMgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ2F0YWxvZwotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgY2F0YWxvZyAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZzsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBDYXRhbG9nV3JhcHBlcihEVFBEYXRhYmFzZVdyYXBwZXIgZGF0YWJhc2UsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cpIHsKLQkJc3VwZXIoZGF0YWJhc2UsIGR0cENhdGFsb2cpOwotCQl0aGlzLmR0cENhdGFsb2cgPSBkdHBDYXRhbG9nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY2F0YWxvZ0NoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBTY2hlbWEuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRnJvbUNhdGFsb2dzKGR0cFNjaGVtYSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFRhYmxlLmdldFNjaGVtYSgpLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpIDoKLQkJCQkJCXRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRUYWJsZUZyb21DYXRhbG9ncyhkdHBUYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pIDoKLQkJCQkJCXRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDb2x1bW5Gcm9tQ2F0YWxvZ3MoZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZyA9PSBjYXRhbG9nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmYjJiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmRiZGVmaW5pdGlvbi5QcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5DaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkV4YWN0TnVtZXJpY0RhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5OdW1lcmljYWxEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJlZGVmaW5lZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb2x1bW4KLSAqLwotZmluYWwgY2xhc3MgRFRQQ29sdW1uV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBDb2x1bW4KLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbHVtbiAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW47Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ29sdW1uV3JhcHBlcihEVFBUYWJsZVdyYXBwZXIgdGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXN1cGVyKHRhYmxlLCBkdHBDb2x1bW4pOwotCQl0aGlzLmR0cENvbHVtbiA9IGR0cENvbHVtbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbHVtbkNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIChEVFBUYWJsZVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnModGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5pc051bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhVHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKSBpbnN0YW5jZW9mIE51bWVyaWNhbERhdGFUeXBlOwotCX0JCi0KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgTnVtZXJpY2FsRGF0YVR5cGUpID8KLQkJCQkJCSgoTnVtZXJpY2FsRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmVjaXNpb24oKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjYWxlKCl7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIEV4YWN0TnVtZXJpY0RhdGFUeXBlKSA/Ci0JCQkJCQkoKEV4YWN0TnVtZXJpY0RhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0U2NhbGUoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpID8KLQkJCQkJCSgoQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRMZW5ndGgoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xPQigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQkJCQlwcmltaXRpdmVUeXBlSXNMb2IoKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkpIDoKLQkJCQkJCWZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQljb252ZXJ0VG9KUEFKYXZhVHlwZSh0aGlzLmdldEphdmFUeXBlKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKSkgOgotCQkJREVGQVVMVF9KQVZBX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkgewotCQlyZXR1cm4gY29udmVydFRvSlBBUHJpbWFyeUtleUphdmFUeXBlKHRoaXMuZ2V0SmF2YVR5cGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhVHlwZSBnZXRKYXZhVHlwZShQcmVkZWZpbmVkRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJLy8gdGhpcyBpcyBqdXN0IGEgYml0IGhhY2t5OiBtb3ZpbmcgZnJvbSBhIHR5cGUgZGVjbGFyYXRpb24gdG8gYSBjbGFzcyBuYW1lIHRvIGEgdHlwZSBkZWNsYXJhdGlvbi4uLgotCQlTdHJpbmcgZHRwSmF2YUNsYXNzTmFtZSA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24oZGF0YVR5cGUpLmdldEphdmFDbGFzc05hbWUoKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVKYXZhVHlwZShSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKGR0cEphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24gcmVzb2x2ZURlZmluaXRpb24oUHJlZGVmaW5lZERhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RFRQRGVmaW5pdGlvbigpLmdldFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24oZGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbiA9PSBjb2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpEQkMgc3BlYyBzYXlzIEpEQkMgZHJpdmVycyBzaG91bGQgYmUgYWJsZSB0byBtYXAgQkxPQnMgYW5kIENMT0JzCi0JICogZGlyZWN0bHksIGJ1dCB0aGUgSlBBIHNwZWMgZG9lcyBub3QgYWxsb3cgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZSBjb252ZXJ0VG9KUEFKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIEJZVEVfQVJSQVlfSkFWQV9UWVBFOwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQ0xPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQkJfQotCQlyZXR1cm4gamF2YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIEpQQSBzcGVjIFsyLjEuNF0gc2F5cyBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGFsbG93ZWQgaW4KLQkgKiBwcmltYXJ5IGtleSBmaWVsZHM6PHVsPgotCSAqICAgICA8bGk+W3ZhcmlhYmxlXSBwcmltaXRpdmVzCi0JICogICAgIDxsaT5bdmFyaWFibGVdIHByaW1pdGl2ZSB3cmFwcGVycwotCSAqICAgICA8bGk+e0BsaW5rIGphdmEubGFuZy5TdHJpbmd9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS51dGlsLkRhdGV9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS5zcWwuRGF0ZX0KLQkgKiA8L3VsPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlIGNvbnZlcnRUb0pQQVByaW1hcnlLZXlKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZSgpCi0JCQkJfHwgamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTVFJJTkdfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhVVElMX0RBVEVfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTUUxfREFURV9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gamF2YVR5cGU7Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhCSUdfREVDSU1BTF9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gTE9OR19KQVZBX1RZUEU7ICAvLyA/PwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoU1FMX1RJTUVfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQkvLyBhbGwgdGhlIG90aGVyIHR5cGljYWwgdHlwZXMgYXJlIHByZXR0eSBtdWNoIHVuLW1hcHBhYmxlIC0gcmV0dXJuIFN0cmluZyg/KQotCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1pdGl2ZVR5cGVJc0xvYihQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUpIHsKLQkJcmV0dXJuIChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQklOQVJZX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKTsKLQl9Ci0KLQotCS8vICoqKioqIHNvbWUgY29uc3RhbnRzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRoZSBjb2x1bW4gdG8gYSBKYXZhIGF0dHJpYnV0ZQotCS8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIERFRkFVTFRfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQkxPQl9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuQmxvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQllURV9BUlJBWV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoYnl0ZVtdLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIENMT0JfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLkNsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNUUklOR19KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBVVElMX0RBVEVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5EYXRlLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfREFURV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuRGF0ZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX1RJTUVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCSUdfREVDSU1BTF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIExPTkdfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGxvbmcuY2xhc3MpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkODZiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0vKioKLSAqIFdyYXAgdGhlIERUUCBQcm9maWxlTWFuYWdlciBpbiB5ZXQgYW5vdGhlciBzaW5nbGV0b24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkKLQlpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQotewotCXByaXZhdGUgUHJvZmlsZU1hbmFnZXIgZHRwUHJvZmlsZU1hbmFnZXI7Ci0KLQlwcml2YXRlIExvY2FsUHJvZmlsZUxpc3RlbmVyIHByb2ZpbGVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IElOU1RBTkNFID0gbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiAncHJpdmF0ZScgdG8gZW5zdXJlIHNpbmdsZXRvbgotCSAqLwotCXByaXZhdGUgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaWZlY3ljbGUgKioqKioqKioqKgotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnQoKSB7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmFkZFByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGJ5IHBsdWctaW4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc3RvcCgpIHsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlci5yZW1vdmVQcm9maWxlTGlzdGVuZXIodGhpcy5wcm9maWxlTGlzdGVuZXIpOwotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lciA9IG51bGw7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIHByb2ZpbGVzICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBhZGFwdGVyKSB7Ci0JCWZvciAoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUgOiB0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmdldFByb2ZpbGVzKCkpIHsKLQkJCWlmIChkdHBQcm9maWxlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gbmV3IERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcihkdHBQcm9maWxlLCBhZGFwdGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SUNvbm5lY3Rpb25Qcm9maWxlLCBTdHJpbmc+KHRoaXMuZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCQkgcmV0dXJuIGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIEl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZT4gZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8SUNvbm5lY3Rpb25Qcm9maWxlPih0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLmdldFByb2ZpbGVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyLmFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCBldmVudHMgdG8gdGhlIGZhY3RvcnkncyBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyMSB7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcj4oQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5jbGFzcyk7Ci0KLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogSVByb2ZpbGVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUFkZGVkKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGR0cFByb2ZpbGUuZ2V0TmFtZSgpOwotCQkJZm9yIChDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZUFkZGVkKG5hbWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUsIFN0cmluZyBvbGROYW1lLCBTdHJpbmcgb2xkRGVzY3JpcHRpb24sIEJvb2xlYW4gb2xkQXV0b0Nvbm5lY3QpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlpZiAoICEgbmV3TmFtZS5lcXVhbHMob2xkTmFtZSkpIHsKLQkJCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCQlsaXN0ZW5lci5jb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQob2xkTmFtZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZUNoYW5nZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCS8vIHRoaXMgbWV0aG9kIHNob3VsZG4ndCBiZSBjYWxsZWQgb24gSVByb2ZpbGVMaXN0ZW5lcjEKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCVN0cmluZyBuYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChuYW1lKTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmODRjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Ecml2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUuRGF0YWJhc2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5jb3JlLnByb2ZpbGUuUHJvZmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgQ29ubmVjdGlvblByb2ZpbGUKLSAqLwotZmluYWwgY2xhc3MgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyCi0JaW1wbGVtZW50cyBEVFBEYXRhYmFzZU9iamVjdCwgQ29ubmVjdGlvblByb2ZpbGUKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSAqLwotCXByaXZhdGUgZmluYWwgSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqIGFkYXB0ZXIgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCAoZGV0ZXJtaW5lcyBpZGVudGlmaWVyIGRlbGltaXRlcnMsIGV0Yy4pICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGlkZW50aWZpZXJBZGFwdGVyOwotCi0JLyoqIGNhbGxiYWNrIHBhc3NlZCB0byB0aGUgaWRlbnRpZmllciBhZGFwdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHRDYWxsYmFjayBpZGVudGlmaWVyQWRhcHRlckNhbGxiYWNrOwotCi0JLyoqIHRoZSBEVFAgbWFuYWdlZCBjb25uZWN0aW9uIHdlIGxpc3RlbiB0byAqLwotCXByaXZhdGUgZmluYWwgSU1hbmFnZWRDb25uZWN0aW9uIGR0cE1hbmFnZWRDb25uZWN0aW9uOwotCi0JLyoqCi0JICogZm9yd2FyZCBldmVudHMgZnJvbSB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiBhYm92ZTsKLQkgKiB3ZSBsaXN0ZW4gYW5kIHByb3BhZ2F0ZSBldmVudHMgaWZmIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcwotCSAqLwotCXByaXZhdGUgZmluYWwgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQsIGFuZCBkZWxldGVkIGF0IGRpc2Nvbm5lY3QgKi8KLQlwcml2YXRlIERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJVkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA9ICJqYXZhLnNxbC5Db25uZWN0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPRkZMSU5FX0RUUF9DT05ORUNUSU9OX1RZUEUgPSBDb25uZWN0aW9uSW5mby5jbGFzcy5nZXROYW1lKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfUFJPRFVDVF9QUk9QX0lEID0gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc2VydmVyLnZlcnNpb24iOyAgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlcihJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ29ubmVjdGlvblByb2ZpbGUsIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlID0gZHRwQ29ubmVjdGlvblByb2ZpbGU7Ci0JCXRoaXMuaWRlbnRpZmllckFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmlkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2sgPSBuZXcgSWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjaygpOwotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uID0gdGhpcy5idWlsZERUUE1hbmFnZWRDb25uZWN0aW9uKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCS8vIGRvbid0IGxpc3RlbiB0byB0aGUgbWFuYWdlZCBjb25uZWN0aW9uIHlldAotCX0KLQotCXByaXZhdGUgSU1hbmFnZWRDb25uZWN0aW9uIGJ1aWxkRFRQTWFuYWdlZENvbm5lY3Rpb24oKSB7Ci0JCVN0cmluZyBjb25uZWN0aW9uVHlwZSA9IHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKSA/Ci0JCQkJT0ZGTElORV9EVFBfQ09OTkVDVElPTl9UWVBFIDogTElWRV9EVFBfQ09OTkVDVElPTl9UWVBFOwotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRNYW5hZ2VkQ29ubmVjdGlvbihjb25uZWN0aW9uVHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgamF2YUlkZW50aWZpZXIpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJLy8gY29ubmVjdGlvbiBwcm9maWxlcyBkbyBub3QgaGF2ZSAiaWRlbnRpZmllcnMiCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgPT0gbnVsbCkgewotCQkJdGhpcy5kYXRhYmFzZSA9IHRoaXMuYnVpbGREYXRhYmFzZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb25uZWN0aW9uUHJvZmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBwcm9wZXJ0aWVzCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlcklEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRQcm92aWRlcklkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YW5jZUlEKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRJbnN0YW5jZUlEKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9OQU1FX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VQcm9kdWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEQVRBQkFTRV9QUk9EVUNUX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRVJTSU9OX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIgbmFtZS4KLQkgKiBBbGxvd3MgdXNlciBuYW1lIGNvbXBvc2VkIGJ5IG1vcmUgdGhhbiBvbmUgd29yZC4KLQkgKiBJZiB0aGUgdXNlciBuYW1lIGNvbnRhaW5zIGEga2V5d29yZCwgaXQgcmV0dXJucyB0aGUgZmlyc3Qgd29yZCBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCVN0cmluZyB1c2VyTmFtZSA9IHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQpOwotCQl1c2VyTmFtZSA9IHVzZXJOYW1lLnRyaW0oKTsgCi0JCVN0cmluZ1tdIG5hbWVzID0gIHVzZXJOYW1lLnNwbGl0KCJcXHMrIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYobmFtZXMubGVuZ3RoID09IDMpIHsgLy8gMjA4OTQ2IGhhbmRsZSB1c2VybmFtZSBsaWtlICJzeXMgYXMgc3lzZGJhIiBvbiBPcmFjbGUKLQkJICAgIGlmKHRoaXMubmFtZUlzS2V5d29yZChuYW1lc1sxXSkpIHsKLQkJICAgIAlyZXR1cm4gbmFtZXNbMF07Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIHVzZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KERSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREcml2ZXJJbnN0YW5jZUJ5SUQodGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSkuZ2V0SmFyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuIERyaXZlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXREcml2ZXJJbnN0YW5jZUJ5SUQodGhpcy5nZXREcml2ZXJEZWZpbml0aW9uSUQoKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8vICoqKioqIGNvbm5lY3Rpb24KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKSB8fCB0aGlzLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0luYWN0aXZlKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQWN0aXZlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkKLQkJCQkmJiAhIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzY29ubmVjdGVkKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQ29ubmVjdGVkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLQkJaWYgKHRoaXMuaXNEaXNjb25uZWN0ZWQoKSkgewotCQkJdGhpcy5jaGVja1N0YXR1cyh0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJdGhpcy5jaGVja1N0YXR1cyh0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKSk7Ci0JfQotCi0JLy8gKioqKiogb2ZmLWxpbmUgc3VwcG9ydAotCXB1YmxpYyBib29sZWFuIGlzV29ya2luZ09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBzYXZlV29ya09mZmxpbmVEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbldvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHdvcmtPZmZsaW5lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCX0KLQkKLQkvLyAqKioqKiBsaXN0ZW5lcnMKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7ICAvLyBmaXJzdCBsaXN0ZW5lciBhZGRlZAotCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmRhdGFiYXNlICE9IG51bGwpIHsgIC8vIGRvbid0IHRyaWdnZXIgZGF0YWJhc2UgY3JlYXRpb24KLQkJCWlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHsgIC8vIERUUCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiBvZmYtbGluZQotCQkJCXRoaXMuZGF0YWJhc2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsgIC8vIGxhc3QgbGlzdGVuZXIgcmVtb3ZlZAotCQkJdGhpcy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgeyAgLy8gZG9uJ3QgdHJpZ2dlciBkYXRhYmFzZSBjcmVhdGlvbgotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCWJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5oYXNOb0xpc3RlbmVycygpOwotCX0KLQotCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuaGFzQW55TGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCWZvciAoSVN0YXR1cyBjaGlsZCA6IHN0YXR1cy5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJdGhpcy5jaGVja1N0YXR1cyhjaGlsZCk7ICAvLyByZWN1cnNlLCBsb29raW5nIGZvciB0aGUgZmlyc3QgZXJyb3IKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGF0dXMuZ2V0RXhjZXB0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgRFRQRGF0YWJhc2VXcmFwcGVyIGJ1aWxkRGF0YWJhc2UoKSB7Ci0JCWlmICh0aGlzLmlzSW5hY3RpdmUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAodGhpcy5pc1dvcmtpbmdPZmZsaW5lKCkpIHsKLQkJCUNvbm5lY3Rpb25JbmZvIGNvbm5lY3Rpb25JbmZvID0gKENvbm5lY3Rpb25JbmZvKSB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmdldENvbm5lY3Rpb24oKS5nZXRSYXdDb25uZWN0aW9uKCk7Ci0JCQlyZXR1cm4gbmV3IERUUERhdGFiYXNlV3JhcHBlcih0aGlzLCBjb25uZWN0aW9uSW5mby5nZXRTaGFyZWREYXRhYmFzZSgpKTsKLQkJfQotCi0JCS8vIFRPRE8gc2VlIERUUCBidWcgMjAyMzA2Ci0JCS8vIHBhc3MgY29ubmVjdD10cnVlIGluIHRvIFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKCkKLQkJLy8gdGhlcmUgaXMgYSBidWcgbWVudGlvbmVkIGluIGEgY29tbWVudDogCi0JCS8vICAgICAiZHVyaW5nIHRoZSBwcm9maWxlIGNvbm5lY3RlZCBldmVudCBub3RpZmljYXRpb24sIAotCQkvLyAgICAgSU1hbmFnZWRDb25uZWN0aW9uIGlzIGNvbm5lY3RlZCB3aGlsZSBJQ29ubmVjdGlvblByb2ZpbGUgaXMgbm90IgotCQkvLyBzbywgc29tZSBoYWNrZXJ5IGhlcmUgdG8gaGFuZGxlIGhhY2tlcnkgdGhlcmUKLQkJcmV0dXJuIG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIodGhpcywgUHJvZmlsZVV0aWwuZ2V0RGF0YWJhc2UobmV3IERhdGFiYXNlSWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSksIHRydWUpKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRhdGFiYXNlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJCXRoaXMuZGF0YWJhc2UgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBjb252ZXJ0IGFuIGlkZW50aWZpZXIgdG8gYSBuYW1lCi0JICogKGUuZy4ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpfSkuCi0JICogV2UgY2hhbm5lbCBhbGwgdGhlIGNhbGxzIHRvIGhlcmUgYW5kIHRoZW4gd2UgZGVsZWdhdGUgdG8gdGhlCi0JICogY2xpZW50LXN1cHBsaWVkICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiLgotCSAqLwotCVN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5pZGVudGlmaWVyQWRhcHRlci5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyLCB0aGlzLmlkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2spOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0ICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiIGNhbGxzIGJhY2sgdG8gaGVyZSBzbyB3ZSBjYW4gZGVsZWdhdGUgdG8KLQkgKiB0aGUgZGF0YWJhc2UsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb3Blcmx5Ci0JICogY29udmVydCBpZGVudGlmaWVycy4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWVfKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCS8vIHRoZSBkYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwgaGVyZSAtIGNhbGwgaXRzIGludGVybmFsIG1ldGhvZAotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb252ZXJ0SWRlbnRpZmllclRvTmFtZV8oaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgd2UgbmVlZCB0byBjb252ZXJ0IGEgbmFtZSB0byBhbiBpZGVudGlmaWVyCi0JICogKGUuZy4ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUjZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcpfSkuCi0JICogV2UgY2hhbm5lbCBhbGwgdGhlIGNhbGxzIHRvIGhlcmUgYW5kIHRoZW4gd2UgZGVsZWdhdGUgdG8gdGhlCi0JICogY2xpZW50LXN1cHBsaWVkICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5pZGVudGlmaWVyQWRhcHRlci5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihuYW1lLCB0aGlzLmlkZW50aWZpZXJBZGFwdGVyQ2FsbGJhY2spOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0ICJkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIiIGNhbGxzIGJhY2sgdG8gaGVyZSBzbyB3ZSBjYW4gZGVsZWdhdGUgdG8KLQkgKiB0aGUgZGF0YWJhc2UsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIHByb3Blcmx5Ci0JICogY29udmVydCBuYW1lcy4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXJfKFN0cmluZyBuYW1lKSB7Ci0JCS8vIHRoZSBkYXRhYmFzZSBzaG91bGQgbm90IGJlIG51bGwgaGVyZSAtIGNhbGwgaXRzIGludGVybmFsIG1ldGhvZAotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcl8obmFtZSk7Ci0JfQotCi0Jdm9pZCBkYXRhYmFzZUNoYW5nZWQoRFRQRGF0YWJhc2VXcmFwcGVyIGRiKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChkYik7Ci0JfQotCi0Jdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOwotCX0KLQotCXZvaWQgc2NoZW1hQ2hhbmdlZChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5zY2hlbWFDaGFuZ2VkKHNjaGVtYSk7Ci0JfQotCi0Jdm9pZCBzZXF1ZW5jZUNoYW5nZWQoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChzZXF1ZW5jZSk7Ci0JfQotCi0Jdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnRhYmxlQ2hhbmdlZCh0YWJsZSk7Ci0JfQotCi0Jdm9pZCBjb2x1bW5DaGFuZ2VkKERUUENvbHVtbldyYXBwZXIgY29sdW1uKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmNvbHVtbkNoYW5nZWQoY29sdW1uKTsKLQl9Ci0KLQl2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoZm9yZWlnbktleSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRCYXNlUHJvcGVydGllcygpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5hbWVJc0tleXdvcmQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYXMiKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQIGNvbm5lY3Rpb24gbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcyB7QGxpbmsgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lcn0gYW5kCi0JICoge0BsaW5rIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lcn0gZXZlbnRzIHRvIHtAbGluayBDb25uZWN0aW9uTGlzdGVuZXJ9cy4KLQkgKi8KLQljbGFzcyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lciB7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxDb25uZWN0aW9uTGlzdGVuZXI+KENvbm5lY3Rpb25MaXN0ZW5lci5jbGFzcyk7Ci0KLQkJTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCk7Ci0JCX0KLQotCQlib29sZWFuIGhhc0FueUxpc3RlbmVycygpIHsKLQkJCXJldHVybiAhIHRoaXMubGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBJTWFuYWdlZENvbm5lY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLy8gb2ZmLWxpbmUgb3IgaW5hY3RpdmUgPT4gbGl2ZQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3QgYnVpbGQgdGhlIGRhdGFiYXNlIGhlcmUgLSBpdCBpcyBidWlsdCBvbi1kZW1hbmQKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIub3BlbmVkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBUaGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgZnJvbSB0aGUgYmFzZSBEVFAgY29kZS4KLQkJICogUGVyaGFwcyBEVFAgZXh0ZW5kZXJzIGNhbGwgaXQuLi4uCi0JCSAqIEBzZWUgTWFuYWdlZENvbm5lY3Rpb24jZmlyZU1vZGlmaWVkRXZlbnQoT2JqZWN0KQotCQkgKiAgICAgd2hpY2ggaXMgbmV2ZXIgY2FsbGVkLi4uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIubW9kaWZpZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlpZiAoICEgbGlzdGVuZXIub2tUb0Nsb3NlKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmFib3V0VG9DbG9zZShEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBsaXZlIG9yIG9mZi1saW5lID0+IGluYWN0aXZlCi0JCXB1YmxpYyB2b2lkIGNsb3NlZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGNsZWFyIHRoZSBkYXRhYmFzZQotCQkJRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMuY2xlYXJEYXRhYmFzZSgpOwotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jbG9zZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJLy8gbGl2ZSA9PiBvZmYtbGluZQotCQlwdWJsaWMgYm9vbGVhbiBva1RvRGV0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gIm9rIHRvIGNsb3NlIiBldmVudDsKLQkJCS8vIHdlIGFyZSAiY2xvc2luZyIgdGhlIGxpdmUgY29ubmVjdGlvbgotCQkJcmV0dXJuIHRoaXMub2tUb0Nsb3NlKGV2ZW50KTsKLQkJfQotCQkKLQkJLy8gbGl2ZSA9PiBvZmYtbGluZQotCQlwdWJsaWMgdm9pZCBhYm91dFRvRGV0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYSAiY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQl0aGlzLmNsb3NlZChldmVudCk7Ci0JCX0KLQotCQkvLyBpbmFjdGl2ZSBvciBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIHdvcmtpbmdPZmZsaW5lKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gIm9wZW4iIGV2ZW50OwotCQkJLy8gd2UgYXJlICJvcGVuaW5nIiB0aGUgb2ZmLWxpbmUgY29ubmVjdGlvbgotCQkJdGhpcy5vcGVuZWQoZXZlbnQpOwotCQl9Ci0KLQkJLy8gb2ZmLWxpbmUgPT4gbGl2ZQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQXR0YWNoKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY29udmVydCB0aGUgZXZlbnQgdG8gYW4gImNsb3NlIiBldmVudDsKLQkJCS8vIHdlIGFyZSAiY2xvc2luZyIgdGhlIG9mZi1saW5lIGNvbm5lY3Rpb24KLQkJCXRoaXMuY2xvc2VkKGV2ZW50KTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCQl2b2lkIGRhdGFiYXNlQ2hhbmdlZChEVFBEYXRhYmFzZVdyYXBwZXIgZGIpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5kYXRhYmFzZUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGRiKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgY2F0YWxvZ0NoYW5nZWQoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZykgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNhdGFsb2dDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBjYXRhbG9nKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgc2NoZW1hQ2hhbmdlZChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLnNjaGVtYUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIHNjaGVtYSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNlcXVlbmNlQ2hhbmdlZChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UpIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5zZXF1ZW5jZUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIHNlcXVlbmNlKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgdGFibGVDaGFuZ2VkKERUUFRhYmxlV3JhcHBlciB0YWJsZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLnRhYmxlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgdGFibGUpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBjb2x1bW5DaGFuZ2VkKERUUENvbHVtbldyYXBwZXIgY29sdW1uKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY29sdW1uQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgY29sdW1uKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgZm9yZWlnbktleUNoYW5nZWQoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmZvcmVpZ25LZXlDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBmb3JlaWduS2V5KTsKLQkJCX0KLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgRGF0YWJhc2VGaW5kZXIgKioqKioqKioqKgotCi0JY2xhc3MgSWRlbnRpZmllckFkYXB0ZXJDYWxsYmFjayBpbXBsZW1lbnRzIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuRGVmYXVsdENhbGxiYWNrIHsKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQkJLy8gY2FsbCBiYWNrIHRvIHRoZSBpbnRlcm5hbCBtZXRob2QKLQkJCXJldHVybiBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZV8oaWRlbnRpZmllcik7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQkJLy8gY2FsbCBiYWNrIHRvIHRoZSBpbnRlcm5hbCBtZXRob2QKLQkJCXJldHVybiBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcy5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcl8obmFtZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllMjJlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotCi0vKioKLSAqIERUUCBkYXRhYmFzZSBvYmplY3QKLSAqLwotcHVibGljIGludGVyZmFjZSBEVFBEYXRhYmFzZU9iamVjdCBleHRlbmRzIERhdGFiYXNlT2JqZWN0IHsKLQotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCURUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM3OTkyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuUmVmcmVzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci0KLS8qKgotICogIERUUCBDYXRhbG9nIE9iamVjdCBXcmFwcGVyIGJhc2UgY2xhc3MKLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyCi0JaW1wbGVtZW50cyBEVFBEYXRhYmFzZU9iamVjdAotewotCS8qKiB3ZSBuZWVkIGEgd2F5IHRvIGdldCB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlICovCi0JcHJpdmF0ZSBmaW5hbCBEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQ7Ci0KLQkvKiogbGlzdGVuIGZvciB0aGUgImNhdGFsb2cgb2JqZWN0IiBiZWluZyByZWZyZXNoZWQgKi8KLQlwcml2YXRlIGZpbmFsIElDYXRhbG9nT2JqZWN0TGlzdGVuZXIgY2F0YWxvZ09iamVjdExpc3RlbmVyOwotCi0JLyoqIGxpc3RlbiBmb3IgdGhpcyBEVFAgY2F0YWxvZyBvYmplY3QgdG8gcmVmcmVzaCAqLwotCWZpbmFsIElDYXRhbG9nT2JqZWN0IGNhdGFsb2dPYmplY3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCURUUERhdGFiYXNlT2JqZWN0V3JhcHBlcihEVFBEYXRhYmFzZU9iamVjdCBwYXJlbnQsIE9iamVjdCBkdHBPYmplY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gd2Ugb25seSBsaXN0ZW4gdG8gImxpdmUiIGNvbm5lY3Rpb25zIChhcyBvcHBvc2VkIHRvICJvZmYtbGluZSIgY29ubmVjdGlvbnMpOwotCQkJLy8gYW5kIHRoZSBtb2RlbCBpcyByZWJ1aWx0IHdoZW4gdGhlIGNvbm5lY3Rpb24gY29ubmVjdHMgb3IgZGlzY29ubmVjdHMKLQkJCXRoaXMuY2F0YWxvZ09iamVjdCA9IChJQ2F0YWxvZ09iamVjdCkgZHRwT2JqZWN0OwotCQkJdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCk7Ci0JCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmhhc0FueUxpc3RlbmVycygpKSB7Ci0JCQkJdGhpcy5zdGFydExpc3RlbmluZygpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5jYXRhbG9nT2JqZWN0ID0gbnVsbDsKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNhdGFsb2dPYmplY3RMaXN0ZW5lciBidWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJQ2F0YWxvZ09iamVjdCBkbUVsZW1lbnQsIGludCBldmVudFR5cGUpIHsKLQkJCQlpZiAoZG1FbGVtZW50ID09IERUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3QpIHsKLQkJCQkJLy8gJ2V2ZW50VHlwZScgZG9lc24ndCBzZWVtIHRvIGJlIHZlcnkgdXNlZnVsLCBzbyBkcm9wIGl0Ci0JCQkJCURUUERhdGFiYXNlT2JqZWN0V3JhcHBlci50aGlzLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIHR5cGljYWxseSwgbm90aWZ5IHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc29tZXRoaW5nIGhhcyBjaGFuZ2VkCi0Jdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBEVFAgb2JqZWN0IGhhcyBjaGFuZ2VkLCBjbGVhciB0aGUgd3JhcHBlcidzIHN0YXRlIHNvIGl0IHdpbGwgYmUKLQkgKiBzeW5jaHJvbml6ZWQgb24tZGVtYW5kLgotCSAqLwotCWFic3RyYWN0IHZvaWQgY2xlYXIoKTsKLQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0IGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBJZgotCSAqIHRoZSBpZGVudGlmaWVyIGlzICJkZWxpbWl0ZWQiICh0eXBpY2FsbHkgd2l0aCBkb3VibGUtcXVvdGVzKSwgaXQgd2lsbCBiZQotCSAqIHVzZWQgd2l0aG91dCBhbnkgZm9sZGluZy4gSWYgdGhlIG5hbWUgaXMgInJlZ3VsYXIiIChpLmUuIG5vdCBkZWxpbWl0ZWQpLAotCSAqIGl0IHdpbGwgYmUgZm9sZGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBjYXNlICh0eXBpY2FsbHkgdXBwZXJjYXNlKS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB3aGVuZXZlciB3ZSBuZWVkIHRvIGZpbmQgYSBjb21wb25lbnQgYnkgaWRlbnRpZmllcgotCSAqIChlLmcuIHt7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZyl9KS4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQoZGF0YWJhc2VPYmplY3RzLCB0aGlzLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKGlkZW50aWZpZXIpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0SWRlbnRpZmllclRvTmFtZShTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFQgZGJPYmplY3QgOiBkYXRhYmFzZU9iamVjdHMpIHsKLQkJCWlmIChkYk9iamVjdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRiT2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEV4YW1wbGVzOjx1bD4KLQkgKiA8bGk+T3JhY2xlIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShGT08pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5UYWJsZShCQVIpIHZzLiAiRm9vIiA9PiAiQkFSIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiXCJCYXJcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoZm9vKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+VGFibGUoYmFyKSB2cy4gIkZvbyIgPT4gImJhciIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgdnMuICJGb28iID0+ICJcIkZvb1wiIgotCSAqICAgICA8bGk+VGFibGUoQmFyKSB2cy4gIkZvbyIgPT4gIlwiQmFyXCIiCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPlNRTCBTZXJ2ZXIgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgdnMuICJGb28iID0+ICJmb28iCi0JICogICAgIDxsaT5UYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgotCSAqICAgICA8bGk+VGFibGUoQmFyKSB2cy4gIkZvbyIgPT4gIkJhciIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcihTdHJpbmcgZGVmYXVsdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSwgZGVmYXVsdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEV4YW1wbGVzOjx1bD4KLQkgKiA8bGk+T3JhY2xlIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShGT08pID0+ICJGT08iCi0JICogICAgIDxsaT5UYWJsZShGb28pID0+ICJcIkZvb1wiIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiXCJmb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbysrKSA9PiAiXCJmb28rK1wiIgotCSAqICAgICA8bGk+VGFibGUoZiJvKSA9PiAiXCJmXCJcIm9cIiIgKGkuZS4gImYiIm8iKQotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5Qb3N0Z3JlU1FMIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShGT08pID0+ICJcIkZPT1wiIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgPT4gImZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbysrKSA9PiAiXCJmb28rK1wiIgotCSAqICAgICA8bGk+VGFibGUoZiJvKSA9PiAiXCJmXCJcIm9cIiIgKGkuZS4gImYiIm8iKQotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5TUUwgU2VydmVyIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShGT08pID0+ICJGT08iCi0JICogICAgIDxsaT5UYWJsZShGb28pID0+ICJGb28iCi0JICogICAgIDxsaT5UYWJsZShmb28pID0+ICJmb28iCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nIHRvIERUUCBkYXRhYmFzZSBvYmplY3QgKioqKioqKioqKgotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIGxpc3RlbmVycwotCXZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLkFkZExpc3RlbmVyKHRoaXMuY2F0YWxvZ09iamVjdCwgdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCX0KLQotCS8vIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyAibGl2ZSIgYW5kIGhhcyBubyBsaXN0ZW5lcnMKLQl2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotICAgICAgICBSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbW92ZUxpc3RlbmVyKHRoaXMuY2F0YWxvZ09iamVjdCwgdGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0xpc3RlbmVyKCkgewotCQlpZiAodGhpcy5jYXRhbG9nT2JqZWN0TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhlIGNhdGFsb2cgbGlzdGVuZXIgaXMgbnVsbCIpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3ZTBjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yLlZlbmRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvci5WZW5kb3JSZXBvc2l0b3J5OwotCi0vKioKLSAqIFdyYXAgYSBEVFAgRGF0YWJhc2UuCi0gKiA8cD4KLSAqIENhdGFsb2dzIHZzLiBTY2hlbWF0YTo8YnI+Ci0gKiBUeXBpY2FsbHksIGlmIGEgRFRQIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgImNhdGFsb2dzIiwKLSAqIG8uZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UjZ2V0Q2F0YWxvZ3MoKSB3aWxsIHJldHVybiBhCi0gKiBzaW5nbGUgY2F0YWxvZyB3aXRob3V0IGEgbmFtZSAoYWN0dWFsbHksIGl0J3MgYW4gZW1wdHkgc3RyaW5nKS4gVGhpcyBjYXRhbG9nCi0gKiB3aWxsIGNvbnRhaW4gYWxsIHRoZSBkYXRhYmFzZSdzIHNjaGVtYXRhLiBXZSB0cnkgdG8gaWdub3JlIHRoaXMgY2F0YWxvZyBhbmQKLSAqIHJldHVybiB0aGUgc2NoZW1hdGEgZnJvbSB0aGUgZGF0YWJhc2UgZGlyZWN0bHkuCi0gKiA8cD4KLSAqIENhdGFsb2cgTm90ZSAxOjxicj4KLSAqIEFzIG9mIEphbiAyMDA5LCB0aGUgRFRQIE15U1FMIGRyaXZlciBpcyBub3QgY29uc2lzdGVudCB3aXRoIHRoaXMgcGF0dGVybi4KLSAqIEEgRFRQIE15U1FMIGRhdGFiYXNlIGhhcyAqbm8qIGNhdGFsb2dzOyBpdCBob2xkcyBhIHNpbmdsZSBzY2hlbWEKLSAqIGRpcmVjdGx5LCBhbmQgdGhhdCBzY2hlbWEgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlLiBTZWUgYnVnIDI0OTAxMy4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDI6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBQb3N0Z3JlU1FMIEpEQkMgZHJpdmVyIGNvbXBsaWNhdGVzIHRoaXMgcGF0dGVybiBhIGJpdC4KLSAqIEV2ZW4gdGhvdWdoIFBvc3RncmVTUUwgZG9lcyBub3Qgc3VwcG9ydCAiY2F0YWxvZ3MiLCBpdHMgSkRCQyBkcml2ZXIKLSAqIHJldHVybnMgYSBzaW5nbGUgY2F0YWxvZyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBkYXRhYmFzZSBzcGVjaWZpZWQKLSAqIGluIHRoZSBKREJDIGNvbm5lY3Rpb24gVVJMLiBUaGUgRFRQIFBvc3RncmVTUUwgZHJpdmVyIHNpbXBseSByZXBsaWNhdGVzIHRoaXMKLSAqIGJlaGF2aW9yLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGNhdGFsb2cgY2FuIGJlIHVubmFtZWQ7IGkuZS4gaXRzIG5hbWUgaXMgYW4KLSAqIGVtcHR5IHN0cmluZy4uLi4KLSAqIDxwPgotICogKFlldCBBbm90aGVyKSBOb3RlOjxicj4KLSAqIFdlIHVzZSAibmFtZSIgd2hlbiBkZWFsaW5nIHdpdGggdGhlIHVubW9kaWZpZWQgbmFtZSBvZiBhIGRhdGFiYXNlIG9iamVjdAotICogYXMgc3VwcGxpZWQgYnkgdGhlIGRhdGFiYXNlIGl0c2VsZiAoaS5lLiBpdCBpcyBub3QgZGVsaW1pdGVkIGFuZCBpdCBpcyBhbHdheXMKLSAqIGNhc2Utc2Vuc2l0aXZlKS4KLSAqIFdlIHVzZSAiaWRlbnRpZmllciIgd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1maW5hbCBjbGFzcyBEVFBEYXRhYmFzZVdyYXBwZXIKLQlleHRlbmRzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIERhdGFiYXNlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBkYXRhYmFzZSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlOwotCi0JLyoqIHZlbmRvci1zcGVjaWZpYyBiZWhhdmlvciAqLwotCXByaXZhdGUgZmluYWwgVmVuZG9yIHZlbmRvcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBzb3J0ZWQgKi8KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gY2F0YWxvZ3M7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBjb25uZWN0aW9uUHJvZmlsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlKSB7Ci0JCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlLCBkdHBEYXRhYmFzZSk7Ci0JCXRoaXMuZHRwRGF0YWJhc2UgPSBkdHBEYXRhYmFzZTsKLQkJdGhpcy52ZW5kb3IgPSBWZW5kb3JSZXBvc2l0b3J5Lmluc3RhbmNlKCkuZ2V0VmVuZG9yKHRoaXMuZ2V0VmVuZG9yTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKiBUT0RPCi0JICogV2UgbWlnaHQgd2FudCB0byBsaXN0ZW4gdG8gdGhlICJ2aXJ0dWFsIiBjYXRhbG9nOyBidXQgdGhhdCdzIHByb2JhYmx5Ci0JICogbm90IG5lY2Vzc2FyeSBzaW5jZSB0aGVyZSBpcyBubyBlYXN5IHdheSBmb3IgdGhlIHVzZXIgdG8gcmVmcmVzaCBpdAotCSAqIChpLmUuIGl0IGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIERUUCBVSSkuCi0JICovCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5kYXRhYmFzZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIERUUERhdGFiYXNlV3JhcHBlciBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmdldFNjaGVtYXModGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpOwotCX0KLQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hRnJvbUNhdGFsb2dzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwU2NoZW1hLmdldENhdGFsb2coKSkuZ2V0U2NoZW1hXyhkdHBTY2hlbWEpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSB3aGVuIHRoZSBkYXRhYmFzZSBpcyB0aGUgc2NoZW1hCi0JICogY29udGFpbmVyLCBzbyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IGNhdGFsb2dzCi0JICovCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIHRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIGNhdGFsb2csIHNvIHdlIGtub3cgd2UgaGF2ZSBjYXRhbG9nczsKLQkgKiBpLmUuIHRoZSBzZWFyY2ggaGFzIHRvIGRlc2NlbmQgdGhyb3VnaCBjYXRhbG9ncywgdGhlbiB0byBzY2hlbWF0YQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZUZyb21DYXRhbG9ncyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBUYWJsZS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldFRhYmxlXyhkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHRoZSBzY2hlbWEKLQkgKiBjb250YWluZXIsIHNvIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSBhbnkgY2F0YWxvZ3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgY2F0YWxvZywgc28gd2Uga25vdyB3ZSBoYXZlIGNhdGFsb2dzOwotCSAqIGkuZS4gdGhlIHNlYXJjaCBoYXMgdG8gZGVzY2VuZCB0aHJvdWdoIGNhdGFsb2dzLCB0aGVuIHRvIHNjaGVtYXRhCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5Gcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERhdGFiYXNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyA8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBzdXBlci5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoZGF0YWJhc2VPYmplY3RzLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9ncwotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLnN1cHBvcnRzQ2F0YWxvZ3ModGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q2F0YWxvZz4odGhpcy5nZXRDYXRhbG9nQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBDYXRhbG9nV3JhcHBlcj4gZ2V0Q2F0YWxvZ1dyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ2F0YWxvZ1dyYXBwZXI+KHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyW10gZ2V0Q2F0YWxvZ0FycmF5KCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dzID0gdGhpcy5idWlsZENhdGFsb2dBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dzOwotCX0KLQotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBidWlsZENhdGFsb2dBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZHRwQ2F0YWxvZ3MgPSB0aGlzLmdldERUUENhdGFsb2dzKCk7Ci0JCURUUENhdGFsb2dXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENhdGFsb2dXcmFwcGVyW2R0cENhdGFsb2dzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENhdGFsb2dXcmFwcGVyKHRoaXMsIGR0cENhdGFsb2dzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMudmVuZG9yLmdldENhdGFsb2dzKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2F0YWxvZ3NTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjYXRhbG9nCi0JICovCi0JRFRQQ2F0YWxvZ1dyYXBwZXIgZ2V0Q2F0YWxvZyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpIHsKLQkJCWlmIChjYXRhbG9nLndyYXBzKGR0cENhdGFsb2cpKSB7Ci0JCQkJcmV0dXJuIGNhdGFsb2c7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY2F0YWxvZzogIiArIGR0cENhdGFsb2cpOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dOYW1lcygpIHsKLQkJLy8gdGhlIGNhdGFsb2dzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRDYXRhbG9nV3JhcHBlcnMoKSwgTkFNRV9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIGNhdGFsb2dzIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRDYXRhbG9nV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcih0aGlzLmdldENhdGFsb2dXcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXModGhpcy5nZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuZ2V0RGVmYXVsdENhdGFsb2dOYW1lcyh0aGlzLmR0cERhdGFiYXNlLCB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjYXRhbG9nIGZvdW5kLgotCSAqLwotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXIgZ2V0Q2F0YWxvZ0Zvck5hbWVzKEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0JCQlEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nTmFtZWQobmFtZSk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNhdGFsb2c7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZmluZCBhIGRlZmF1bHQgY2F0YWxvZywgcmV0dXJuIGl0cyBpZGVudGlmaWVyOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBsYXN0IG5hbWUgb24gdGhlIGxpc3Qgb2YgZGVmYXVsdCBuYW1lcy4KLQkgKiAoU29tZSBkYXRhYmFzZXMgaGF2ZSBtdWx0aXBsZSBwb3NzaWJsZSBkZWZhdWx0IG5hbWVzLikKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbmFtZXMgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nTmFtZXMoKTsKLQkJRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZ0Zvck5hbWVzKG5hbWVzKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhdGFsb2cuZ2V0SWRlbnRpZmllcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIHN0cmVhbS5oYXNOZXh0KCkgPyB0aGlzLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKENvbGxlY3Rpb25Ub29scy5sYXN0KHN0cmVhbSkpIDogbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBzY2hlbWF0YQotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0U2NoZW1hTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5nZXREZWZhdWx0U2NoZW1hTmFtZXModGhpcy5kdHBEYXRhYmFzZSwgdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldFVzZXJOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlbGVnYXRlIHRvIHRoZSB2ZW5kb3IuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyXyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRGVsZWdhdGUgdG8gdGhlIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgY29udmVydElkZW50aWZpZXJUb05hbWVfKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnZlbmRvci5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgbmFtZSB0byBhbiBpZGVudGlmaWVyLiBSZXR1cm4gbnVsbCBpZiB0aGUgcmVzdWx0aW5nCi0JICogaWRlbnRpZmllciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBuYW1lLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgb2xkIGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlCi0JICogc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5Ci0JICogYW5kIHNwZWNpYWwgY2hhcmFjdGVycykuCi0JICovCi0JLy8gVE9ETyBhZGQgdG8gZGF0YWJhc2UgaWRlbnRpZmllciBhZGFwdGVyPyBjdXJyZW50bHkgbm90IHVzZWQuLi4KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy52ZW5kb3IuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSwgZGVmYXVsdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCURhdGFiYXNlRGVmaW5pdGlvbiBnZXREVFBEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gUkRCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGF0YWJhc2VEZWZpbml0aW9uUmVnaXN0cnkoKS5nZXREZWZpbml0aW9uKHRoaXMuZHRwRGF0YWJhc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q2F0YWxvZ3MoKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wQ2F0YWxvZ3MoKSB7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyQ2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckNhdGFsb2dzKCkgewotCQl0aGlzLnN0b3BDYXRhbG9ncygpOwotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmNhdGFsb2dzKSB7Ci0JCQljYXRhbG9nLmNsZWFyKCk7Ci0JCX0KLQkJdGhpcy5jYXRhbG9ncyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZjgzNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotZmluYWwgY2xhc3MgRFRQRm9yZWlnbktleVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgRm9yZWlnbktleQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgZm9yZWlnbiBrZXkgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXIgcmVmZXJlbmNlZFRhYmxlOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGNvbHVtblBhaXJzOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgLSBidXQgaXQgY2FuIGJlICdudWxsJyBzbyB3ZSB1c2UgYSBmbGFnICovCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdEF0dHJpYnV0ZU5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCA9IGZhbHNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUEZvcmVpZ25LZXlXcmFwcGVyKERUUFRhYmxlV3JhcHBlciBiYXNlVGFibGUsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZHRwRm9yZWlnbktleSkgewotCQlzdXBlcihiYXNlVGFibGUsIGR0cEZvcmVpZ25LZXkpOwotCQl0aGlzLmR0cEZvcmVpZ25LZXkgPSBkdHBGb3JlaWduS2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZm9yZWlnbktleUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5nZXROYW1lKCkgKyAiOiAiICsgQXJyYXlzLmFzTGlzdCh0aGlzLmdldENvbHVtblBhaXJBcnJheSgpKSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEZvcmVpZ25LZXkgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldEJhc2VUYWJsZSgpIHsKLQkJcmV0dXJuIChEVFBUYWJsZVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXIgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgewotCQlpZiAodGhpcy5yZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSB0aGlzLmdldEJhc2VUYWJsZSgpLmdldFRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29sdW1uUGFpcnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbiBwYWlycwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29sdW1uUGFpcj4odGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIExvY2FsQ29sdW1uUGFpciBnZXRDb2x1bW5QYWlyKCkgewotCQlMb2NhbENvbHVtblBhaXJbXSBwYWlycyA9IHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCk7Ci0JCWlmIChwYWlycy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgY29sdW1uIHBhaXJzOiAiICsgcGFpcnMubGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcGFpcnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+IGdldExvY2FsQ29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIExvY2FsQ29sdW1uUGFpcltdIGdldENvbHVtblBhaXJBcnJheSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uUGFpcnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5QYWlycyA9IHRoaXMuYnVpbGRDb2x1bW5QYWlyQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGJ1aWxkQ29sdW1uUGFpckFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGJhc2VDb2x1bW5zID0gdGhpcy5nZXREVFBCYXNlQ29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGJhc2VDb2x1bW5zLnNpemUoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiByZWZDb2x1bW5zID0gdGhpcy5nZXREVFBSZWZlcmVuY2VDb2x1bW5zKCk7Ci0JCWlmIChyZWZDb2x1bW5zLnNpemUoKSAhPSBzaXplKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuZ2V0QmFzZVRhYmxlKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKwotCQkJCQkJCQkiIC0gbWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHJlc3VsdCA9IG5ldyBMb2NhbENvbHVtblBhaXJbYmFzZUNvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGJhc2VDb2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgTG9jYWxDb2x1bW5QYWlyKAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihiYXNlQ29sdW1ucy5nZXQoaSkpLAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihyZWZDb2x1bW5zLmdldChpKSkKLQkJCQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIENvbHVtblBhaXIuQkFTRV9DT0xVTU5fQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBSZWZlcmVuY2VDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5QYWlyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXRCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExvY2FsQ29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmdldExvY2FsQ29sdW1uUGFpcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybShMb2NhbENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlib29sZWFuIGJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QmFzZUNvbHVtbnMoKSwgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8Q29sdW1uPih0aGlzLmdldEJhc2VDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBjb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5nZXRMb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCQlyZXR1cm4gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKiogYXR0cmlidXRlIG5hbWUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5nZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQlyZXR1cm4gKGRlZmF1bHROYW1lICE9IG51bGwpID8gZGVmYXVsdE5hbWUgOiB0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWlmIChiYXNlQ29sTmFtZS5sZW5ndGgoKSA8PSAocmVmQ29sTmFtZS5sZW5ndGgoKSArIDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgYmFzZUNvbE5hbWUuZW5kc1dpdGgocmVmQ29sTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBfaW5kZXggPSBiYXNlQ29sTmFtZS5sZW5ndGgoKSAtIHJlZkNvbE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoYmFzZUNvbE5hbWUuY2hhckF0KF9pbmRleCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIF9pbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiBzaW5nbGUgYmFzZSBjb2x1bW4gdG8gYnVpbGQgYSBuYW1lLiBJZiB0aGlzIGlzIGEgY29tcG91bmQgZm9yZWlnbiBrZXksCi0JICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQlwcml2YXRlIFN0cmluZyBnZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldENvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCQkJCXRoaXMuZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIDoKLQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcnNjb3JlIGNoZWNrIGlzIGhlbHBmdWwgd2hlbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgPGVtPm5vdDwvZW0+IHRoZQotCSAqIHByaW1hcnkga2V5IG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlIChpLmUuIGl0IGhhcyBvbmx5IGEgPGVtPnVuaXF1ZTwvZW0+IGNvbnN0cmFpbnQpLgotCSAqIDxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVJRCAgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfUEsgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEVfUEsiCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmdldENvbHVtblBhaXIoKTsKLQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVmQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKTsKLQkJaW50IGxlbiA9IGJhc2VDb2xOYW1lLmxlbmd0aCgpOwotCQlpbnQgcmVmTGVuID0gcmVmQ29sTmFtZS5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPiByZWZMZW4pICYmIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlsZW4gPSBsZW4gLSByZWZMZW47Ci0JCQlpZiAoKGxlbiA+IDEpICYmIGJhc2VDb2xOYW1lLmNoYXJBdChsZW4gLSAxKSA9PSAnXycpIHsKLQkJCQlsZW4gPSBsZW4gLSAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29faWQgPT4gaWQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KGZvb19pZCA9PiBmb29faWQpIHZzLiAiZm9vIiA9PiAiZm9vX2lkIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb28gPT4gaWQpIHZzLiAiZm9vIiA9PiAiZm9vIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiRm9vX0lEIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIGJhc2VDb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSA9IGF0dHJpYnV0ZU5hbWUgKyAnXycgKyB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIoYmFzZUNvbHVtbk5hbWUsIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleSA9PSBmb3JlaWduS2V5OwotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQkvLyB0aGUgZm9yZWlnbiBrZXkgZG9lcyBub3QgImNvbnRhaW4iIGFueSBvdGhlciBvYmplY3RzLAotCQkvLyBzbyB3ZSBkb24ndCBuZWVkIHRvIGZvcndhcmQgdGhlICNjbGVhcigpCi0JCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0JCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQl0aGlzLmNvbHVtblBhaXJzID0gIG51bGw7Ci0JCXRoaXMucmVmZXJlbmNlZFRhYmxlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIHBhaXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIExvY2FsQ29sdW1uUGFpciBpbXBsZW1lbnRzIENvbHVtblBhaXIgewotCQlwcml2YXRlIGZpbmFsIERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbjsKLQkJcHJpdmF0ZSBmaW5hbCBEVFBDb2x1bW5XcmFwcGVyIHJlZmVyZW5jZWRDb2x1bW47Ci0KLQkJTG9jYWxDb2x1bW5QYWlyKERUUENvbHVtbldyYXBwZXIgYmFzZUNvbHVtbiwgRFRQQ29sdW1uV3JhcHBlciByZWZlcmVuY2VkQ29sdW1uKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKChiYXNlQ29sdW1uID09IG51bGwpIHx8IChyZWZlcmVuY2VkQ29sdW1uID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmJhc2VDb2x1bW4gPSBiYXNlQ29sdW1uOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uID0gcmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldEJhc2VDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5iYXNlQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0UmVmZXJlbmNlZENvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW47Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYmFzZUNvbHVtbi5nZXROYW1lKCkgKyAiPT4iICsgdGhpcy5yZWZlcmVuY2VkQ29sdW1uLmdldE5hbWUoKSk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFDb250YWluZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2ZjlkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotCi0vKioKLSAqIENvYWxlc2NlIGJlaGF2aW9yIGZvciBhIHNjaGVtYSBjb250YWluZXIgKGkuZS4gZGF0YWJhc2Ugb3IgY2F0YWxvZykuCi0gKi8KLWFic3RyYWN0IGNsYXNzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgU2NoZW1hQ29udGFpbmVyCi17Ci0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFNjaGVtYVdyYXBwZXJbXSBzY2hlbWF0YTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyKERUUERhdGFiYXNlT2JqZWN0IHBhcmVudCwgT2JqZWN0IGR0cFNjaGVtYUNvbnRhaW5lcikgewotCQlzdXBlcihwYXJlbnQsIGR0cFNjaGVtYUNvbnRhaW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBzY2hlbWEgY29udGFpbmVyJ3MgRFRQIHNjaGVtYXRhCi0JICovCi0JYWJzdHJhY3QgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWF0YSgpOwotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBzY2hlbWEgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHNjaGVtYQotCSAqLwotCWFic3RyYWN0IERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKTsKLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5lciAoZGF0YWJhc2Ugb3IgY2F0YWxvZykgY29udGFpbnMKLQkgKiB0aGUgc3BlY2lmaWVkIHNjaGVtYQotCSAqLwotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5nZXRTY2hlbWFBcnJheSgpKSB7Ci0JCQlpZiAoc2NoZW1hLndyYXBzKGR0cFNjaGVtYSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIHNjaGVtYTogIiArIGR0cFNjaGVtYSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGU7Ci0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hICh0byBpdHMgY29udGFpbmVyKQotCSAqLwotCWFic3RyYWN0IERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpOwotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbmVyIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFibGUKLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVfKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFfKGR0cFRhYmxlLmdldFNjaGVtYSgpKS5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW47Ci0JICogdGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hICh0byBpdHMgY29udGFpbmVyKQotCSAqLwotCWFic3RyYWN0IERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKTsKLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgc2NoZW1hIGNvbnRhaW5lciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwQ29sdW1uLmdldFRhYmxlKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hdGEgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFNjaGVtYT4gZ2V0U2NoZW1hdGEoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTY2hlbWE+KHRoaXMuZ2V0U2NoZW1hQXJyYXkoKSk7Ci0JfQotCi0JSXRlcmFibGU8RFRQU2NoZW1hV3JhcHBlcj4gZ2V0U2NoZW1hV3JhcHBlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxEVFBTY2hlbWFXcmFwcGVyPih0aGlzLmdldFNjaGVtYUFycmF5KCkpOwotCX0KLQotCXN5bmNocm9uaXplZCBEVFBTY2hlbWFXcmFwcGVyW10gZ2V0U2NoZW1hQXJyYXkoKSB7Ci0JCWlmICh0aGlzLnNjaGVtYXRhID09IG51bGwpIHsKLQkJCXRoaXMuc2NoZW1hdGEgPSB0aGlzLmJ1aWxkU2NoZW1hQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zY2hlbWF0YTsKLQl9Ci0KLQlwcml2YXRlIERUUFNjaGVtYVdyYXBwZXJbXSBidWlsZFNjaGVtYUFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGR0cFNjaGVtYXRhID0gdGhpcy5nZXREVFBTY2hlbWF0YSgpOwotCQlEVFBTY2hlbWFXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUFNjaGVtYVdyYXBwZXJbZHRwU2NoZW1hdGEuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUFNjaGVtYVdyYXBwZXIodGhpcywgZHRwU2NoZW1hdGEuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gQXJyYXlUb29scy5zb3J0KHJlc3VsdCwgREVGQVVMVF9DT01QQVJBVE9SKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjaGVtYXRhU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2NoZW1hTmFtZXMoKSB7Ci0JCS8vIHRoZSBzY2hlbWF0YSBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0U2NoZW1hV3JhcHBlcnMoKSwgTkFNRV9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkgewotCQkvLyB0aGUgc2NoZW1hdGEgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2NoZW1hV3JhcHBlcnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hRm9yTmFtZXModGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWFOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IHNjaGVtYSBmb3VuZC4KLQkgKi8KLQlEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYUZvck5hbWVzKEl0ZXJhYmxlPFN0cmluZz4gbmFtZXMpIHsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7Ci0JCQlEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hTmFtZWQobmFtZSk7Ci0JCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGZpbmQgYSBkZWZhdWx0IHNjaGVtYSwgcmV0dXJuIGl0cyBpZGVudGlmaWVyOwotCSAqIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBsYXN0IG5hbWUgb24gdGhlIGxpc3Qgb2YgZGVmYXVsdCBuYW1lcy4KLQkgKiAoU29tZSBjb250YWluZXJzIGhhdmUgbXVsdGlwbGUgcG9zc2libGUgZGVmYXVsdCBuYW1lcy4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbmFtZXMgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCk7Ci0JCURUUFNjaGVtYVdyYXBwZXIgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyhuYW1lcyk7Ci0JCS8vIGFzc3VtZSAnbmFtZXMnIGlzIG5vbi1lbXB0eSAoISkKLQkJcmV0dXJuIChzY2hlbWEgIT0gbnVsbCkgPwotCQkJCXNjaGVtYS5nZXRJZGVudGlmaWVyKCkgOgotCQkJCXRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmxhc3QobmFtZXMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2NoZW1hdGEoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTY2hlbWF0YSgpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNjaGVtYXRhKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTY2hlbWF0YSgpIHsKLQkJdGhpcy5zdG9wU2NoZW1hdGEoKTsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuc2NoZW1hdGEpIHsKLQkJCXNjaGVtYS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2NoZW1hdGEgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyMzQ4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuU1FMVGFibGVzUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFNjaGVtYQotICovCi1maW5hbCBjbGFzcyBEVFBTY2hlbWFXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFNjaGVtYQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgc2NoZW1hICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXJbXSB0YWJsZXM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQU2VxdWVuY2VXcmFwcGVyW10gc2VxdWVuY2VzOwotCi0JCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCQotCS8qKiB1c2VkIGZvciBhZG9wdGVyIHByb2R1Y3QgY3VzdG9taXphdGlvbiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FORF9WSUVXX1RBQkxFU19PTkxZID0gInN1cHBvcnRQZXJzaXN0ZW50QW5kVmlld1RhYmxlc09ubHkiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2NoZW1hV3JhcHBlcihEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGNvbnRhaW5lciwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJc3VwZXIoY29udGFpbmVyLCBkdHBTY2hlbWEpOwotCQl0aGlzLmR0cFNjaGVtYSA9IGR0cFNjaGVtYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNjaGVtYUNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNjaGVtYSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gKERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8gKioqKiogdGFibGVzCi0KLQlwdWJsaWMgSXRlcmFibGU8VGFibGU+IGdldFRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFRhYmxlPih0aGlzLmdldFRhYmxlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBUYWJsZVdyYXBwZXI+IGdldFRhYmxlV3JhcHBlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxEVFBUYWJsZVdyYXBwZXI+KHRoaXMuZ2V0VGFibGVBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXJbXSBnZXRUYWJsZUFycmF5KCkgewotCQlpZiAodGhpcy50YWJsZXMgPT0gbnVsbCkgewotCQkJdGhpcy50YWJsZXMgPSB0aGlzLmJ1aWxkVGFibGVBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnRhYmxlczsKLQl9Ci0KLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlcltdIGJ1aWxkVGFibGVBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGR0cFRhYmxlcyA9IHRoaXMuZ2V0RFRQVGFibGVzKCk7Ci0JCURUUFRhYmxlV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBUYWJsZVdyYXBwZXJbZHRwVGFibGVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUFRhYmxlV3JhcHBlcih0aGlzLCBkdHBUYWJsZXMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gQXJyYXlUb29scy5zb3J0KHJlc3VsdCwgREVGQVVMVF9DT01QQVJBVE9SKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBnZXREVFBUYWJsZXMoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMgPSB0aGlzLmdldERUUFRhYmxlc18oKTsKLQkJcmV0dXJuIHRoaXMuaGFjaygpID8gdGhpcy5oYWNrKGR0cFRhYmxlcykgOiBkdHBUYWJsZXM7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGdldERUUFRhYmxlc18oKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNjaGVtYS5nZXRUYWJsZXMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFjaygpIHsKLQkJLy8gdGhlIHByb2R1Y3QgaXMgbnVsbCBkdXJpbmcganVuaXQgdGVzdGluZwotCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQlTdHJpbmcgaGFjayA9IChwcm9kdWN0ID09IG51bGwpID8gbnVsbCA6IHByb2R1Y3QuZ2V0UHJvcGVydHkoUEVSU0lTVEVOVF9BTkRfVklFV19UQUJMRVNfT05MWSk7Ci0JCXJldHVybiAoaGFjayAhPSBudWxsKSAmJiBoYWNrLmVxdWFscygidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIERUUCBleHRlbmRlcnMgdGhhdCBzdXBwb3J0IHN5bm9ueW1zIGJ1dCBkb24ndCB3YW50IHRvIGhhdmUgdGhlbSBhcHBlYXIKLQkvLyBpbiBEYWxpIHRvIGZpbHRlciBvdXQgdGhlc2UgdGFibGUgdHlwZXMgZnJvbSBEYWxpIAotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGhhY2soTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IGR0cFRhYmxlcykgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+KCk7Ci0JCWZvciAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlIDogZHRwVGFibGVzKSB7Ci0JCQlpZiAodGhpcy5oYWNrKGR0cFRhYmxlKSkgewotCQkJCXJlc3VsdC5hZGQoZHRwVGFibGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhY2sob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiBTUUxUYWJsZXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRQZXJzaXN0ZW50VGFibGUoKS5pc1N1cGVyVHlwZU9mKGR0cFRhYmxlLmVDbGFzcygpKSB8fAotCQkJCQlTUUxUYWJsZXNQYWNrYWdlLmVJTlNUQU5DRS5nZXRWaWV3VGFibGUoKS5pc1N1cGVyVHlwZU9mKGR0cFRhYmxlLmVDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhYmxlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGUKLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGUob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwVGFibGUuZ2V0U2NoZW1hKCkpID8KLQkJCQkJCXRoaXMuZ2V0VGFibGVfKGR0cFRhYmxlKSA6Ci0JCQkJCQl0aGlzLmdldENvbnRhaW5lcigpLmdldFRhYmxlKGR0cFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWlucyB0aGUgc3BlY2lmaWVkIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLmdldFRhYmxlQXJyYXkoKSkgewotCQkJaWYgKHRhYmxlLndyYXBzKGR0cFRhYmxlKSkgewotCQkJCXJldHVybiB0YWJsZTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCB0YWJsZTogIiArIGR0cFRhYmxlKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFRhYmxlV3JhcHBlcnMoKSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHRhYmxlcyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0VGFibGVXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRUYWJsZVdyYXBwZXJzKCksIGlkZW50aWZpZXIpOwotCX0KLQotCS8vICoqKioqIHNlcXVlbmNlcwotCi0JcHVibGljIEl0ZXJhYmxlPFNlcXVlbmNlPiBnZXRTZXF1ZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTZXF1ZW5jZT4odGhpcy5nZXRTZXF1ZW5jZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPiBnZXRTZXF1ZW5jZVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPih0aGlzLmdldFNlcXVlbmNlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQU2VxdWVuY2VXcmFwcGVyW10gZ2V0U2VxdWVuY2VBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzID09IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VzID0gdGhpcy5idWlsZFNlcXVlbmNlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBidWlsZFNlcXVlbmNlQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlPiBkdHBTZXF1ZW5jZXMgPSB0aGlzLmdldERUUFNlcXVlbmNlcygpOwotCQlEVFBTZXF1ZW5jZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQU2VxdWVuY2VXcmFwcGVyW2R0cFNlcXVlbmNlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTZXF1ZW5jZVdyYXBwZXIodGhpcywgZHRwU2VxdWVuY2VzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2U+IGdldERUUFNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFNlcXVlbmNlcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VxdWVuY2VBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgRFRQU2VxdWVuY2VXcmFwcGVyIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNlcXVlbmNlV3JhcHBlcnMoKSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNlcXVlbmNlcyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0U2VxdWVuY2VXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2VxdWVuY2VXcmFwcGVyIGdldFNlcXVlbmNlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRTZXF1ZW5jZVdyYXBwZXJzKCksIGlkZW50aWZpZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hID09IHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikgOgotCQkJCQkJdGhpcy5nZXRDb250YWluZXIoKS5nZXRDb2x1bW4oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIHNjaGVtYSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtbgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwQ29sdW1uLmdldFRhYmxlKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydFNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0VGFibGVzKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRTZXF1ZW5jZXMoKSB7Ci0JCWZvciAoRFRQU2VxdWVuY2VXcmFwcGVyIHNlcXVlbmNlIDogdGhpcy5zZXF1ZW5jZXMpIHsKLQkJCXNlcXVlbmNlLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRUYWJsZXMoKSB7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy50YWJsZXMpIHsKLQkJCXRhYmxlLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wU2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcFRhYmxlcygpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFNlcXVlbmNlcygpIHsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2Uuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BUYWJsZXMoKSB7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy50YWJsZXMpIHsKLQkJCXRhYmxlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclRhYmxlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyU2VxdWVuY2VzKCkgewotCQl0aGlzLnN0b3BTZXF1ZW5jZXMoKTsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2UuY2xlYXIoKTsKLQkJfQotCQl0aGlzLnNlcXVlbmNlcyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFibGVzKCkgewotCQl0aGlzLnN0b3BUYWJsZXMoKTsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuY2xlYXIoKTsKLQkJfQotCQl0aGlzLnRhYmxlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTZXF1ZW5jZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2VxdWVuY2VXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzODVjMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTZXF1ZW5jZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2VxdWVuY2U7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAgU2VxdWVuY2UKLSAqLwotZmluYWwgY2xhc3MgRFRQU2VxdWVuY2VXcmFwcGVyCi0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIKLQlpbXBsZW1lbnRzIFNlcXVlbmNlCi17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBzZXF1ZW5jZSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFNlcXVlbmNlV3JhcHBlcihEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIGR0cFNlcXVlbmNlKSB7Ci0JCXN1cGVyKHNjaGVtYSwgZHRwU2VxdWVuY2UpOwotCQl0aGlzLmR0cFNlcXVlbmNlID0gZHRwU2VxdWVuY2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5zZXF1ZW5jZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNlcXVlbmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2VxdWVuY2UuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIChEVFBTY2hlbWFXcmFwcGVyKSB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFNlcXVlbmNlID09IHNlcXVlbmNlOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vIHN0YXRlIHRvIGNsZWFyCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBUYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgzYzMzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuUHJpbWFyeUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQmFzZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBUYWJsZQotICovCi1maW5hbCBjbGFzcyBEVFBUYWJsZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcgotCWltcGxlbWVudHMgVGFibGUKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHRhYmxlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGU7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGNvbHVtbnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIHByaW1hcnlLZXlDb2x1bW5zOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gZm9yZWlnbktleXM7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUUENvbHVtbldyYXBwZXJbXSBFTVBUWV9DT0xVTU5TID0gbmV3IERUUENvbHVtbldyYXBwZXJbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBFTVBUWV9GT1JFSUdOX0tFWVMgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbMF07Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQVGFibGVXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJc3VwZXIoc2NoZW1hLCBkdHBUYWJsZSk7Ci0JCXRoaXMuZHRwVGFibGUgPSBkdHBUYWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnRhYmxlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKERUUFNjaGVtYVdyYXBwZXIpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8gKioqKiogY29sdW1ucwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENvbHVtbj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUENvbHVtbldyYXBwZXI+IGdldENvbHVtbldyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ29sdW1uV3JhcHBlcj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0Q29sdW1uQXJyYXkoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5zID0gdGhpcy5idWlsZENvbHVtbkFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBidWlsZENvbHVtbkFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmdldERUUENvbHVtbnMoKTsKLQkJRFRQQ29sdW1uV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDb2x1bW5XcmFwcGVyW2R0cENvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQQ29sdW1uV3JhcHBlcih0aGlzLCBkdHBDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXRDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbihvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbikgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cENvbHVtbi5nZXRUYWJsZSgpKSA/Ci0JCQkJCQl0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKSA6Ci0JCQkJCQl0aGlzLmdldFNjaGVtYSgpLmdldENvbHVtbihkdHBDb2x1bW4pOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSB0aGUgdGFibGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4KLQkgKi8KLQlEVFBDb2x1bW5XcmFwcGVyIGdldENvbHVtbl8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuZ2V0Q29sdW1uQXJyYXkoKSkgewotCQkJaWYgKGNvbHVtbi53cmFwcyhkdHBDb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIERUUCBjb2x1bW46ICIgKyBkdHBDb2x1bW4pOyAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgewotCQkvLyB0aGUgY29sdW1ucyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q29sdW1uV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIodGhpcy5nZXRDb2x1bW5XcmFwcGVycygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyAqKioqKiBwcmltYXJ5S2V5Q29sdW1ucwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb2x1bW4+KHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkpOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCURUUENvbHVtbldyYXBwZXJbXSBwa0NvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQlpZiAocGtDb2x1bW5zLmxlbmd0aCAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtdWx0aXBsZSBwcmltYXJ5IGtleSBjb2x1bW5zOiAiICsgcGtDb2x1bW5zLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBrQ29sdW1uc1swXTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gdGhpcy5idWlsZFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGJ1aWxkUHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlQcmltYXJ5S2V5IHBrID0gKChCYXNlVGFibGUpIHRoaXMuZHRwVGFibGUpLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKHBrID09IG51bGwpIHsKLQkJCS8vIG5vIFBLIHdhcyBkZWZpbmVkCi0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IHBrQ29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1ucyhwayk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltwa0NvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSB0aGlzLmdldENvbHVtbihwa0NvbHVtbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0Q29sdW1ucyhQcmltYXJ5S2V5IHBrKSB7Ci0JCXJldHVybiBway5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlib29sZWFuIHByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyh0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLCBjb2x1bW4pOwotCX0KLQotCS8vICoqKioqIGZvcmVpZ25LZXlzCi0KLQlwdWJsaWMgSXRlcmFibGU8Rm9yZWlnbktleT4gZ2V0Rm9yZWlnbktleXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxGb3JlaWduS2V5Pih0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGdldEZvcmVpZ25LZXlBcnJheSgpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgPT0gbnVsbCkgewotCQkJdGhpcy5mb3JlaWduS2V5cyA9IHRoaXMuYnVpbGRGb3JlaWduS2V5QXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mb3JlaWduS2V5czsKLQl9Ci0KLQlwcml2YXRlIERUUEZvcmVpZ25LZXlXcmFwcGVyW10gYnVpbGRGb3JlaWduS2V5QXJyYXkoKSB7Ci0JCWlmICggISAodGhpcy5kdHBUYWJsZSBpbnN0YW5jZW9mIEJhc2VUYWJsZSkpIHsKLQkJCXJldHVybiBFTVBUWV9GT1JFSUdOX0tFWVM7Ci0JCX0KLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBkdHBGb3JlaWduS2V5cyA9IHRoaXMuZ2V0RFRQRm9yZWlnbktleXMoKTsKLQkJRFRQRm9yZWlnbktleVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXJbZHRwRm9yZWlnbktleXMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQRm9yZWlnbktleVdyYXBwZXIodGhpcywgZHRwRm9yZWlnbktleXMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5Gb3JlaWduS2V5PiBnZXREVFBGb3JlaWduS2V5cygpIHsKLQkJcmV0dXJuICgoQmFzZVRhYmxlKSB0aGlzLmR0cFRhYmxlKS5nZXRGb3JlaWduS2V5cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Rm9yZWlnbktleXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2x1bW4gaXMgYSBiYXNlIGNvbHVtbiBmb3IgYXQgbGVhc3Qgb25lCi0JICogb2YgdGhlIHRoZSB0YWJsZSdzIGZvcmVpZ24ga2V5cwotCSAqLwotCWJvb2xlYW4gZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZrV3JhcHBlciA6IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KCkpIHsKLQkJCWlmIChma1dyYXBwZXIuYmFzZUNvbHVtbnNDb250YWlucyhjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqIGpvaW4gdGFibGUKLQotCXB1YmxpYyBib29sZWFuIGlzUG9zc2libGVKb2luVGFibGUoKSB7Ci0JCWlmICh0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpLmxlbmd0aCAhPSAyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgdGFibGUgbXVzdCBoYXZlIGV4YWN0bHkgMiBmb3JlaWduIGtleXMKLQkJfQotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0aGlzLmdldENvbHVtbnMoKSkgewotCQkJaWYgKCAhIHRoaXMuZm9yZWlnbktleUJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIGFsbCB0aGUgdGFibGUncyBjb2x1bW5zIG11c3QgYmVsb25nIHRvIG9uZSAob3IgYm90aCkgb2YgdGhlIDIgZm9yZWlnbiBrZXlzCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHRhYmxlIG5hbWUgaXMgPGNvZGU+Rk9PX0JBUjwvY29kZT4KLQkgKiBhbmQgaXQgam9pbnMgdGFibGVzIDxjb2RlPkZPTzwvY29kZT4gYW5kIDxjb2RlPkJBUjwvY29kZT4sCi0JICogcmV0dXJuIHRoZSBmb3JlaWduIGtleSB0byA8Y29kZT5GT088L2NvZGU+OwotCSAqIGlmIHRoZSB0YWJsZSBuYW1lIGlzIDxjb2RlPkJBUl9GT088L2NvZGU+Ci0JICogYW5kIGl0IGpvaW5zIHRhYmxlcyA8Y29kZT5GT088L2NvZGU+IGFuZCA8Y29kZT5CQVI8L2NvZGU+LAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gPGNvZGU+QkFSPC9jb2RlPjsKLQkgKiBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiB0aGUgZmlyc3QgZm9yZWlnbiBrZXkgaW4gdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBGb3JlaWduS2V5IGdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKSB7Ci0JCUZvcmVpZ25LZXkgZmswID0gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKVswXTsKLQkJU3RyaW5nIG5hbWUwID0gZmswLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKTsKLQotCQlGb3JlaWduS2V5IGZrMSA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMV07Ci0JCVN0cmluZyBuYW1lMSA9IGZrMS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCk7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0TmFtZSgpLmVxdWFscyhuYW1lMSArICdfJyArIG5hbWUwKSA/IGZrMSA6IGZrMDsKLQl9Ci0KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luVGFibGVOb25Pd25pbmdGb3JlaWduS2V5KCkgewotCQlGb3JlaWduS2V5IGZrMCA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMF07Ci0JCUZvcmVpZ25LZXkgZmsxID0gdGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKVsxXTsKLQkJRm9yZWlnbktleSBvZmsgPSB0aGlzLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKTsKLQkJcmV0dXJuIChvZmsgPT0gZmswKSA/IGZrMSA6IGZrMDsKLQl9Ci0KLQkvKioKLQkgKiBIbW1tLi4uLgotCSAqIFdlIG1pZ2h0IHdhbnQgdG8gZ28gdG8gdGhlIHBsYXRmb3JtIHRvIGFsbG93IGEgdmVuZG9yLXNwZWNpZmljCi0JICogY29tcGFyaXNvbiBoZXJlOwotCSAqIGJ1dCwgc2luY2UgYWxsIHRoZSBuYW1lcyBhcmUgY29taW5nIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlCi0JICogKGkuZS4gdGhlcmUgYXJlIG5vIGNvbnZlcnNpb25zIHRvIEphdmEgaWRlbnRpZmllcnMgZXRjLiksIGl0IHNlZW1zCi0JICogbGlrZSB3ZSBjYW4ganVzdCBjb21wYXJlIHRoZW0gZGlyZWN0bHkgYW5kIGlnbm9yZSBjYXNlLXNlbnNpdGl2aXR5Ci0JICogaXNzdWVzLi4uLiAgfmJqdgotCSAqLwotCXB1YmxpYyBib29sZWFuIGpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHModGhpcy5idWlsZERlZmF1bHRKb2luVGFibGVOYW1lKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEpvaW5UYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU93bmluZ1RhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJCSsgJ18nCi0JCQkJCSsgdGhpcy5nZXRKb2luVGFibGVOb25Pd25pbmdUYWJsZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGdldEpvaW5UYWJsZU93bmluZ1RhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRKb2luVGFibGVOb25Pd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlID09IHRhYmxlOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSB0YWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKHRhYmxlKSA/IHRoaXMgOiB0aGlzLmdldFNjaGVtYSgpLmdldFRhYmxlKHRhYmxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5mb3JlaWduS2V5cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Rm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDb2x1bW5zKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sdW1ucygpIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuY29sdW1ucykgewotCQkJY29sdW1uLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5mb3JlaWduS2V5cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BGb3JlaWduS2V5cygpOwotCQl9Ci0JCWlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wQ29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcEZvcmVpZ25LZXlzKCkgewotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkgOiB0aGlzLmZvcmVpZ25LZXlzKSB7Ci0JCQlmb3JlaWduS2V5LnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wQ29sdW1ucygpIHsKLQkJZm9yIChEVFBDb2x1bW5XcmFwcGVyIGNvbHVtbiA6IHRoaXMuY29sdW1ucykgewotCQkJY29sdW1uLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckZvcmVpZ25LZXlzKCk7Ci0JCX0KLQotCQkvLyB0aGUgdGFibGUgZG9lcyBub3QgImNvbnRhaW4iIHRoZSBwayBjb2x1bW5zLCBzbyBubyBuZWVkIHRvIGZvcndhcmQgI2NsZWFyKCkKLQkJdGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9IG51bGw7Ci0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyQ29sdW1ucygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRm9yZWlnbktleXMoKSB7Ci0JCXRoaXMuc3RvcEZvcmVpZ25LZXlzKCk7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmZvcmVpZ25LZXlzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJDb2x1bW5zKCkgewotCQl0aGlzLnN0b3BDb2x1bW5zKCk7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5jbGVhcigpOwotCQl9Ci0gICAgCXRoaXMuY29sdW1ucyA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9BYnN0cmFjdFZlbmRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvQWJzdHJhY3RWZW5kb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFlYjZmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9BYnN0cmFjdFZlbmRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBDb25zb2xpZGF0ZSB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIHRoZSB0eXBpY2FsIHZlbmRvcnMuCi0gKiAKLSAqIEBzZWUgVW5yZWNvZ25pemVkVmVuZG9yCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVuZG9yCi0JaW1wbGVtZW50cyBWZW5kb3IKLXsKLQlBYnN0cmFjdFZlbmRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nIGFuZCBzY2hlbWEgc3VwcG9ydCAqKioqKioqKioqCi0KLQlhYnN0cmFjdCBDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLnN1cHBvcnRzQ2F0YWxvZ3MoZGF0YWJhc2UpOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLmdldENhdGFsb2dzKGRhdGFiYXNlKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldENhdGFsb2dTdHJhdGVneSgpLmdldFNjaGVtYXMoZGF0YWJhc2UpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ2ZW5kb3I6ICIgKyB0aGlzLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSkgewotCQlpZiAoICEgdGhpcy5zdXBwb3J0c0NhdGFsb2dzKGRhdGFiYXNlKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKGRhdGFiYXNlLCB1c2VyTmFtZSwgbmFtZXMpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogU2VlIGNvbW1lbnQgYXQKLQkgKiB7QGxpbmsgI2FkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlLCBTdHJpbmcsIEFycmF5TGlzdCl9LgotCSAqLwotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIHRoZSB1c2VyIG5hbWUuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhkYXRhYmFzZSwgdXNlck5hbWUsIG5hbWVzKTsKLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIG5hbWUgcGFzc2VkIGluIGhlcmUgd2FzIHJldHJpZXZlZCBmcm9tIERUUC4KLQkgKiBEVFAgc3RvcmVzIHRoZSB1c2VyIG5hbWUgdGhhdCB3YXMgcGFzc2VkIHRvIGl0IGR1cmluZyB0aGUgY29ubmVjdGlvbgotCSAqIHRvIHRoZSBkYXRhYmFzZS4gQXMgYSByZXN1bHQsIHRoaXMgdXNlciBuYW1lIGlzIGFuIDxlbT5pZGVudGlmaWVyPC9lbT4KLQkgKiBub3QgYSA8ZW0+bmFtZTwvZW0+LgotCSAqIElmIHRoZSB1c2VyIG5hbWUgd2VyZSByZXRyaWV2ZWQgZnJvbSB0aGUgSkRCQyBjb25uZWN0aW9uIGl0IHdvdWxkIHByb2JhYmx5Ci0JICogYmUgYSA8ZW0+bmFtZTwvZW0+LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBjb25uZWN0IHRvIGFuIE9yYWNsZSBkYXRhYmFzZSB3aXRoIHRoZQotCSAqIHVzZXIgbmFtZSAic2NvdHQiLCBidXQgdGhhdCBpZGVudGlmZXIgaXMgZm9sZGVkIHRvIHRoZSBhY3R1YWwgdXNlciBuYW1lCi0JICogIlNDT1RUIi4gRFRQIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyaW5nICJzY290dCIsIHdoaWxlIHRoZSBPcmFjbGUgSkRCQwotCSAqIGRyaXZlciBzdG9yZXMgdGhlIGZvbGRlZCBzdHJpbmcgIlNDT1RUIi4KLQkgKi8KLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmb2xkaW5nIHN0cmF0ZWd5IHVzZWQgdG8gY29udmVydCBuYW1lcyBhbmQgaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIFNRTCBzcGVjIHNheXMgYSA8ZW0+cmVndWxhcjwvZW0+IChub24tZGVsaW1pdGVkKSBpZGVudGlmaWVyIHNob3VsZCBiZQotCSAqIGZvbGRlZCB0byB1cHBlcmNhc2U7IGJ1dCBzb21lIGRhdGFiYXNlcyBkbyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KLQkgKi8KLQlhYnN0cmFjdCBGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAtPiBpZGVudGlmaWVyICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVxdWlyZXNEZWxpbWl0ZXJzKG5hbWUpID8KLQkJCQkJCXRoaXMuZGVsaW1pdE5hbWUobmFtZSkgOgotCQkJCQkJdGhpcy5yZWd1bGFyTmFtZXNNYXRjaChuYW1lLCBkZWZhdWx0TmFtZSkgPyBudWxsIDogbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVSZXF1aXJlc0RlbGltaXRlcnMobmFtZSkgPyB0aGlzLmRlbGltaXROYW1lKG5hbWUpIDogbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIG11c3QgYmUgZGVsaW1pdGVkCi0JICogd2hlbiB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQuCi0JICogSWYgdGhlIG5hbWUgaGFzIGFueSAic3BlY2lhbCIgY2hhcmFjdGVycyAoYXMgb3Bwb3NlZCB0byBsZXR0ZXJzLAotCSAqIGRpZ2l0cywgYW5kIG90aGVyIGFsbG93ZWQgY2hhcmFjdGVycyBbZS5nLiB1bmRlcnNjb3Jlc10pLCBpdCByZXF1aXJlcwotCSAqIGRlbGltaXRlcnMuCi0JICogSWYgdGhlIG5hbWUgaXMgbWl4ZWQgY2FzZSBhbmQgdGhlIGRhdGFiYXNlIGZvbGRzIHVuZGVsaW1pdGVkIG5hbWVzCi0JICogKHRvIGVpdGhlciB1cHBlcmNhc2Ugb3IgbG93ZXJjYXNlKSwgaXQgcmVxdWlyZXMgZGVsaW1pdGVycy4KLQkgKi8KLQlib29sZWFuIG5hbWVSZXF1aXJlc0RlbGltaXRlcnMoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChuYW1lLmxlbmd0aCgpID09IDApICAvLyAgYW4gZW1wdHkgc3RyaW5nIG11c3QgYmUgZGVsaW1pdGVkKD8pCi0JCQkJCXx8IHRoaXMubmFtZUNvbnRhaW5zQW55U3BlY2lhbENoYXJhY3RlcnMobmFtZSkKLQkJCQkJfHwgdGhpcy5uYW1lSXNOb3RGb2xkZWQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFueSAic3BlY2lhbCIgY2hhcmFjdGVycwotCSAqIHRoYXQgcmVxdWlyZSB0aGUgbmFtZSB0byBiZSBkZWxpbWl0ZWQuCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBuYW1lIGlzIG5vdCBlbXB0eQotCSAqLwotCWJvb2xlYW4gbmFtZUNvbnRhaW5zQW55U3BlY2lhbENoYXJhY3RlcnMoU3RyaW5nIG5hbWUpIHsKLQkJY2hhcltdIHN0cmluZyA9IG5hbWUudG9DaGFyQXJyYXkoKTsKLQkJaWYgKHRoaXMuY2hhcmFjdGVySXNOb25SZWd1bGFyTmFtZVN0YXJ0KHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIG5vdGU6IHN0b3AgYXQgMQotCQkJaWYgKHRoaXMuY2hhcmFjdGVySXNOb25SZWd1bGFyTmFtZVBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyAibm9uLXJlZ3VsYXIiIGZvciB0aGUgZmlyc3QKLQkgKiBjaGFyYWN0ZXIgb2YgYSBuYW1lLgotCSAqIFR5cGljYWxseSwgZGF0YWJhc2VzIGFyZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgY2hhcmFjdGVycyBjYW4KLQkgKiBiZSB1c2VkIHRvIDxlbT5zdGFydDwvZW0+IGFuIGlkZW50aWZpZXIgKGFzIG9wcG9zZWQgdG8gdGhlIGNoYXJhY3RlcnMKLQkgKiBhbGxvd2VkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBpZGVudGlmaWVyKS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgPGVtPnJlZ3VsYXI8L2VtPiBmb3IgdGhlIGZpcnN0Ci0JICogY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFuIGlkZW50aWZpZXIgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgdmVuZG9yLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHN0YXJ0IGNoYXJhY3RlcnMKLQkgKiA8L3VsPgotCSAqLwotCWJvb2xlYW4gY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQkvLyBhbGwgdmVuZG9ycyBhbGxvdyBhIGxldHRlcgotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyKGMpCi0JCQkJfHwgdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjKTsKLQl9Ci0KLQlib29sZWFuIGNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gYXJyYXlDb250YWlucyh0aGlzLmdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzLCBmb3IgdGhlCi0JICogZmlyc3QgY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGVyZSBhcmUgbm8gImV4dGVuZGVkIiBjaGFyYWN0ZXJzLgotCSAqLwotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyAibm9uLXJlZ3VsYXIiIGZvciB0aGUgc2Vjb25kCi0JICogYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIG5hbWUuCi0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lUGFydChjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBpcyA8ZW0+cmVndWxhcjwvZW0+IGZvciB0aGUgc2Vjb25kIGFuZAotCSAqIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBvZiBhIG5hbWUuCi0JICogVGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgPGVtPnJlZ3VsYXI8L2VtPiBuYW1lIGNhbiBiZTo8dWw+Ci0JICogPGxpPmEgbGV0dGVyCi0JICogPGxpPmEgZGlnaXQKLQkgKiA8bGk+YW4gdW5kZXJzY29yZQotCSAqIDxsaT5hbnkgb2YgdGhlIGV4dGVuZGVkLCB2ZW5kb3Itc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gc3RhcnQgY2hhcmFjdGVycwotCSAqIDxsaT5hbnkgb2YgdGhlIGV4dGVuZGVkLCB2ZW5kb3Itc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gcGFydCBjaGFyYWN0ZXJzCi0JICogPC91bD4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQkvLyBhbGwgdmVuZG9ycyBhbGxvdyBhIGxldHRlciBvciBkaWdpdAotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fAotCQkJCShjID09ICdfJykgfHwKLQkJCQl0aGlzLmNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0KGMpIHx8Ci0JCQkJdGhpcy5jaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVQYXJ0KGMpOwotCX0KLQotCWJvb2xlYW4gY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIGFycmF5Q29udGFpbnModGhpcy5nZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzIGFuZCBkaWdpdHMgYW5kIHRoZQotCSAqIDxlbT5yZWd1bGFyPC9lbT4gZmlyc3QgY2hhcmFjdGVycywgZm9yIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2hhcmFjdGVycwotCSAqIG9mIGFuIGlkZW50aWZpZXIuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbCBjaGFyYWN0ZXJzLgotCSAqLwotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyBub3QgZm9sZGVkIHRvIHRoZSBkYXRhYmFzZSdzCi0JICogY2FzZSwgcmVxdWlyaW5nIGl0IHRvIGJlIGRlbGltaXRlZC4KLQkgKi8KLQlib29sZWFuIG5hbWVJc05vdEZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLm5hbWVJc0ZvbGRlZChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIDxlbT5yZWd1bGFyPC9lbT4gbmFtZXMgbWF0Y2guCi0JICovCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gdGhpcy5yZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgPwotCQkJCQkJbmFtZTEuZXF1YWxzKG5hbWUyKSA6Ci0JCQkJCQluYW1lMS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIDxlbT5yZWd1bGFyPC9lbT4gaWRlbnRpZmllcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0JICovCi0JYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGb2xkaW5nU3RyYXRlZ3koKS5yZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCk7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gZGVsaW1pdGVycyAodHlwaWNhbGx5IGRvdWJsZS1xdW90ZXMpLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVyIC0+IG5hbWUgKioqKioqKioqKgotCi0JLy8gbm90IHN1cmUgaG93IHRvIGhhbmRsZSBhbiBlbXB0eSBzdHJpbmc6Ci0JLy8gYm90aCAiIiBhbmQgIlwiXCIiIGFyZSBjb252ZXJ0ZWQgdG8gIiIgLi4uCi0JLy8gY29udmVydCAiIiB0byAnbnVsbCcgc2luY2UgZW1wdHkgc3RyaW5ncyBtdXN0IGJlIGRlbGltaXRlZD8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiAoaWRlbnRpZmllciA9PSBudWxsKSA/Ci0JCQkJCW51bGwgOgotCQkJCQl0aGlzLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKSA/Ci0JCQkJCQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0KGlkZW50aWZpZXIpIDoKLQkJCQkJCQl0aGlzLmdldEZvbGRpbmdTdHJhdGVneSgpLmZvbGQoaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyIGlzIDxlbT5kZWxpbWl0ZWQ8L2VtPi4KLQkgKiBUaGUgU1FMLTkyIHNwZWMgc2F5cyBpZGVudGlmaWVycyBzaG91bGQgYmUgZGVsaW1pdGVkIGJ5Ci0JICogZG91YmxlLXF1b3RlczsgYnV0IHNvbWUgZGF0YWJhc2VzIGFsbG93IG90aGVyd2lzZSAoZS5nLiBTeWJhc2UpLgotCSAqLwotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChpZGVudGlmaWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBWZW5kb3JOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogc3RhdGljIGNvbnZlbmllbmNlIG1ldGhvZCAtIGFycmF5IG51bGwgY2hlY2sKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBhcnJheUNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciBjKSB7Ci0JCXJldHVybiAoYXJyYXkgIT0gbnVsbCkgJiYgQXJyYXlUb29scy5jb250YWlucyhhcnJheSwgYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjFjYTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0NhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogSGFuZGxlIHRoZSB2YXJpZXR5IG9mIGNhdGFsb2cgKGFuZCBzY2hlbWEpIGNvbmZpZ3VyYXRpb25zIGdlbmVyYXRlZCBieSBEVFAuCi0gKi8KLWludGVyZmFjZSBDYXRhbG9nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkYXRhYmFzZSBoYXMgcmVhbCBjYXRhbG9ncy4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBjYXRhbG9ncy4KLQkgKi8KLQlMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlJ3Mgc2NoZW1hcy4KLQkgKi8KLQlMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0RCMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvREIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjY4MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvREIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1jbGFzcyBEQjIKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHRwVmVuZG9yTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBVREIgPSBuZXcgREIyKCJEQjIgVURCIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgVURCX0lfU0VSSUVTID0gbmV3IERCMigiREIyIFVEQiBpU2VyaWVzIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgVURCX1pfU0VSSUVTID0gbmV3IERCMigiREIyIFVEQiB6U2VyaWVzIik7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBWZW5kb3IgdWRiKCkgewotCQlyZXR1cm4gVURCOwotCX0KLQotCXN0YXRpYyBWZW5kb3IgdWRiSVNlcmllcygpIHsKLQkJcmV0dXJuIFVEQl9JX1NFUklFUzsKLQl9Ci0KLQlzdGF0aWMgVmVuZG9yIHVkYlpTZXJpZXMoKSB7Ci0JCXJldHVybiBVREJfWl9TRVJJRVM7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG9ubHkgc3RhdGljIGluc3RhbmNlcy4KLQkgKi8KLQlwcml2YXRlIERCMihTdHJpbmcgZHRwVmVuZG9yTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cFZlbmRvck5hbWUgPSBkdHBWZW5kb3JOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwVmVuZG9yTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVW5rbm93bkNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOyAgLy8gbm90IHZlcmlmaWVkIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0RlcmJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9EZXJieS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI2NGFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0RlcmJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgRGVyYnkKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IERlcmJ5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlcmJ5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gRmF1eENhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYU5hbWUodXNlck5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB1c2VyIG5hbWUgb24gRGVyYnkgaXMgIkFQUCIgd2hlbiB0aGUgdXNlciBjb25uZWN0cyB3aXRob3V0Ci0JICogYSB1c2VyIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLQkJcmV0dXJuICgodXNlck5hbWUgIT0gbnVsbCkgJiYgKHVzZXJOYW1lLmxlbmd0aCgpICE9IDApKSA/Ci0JCQkJdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh1c2VyTmFtZSkgOgotCQkJCURFRkFVTFRfVVNFUl9OQU1FOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VU0VSX05BTUUgPSAiQVBQIjsgIC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvRmF1eENhdGFsb2dTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvRmF1eENhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTExNmUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgYnVpbGQgYSAidmlydHVhbCIgY2F0YWxvZyAodGhhdCBoYXMKLSAqIG5vIG5hbWUpIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgSkRCQyBkcml2ZXIgZG9lcyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncwotICogKGUuZy4gT3JhY2xlKS4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIEZhdXhDYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEZhdXhDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyAzMDg5NDcgLSBoYWNrIHRvIHN1cHBvcnQgb2xkIElCTSBEVFAvUkRCIGV4dGVuc2lvbiBmb3IgT3JhY2xlCi0JCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCQl9Ci0KLQkJLy8gbm9ybWFsIGxvZ2ljOgotCQlyZXR1cm4gdGhpcy5nZXRGYXV4Q2F0YWxvZyhkYXRhYmFzZS5nZXRDYXRhbG9ncygpKS5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nIGdldEZhdXhDYXRhbG9nKExpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MpIHsKLQkJaWYgKGNhdGFsb2dzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoY2F0YWxvZ3Muc2l6ZSgpICE9IDEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm5vdCBhIHNpbmdsZSBjYXRhbG9nOiAiICsgY2F0YWxvZ3Muc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nID0gY2F0YWxvZ3MuZ2V0KDApOwotCQlpZiAoY2F0YWxvZy5nZXROYW1lKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaWxsZWdhbCBuYW1lOiAiICsgY2F0YWxvZy5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Gb2xkaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0ZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMzZTJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0ZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotLyoqCi0gKiBIYW5kbGUgZGF0YWJhc2Utc3BlY2lmaWMgaWRlbnRpZmllci1mb2xkaW5nIGlzc3Vlcy4KLSAqLwotaW50ZXJmYWNlIEZvbGRpbmdTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBGb2xkIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZm9sZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIGlzIGFscmVhZHkgZm9sZGVkLAotCSAqIG1lYW5pbmcsIGlmIGl0IGhhcyBubyBzcGVjaWFsIGNoYXJhY3RlcnMsIGl0IHJlcXVpcmVzIG5vIGRlbGltaXRlcnMuCi0JICovCi0JYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGRhdGFiYXNlIGlzIGNhc2Utc2Vuc2l0aXZlIHdoZW4gdXNpbmcgInJlZ3VsYXIiCi0JICogKGkuZS4gbm9uLWRlbGltaXRlZCkgaWRlbnRpZmllcnMuCi0JICovCi0JYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0hTUUxEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvSFNRTERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWIyZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvSFNRTERCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgSFNRTERCCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBIU1FMREIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSFNRTERCKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJIU1FMREIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsgIC8vIG5vdCB2ZXJpZmllZCB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoUFVCTElDX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ0hFTUFfTkFNRSA9ICJQVUJMSUMiOyAgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9JbmZvcm1peC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvSW5mb3JtaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxYTZkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9JbmZvcm1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgSW5mb3JtaXgKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IEluZm9ybWl4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEluZm9ybWl4KCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJJbmZvcm1peCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVW5rbm93bkNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOyAgLy8gbm90IHZlcmlmaWVkIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL0xvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYjQ1N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEZvbGQgIm5vcm1hbCIgaWRlbnRpZmllcnMgdG8gbG93ZXIgY2FzZS4KLSAqIElnbm9yZSB0aGUgY2FzZSBvZiAibm9ybWFsIiBpZGVudGlmaWVycy4KLSAqLwotY2xhc3MgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBGb2xkaW5nU3RyYXRlZ3kKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVJc0ZvbGRlZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UobmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTWF4REIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL01heERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGYxZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTWF4REIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWNsYXNzIE1heERCCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBNYXhEQigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBNYXhEQigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiTWF4REIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVua25vd25DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsgIC8vIG5vdCB2ZXJpZmllZCB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICcjJywgJ0AnLCAnJCcgfTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTXlTUUwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL015U1FMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNThlNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTXlTUUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLWNsYXNzIE15U1FMCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBNeVNRTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBNeVNRTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTcWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIERUUCBtb2RlbCBmb3IgTXlTUUwgaGFzIGEgZGF0YWJhc2UgdGhhdCBjb250YWlucyBubyBjYXRhbG9nczsKLQkgKiBidXQsIGluc3RlYWQsIGRpcmVjdGx5IGhvbGRzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiB0aGUgZGF0YWJhc2UuIChUaGlzIGlzIGhhcmQtY29kZWQgaW4gTXlTcWxDYXRhbG9nRGF0YWJhc2UuZ2V0U2NoZW1hcygpLikKLQkgKiBBbHRob3VnaCB5b3UgY2FuIHF1YWxpZnkgaWRlbnRpZmllcnMgd2l0aCBhIGRhdGFiYXNlIG5hbWUKLQkgKiBpbiBNeVNRTCwgb25seSB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkIGF0IGxvZ2luIHNlZW1zIHRvIGJlIGF2YWlsYWJsZQotCSAqIGluIHRoZSBEVFAgbW9kZWwuLi4uCi0JICogCi0JICogTkI6IEluIE15U1FMIERETCwgU0NIRU1BIGlzIGEgc3lub255bSBmb3IgREFUQUJBU0U7IGJ1dCB0aGUgSkRCQwotCSAqIG1ldGhvZCBEYXRhYmFzZU1ldGFEYXRhLmdldFNjaGVtYXMoKSByZXR1cm5zIGFuIGVtcHR5IGxpc3QsCi0JICogd2hpbGUgZ2V0Q2F0YWxvZ3MoKSByZXR1cm5zIGEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGRhdGFiYXNlcy4KLQkgKiBZb3UgY2FuIGFsc28gdXNlIHRoZSBKREJDIG1ldGhvZCBDb25uZWN0aW9uLnNldENhdGFsb2coU3RyaW5nKSB0bwotCSAqIHNldCB0aGUgZGVmYXVsdCBkYXRhYmFzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgZ2V0Q2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9DYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBNeVNRTCBpcyBhIGJpdCB1bnVzdWFsLCBzbyB3ZSBmb3JjZSBleGFjdCBtYXRjaGVzLgotCSAqIChlLmcuIE15U1FMIGZvbGRzIGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcyB0byBsb3dlcmNhc2Ugb24gV2luZG93cwotCSAqIGJ5IGRlZmF1bHQ7IGJ1dCB0aGF0IGRlZmF1bHQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlCi0JICogJ2xvd2VyX2Nhc2VfdGFibGVfbmFtZXMnIHN5c3RlbSB2YXJpYWJsZS4gVGhpcyBpcyBiZWNhdXNlIGRhdGFiYXNlcyBhcmUKLQkgKiBzdG9yZWQgYXMgZGlyZWN0b3JpZXMgYW5kIHRhYmxlcyBhcmUgc3RvcmVkIGFzIGZpbGVzIGluIHRoZSB1bmRlcmx5aW5nCi0JICogTy9TOyBhbmQgdGhlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGhlIG5hbWVzIGlzIGRldGVybWluZWQgYnkgdGhlIGJlaGF2aW9yCi0JICogb2YgZmlsZW5hbWVzIG9uIHRoZSBPL1MuIFRoZW4sIHRvIGNvbXBsaWNhdGUgdGhpbmdzLAotCSAqIG5vbmUgb2YgdGhlIG90aGVyIGlkZW50aWZpZXJzLCBsaWtlIGluZGV4IGFuZCBjb2x1bW4gbmFtZXMsIGFyZSBmb2xkZWQ7Ci0JICogYnV0IHRoZXkgYXJlIGNhc2UtaW5zZW5zaXRpdmUsIHVubGVzcyBkZWxpbWl0ZWQuIFNlZQotCSAqIGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL2lkZW50aWZpZXItY2FzZS1zZW5zaXRpdml0eS5odG1sLikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBNeVNRTCBpcyB0aGUgb25seSB2ZW5kb3IgdGhhdCBhbGxvd3MgYSBkaWdpdC4KLQkgKiBBbHRob3VnaCwgdGhlIG5hbWUgY2Fubm5vdCBiZSAqYWxsKiBkaWdpdHMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNEaWdpdChjKSB8fCBzdXBlci5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJywgJyQnIH07Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBNeVNRTCBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJhY2t0aWNrcyAoYCk7IGJ1dCBpdAotCSAqIGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGRvdWJsZS1xdW90ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKGlkZW50aWZpZXIsIEJBQ0tUSUNLKQotCQkJCQl8fCBzdXBlci5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1RJQ0sgPSAnYCc7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Ob0NhdGFsb2dTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FmYTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCBoYXZlIGNhdGFsb2dzCi0gKiAoZS5nLiBNeVNRTCBzZWUgYnVnIDI0OTAxMykuCi0gKi8KLWNsYXNzIE5vQ2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXRhbG9nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgTm9DYXRhbG9nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBDYXRhbG9nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTm9DYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvTm9uRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIzYWRmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLQotLyoqCi0gKiBEbyBub3QgZm9sZCAibm9ybWFsIiBpZGVudGlmaWVycy4KLSAqIFJlc3BlY3QgdGhlIGNhc2Ugb2YgIm5vcm1hbCIgaWRlbnRpZmllcnMuCi0gKi8KLWNsYXNzIE5vbkZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGb2xkaW5nU3RyYXRlZ3kgSU5TVEFOQ0UgPSBuZXcgTm9uRm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgRm9sZGluZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5vbkZvbGRpbmdTdHJhdGVneSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBpZGVudGlmaWVycyBhcmUgbm90IGZvbGRlZCB0byB1cHBlci0gb3IgbG93ZXItY2FzZSwgdGhlIG5hbWUgaXMKLQkgKiBhbHJlYWR5ICJmb2xkZWQiLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBpZGVudGlmaWVycyBhcmUgbm90IGZvbGRlZCB0byB1cHBlci0gb3IgbG93ZXItY2FzZSwgdGhlIG5hbWUgaXMKLQkgKiBhbHJlYWR5ICJmb2xkZWQiLgotCSAqIChOb24tZm9sZGluZyBkYXRhYmFzZXMgZG8gbm90IHJlcXVpcmUgZGVsaW1pdGVycyBhcm91bmQgbWl4ZWQtY2FzZQotCSAqICJub3JtYWwiIGlkZW50aWZpZXJzLikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVndWxhcklkZW50aWZpZXJzQXJlQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9PcmFjbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzI4YWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL09yYWNsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotY2xhc3MgT3JhY2xlCi0JZXh0ZW5kcyBBYnN0cmFjdFZlbmRvcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvciBJTlNUQU5DRSA9IG5ldyBPcmFjbGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBWZW5kb3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JhY2xlKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEZhdXhDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJywgJyMnIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1Bvc3RncmVTUUwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1Bvc3RncmVTUUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4MWJjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Qb3N0Z3JlU1FMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwudmVuZG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLQotY2xhc3MgUG9zdGdyZVNRTAotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgUG9zdGdyZVNRTCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBQb3N0Z3JlU1FMKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RFRQVmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgUG9zdGdyZVNRTCBKREJDIGRyaXZlciByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgZnJvbSB0aGUgY2FsbCB0bwotCSAqIERhdGFiYXNlTWV0YURhdGEuZ2V0Q2F0YWxvZ3MoKSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQotCSAqIGRhdGFiYXNlIGluaXRpYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNvbm5lY3Rpb24gKGluIHRoZSBKREJDIFVSTCkuCi0JICogRFRQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHVubW9kaWZpZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBEVFAKLQkgKiBkYXRhYmFzZSdzIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlJ3MKLQkgKiBuYW1lLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgZ2V0Rm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIFBvc3RncmVTUUwgZGF0YWJhc2UgaG9sZHMgYSBzaW5nbGUgY2F0YWxvZyB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzCi0JICogdGhlIGRhdGFiYXNlLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2dOYW1lKGRhdGFiYXNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuICgoQ2F0YWxvZykgZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKS5nZXQoMCkpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3N0Z3JlU1FMIGhhcyBhICJzY2hlbWEgc2VhcmNoIHBhdGgiLiBUaGUgZGVmYXVsdCBpczoKLQkgKiAgICAgIiR1c2VyIixwdWJsaWMKLQkgKiBJZiB0aGUgIiR1c2VyIiBzY2hlbWEgaXMgbm90IGZvdW5kLCB1c2UgdGhlICJwdWJsaWMiIHNjaGVtYS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyLmFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKGRhdGFiYXNlLCB1c2VyTmFtZSwgbmFtZXMpOwotCQluYW1lcy5hZGQoUFVCTElDX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ0hFTUFfTkFNRSA9ICJwdWJsaWMiOyAgLy8kTk9OLU5MUy0xJAotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJyB9OwotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVQYXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICckJyB9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9TUUxTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1NRTFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDExNGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1NRTFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1jbGFzcyBTUUxTZXJ2ZXIKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVuZG9yIElOU1RBTkNFID0gbmV3IFNRTFNlcnZlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIFZlbmRvciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTUUxTZXJ2ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCkgewotCQlyZXR1cm4gIlNRTCBTZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFNpbXBsZUNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFNRTCBTZXJ2ZXIgaWRlbnRpZmllcnMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdpdGhvdXQKLQkgKiBkZWxpbWl0ZXJzLiBUaGlzIGNhbiBkZXBlbmQgb24gdGhlIGNvbGxhdGlvbiBzZXR0aW5nLi4uLgotCSAqLwotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBnZXRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBOb25Gb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTUUwgU2VydmVyIHdpbGwgdXNlIHRoZSB1c2VyLXJlcXVlc3RlZCBkYXRhYmFzZTsgaWYgdGhhdCBkYXRhYmFzZSBpcyBub3QKLQkgKiBmb3VuZCwgaXQgd2lsbCBkZWZhdWx0IHRvICdtYXN0ZXInLgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChkYXRhYmFzZS5nZXROYW1lKCkpOwotCQluYW1lcy5hZGQoTUFTVEVSX0NBVEFMT0dfSURFTlRJRklFUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19JREVOVElGSUVSID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzY2hlbWEgb24gU1FMIFNlcnZlciBmb3IgYW55IGRhdGFiYXNlIChjYXRhbG9nKSBpcyAnZGJvJy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKERhdGFiYXNlIGRhdGFiYXNlLCBTdHJpbmcgdXNlck5hbWUsIEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJywgJyMnIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBTUUwgU2VydmVyIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMgKFtdKTsgYnV0IGl0Ci0JICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZThiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2VzIHRoYXQgc2ltcGx5IG1vZGVsIHRoZSBjYXRhbG9ncyByZXR1cm5lZAotICogYnkgdGhlIHVuZGVybHlpbmcgSkRCQyBkcml2ZXIgKGUuZy4gU3liYXNlKS4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFNpbXBsZUNhdGFsb2dTdHJhdGVneQotCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFNpbXBsZUNhdGFsb2dTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIENhdGFsb2dTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBCdWcgMzI3NTcyIC0gVW5mb3J0dW5hdGVseSBEVFAgYWxsb3dzIGZvciBvcHRpb25hbCBzdXBwb3J0IG9mIGNhdGFsb2dzIGluIGV4dGVuc2lvbnMKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIG5vcm1hbCBsb2dpYzoKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCS8vIEJ1ZyAzMjc1NzIgLSBVbmZvcnR1bmF0ZWx5IERUUCBhbGxvd3MgZm9yIG9wdGlvbmFsIHN1cHBvcnQgb2YgY2F0YWxvZ3MgaW4gZXh0ZW5zaW9ucwotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQkvLyBub3JtYWwgbG9naWM6Ci0JCXJldHVybiBjYXRhbG9nczsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IGRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JCS8vIEJ1ZyAzMjc1NzIgLSBVbmZvcnR1bmF0ZWx5IERUUCBhbGxvd3MgZm9yIG9wdGlvbmFsIHN1cHBvcnQgb2YgY2F0YWxvZ3MgaW4gZXh0ZW5zaW9ucwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZGF0YWJhc2UuZ2V0U2NoZW1hcygpOwotCQl9Ci0JCQotCQkvLyBub3JtYWwgbG9naWM6Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1N5YmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWUxMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvU3liYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1jbGFzcyBTeWJhc2UKLQlleHRlbmRzIEFic3RyYWN0VmVuZG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZHRwVmVuZG9yTmFtZTsKLQotCXN0YXRpYyBmaW5hbCBWZW5kb3IgQVNBID0gbmV3IFN5YmFzZSgiU3liYXNlX0FTQSIpOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFZlbmRvciBBU0UgPSBuZXcgU3liYXNlKCJTeWJhc2VfQVNFIik7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBWZW5kb3IgYXNhKCkgewotCQlyZXR1cm4gQVNBOwotCX0KLQotCXN0YXRpYyBWZW5kb3IgYXNlKCkgewotCQlyZXR1cm4gQVNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBvbmx5IHN0YXRpYyBpbnN0YW5jZXMuCi0JICovCi0JcHJpdmF0ZSBTeWJhc2UoU3RyaW5nIGR0cFZlbmRvck5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kdHBWZW5kb3JOYW1lID0gZHRwVmVuZG9yTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFZlbmRvck5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGdldENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFNpbXBsZUNhdGFsb2dTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFN5YmFzZSBpZGVudGlmaWVycyBhcmUgY2FzZS1zZW5zaXRpdmUsIGV2ZW4gd2l0aG91dAotCSAqIGRlbGltaXRlcnMuIFRoaXMgY2FuIGRlcGVuZCBvbiB0aGUgY29sbGF0aW9uIHNldHRpbmcuLi4uCi0JICovCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIE5vbkZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIFN5YmFzZSB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90Ci0JICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byAnbWFzdGVyJy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhEYXRhYmFzZSBkYXRhYmFzZSwgU3RyaW5nIHVzZXJOYW1lLCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJbmFtZXMuYWRkKE1BU1RFUl9DQVRBTE9HX05BTUUpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFTVEVSX0NBVEFMT0dfTkFNRSA9ICJtYXN0ZXIiOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHR5cGljYWwgZGVmYXVsdCBzY2hlbWEgb24gU3liYXNlIGZvciBhbnkgZGF0YWJhc2UgKGNhdGFsb2cpIGlzCi0JICogJ2RibycuCi0JICogCi0JICogQWN0dWFsbHksIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyBtb3JlIGxpa2UgYSBzZWFyY2ggcGF0aDoKLQkgKiBUaGUgc2VydmVyIGxvb2tzIGZvciBhIHNjaGVtYSBvYmplY3QgKGUuZy4gYSB0YWJsZSkgZmlyc3QgaW4gdGhlIHVzZXIncwotCSAqIHNjaGVtYSwgdGhlbiBpdCBsb29rcyBmb3IgdGhlIHNjaGVtYSBvYmplY3QgaW4gdGhlIGRhdGFiYXNlIG93bmVyJ3MKLQkgKiBzY2hlbWEgKGRibykuIEFzIGEgcmVzdWx0LCBpdCdzIHJlYWxseSBub3QgcG9zc2libGUgdG8gc3BlY2lmeQotCSAqIHRoZSAiZGVmYXVsdCIgc2NoZW1hIHdpdGhvdXQga25vd2luZyB0aGUgc2NoZW1hIG9iamVjdCB3ZSBhcmUKLQkgKiBsb29raW5nIGZvci4KLQkgKiAKLQkgKiAoTm90ZTogdGhlIGN1cnJlbnQgJ3VzZXInIGlzIG5vdCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgY3VycmVudAotCSAqICdsb2dpbicgLSBzZWUgc3BfYWRkdXNlciBhbmQgc3BfYWRkbG9naW47IHNvIHdlIHByb2JhYmx5IGNhbid0Ci0JICogdXNlIENvbm5lY3Rpb25Qcm9maWxlI2dldFVzZXJOYW1lKCkuKQotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSwgQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKERFRkFVTFRfU0NIRU1BX05BTUUpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TQ0hFTUFfTkFNRSA9ICJkYm8iOyAgLy8kTk9OLU5MUy0xJAotCi0JQE92ZXJyaWRlCi0JY2hhcltdIGdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTID0gbmV3IGNoYXJbXSB7ICdfJywgJ0AnIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnLCAnpScsICejJywgJyMnIH07Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBTeWJhc2UgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBicmFja2V0cyAoW10pOyBidXQgaXQKLQkgKiBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChpZGVudGlmaWVyKQotCQkJCQl8fCBzdXBlci5pZGVudGlmaWVySXNEZWxpbWl0ZWQoaWRlbnRpZmllcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjllZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvVW5rbm93bkNhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIHVua25vd24gRFRQIGRhdGFiYXNlcy4KLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFVua25vd25DYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhdGFsb2dTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgQ2F0YWxvZ1N0cmF0ZWd5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVua25vd25DYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQkJaWYgKChjYXRhbG9ncyA9PSBudWxsKSB8fCBjYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0aGlzLmdldEZhdXhDYXRhbG9nKGNhdGFsb2dzKSA9PSBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCUxpc3Q8Q2F0YWxvZz4gY2F0YWxvZ3MgPSBkYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCQkvLyBpZiB0aGVyZSBhcmUgbm8gY2F0YWxvZ3MsIHRoZSBkYXRhYmFzZSBtdXN0IGhvbGQgdGhlIHNjaGVtYXRhIGRpcmVjdGx5Ci0JCWlmICgoY2F0YWxvZ3MgPT0gbnVsbCkgfHwgY2F0YWxvZ3MuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlDYXRhbG9nIGZhdXhDYXRhbG9nID0gdGhpcy5nZXRGYXV4Q2F0YWxvZyhjYXRhbG9ncyk7Ci0JCXJldHVybiAoZmF1eENhdGFsb2cgPT0gbnVsbCkgPyBjYXRhbG9ncyA6IENvbGxlY3Rpb25zLjxDYXRhbG9nPmVtcHR5TGlzdCgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcyhEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gZGF0YWJhc2UuZ2V0Q2F0YWxvZ3MoKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGRhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQkJfQotCi0JCUNhdGFsb2cgZmF1eENhdGFsb2cgPSB0aGlzLmdldEZhdXhDYXRhbG9nKGNhdGFsb2dzKTsKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyAhPSBudWxsKSA/IGZhdXhDYXRhbG9nLmdldFNjaGVtYXMoKSA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZyBnZXRGYXV4Q2F0YWxvZyhMaXN0PENhdGFsb2c+IGNhdGFsb2dzKSB7Ci0JCWlmIChjYXRhbG9ncy5zaXplKCkgPT0gMSkgewotCQkJQ2F0YWxvZyBjYXRhbG9nID0gY2F0YWxvZ3MuZ2V0KDApOwotCQkJaWYgKGNhdGFsb2cuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvVW5yZWNvZ25pemVkVmVuZG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxY2YyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9VbnJlY29nbml6ZWRWZW5kb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIFVucmVjb2duaXplZFZlbmRvcgotCWV4dGVuZHMgQWJzdHJhY3RWZW5kb3IKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZW5kb3IgSU5TVEFOQ0UgPSBuZXcgVW5yZWNvZ25pemVkVmVuZG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgVmVuZG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFVucmVjb2duaXplZFZlbmRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERUUFZlbmRvck5hbWUoKSB7Ci0JCXJldHVybiAiVW5yZWNvZ25pemVkIFZlbmRvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOb3Qgc3VyZSB3aGF0IHRvIGRvIGhlcmUuLi4uCi0JICogQXNzdW1lIHRoZSBEVFAgZGF0YWJhc2UgaXMgb3JnYW5pemVkIGludG8gb25lIG9yIG1vcmUgY2F0YWxvZ3MgYW5kCi0JICogdGhlIHNjaGVtYXRhIGFyZSBjb250YWluZWQgYnkgdGhvc2UgY2F0YWxvZ3MuIFRoaXMgYXBwZWFycyB0byBiZSB0aGUKLQkgKiBkZWZhdWx0IHdheSBEVFAgYnVpbGRzIG1vZGVscyB0aGVzZSBkYXlzIChpLmUuIGEgZGF0YWJhc2Ugd2l0aCBhdAotCSAqIGxlYXN0IG9uZSBjYXRhbG9nLCBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBob2xkaW5nIHNjaGVtYXRhCi0JICogZGlyZWN0bHkpLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBnZXRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGdldEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwYWZlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCAibm9ybWFsIiBpZGVudGlmaWVycyB0byB1cHBlciBjYXNlLgotICogSWdub3JlIHRoZSBjYXNlIG9mICJub3JtYWwiIGlkZW50aWZpZXJzLgotICovCi1jbGFzcyBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIEZvbGRpbmdTdHJhdGVneQotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWd1bGFySWRlbnRpZmllcnNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL3ZlbmRvci9WZW5kb3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRjOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLnZlbmRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogRGVsZWdhdGUgdmVuZG9yLXNwZWNpZmljIGJlaGF2aW9yIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZTo8dWw+Ci0gKiAgIDxsaT5jYXRhbG9nIHN1cHBvcnQKLSAqICAgPGxpPmRlZmF1bHQgY2F0YWxvZyBhbmQgc2NoZW1hCi0gKiAgIDxsaT5jb252ZXJ0aW5nIG5hbWVzIHRvIGlkZW50aWZpZXJzIGFuZCB2aWNlLXZlcnNhCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz48YnI+Ci0gKiBXZSB1c2UgPGVtPm5hbWU8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgdW5tb2RpZmllZCBuYW1lIG9mIGEgZGF0YWJhc2Ugb2JqZWN0Ci0gKiBhcyBzdXBwbGllZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmIChpLmUuIGl0IGlzIG5vdCBkZWxpbWl0ZWQgYW5kIGl0IGlzIGFsd2F5cwotICogY2FzZS1zZW5zaXRpdmUpLgotICogPGJyPgotICogV2UgdXNlIDxlbT5pZGVudGlmaWVyPC9lbT4gd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlbmRvciB7Ci0KLQkvKioKLQkgKiBUaGlzIG11c3QgbWF0Y2ggdGhlIERUUCB2ZW5kb3IgbmFtZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSNnZXRWZW5kb3IoKQotCSAqLwotCVN0cmluZyBnZXREVFBWZW5kb3JOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdmVuZG9yIHN1cHBvcnRzICJyZWFsIiBjYXRhbG9ncyAoZS5nLiBTeWJhc2UpLgotCSAqLwotCWJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncyhEYXRhYmFzZSBkYXRhYmFzZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqLwotCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2cgbmFtZXMgZm9yIHRoZQotCSAqIHNwZWNpZmllZCB1c2VyLiBUaGUgZmlyc3QgbmFtZSBpbiB0aGUgbGlzdCB0aGF0IGlkZW50aWZpZXMgYSBjYXRhbG9nCi0JICogdGhhdCBleGlzdHMgaXMgInRoZSIgZGVmYXVsdC4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBkYXRhYmFzZSdzIHNjaGVtYXMuCi0JICovCi0JTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoRGF0YWJhc2UgZGF0YWJhc2UpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSBuYW1lcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHVzZXIuIFRoZSBmaXJzdCBuYW1lIGluIHRoZSBsaXN0IHRoYXQgaWRlbnRpZmllcyBhIHNjaGVtYQotCSAqIHRoYXQgZXhpc3RzIGlzICJ0aGUiIGRlZmF1bHQuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0U2NoZW1hTmFtZXMoRGF0YWJhc2UgZGF0YWJhc2UsIFN0cmluZyB1c2VyTmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSB2ZW5kb3IgaWRlbnRpZmllci4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgbmFtZS4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0TmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSB2ZW5kb3IgaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBpZGVudGlmaWVyIHRvIGEgdmVuZG9yIG5hbWUuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC92ZW5kb3IvVmVuZG9yUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdkMTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvdmVuZG9yL1ZlbmRvclJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC52ZW5kb3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGNsYXNzIFZlbmRvclJlcG9zaXRvcnkgewotCXByaXZhdGUgZmluYWwgVmVuZG9yW10gdmVuZG9yczsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlbmRvclJlcG9zaXRvcnkgSU5TVEFOQ0UgPSBuZXcgVmVuZG9yUmVwb3NpdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBWZW5kb3JSZXBvc2l0b3J5IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFZlbmRvclJlcG9zaXRvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmVuZG9ycyA9IHRoaXMuYnVpbGRWZW5kb3JzKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZW5kb3JbXSBidWlsZFZlbmRvcnMoKSB7Ci0JCUFycmF5TGlzdDxWZW5kb3I+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFZlbmRvcj4oKTsKLQkJdGhpcy5hZGRWZW5kb3JzVG8obGlzdCk7Ci0JCXJldHVybiBsaXN0LnRvQXJyYXkobmV3IFZlbmRvcltsaXN0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWZW5kb3JzVG8oQXJyYXlMaXN0PFZlbmRvcj4gbGlzdCkgewotCQl0aGlzLmFkZFZlbmRvclRvKERCMi51ZGIoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oREIyLnVkYklTZXJpZXMoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oREIyLnVkYlpTZXJpZXMoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oRGVyYnkuaW5zdGFuY2UoKSwgbGlzdCk7Ci0JCXRoaXMuYWRkVmVuZG9yVG8oSFNRTERCLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKEluZm9ybWl4Lmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKE1heERCLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKE15U1FMLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKE9yYWNsZS5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhQb3N0Z3JlU1FMLmluc3RhbmNlKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKFNRTFNlcnZlci5pbnN0YW5jZSgpLCBsaXN0KTsKLQkJdGhpcy5hZGRWZW5kb3JUbyhTeWJhc2UuYXNhKCksIGxpc3QpOwotCQl0aGlzLmFkZFZlbmRvclRvKFN5YmFzZS5hc2UoKSwgbGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZlbmRvclRvKFZlbmRvciB2ZW5kb3IsIEFycmF5TGlzdDxWZW5kb3I+IGxpc3QpIHsKLQkJU3RyaW5nIG5hbWUgPSB2ZW5kb3IuZ2V0RFRQVmVuZG9yTmFtZSgpOwotCQlmb3IgKEl0ZXJhdG9yPFZlbmRvcj4gc3RyZWFtID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmdldERUUFZlbmRvck5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgdmVuZG9yOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlsaXN0LmFkZCh2ZW5kb3IpOwotCX0KLQotCXB1YmxpYyBWZW5kb3IgZ2V0VmVuZG9yKFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLnZlbmRvcnMubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJVmVuZG9yIHZlbmRvciA9IHRoaXMudmVuZG9yc1tpXTsKLQkJCWlmICh2ZW5kb3IuZ2V0RFRQVmVuZG9yTmFtZSgpLmVxdWFscyhkdHBWZW5kb3JOYW1lKSkgewotCQkJCXJldHVybiB2ZW5kb3I7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFVucmVjb2duaXplZFZlbmRvci5pbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDA3YjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjMjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYTc1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjQuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwZTM2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwODliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxNDZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjNjBkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTJkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgZXhwb3J0ZWQ9InRydWUiIGtpbmQ9ImxpYiIgcGF0aD0ibGliL3BlcnNpc3RlbmNlLmphciIgc291cmNlcGF0aD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbnNyYy56aXAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY3ZzaWdub3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhYTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTU1ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjU0IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDFiYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNXZWQgQXByIDMwIDE3OjI0OjQxIEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDg1NjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9wZXJzaXN0ZW5jZS5qYXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnBlcnNpc3RlbmNlLAotIGphdmF4LnBlcnNpc3RlbmNlLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczYWMxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgbGliL3BlcnNpc3RlbmNlLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2xpYi9wZXJzaXN0ZW5jZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWIyMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9saWIvcGVyc2lzdGVuY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjg0ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSnBhIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBEREwgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9kZGxnZW4vTWFpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGI1ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci0KLS8qKiAKLSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBhIEVjbGlwc2VMaW5rIDxjb2RlPkVudGl0eU1hbmFnZXJGYWN0b3J5PC9jb2RlPiwgCi0gKiBhbmQgZXhlY3V0ZXMgdGhlIERETCBnZW5lcmF0b3Igd2l0aCB0aGUgY29tbWFuZCBzZXQgaW4gdGhlIHByb3BlcnRpZXM6IAotICogICAgIDxjb2RlPmVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uLm91dHB1dC1tb2RlPC9jb2RlPiAKLSAqICAgICA8Y29kZT5lY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbjwvY29kZT4KLSAqIAotICogQ3VycmVudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgotICogICAgIFstcHUgcHVOYW1lXSAtIHBlcnNpc3RlbmNlIHVuaXQgbmFtZQotICogICAgIFstcCBwcm9wZXJ0aWVzRmlsZVBhdGhdIC0gcHJvcGVydGllcyBmb3IgRWNsaXBzZUxpbmsgRW50aXR5TWFuYWdlcgotICogIAotICogIEV4YW1wbGUgb2YgYSBwcm9wZXJ0aWVzIGZpbGU6Ci0gKiAgCWVjbGlwc2VsaW5rLmpkYmMuYmluZC1wYXJhbWV0ZXJzPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmpkYmMuZHJpdmVyPW9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlcgotICogIAllY2xpcHNlbGluay5qZGJjLnVybD1qZGJjXDpkZXJieVw6Y1w6L2RlcmJ5ZGIvdGVzdGRiO2NyZWF0ZVw9dHJ1ZQotICogIAllY2xpcHNlbGluay5qZGJjLnVzZXI9dHJhbgotICogIAllY2xpcHNlbGluay5qZGJjLnBhc3N3b3JkPQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLmxldmVsPUZJTkVTVAotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnRpbWVzdGFtcD1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnRocmVhZD1mYWxzZQotICogIAllY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb249ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsub3JtLnRocm93LmV4Y2VwdGlvbnM9dHJ1ZQotICogIAllY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZT1kYXRhYmFzZQotICogIAllY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbj1kcm9wLWFuZC1jcmVhdGUtdGFibGVzCi0gKiAgCWVjbGlwc2VsaW5rLmFwcGxpY2F0aW9uLWxvY2F0aW9uPWNcOi9fUHJvamVjdHNfL0V4YW1wbGVEREwKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcm90ZWN0ZWQgRW50aXR5TWFuYWdlckZhY3RvcnkgZW1mOwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBlY2xpcHNlTGlua1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRERMRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZHJvcERETEZpbGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIGFwcExvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmVtZiA9IFBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KHRoaXMuZ2V0UFVOYW1lKGFyZ3MpLCB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyk7Ci0JCXRoaXMucGVyZm9ybSgpOwotCQl0aGlzLmNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKTsKLQkJCi0JCXRoaXMuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm0oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBFTSB0byBnZW5lcmF0ZSBzY2hlbWEuCi0JCXRoaXMuZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKS5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCkgewotCQl0aGlzLmVtZi5jbG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCi0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChhcmdzKTsKLQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXModGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQkJCi0JCXRoaXMuY3JlYXRlRERMRmlsZU5hbWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoIAotCQkJCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FLCAKLQkJCQkJCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLCAgCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0KLQkJdGhpcy5kcm9wRERMRmlsZU5hbWUgPSB0aGlzLmdldENvbmZpZ1Byb3BlcnR5QXNTdHJpbmcoCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLCAKLQkJCQkJCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzLCAgCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRFJPUF9GSUxFX05BTUUpOyAKLQkJCi0JCXRoaXMuYXBwTG9jYXRpb24gPSB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcy5nZXQoCi0JCQkJCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKCkgewotCi0JCWlmKCAhIHRoaXMuaXNEZWJ1Z01vZGUpIHsKLQkJCW5ldyBGaWxlKHRoaXMuYXBwTG9jYXRpb24gKyAiLyIgKyB0aGlzLmNyZWF0ZURETEZpbGVOYW1lKS5kZWxldGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJbmV3IEZpbGUodGhpcy5hcHBMb2NhdGlvbiArICIvIiArIHRoaXMuZHJvcERETEZpbGVOYW1lKS5kZWxldGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJbmV3IEZpbGUodGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKS5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcyhTdHJpbmcgZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkgewotCQkKLQkJU2V0PEVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gcHJvcGVydGllc1NldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9wZXJ0aWVzU2V0ID0gdGhpcy5sb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZzogIiArIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlmb3IoRW50cnk8T2JqZWN0LCBPYmplY3Q+IHByb3BlcnR5IDogcHJvcGVydGllc1NldCkgewotCQkJcHJvcGVydGllcy5wdXQoKFN0cmluZylwcm9wZXJ0eS5nZXRLZXkoKSwgKFN0cmluZylwcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLSAgICBwcml2YXRlIFNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IGxvYWRFY2xpcHNlTGlua1Byb3BlcnRpZXMoU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZW50cnlTZXQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFyZ3VtZW50IHF1ZXJpZXMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgU3RyaW5nIGdldFBVTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXB1IiwgYXJncyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXAiLCBhcmdzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJcmV0dXJuIGFyZ3Nbal07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXJndW1lbnRFeGlzdHMoU3RyaW5nIGFyZ3VtZW50LCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ3VtZW50KSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiogdXRpbGl0eSBtZXRob2RzICoqKioqKioKLQkKLSAgICAvKioKLSAgICAgKiBDaGVjayB0aGUgcHJvdmlkZWQgbWFwIGZvciBhbiBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4ga2V5LiAgSWYgdGhhdCBvYmplY3QgaXMgbm90IGF2YWlsYWJsZSwgY2hlY2sgdGhlCi0gICAgICogU3lzdGVtIHByb3BlcnRpZXMuICBJZiBpdCBpcyBub3QgYXZhaWxhYmxlIGZyb20gZWl0aGVyIGxvY2F0aW9uLCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IAotICAgICAqIEBwYXJhbSBtYXAgCi0gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAKLSAgICAgKiBAcmV0dXJuIAotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhTdHJpbmcgcHJvcGVydHlLZXksIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzLCBTdHJpbmcgZGVmYXVsdFZhbHVlKXsKLSAgICAJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRDb25maWdQcm9wZXJ0eUFzU3RyaW5nKHByb3BlcnR5S2V5LCBvdmVycmlkZXMpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCl7Ci0gICAgICAgICAgICB2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnUHJvcGVydHlBc1N0cmluZyhTdHJpbmcgcHJvcGVydHlLZXksIE1hcDxTdHJpbmcsIFN0cmluZz4gb3ZlcnJpZGVzKXsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKG92ZXJyaWRlcyAhPSBudWxsKXsKLSAgICAgICAgICAgIHZhbHVlID0gb3ZlcnJpZGVzLmdldChwcm9wZXJ0eUtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpewotICAgICAgICAgICAgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGViNGM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNjQ0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjMmIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjODc0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jRnJpIEp1bCAzMCAxMzoxNToxNiBFRFQgMjAxMAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkPVVURjgKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkPVVURjgKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkPVVURjgKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkPVVURjgKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkPVVURjgKLWVuY29kaW5nLy9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMS54c2Q9VVRGOAotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2ZhNTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jU3VuIEZlYiAyNCAyMToyNTozNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1M2IzNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDIsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZywKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbCwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2Uub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5kZGxnZW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0Lm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucywKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWJkNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWphdmFjU291cmNlPTEuNQotamF2YWNUYXJnZXQ9MS41Ci1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBzY2hlbWFzLwotamFycy5jb21waWxlLm9yZGVyID0gLgotc3JjLmluY2x1ZGVzID0gbW9kZWwvCi1zcmMuaW5jbHVkZXMgPSBtb2RlbC8sXAotICAgICAgICAgICAgICAgc2NoZW1hcy8KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9tb2RlbC9lY2xpcHNlTGlua1Jlc291cmNlTW9kZWxzLmdlbm1vZGVsIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGM2NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VMaW5rUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxnZW5tb2RlbDpHZW5Nb2RlbCB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiCi0gICAgeG1sbnM6Z2VubW9kZWw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwiIG1vZGVsRGlyZWN0b3J5PSIvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYyIKLSAgICBjcmVhdGlvbkNvbW1hbmRzPSJmYWxzZSIgY3JlYXRpb25JY29ucz0iZmFsc2UiIGVkaXREaXJlY3Rvcnk9IiIgZWRpdG9yRGlyZWN0b3J5PSIiCi0gICAgbW9kZWxQbHVnaW5JRD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlIiBtb2RlbE5hbWU9IkVjbGlwc2VMaW5rQ29yZSIgZWRpdFBsdWdpbkNsYXNzPSIiCi0gICAgZWRpdG9yUGx1Z2luQ2xhc3M9IiIgdXBkYXRlQ2xhc3NwYXRoPSJmYWxzZSIgcm9vdEV4dGVuZHNJbnRlcmZhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdCIKLSAgICByb290RXh0ZW5kc0NsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdCIgc3VwcHJlc3NJbnRlcmZhY2VzPSJ0cnVlIgotICAgIHRlc3RzRGlyZWN0b3J5PSIiIHRlc3RTdWl0ZUNsYXNzPSIiIGltcG9ydGVySUQ9Im9yZy5lY2xpcHNlLmVtZi5pbXBvcnRlci5lY29yZSIKLSAgICBjb21wbGlhbmNlTGV2ZWw9IjUuMCIgY29weXJpZ2h0RmllbGRzPSJmYWxzZSIgdXNlZEdlblBhY2thZ2VzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwjLy9vcm0gLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL2pwYVJlc291cmNlTW9kZWxzLmdlbm1vZGVsIy8veG1sIj4KLSAgPGZvcmVpZ25Nb2RlbD5lY2xpcHNlbGlua19vcm0uZWNvcmU8L2ZvcmVpZ25Nb2RlbD4KLSAgPGdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm0iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UiCi0gICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZUNvb3JkaW5hdGlvblR5cGUvSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVDb29yZGluYXRpb25UeXBlL1NFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS9OT05FIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL0ZVTEwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1dFQUsiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQ2FjaGVUeXBlL1NPRlRfV0VBSyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvSEFSRF9XRUFLIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0NhY2hlVHlwZS9DQUNIRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9DYWNoZVR5cGUvTk9ORSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nVHlwZS9BVFRSSUJVVEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL09CSkVDVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ1R5cGUvREVGRVJSRUQiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlL0FVVE8iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24iPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU4iLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRGlyZWN0aW9uL09VVCIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxEaXJlY3Rpb24vSU5fT1VUIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbERpcmVjdGlvbi9PVVRfQ1VSU09SIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0V4aXN0ZW5jZVR5cGUvQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9DSEVDS19EQVRBQkFTRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9FeGlzdGVuY2VUeXBlL0FTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vRXhpc3RlbmNlVHlwZS9BU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwvZ2VuRW51bXM+Ci0gICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2hUeXBlL0lOTkVSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaFR5cGUvT1VURVIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvQUxMX0NPTFVNTlMiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlL0NIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUvVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWNjZXNzTWV0aG9kcy9nZXRNZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzL3NldE1ldGhvZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyL2FjY2Vzc01ldGhvZHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vQXR0cmlidXRlcyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL0F0dHJpYnV0ZXMvYmFzaWNDb2xsZWN0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2Jhc2ljTWFwcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3RyYW5zZm9ybWF0aW9ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3ZhcmlhYmxlT25lVG9PbmVzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxCYXNpY0NvbGxlY3Rpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhc2ljTWFwIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmF0Y2hGZXRjaCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQmF0Y2hGZXRjaEhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEJhdGNoRmV0Y2hIb2xkZXIvYmF0Y2hGZXRjaCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZXhwaXJ5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvc2l6ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3NoYXJlZCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9hbHdheXNSZWZyZXNoIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvcmVmcmVzaE9ubHlJZk5ld2VyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZGlzYWJsZUhpdHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZS9jb29yZGluYXRpb25UeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgbm90aWZ5PSJmYWxzZSIgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBwcm9wZXJ0eVNvcnRDaG9pY2VzPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGUvZXhwaXJ5VGltZU9mRGF5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2FjaGVIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDYWNoZUhvbGRlci9jYWNoZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENhY2hlSG9sZGVyL2V4aXN0ZW5jZUNoZWNraW5nIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENoYW5nZVRyYWNraW5nIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZy90eXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci9jaGFuZ2VUcmFja2luZyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENsb25lQ29weVBvbGljeS9tZXRob2QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDbG9uZUNvcHlQb2xpY3kvd29ya2luZ0NvcHlNZXRob2QiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29sbGVjdGlvblRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJzaW9uVmFsdWUvZGF0YVZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVyc2lvblZhbHVlL29iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlckhvbGRlci9jb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL3R5cGVDb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL29iamVjdFR5cGVDb252ZXJ0ZXIiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVySG9sZGVyL3N0cnVjdENvbnZlcnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlcnNIb2xkZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyL2NvbnZlcnRlcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ29udmVydGVyc0hvbGRlci90eXBlQ29udmVydGVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyL29iamVjdFR5cGVDb252ZXJ0ZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbENvbnZlcnRlcnNIb2xkZXIvc3RydWN0Q29udmVydGVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcvY29udmVydCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb3B5UG9saWN5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxDb3B5UG9saWN5L2NsYXNzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplci9jdXN0b21pemVyQ2xhc3NOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sQ3VzdG9taXplckhvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEN1c3RvbWl6ZXJIb2xkZXIvY3VzdG9taXplciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbGVtZW50Q29sbGVjdGlvbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2NvcHlQb2xpY3kiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW1iZWRkYWJsZS9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlL2Nsb25lQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUvZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVtYmVkZGVkIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZElkIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L29wdGltaXN0aWNMb2NraW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9jb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEVudGl0eS9pbnN0YW50aWF0aW9uQ29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxFbnRpdHkvY2xvbmVDb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5L2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxGZXRjaEF0dHJpYnV0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEZldGNoR3JvdXAiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxIYXNoUGFydGl0aW9uaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxJbmRleCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxKb2luRmV0Y2giPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbEpvaW5GZXRjaC9qb2luRmV0Y2giLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sSm9pblRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFueVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hbnlUb09uZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL29wdGltaXN0aWNMb2NraW5nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvY29weVBvbGljeSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2luc3RhbnRpYXRpb25Db3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvY2xvbmVDb3B5UG9saWN5Ii8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTWFwcGVkU3VwZXJjbGFzcy9leGNsdWRlRGVmYXVsdE1hcHBpbmdzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTXV0YWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTXV0YWJsZS9tdXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkQ29udmVydGVyL25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS9yZXN1bHRDbGFzcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmVzdWx0U2V0TWFwcGluZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcHJvY2VkdXJlTmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcmV0dXJuc1Jlc3VsdFNldCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5L2hpbnRzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkvcGFyYW1ldGVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyL2RhdGFUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT2JqZWN0VHlwZUNvbnZlcnRlci9vYmplY3RUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvY29udmVyc2lvblZhbHVlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIvZGVmYXVsdE9iamVjdFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9uZVRvT25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcHRpbWlzdGljTG9ja2luZy9jYXNjYWRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbE9wdGltaXN0aWNMb2NraW5nL3NlbGVjdGVkQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxPcmRlckNvbHVtbiIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhL2V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUGlubmVkUGFydGl0aW9uaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpbWFyeUtleSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJpdmF0ZU93bmVkIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcml2YXRlT3duZWQvcHJpdmF0ZU93bmVkIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUHJvcGVydHkvdmFsdWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eS92YWx1ZVR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFByb3BlcnR5Q29udGFpbmVyL3Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyL25hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxRdWVyeVJlZGlyZWN0b3JzIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sUmFuZ2VQYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJlYWRPbmx5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxSZWFkT25seS9yZWFkT25seSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJldHVybkluc2VydCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL2RpcmVjdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3F1ZXJ5UGFyYW1ldGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyL3R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIvamRiY1R5cGVOYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFN0cnVjdENvbnZlcnRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sU3RydWN0Q29udmVydGVyL2NvbnZlcnRlciIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkvaG91ciIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFRpbWVPZkRheS9taW51dGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUaW1lT2ZEYXkvc2Vjb25kIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVGltZU9mRGF5L21pbGxpc2Vjb25kIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHJhbnNmb3JtYXRpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUcmFuc2llbnQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUeXBlQ29udmVydGVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxUeXBlQ29udmVydGVyL2RhdGFUeXBlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVHlwZUNvbnZlcnRlci9vYmplY3RUeXBlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFVuaW9uUGFydGl0aW9uaW5nIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vWG1sVmFsdWVQYXJ0aXRpb25pbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL1htbFZhcmlhYmxlT25lVG9PbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy9YbWxWZXJzaW9uIi8+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm1WMV8xIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvTlVMTCIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvWkVSTyIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEvTk9ORSIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxCYXNpY18xXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sQmFzaWNfMV8xL2dlbmVyYXRlZFZhbHVlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sRW50aXR5XzFfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxFbnRpdHlfMV8xL3ByaW1hcnlLZXkiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS9wcmltYXJ5S2V5Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMS92YWxpZGF0aW9uIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjFfMS9YbWxQcmltYXJ5S2V5XzFfMS9jb2x1bW5zIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJFY2xpcHNlTGlua09ybVYyXzAiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIgotICAgICAgICBkaXNwb3NhYmxlUHJvdmlkZXJGYWN0b3J5PSJ0cnVlIiBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMCI+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMCI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMC9SRUFEIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMC9SRUFEX1dSSVRFIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMC9FWENFUFRJT04iLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wL21hcEtleUNvbnZlcnQiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxFbnRpdHlfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbEVudGl0eV8yXzAvY2FjaGVJbnRlcmNlcHRvciIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5XzJfMC9xdWVyeVJlZGlyZWN0b3JzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC9tYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wL2NhY2hlSW50ZXJjZXB0b3IiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wL2NvcnJlY3Rpb25UeXBlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9hbGxRdWVyaWVzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL3JlYWRBbGwiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvcmVhZE9iamVjdCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9yZXBvcnQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAvdXBkYXRlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wL2luc2VydCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC9kZWxldGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICAgIDxuZXN0ZWRHZW5QYWNrYWdlcyBwcmVmaXg9IkVjbGlwc2VMaW5rT3JtVjJfMSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iCi0gICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZmlsZUV4dGVuc2lvbnM9ImVjbGlwc2VsaW5rb3JtdjJfMSIKLSAgICAgICAgZWNvcmVQYWNrYWdlPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xIj4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS9JRF9WQUxVRSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS9DQUNIRV9LRVkiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0NhY2hlS2V5VHlwZV8yXzEvQVVUTyIvPgotICAgICAgPC9nZW5FbnVtcz4KLSAgICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL0JhdGNoRmV0Y2hUeXBlXzJfMSI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEvSk9JTiIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xL0VYSVNUUyIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xL0lOIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhc2ljXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXNpY18yXzEvcmV0dXJuSW5zZXJ0Ii8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhc2ljXzJfMS9yZXR1cm5VcGRhdGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmFzaWNfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xL3NpemUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEvYmF0Y2hGZXRjaFR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVtYmVkZGFibGVfMl8xIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW1iZWRkZWRfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW1iZWRkZWRfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbWJlZGRlZElkXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVtYmVkZGVkSWRfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxFbnRpdHlfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVudGl0eV8yXzEvY2xhc3NFeHRyYWN0b3IiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRW50aXR5XzJfMS9wYXJlbnRDbGFzcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMSIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoQXR0cmlidXRlXzJfMS9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS9uYW1lIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoR3JvdXBfMl8xL2xvYWQiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbEZldGNoR3JvdXBfMl8xL2F0dHJpYnV0ZXMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEvZmV0Y2hHcm91cHMiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxJZF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxJZF8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hbnlUb01hbnlfMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sTWFueVRvTWFueV8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE1hbnlUb09uZV8yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS9zcWxSZXN1bHRTZXRNYXBwaW5ncyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEvcXVlcnlSZWRpcmVjdG9ycyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS9wYXJlbnRDbGFzcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbE9uZVRvTWFueV8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxPbmVUb01hbnlfMl8xL2F0dHJpYnV0ZVR5cGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxPbmVUb09uZV8yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMSI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFByaW1hcnlLZXlfMl8xL2NhY2hlS2V5VHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFJldHVybkluc2VydF8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxSZXR1cm5JbnNlcnRfMl8xL3JldHVybk9ubHkiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8xL1htbFZlcnNpb25fMl8xIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzEvWG1sVmVyc2lvbl8yXzEvYXR0cmlidXRlVHlwZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgIDwvbmVzdGVkR2VuUGFja2FnZXM+Ci0gICAgPG5lc3RlZEdlblBhY2thZ2VzIHByZWZpeD0iRWNsaXBzZUxpbmtPcm1WMl8yIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBmaWxlRXh0ZW5zaW9ucz0iRWNsaXBzZUxpbmtPcm1WMl8yIgotICAgICAgICBlY29yZVBhY2thZ2U9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIiPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yL2NyaXRlcmlhIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQmFzaWNfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEJhc2ljXzJfMi9pbmRleCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEJhc2ljQ29sbGVjdGlvbl8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxCYXNpY0NvbGxlY3Rpb25fMl8yL2Nhc2NhZGVPbkRlbGV0ZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEJhc2ljTWFwXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEJhc2ljTWFwXzJfMi9jYXNjYWRlT25EZWxldGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sQ29sbGVjdGlvblRhYmxlXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi9jYXNjYWRlT25EZWxldGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yL25vbkNhY2hlYWJsZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVtYmVkZGFibGVfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW1iZWRkYWJsZV8yXzIvcGFyZW50Q2xhc3MiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eV8yXzIvYWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eV8yXzIvY2FzY2FkZU9uRGVsZXRlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlfMl8yL2luZGV4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9wYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9yZXBsaWNhdGlvblBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3JvdW5kUm9iaW5QYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9waW5uZWRQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi9yYW5nZVBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3ZhbHVlUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxFbnRpdHlNYXBwaW5nc18yXzIvaGFzaFBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yL3VuaW9uUGFydGl0aW9uaW5nIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxIYXNoUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbElkXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJZF8yXzIvaW5kZXgiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvbmFtZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvc2NoZW1hIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi9jYXRhbG9nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi90YWJsZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxJbmRleF8yXzIvdW5pcXVlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEluZGV4XzJfMi9jb2x1bW5OYW1lcyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbEpvaW5UYWJsZV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxKb2luVGFibGVfMl8yL2NyZWF0aW9uU3VmZml4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvTWFueV8yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxNYW55VG9NYW55XzJfMi9jYXNjYWRlT25EZWxldGUiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvTWFueV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFueVRvT25lXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE1hbnlUb09uZV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIvYWRkaXRpb25hbENyaXRlcmlhIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9PbmVfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9PbmVfMl8yL2Nhc2NhZGVPbkRlbGV0ZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxPbmVUb09uZV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sT25lVG9NYW55XzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE9uZVRvTWFueV8yXzIvY2FzY2FkZU9uRGVsZXRlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbE9uZVRvTWFueV8yXzIvbm9uQ2FjaGVhYmxlIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcmVwbGljYXRpb25QYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi9yb3VuZFJvYmluUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGlubmVkUGFydGl0aW9uaW5nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcmFuZ2VQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi92YWx1ZVBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yL2hhc2hQYXJ0aXRpb25pbmciLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi91bmlvblBhcnRpdGlvbmluZyIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIvcGFydGl0aW9uZWQiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIvbmFtZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMi9jcmVhdGlvblN1ZmZpeCIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMi9uYW1lIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9ImVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGVjbGlwc2VsaW5rX29ybS5lY29yZSMvL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0iZWNsaXBzZWxpbmtfb3JtLmVjb3JlIy8vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMiI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZhcmlhYmxlT25lVG9PbmVfMl8yL25vbkNhY2hlYWJsZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZlcnNpb25fMl8yIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBlY2xpcHNlbGlua19vcm0uZWNvcmUjLy92Ml8yL1htbFZlcnNpb25fMl8yL2luZGV4Ii8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPC9uZXN0ZWRHZW5QYWNrYWdlcz4KLSAgPC9nZW5QYWNrYWdlcz4KLTwvZ2VubW9kZWw6R2VuTW9kZWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL21vZGVsL2VjbGlwc2VsaW5rX29ybS5lY29yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4ODUwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvbW9kZWwvZWNsaXBzZWxpbmtfb3JtLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9Im9ybSIKLSAgICBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBY2Nlc3NNZXRob2RzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZ2V0TWV0aG9kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZXRNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWNjZXNzTWV0aG9kcyIgZVR5cGU9IiMvL1htbEFjY2Vzc01ldGhvZHMiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQWRkaXRpb25hbENyaXRlcmlhIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXR0cmlidXRlcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BdHRyaWJ1dGVzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzaWNDb2xsZWN0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxCYXNpY0NvbGxlY3Rpb24iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmFzaWNNYXBzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEJhc2ljTWFwIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRyYW5zZm9ybWF0aW9ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxUcmFuc2Zvcm1hdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ2YXJpYWJsZU9uZVRvT25lcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxWYXJpYWJsZU9uZVRvT25lIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEJhc2ljICMvL3YxXzEvWG1sQmFzaWNfMV8xICMvL3YyXzEvWG1sQmFzaWNfMl8xICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sTXV0YWJsZSAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNpY0NvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMi9YbWxCYXNpY0NvbGxlY3Rpb25fMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNNYXAiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMi9YbWxCYXNpY01hcF8yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXRjaEZldGNoIiBlU3VwZXJUeXBlcz0iIy8vdjJfMS9YbWxCYXRjaEZldGNoXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhdGNoRmV0Y2hIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYmF0Y2hGZXRjaCIgZVR5cGU9IiMvL1htbEJhdGNoRmV0Y2giCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleHBpcnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNpemUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNoYXJlZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSIjLy9DYWNoZVR5cGUiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYWx3YXlzUmVmcmVzaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlZnJlc2hPbmx5SWZOZXdlciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2FibGVIaXRzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29vcmRpbmF0aW9uVHlwZSIgZVR5cGU9IiMvL0NhY2hlQ29vcmRpbmF0aW9uVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImV4cGlyeVRpbWVPZkRheSIgZVR5cGU9IiMvL1htbFRpbWVPZkRheSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjYWNoZSIgZVR5cGU9IiMvL1htbENhY2hlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4aXN0ZW5jZUNoZWNraW5nIiBlVHlwZT0iIy8vRXhpc3RlbmNlVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENoYW5nZVRyYWNraW5nIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idHlwZSIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nVHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjaGFuZ2VUcmFja2luZyIgZVR5cGU9IiMvL1htbENoYW5nZVRyYWNraW5nIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENsb25lQ29weVBvbGljeSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1ldGhvZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0id29ya2luZ0NvcHlNZXRob2QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbGxlY3Rpb25UYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDb2xsZWN0aW9uVGFibGUgIy8vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29udmVyc2lvblZhbHVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGF0YVZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3RWYWx1ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29udmVydGVyIiBlU3VwZXJUeXBlcz0iIy8vWG1sTmFtZWRDb252ZXJ0ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzc05hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnRlckhvbGRlciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb252ZXJ0ZXIiIGVUeXBlPSIjLy9YbWxDb252ZXJ0ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZUNvbnZlcnRlciIgZVR5cGU9IiMvL1htbFR5cGVDb252ZXJ0ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib2JqZWN0VHlwZUNvbnZlcnRlciIgZVR5cGU9IiMvL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic3RydWN0Q29udmVydGVyIiBlVHlwZT0iIy8vWG1sU3RydWN0Q29udmVydGVyIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnRlcnNIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29udmVydGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxDb252ZXJ0ZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHlwZUNvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVHlwZUNvbnZlcnRlciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvYmplY3RUeXBlQ29udmVydGVycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxPYmplY3RUeXBlQ29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InN0cnVjdENvbnZlcnRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sU3RydWN0Q29udmVydGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbnZlcnRpYmxlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL1htbENvbnZlcnRlckhvbGRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbnZlcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvcHlQb2xpY3kiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ3VzdG9taXplciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImN1c3RvbWl6ZXJDbGFzc05hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEN1c3RvbWl6ZXJIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY3VzdG9taXplciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sRWxlbWVudENvbGxlY3Rpb24gIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgIy8vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgIy8vdjJfMi9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRhYmxlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVtYmVkZGFibGUgIy8vdjJfMS9YbWxFbWJlZGRhYmxlXzJfMSAjLy92Ml8yL1htbEVtYmVkZGFibGVfMl8yICMvL1htbEN1c3RvbWl6ZXJIb2xkZXIgIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgIy8vWG1sQ29udmVydGVyc0hvbGRlciAjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDb3B5UG9saWN5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imluc3RhbnRpYXRpb25Db3B5UG9saWN5IgotICAgICAgICBlVHlwZT0iIy8vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2xvbmVDb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ2xvbmVDb3B5UG9saWN5IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCAjLy92Ml8xL1htbEVtYmVkZGVkXzJfMSAjLy9YbWxBdHRyaWJ1dGVNYXBwaW5nIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJZCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbWJlZGRlZElkICMvL3YyXzEvWG1sRW1iZWRkZWRJZF8yXzEgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxFbnRpdHkgIy8vdjFfMS9YbWxFbnRpdHlfMV8xICMvL3YyXzAvWG1sRW50aXR5XzJfMCAjLy92Ml8xL1htbEVudGl0eV8yXzEgIy8vdjJfMi9YbWxFbnRpdHlfMl8yICMvL1htbFJlYWRPbmx5ICMvL1htbEN1c3RvbWl6ZXJIb2xkZXIgIy8vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgIy8vWG1sQ2FjaGVIb2xkZXIgIy8vWG1sQ29udmVydGVyc0hvbGRlciAjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxQcm9wZXJ0eUNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9wdGltaXN0aWNMb2NraW5nIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmciCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29weVBvbGljeSIgZVR5cGU9IiMvL1htbENvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbG9uZUNvcHlQb2xpY3kiIGVUeXBlPSIjLy9YbWxDbG9uZUNvcHlQb2xpY3kiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eU1hcHBpbmdzIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzICMvL3YyXzEvWG1sRW50aXR5TWFwcGluZ3NfMl8xICMvL3YyXzIvWG1sRW50aXR5TWFwcGluZ3NfMl8yICMvL1htbENvbnZlcnRlcnNIb2xkZXIgIy8vWG1sUXVlcnlDb250YWluZXIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEF0dHJpYnV0ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hHcm91cCIgZVN1cGVyVHlwZXM9IiMvL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxIYXNoUGFydGl0aW9uaW5nIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxIYXNoUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbElkICMvL3YyXzEvWG1sSWRfMl8xICMvL3YyXzIvWG1sSWRfMl8yICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sTXV0YWJsZSAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJbmRleCIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luRmV0Y2giIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqb2luRmV0Y2giIGVUeXBlPSIjLy9YbWxKb2luRmV0Y2hUeXBlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxKb2luVGFibGUgIy8vdjJfMi9YbWxKb2luVGFibGVfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYW55VG9NYW55ICMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAgIy8vdjJfMS9YbWxNYW55VG9NYW55XzJfMSAjLy92Ml8yL1htbE1hbnlUb01hbnlfMl8yICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbE1hbnlUb09uZSAjLy92Ml8xL1htbE1hbnlUb09uZV8yXzEgIy8vdjJfMi9YbWxNYW55VG9PbmVfMl8yICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzcyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzICMvL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgIy8vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCAjLy92Ml8xL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8xICMvL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIgIy8vWG1sUmVhZE9ubHkgIy8vWG1sQ3VzdG9taXplckhvbGRlciAjLy9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlciAjLy9YbWxDYWNoZUhvbGRlciAjLy9YbWxDb252ZXJ0ZXJzSG9sZGVyICMvL1htbFByb3BlcnR5Q29udGFpbmVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ib3B0aW1pc3RpY0xvY2tpbmciIGVUeXBlPSIjLy9YbWxPcHRpbWlzdGljTG9ja2luZyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb3B5UG9saWN5IiBlVHlwZT0iIy8vWG1sQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsb25lQ29weVBvbGljeSIgZVR5cGU9IiMvL1htbENsb25lQ29weVBvbGljeSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdE1hcHBpbmdzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTXV0YWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im11dGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bHRDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVzdWx0U2V0TWFwcGluZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvY2VkdXJlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmV0dXJuc1Jlc3VsdFNldCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImhpbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcmFtZXRlcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3RUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb252ZXJzaW9uVmFsdWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbENvbnZlcnNpb25WYWx1ZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWZhdWx0T2JqZWN0VmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvTWFueSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxPbmVUb01hbnkgIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wICMvL3YyXzEvWG1sT25lVG9NYW55XzJfMSAjLy92Ml8yL1htbE9uZVRvTWFueV8yXzIgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxQcml2YXRlT3duZWQgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT25lVG9PbmUgIy8vdjJfMS9YbWxPbmVUb09uZV8yXzEgIy8vdjJfMi9YbWxPbmVUb09uZV8yXzIgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxQcml2YXRlT3duZWQgIy8vWG1sSm9pbkZldGNoIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3B0aW1pc3RpY0xvY2tpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0eXBlIiBlVHlwZT0iIy8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzZWxlY3RlZENvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iZWNvcmU6RUNsYXNzIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxDb2x1bW4iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW4iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sT3JkZXJDb2x1bW4gIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyAjLy92Ml8xL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBpbm5lZFBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXkiIGVTdXBlclR5cGVzPSIjLy92MV8xL1htbFByaW1hcnlLZXlfMV8xICMvL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcml2YXRlT3duZWQiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwcml2YXRlT3duZWQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWx1ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByb3BlcnR5Q29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByb3BlcnRpZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sUHJvcGVydHkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSIgY29udGFpbm1lbnQ9InRydWUiCi0gICAgICAgIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeVJlZGlyZWN0b3JzIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJhbmdlUGFydGl0aW9uaW5nIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZWFkT25seSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRPbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJldHVybkluc2VydCIgZVN1cGVyVHlwZXM9IiMvL3YyXzEvWG1sUmV0dXJuSW5zZXJ0XzJfMSIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2Vjb25kYXJ5VGFibGUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sU2Vjb25kYXJ5VGFibGUgIy8vdjJfMi9YbWxTZWNvbmRhcnlUYWJsZV8yXzIiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXJlY3Rpb24iIGVUeXBlPSIjLy9YbWxEaXJlY3Rpb24iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icXVlcnlQYXJhbWV0ZXIiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImpkYmNUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJqZGJjVHlwZU5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFN0cnVjdENvbnZlcnRlciIgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29udmVydGVyIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY29udmVydGVyIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxUYWJsZSAjLy92Ml8yL1htbFRhYmxlXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRhYmxlR2VuZXJhdG9yIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yICMvL3YyXzIvWG1sVGFibGVHZW5lcmF0b3JfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVGltZU9mRGF5Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaG91ciIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWludXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzZWNvbmQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1pbGxpc2Vjb25kIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUcmFuc2Zvcm1hdGlvbiIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudCIgZVN1cGVyVHlwZXM9Ii4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxUcmFuc2llbnQgIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFR5cGVDb252ZXJ0ZXIiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbnZlcnRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRhdGFUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvYmplY3RUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxVbmlvblBhcnRpdGlvbmluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmFsdWVQYXJ0aXRpb25pbmciIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFZhbHVlUGFydGl0aW9uaW5nXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZhcmlhYmxlT25lVG9PbmUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU1hcHBpbmcgIy8vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZlcnNpb24iIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sVmVyc2lvbiAjLy92Ml8xL1htbFZlcnNpb25fMl8xICMvL3YyXzIvWG1sVmVyc2lvbl8yXzIgIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxNdXRhYmxlICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQ2FjaGVDb29yZGluYXRpb25UeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiIHZhbHVlPSIyIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkNhY2hlVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJGVUxMIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJXRUFLIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU09GVCIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlNPRlRfV0VBSyIgdmFsdWU9IjMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkhBUkRfV0VBSyIgdmFsdWU9IjQiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNBQ0hFIiB2YWx1ZT0iNSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iTk9ORSIgdmFsdWU9IjYiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxDaGFuZ2VUcmFja2luZ1R5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVRUUklCVVRFIiBsaXRlcmFsPSJBVFRSSUJVVEUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9CSkVDVCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkRFRkVSUkVEIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVVUTyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxEaXJlY3Rpb24iPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU4iLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVCIgdmFsdWU9IjEiIGxpdGVyYWw9Ik9VVCIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5fT1VUIiB2YWx1ZT0iMiIgbGl0ZXJhbD0iSU5fT1VUIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPVVRfQ1VSU09SIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iT1VUX0NVUlNPUiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkV4aXN0ZW5jZVR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQ0hFQ0tfQ0FDSEUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNIRUNLX0RBVEFCQVNFIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVNTVU1FX0VYSVNURU5DRSIgdmFsdWU9IjIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIiB2YWx1ZT0iMyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbEpvaW5GZXRjaFR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5ORVIiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9VVEVSIiB2YWx1ZT0iMSIgbGl0ZXJhbD0iT1VURVIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQUxMX0NPTFVNTlMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkNIQU5HRURfQ09MVU1OUyIgdmFsdWU9IjEiIGxpdGVyYWw9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0VMRUNURURfQ09MVU1OUyIgdmFsdWU9IjIiIGxpdGVyYWw9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlZFUlNJT05fQ09MVU1OIiB2YWx1ZT0iMyIgbGl0ZXJhbD0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlU3VicGFja2FnZXMgbmFtZT0idjFfMSIgbnNVUkk9ImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEiPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNfMV8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZ2VuZXJhdGVkVmFsdWUiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEdlbmVyYXRlZFZhbHVlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eV8xXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXkiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJpbWFyeUtleSIgZVR5cGU9IiMvL1htbFByaW1hcnlLZXkiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFByaW1hcnlLZXlfMV8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZGF0aW9uIiBlVHlwZT0iIy8vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbENvbHVtbiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IklkVmFsaWRhdGlvblR5cGVfMV8xIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iTlVMTCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJaRVJPIiB2YWx1ZT0iMiIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8wIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8wLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXlDb252ZXJ0IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcgIy8vWG1sQ29udmVydGVyc0hvbGRlciAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5XzJfMCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FjaGVJbnRlcmNlcHRvciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InF1ZXJ5UmVkaXJlY3RvcnMiIGVUeXBlPSIjLy9YbWxRdWVyeVJlZGlyZWN0b3JzIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hbnlUb01hbnlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQ29udmVydGVySG9sZGVyICMvL3YyXzAvWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCIKLSAgICAgICAgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSJlY29yZTpFQ2xhc3MgLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL3YyXzAvWG1sQ2FjaGVhYmxlXzJfMCI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY2FjaGVJbnRlcmNlcHRvciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRlckhvbGRlciAjLy92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW5fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb3JyZWN0aW9uVHlwZSIgZVR5cGU9IiMvL3YyXzAvT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhbGxRdWVyaWVzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlYWRBbGwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVhZE9iamVjdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXBvcnQiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imluc2VydCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9Ik9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVBRCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJSRUFEX1dSSVRFIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJFWENFUFRJT04iIHZhbHVlPSIyIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotICA8ZVN1YnBhY2thZ2VzIG5hbWU9InYyXzEiIG5zVVJJPSJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzEueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xIj4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzJfMSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icmV0dXJuSW5zZXJ0IiBlVHlwZT0iIy8vWG1sUmV0dXJuSW5zZXJ0IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXR1cm5VcGRhdGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXRjaEZldGNoXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2l6ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJiYXRjaEZldGNoVHlwZSIgZVR5cGU9IiMvL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxKb2luRmV0Y2ggIy8vWG1sQmF0Y2hGZXRjaEhvbGRlciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGVfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRfMl8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkZWRJZF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlfMl8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciAjLy92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjbGFzc0V4dHJhY3RvciIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3NfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRmV0Y2hHcm91cF8yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibG9hZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYXR0cmlidXRlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL1htbEZldGNoQXR0cmlidXRlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZmV0Y2hHcm91cHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxGZXRjaEdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJZF8yXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9PbmVfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sQmF0Y2hGZXRjaEhvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgIy8vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yQ29udGFpbmVyIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxRdWVyeUNvbnRhaW5lciAjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVDbGFzcyAuLi8uLi9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZyIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icXVlcnlSZWRpcmVjdG9ycyIgZVR5cGU9IiMvL1htbFF1ZXJ5UmVkaXJlY3RvcnMiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcmVudENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55XzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEJhdGNoRmV0Y2hIb2xkZXIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImF0dHJpYnV0ZVR5cGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb09uZV8yXzEiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy9YbWxCYXRjaEZldGNoSG9sZGVyIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5XzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FjaGVLZXlUeXBlIiBlVHlwZT0iIy8vdjJfMS9DYWNoZUtleVR5cGVfMl8xIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxSZXR1cm5JbnNlcnRfMl8xIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXR1cm5Pbmx5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zZm9ybWF0aW9uXzJfMSIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iYXR0cmlidXRlVHlwZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZlcnNpb25fMl8xIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhdHRyaWJ1dGVUeXBlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJDYWNoZUtleVR5cGVfMl8xIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSURfVkFMVUUiIGxpdGVyYWw9IklEX1ZBTFVFIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IkNBQ0hFX0tFWSIgdmFsdWU9IjEiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVVUTyIgdmFsdWU9IjIiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iQmF0Y2hGZXRjaFR5cGVfMl8xIj4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iSk9JTiIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJFWElTVFMiIHZhbHVlPSIxIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IklOIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8yIiBuc1VSST0ianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8yLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMiI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcml0ZXJpYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljXzJfMiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5kZXgiIGVUeXBlPSIjLy92Ml8yL1htbEluZGV4XzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2ljTWFwXzJfMiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENvbGxlY3Rpb25UYWJsZV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uU3VmZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMi9YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhc2NhZGVPbkRlbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uQ2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGFibGVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iLi4vLi4vb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL29ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIC4uLy4uL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwYXJlbnRDbGFzcyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eV8yXzIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbENyaXRlcmlhIiBlVHlwZT0iIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleCIgZVR5cGU9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbnRpdHlNYXBwaW5nc18yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBhcnRpdGlvbmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBsaWNhdGlvblBhcnRpdGlvbmluZyIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9IiMvL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InJvdW5kUm9iaW5QYXJ0aXRpb25pbmciCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy92Ml8yL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InBpbm5lZFBhcnRpdGlvbmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYW5nZVBhcnRpdGlvbmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIiBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InZhbHVlUGFydGl0aW9uaW5nIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMi9YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGFzaFBhcnRpdGlvbmluZyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgICAgZVR5cGU9IiMvL3YyXzIvWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idW5pb25QYXJ0aXRpb25pbmciIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWRfMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleCIgZVR5cGU9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxJbmRleF8yXzIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pcXVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW5OYW1lcyIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgICB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uU3VmZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub25DYWNoZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvT25lXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub25DYWNoZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iYWRkaXRpb25hbENyaXRlcmlhIiBlVHlwZT0iIy8vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb09uZV8yXzIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZU9uRGVsZXRlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJub25DYWNoZWFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9NYW55XzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlT25EZWxldGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vbkNhY2hlYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQYXJ0aXRpb25pbmdfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyZXBsaWNhdGlvblBhcnRpdGlvbmluZyIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMi9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIiIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icm91bmRSb2JpblBhcnRpdGlvbmluZyIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMi9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiIgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwaW5uZWRQYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIiCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJyYW5nZVBhcnRpdGlvbmluZyIgZVR5cGU9IiMvL3YyXzIvWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmFsdWVQYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbFZhbHVlUGFydGl0aW9uaW5nXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Imhhc2hQYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idW5pb25QYXJ0aXRpb25pbmciIGVUeXBlPSIjLy92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhcnRpdGlvbmVkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2Vjb25kYXJ5VGFibGVfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjcmVhdGlvblN1ZmZpeCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRhYmxlXzJfMiIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY3JlYXRpb25TdWZmaXgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvcl8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNyZWF0aW9uU3VmZml4IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmFyaWFibGVPbmVUb09uZV8yXzIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibm9uQ2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFZlcnNpb25fMl8yIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpbmRleCIgZVR5cGU9IiMvL3YyXzIvWG1sSW5kZXhfMl8yIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gIDwvZVN1YnBhY2thZ2VzPgotPC9lY29yZTpFUGFja2FnZT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2ZTI3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBFY2xpcHNlTGluayBTdXBwb3J0IC0gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UID0gRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZXMKLQotRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUw9RWNsaXBzZUxpbmsKLUVDTElQU0VMSU5LMV8wX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAxLjAueAotRUNMSVBTRUxJTksxXzFfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDEuMS54Ci1FQ0xJUFNFTElOSzFfMl94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMS4yLngKLUVDTElQU0VMSU5LMl8wX3hfUExBVEZPUk0gPSBFY2xpcHNlTGluayAyLjAueAotRUNMSVBTRUxJTksyXzFfeF9QTEFURk9STSA9IEVjbGlwc2VMaW5rIDIuMS54Ci1FQ0xJUFNFTElOSzJfMl94X1BMQVRGT1JNID0gRWNsaXBzZUxpbmsgMi4yLngKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOGMzNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkJCi0JCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGVudC5vcm0iCi0JCQluYW1lPSIlRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5tYXBwaW5nRmlsZSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlcjIiPgotCQkJCTxwYXJhbWV0ZXIgCi0JCQkJCW5hbWU9ImVsZW1lbnQiIAotCQkJCQl2YWx1ZT0ie2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm19ZW50aXR5LW1hcHBpbmdzIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybXMiPgotCQkKLQkJPGpwYVBsYXRmb3JtR3JvdXAKLSAgICAgICAgCWlkPSJlY2xpcHNlbGluayIKLSAgICAgICAgCWxhYmVsPSIlRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUwiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCQkJaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2VsaW5rLnBsYXRmb3JtIgotICAgICAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzFfMF94X1BMQVRGT1JNIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JCQlncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqcGFGYWNldFZlcnNpb249IjEuMCIvPgotCSAgICAKLQkgICAgPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZWNsaXBzZWxpbmsxXzEiCi0JICAgICAgICBsYWJlbD0iJUVDTElQU0VMSU5LMV8xX3hfUExBVEZPUk0iCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLkVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5IgotCSAgICAgICAgZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJanBhRmFjZXRWZXJzaW9uPSIxLjAiLz4KLQkgICAgCi0JICAgIDxqcGFQbGF0Zm9ybQotCQkJaWQ9ImVjbGlwc2VsaW5rMV8yIgotCQkJbGFiZWw9IiVFQ0xJUFNFTElOSzFfMl94X1BMQVRGT1JNIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeSIKLQkJCWdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIi8+Ci0JCQotCSAgICA8anBhUGxhdGZvcm0KLQkgICAgICAgIGlkPSJlY2xpcHNlbGluazJfMCIKLQkgICAgICAgIGxhYmVsPSIlRUNMSVBTRUxJTksyXzBfeF9QTEFURk9STSIKLQkgICAgICAgIGZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JICAgICAgICBncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqcGFGYWNldFZlcnNpb249IjIuMCIvPgotCQkKLQkJPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZWNsaXBzZWxpbmsyXzEiCi0JICAgICAgICBsYWJlbD0iJUVDTElQU0VMSU5LMl8xX3hfUExBVEZPUk0iCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLkVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5IgotCSAgICAgICAgZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJanBhRmFjZXRWZXJzaW9uPSIyLjAiLz4KLQkJCi0JCTxqcGFQbGF0Zm9ybQotCSAgICAgICAgaWQ9ImVjbGlwc2VsaW5rMl8yIgotCSAgICAgICAgbGFiZWw9IiVFQ0xJUFNFTElOSzJfMl94X1BMQVRGT1JNIgotCSAgICAgICAgZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMi5FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeSIKLQkgICAgICAgIGdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMi4wIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJyYXJ5VmFsaWRhdG9ycyI+Ci0JCQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImVjbGlwc2VsaW5rTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsLkVjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHdpdGggdmFyaWFibGU9ImxpYnJhcnlQcm92aWRlciI+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImpwYS11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQkJPC93aXRoPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0iY29uZmlnIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhUGxhdGZvcm1Hcm91cCIgdmFsdWU9ImVjbGlwc2VsaW5rIi8+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L2FuZD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9saWJyYXJ5VmFsaWRhdG9yPgotCQkKLQkJPGxpYnJhcnlWYWxpZGF0b3IKLQkJCWlkPSJlY2xpcHNlbGlua0VjbGlwc2VsaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPGFuZD4KLQkJCQkJPHdpdGggdmFyaWFibGU9ImxpYnJhcnlQcm92aWRlciI+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImVjbGlwc2VsaW5rLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJCTx3aXRoIHZhcmlhYmxlPSJjb25maWciPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybUdyb3VwIiB2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJPC93aXRoPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJyYXJ5UHJvdmlkZXJzIj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJqcGEtZWNsaXBzZWxpbmsxXzAtdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianBhLWVjbGlwc2VsaW5rMV8xLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1lY2xpcHNlbGluazFfMi11c2VyLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ianBhLWRlcHJlY2F0ZWQtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJaGlkZGVuPSJ0cnVlIj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJlY2xpcHNlbGluazJfMC11c2VyLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ianBhLWRlcHJlY2F0ZWQtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJaGlkZGVuPSJ0cnVlIj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlciAKLQkJCWlkPSJqcGEtZWNsaXBzZWxpbmsyXzEtdXNlci1saWJyYXJ5LXByb3ZpZGVyIiAKLQkJCWV4dGVuZHM9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0gKioqKiogV1RQIGV4dGVuc2lvbnMgKioqKiogLS0+Ci0KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmUucmVzb3VyY2VGYWN0b3JpZXMiPgotCQkKLQkJPHJlc291cmNlRmFjdG9yeQotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZW50Lm9ybSI+Ci0JCQk8L2NvbnRlbnRUeXBlQmluZGluZz4KLQkJPC9yZXNvdXJjZUZhY3Rvcnk+Ci0JICAgIAotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuY2F0YWxvZ0NvbnRyaWJ1dGlvbnMiPgotCQkKLQkJPGNhdGFsb2dDb250cmlidXRpb24gaWQ9ImRlZmF1bHQiPgotCQkJCi0JCQk8cHVibGljCi0JCQkJcHVibGljSWQ9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkIi8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCIgLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZCIgLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMi54c2QiIC8+Ci0JCQkKLQkJCTxwdWJsaWMKLQkJCQlwdWJsaWNJZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3htXzJfMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIiAvPgotICAgCQkJPHVyaQotICAgICAgICAgCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QiCi0gICAgICAgICAJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZCI+Ci0gIAkgCQk8L3VyaT4KLQkJCQkKLQkJCTxwdWJsaWMKLQkJCQlwdWJsaWNJZD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCIvPgkJCQkKLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMC54c2QiIC8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIiAvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCIgLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzIuMC54c2QiIC8+Ci0JCQkJCi0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QiIC8+Ci0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QiIC8+CQotCQkJCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiIC8+Ci0JCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QiIC8+CQotCQkJCi0JCTwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KLQkJCi0gICAgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua19qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NWQ3MGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQ9VGhlIEBDYWNoZSBhbm5vdGF0aW9uIG9uIGVudGl0eSBcInswfVwiIGhhcyBib3RoIGV4cGlyeSgpIGFuZCBleHBpcnlUaW1lT2ZEYXkoKSBzcGVjaWZpZWQuIE9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZAotQ09OVkVSVEVSX0NMQVNTX0VYSVNUUz1UaGUgY29udmVydGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCi1DT05WRVJURVJfQ0xBU1NfREVGSU5FRD1UaGUgY29udmVydGVyIGNsYXNzIG11c3QgYmUgZGVmaW5lZC4KLUNPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUj1UaGUgY29udmVydGVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UKLUNPTlZFUlRFUl9EVVBMSUNBVEVfTkFNRT1EdXBsaWNhdGUgY29udmVydGVyIFwiezB9XCIgZGVmaW5lZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQKLUNPTlZFUlRFUl9OQU1FX1VOREVGSU5FRD1Db252ZXJ0ZXIgaXMgdW5uYW1lZC4gQWxsIGNvbnZlcnRlcnMgcmVxdWlyZSBhIG5hbWUuCi1DVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfREVTQ1JJUFRPUl9DVVNUT01JWkVSPVRoZSBjdXN0b21pemVyIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgaW50ZXJmYWNlCi1JRF9NQVBQSU5HX1VOUkVTT0xWRURfQ09OVkVSVEVSX05BTUU9VGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgXCJ7MH1cIiBmb3IgbWFwcGluZyBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRT1NdWx0aXBsZSBvYmplY3QgdmFsdWVzIGFyZSBzcGVjaWZpZWQgZm9yIHRoZSBkYXRhIHZhbHVlIFwiezB9XCIKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEU9VGhlIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgZm9yIGEgVmVyc2lvbiBtYXBwaW5nIG11c3QgYmUgb2YgdHlwZSBpbnQsIEludGVnZXIsIHNob3J0LCBTaG9ydCwgbG9uZywgTG9uZywgb3IgVGltZXN0YW1wCi1QRVJTSVNURU5DRV9VTklUX0xFR0FDWV9ERVNDUklQVE9SX0NVU1RPTUlaRVI9XCJ7MH1cIiBpcyBhIGxlZ2FjeSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgcHJvcGVydHkuIENvbnNpZGVyIG1pZ3JhdGlvbiB0byB0aGUgRWNsaXBzZUxpbmsgY3VzdG9taXplciBzZXR0aW5ncyB2aWEgYW5ub3RhdGlvbiBvciBYTUwgbWFwcGluZyBmaWxlCi1QRVJTSVNURU5DRV9VTklUX0xFR0FDWV9FTlRJVFlfQ0FDSElORz1cInswfVwiIGlzIGEgbGVnYWN5IGVudGl0eSBjYWNoaW5nIHByb3BlcnR5LiBDb25zaWRlciBtaWdyYXRpb24gdG8gSlBBIDIuMCBhbmQgRWNsaXBzZUxpbmsgY2FjaGUgc2V0dGluZ3MgdmlhIGFubm90YXRpb24gb3IgWE1MIG1hcHBpbmcgZmlsZQotUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQ9UHJvcGVydHkgXCJ7MH1cIiB3aWxsIGJlIGlnbm9yZWQgYXMgc2hhcmVkLWNhY2hlLW1vZGUgaXMgc2V0IHRvIE5PTkUKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0FUVFJJQlVURV9NQVBQSU5HPUR1cGxpY2F0ZSBhdHRyaWJ1dGUgbWFwcGluZyBcInswfVwiIGlzIGRlZmluZWQgZm9yIFwiezF9XCIKLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBFRF9DTEFTUz1EaWZmZXJlbnQgdHlwZSBtYXBwaW5ncyBhcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIGNsYXNzIFwiezB9XCIKLUJBU0lDX0NPTExFQ1RJT05fTUFQUElOR19ERVBSRUNBVEVEPVRoZSB0eXBlIGJhc2ljLWNvbGxlY3Rpb24gaXMgZGVwcmVjYXRlZAotQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRD1UaGUgdHlwZSBiYXNpYy1tYXAgaXMgZGVwcmVjYXRlZAotVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTU19OT1RfU1RBVElDPVRoZSBqYXZhIGNsYXNzIGZvciBtYXBwZWQgdHlwZSBcInswfVwiIGlzIGEgbm9uLXN0YXRpYyBtZW1iZXIgY2xhc3MgCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFkMWRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzAueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmV3IG5hdGl2ZSBFY2xpcHNlTGluayBYTUwgbWV0YWRhdGEKLSAgICAgICBmb3JtYXQgdXNlZCBmb3IgSlBBIGFuZCBuYXRpdmUgZGVwbG95bWVudCB4bWwgZmlsZXMuIAotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKLSAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAotICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0JCQkvKioKLQkJCSogUHJvcGVydHkgbmFtZS4KLQkJCSovIAotCQkJU3RyaW5nIG5hbWUoKTsKLQkJCQotCQkJLyoqCi0JCQkqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLQkJCSogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLQkJCSovIAotCQkJU3RyaW5nIHZhbHVlKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotCQkJKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KLQkJCSogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0JCQkqIENvbnZlcnNpb25NYW5hZ2VyOiAKLQkJCSogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAotCQkJKi8gCi0JCQlDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKLQkJfQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotCQkgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotCQkgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotCQkgKiAgCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKLQkJICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCi0JCSAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAotCQkgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLQkJICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLQkJICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuCi0JCSAqICAKLQkJICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0JCSAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLQkJICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotCQkgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLQkJICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0JCSAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotCQkgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0JCSAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLQkJICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLQkJICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgY29sdW1uLgotCQkgICAgICogTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIHN1cHBvcnRlZCB0aGUgCi0JCSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLCBub3QganVzdCAKLQkJICAgICAqIE9iamVjdCwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgZ2V0U3RhcnRUaW1lKCkuCi0JCSAgICAgKiBUaGUgbWV0aG9kIG1heSByZXF1aXJlIGEgVHJhbnNpZW50IGFubm90YXRpb24gdG8gYXZvaWQgYmVpbmcgCi0JCSAgICAgKiBtYXBwZWQgYXMgQmFzaWMgYnkgZGVmYXVsdC4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLQkJICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0JCSAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotCQkgICAgICovIAotCQkgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotCQkgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLQkJICogZGF0YWJhc2UgY29sdW1ucy4KLQkJICogCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotCQkgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLQkJICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0JCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCSAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkgICAgICovCi0JCSAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCQkgICAgCi0JCSAgICAvKioKLQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0JCSAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotCQkgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLQkJICAgICAqLwotCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAgQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX2tleSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotCSAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotCSAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0JICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLQkgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0JICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLQkgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0JICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0JICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLQkgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLQkgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0JICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotCSAgICAgICAgICovIAotCSAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6Y2hvaWNlPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8L3hzZDpjaG9pY2U+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0JICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotCSAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotCSAgICAgICAgICogcmVhZC4KLQkgICAgICAgICAqLwotCSAgICAgICAgRlVMTCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFdFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0JICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotCSAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLQkgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0JICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLQkgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotCSAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotCSAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLQkgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotCSAgICAgICAgICovCi0JICAgICAgICBTT0ZUX1dFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0JICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotCSAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0JICAgICAgICAgKi8KLQkgICAgICAgIEhBUkRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLQkgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLQkgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotCSAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLQkgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLQkgICAgICAgICAqIGlkZW50aXR5LgotCSAgICAgICAgICovCi0JICAgICAgICBDQUNIRSwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLQkgICAgICAgICAqIG9iamVjdHMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIE5PTkUKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLQkgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotCSAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLQkgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLQkgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0JICAgICAgICAgICovCi0JICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotCSAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBOT05FCi0gICAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0JICAgICAgQFRhcmdldCh7fSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAvKiogCi0gICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZXNzaW9ucy5mYWN0b3JpZXMuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICoKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICovIAotCSAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLQkgICAgICAvKioKLQkgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotCSAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLQkgICAgICAgKi8KLQkgICAgICBDbGFzcyB2YWx1ZSgpOyAKLQkgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLQkgICAgICAgICAqLwotCSAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLQkgICAgICAgICAqLwotCSAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpzZXF1ZW5jZT4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgCi0JICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiAKLQkgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSAgICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotCSAgICAgICAgICovCi0JICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotCSAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0JICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0JICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLQkgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgSU4sCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VULAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTl9PVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VUX0NVUlNPUgotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQkKLQk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0JCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJLyoqIAotCQkJCSAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLQkJCQkgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLQkJCQkgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0JCQkJICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLQkJCQkgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotCQkJCSAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotCQkJCSAqIAotCQkJCSAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotCQkJCSAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotCQkJCSAqLyAKLQkJCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0JCQkJQFJldGVudGlvbihSVU5USU1FKQotCQkJCXB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0JCQkJICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLQkJCQkgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkJCSAgICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0JCQkJICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLQkJCQkgICAgICovCi0JCQkJICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJCQkgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLQkJCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkJCSAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLQkJCQkgICAgICovCi0JCQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotCQkJCSAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotCQkJCSAgICAgKi8KLQkJCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJCQkgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotCQkJCSAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLQkJCQkgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLQkJCQkgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLQkJCQkgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0JCQkJICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAqLwotCQkJCSAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0JCQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1pbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgICAgLyoqCi0gICAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICAgKiAKLSAgICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0RBVEFCQVNFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0JCQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgkgCi0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+CQotCQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZmYxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMyNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjEuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllY2xpcHNlbGlua19vcm1fMV8xLnhzZCAxLjEgIEZlYnJ1YXJ5IDQgMjAwOQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5ldyBuYXRpdmUgRWNsaXBzZUxpbmsgWE1MIG1ldGFkYXRhCi0gICAgICAgZm9ybWF0IHVzZWQgZm9yIEpQQSBhbmQgbmF0aXZlIGRlcGxveW1lbnQgeG1sIGZpbGVzLiAKLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnkgb3IgbmFtZWQtbmF0aXZlLXF1ZXJ5Ci0gICAgICAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSAKLSAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCB0aGVuIAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotCQkJLyoqCi0JCQkqIFByb3BlcnR5IG5hbWUuCi0JCQkqLyAKLQkJCVN0cmluZyBuYW1lKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0JCQkqIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiB2YWx1ZVR5cGUuCi0JCQkqLyAKLQkJCVN0cmluZyB2YWx1ZSgpOwotCQkJCi0JCQkvKioKLQkJCSogUHJvcGVydHkgdmFsdWUgdHlwZS4KLQkJCSogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0JCQkqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotCQkJKiBDb252ZXJzaW9uTWFuYWdlcjogCi0JCQkqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLQkJCSovIAotCQkJQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0JCX0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0JCSAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0JCSAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqICAKLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLQkJICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0JCSAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotCQkgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotCQkgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLQkJICogIAotCQkgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKLQkJICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAotCQkgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCi0JCSAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAotCQkgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCi0JCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCi0JCSAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKLQkJICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAotCQkgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAotCQkgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0JCSAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLQkJICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotCQkgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLQkJICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLQkJICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotCQkgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLQkJICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotCQkgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0JCSAgICAgKi8gCi0JCSAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0JCSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotCQkgKiBkYXRhYmFzZSBjb2x1bW5zLgotCQkgKiAKLQkJICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0JCSAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotCQkgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0JCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0JCSAgICAgKi8KLQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCSAgICAKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLQkJICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0JCSAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotCQkgICAgICovCi0JCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAotICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCi0gICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAotICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCi0gICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIsIHdvcmtpbmdDb3B5TWV0aG9kPSJteVdvcmtpbmdDb3B5Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAotICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKLSAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCi0gICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBTExfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcwotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCi0gICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKLSAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAotICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFZFUlNJT05fQ09MVU1OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqIAotCQkgKiAgVGhlIFByaW1hcnlLZXkgYW5ub3RhdGlvbiBhbGxvd3MgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvZiB0aGUgSWQuCi0JCSAqICBBIHZhbGlkYXRpb24gcG9saWN5IGNhbiBiZSBnaXZlbiB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGlmIHplcm8gaXMgYSB2YWxpZCBpZCB2YWx1ZS4KLQkJICogIFRoZSBzZXQgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LgotCQkgKiAKLQkJICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0JCSAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjEKLQkJICovIAotCQlAVGFyZ2V0KHtUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotCQkgICAgICovCi0JCSAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCQkKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0JCSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLQkJICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgotCQkgICAgICovCi0JCSAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKiogCi0JCSAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLQkJICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLQkJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0JCSAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLQkJICogCi0JCSAqIEBzZWUgUHJpbWFyeUtleQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotCQkgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLQkJICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLQkJICovIAotCQlwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLQkJICAgICAqLwotCQkgICAgTlVMTCwKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIG51bGwgYW5kIDAgYXJlIG5vdCBhbGxvd2VkLCAob25seSBpbnQgYW5kIGxvbmcpLgotCQkgICAgICovCi0JCSAgICBaRVJPLAotCQkKLQkJICAgIC8qKgotCQkgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICovCi0JCSAgICBOT05FCi0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0JICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0JICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLQkgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotCSAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLQkgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0JICAgICAgICAgKi8gCi0JICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotCSAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLQkgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLQkgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotCSAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotCSAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLQkgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLQkgIDwveHNkOmNob2ljZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0JICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLQkgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0JICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0JICAgICAgICAgKiByZWFkLgotCSAgICAgICAgICovCi0JICAgICAgICBGVUxMLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotCSAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLQkgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotCSAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU09GVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLQkgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotCSAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0JICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0JICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotCSAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLQkgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0JICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLQkgICAgICAgICAqLwotCSAgICAgICAgSEFSRF9XRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotCSAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotCSAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0JICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotCSAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotCSAgICAgICAgICogaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENBQ0hFLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotCSAgICAgICAgICogb2JqZWN0cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgTk9ORQotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0JICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotCSAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotCSAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLQkgICAgICAgICAgKi8KLQkgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0JICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgIC8qKiAKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgKgotICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgKi8gCi0JICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotCSAgICAgIC8qKgotCSAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0JICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotCSAgICAgICAqLwotCSAgICAgIENsYXNzIHZhbHVlKCk7IAotCSAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotCSAgICAgICAgICovCi0JICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotCSAgICAgICAgICovCi0JICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOnNlcXVlbmNlPgotCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiAKLQkgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIAotCSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgIDwveHNkOnNlcXVlbmNlPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe30pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0JICAgICAgICAgKi8KLQkgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0JICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLQkgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLQkgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTiwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIElOX09VVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IGN1cnNvcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVRfQ1VSU09SCi0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkvKiogCi0JCQkJICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotCQkJCSAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotCQkJCSAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLQkJCQkgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotCQkJCSAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0JCQkJICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0JCQkJICogCi0JCQkJICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0JCQkJICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0JCQkJICovIAotCQkJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLQkJCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCQkJcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLQkJCQkgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotCQkJCSAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0JCQkJICAgICAqLwotCQkJCSAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLQkJCQkgICAgICogdGhlIGFzc29jaWF0aW9uLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkJCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotCQkJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0JCQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0JCQkJICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0JCQkJICAgICAqLwotCQkJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQkJCSAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0JCQkJICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotCQkJCSAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotCQkJCSAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQkJCQkgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLQkJCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICAgIC8qKgotICAgICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAgICogCi0gICAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0NBQ0hFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCQkKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4JIAotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgkKLQkKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MyYjI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzUxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzIueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmF0aXZlIEVjbGlwc2VsaW5rIFhNTCBtYXBwaW5nIGZpbGUKLSAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZQotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAotICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0KLQotICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIgotICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIAotICAgICAgIGVjbGlwc2VsaW5rX29ybV8xXzIueHNkCi0gICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICAgICAuLi4KLSAgICAgICA8L2VudGl0eS1tYXBwaW5ncz4KLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKLSAgICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvCi0gICAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nCi0gICAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgZml4ZWQ9IjEuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZQotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLgotCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4KLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWItZWxlbWVudHMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZC12YWxpZGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgSWRWYWxpZGF0aW9uIGVudW0gZGV0ZXJtaW5lcyB0aGUgdHlwZSB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBmb3IgYW4gSWQuCi0gICAgICAgICAqIEJ5IGRlZmF1bHQgbnVsbCBpcyBub3QgYWxsb3dlZCwgYW5kIDAgaXMgbm90IGFsbG93IGZvciBzaW5nbGV0b24gaWRzIG9mIGxvbmcgb3IgaW50IHR5cGUuCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFpFUk8gZm9yIHNpbmdsZXRvbiBpZHMsIGFuZCBOVUxMIGZvciBjb21wb3NpdGUgaWRzLgotICAgICAgICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24sIG9yIENsYXNzRGVzY3JpcHRvciBBUEkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFByaW1hcnlLZXkKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3Ijc2V0SWRWYWxpZGF0aW9uKElkVmFsaWRhdGlvbikKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjAgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gSWRWYWxpZGF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogT25seSBudWxsIGlzIG5vdCBhbGxvd2VkIGFzIGFuIGlkIHZhbHVlLCAwIGlzIGFsbG93ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5VTEwsCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogbnVsbCBhbmQgMCBhcmUgbm90IGFsbG93ZWQsIChvbmx5IGludCBhbmQgbG9uZykuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFpFUk8sCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLAotICAgICAgICBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsCi0gICAgICAgIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24tbW9kZSIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbi12YWxpZGF0aW9uLW1vZGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1jb2x1bW4tdmFsaWRhdGlvbi1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZSB7Ci0gICAgICAgICAgTk9ORSwKLSAgICAgICAgICBDT1JSRUNUSU9OLAotICAgICAgICAgIEVYQ0VQVElPTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1JSRUNUSU9OIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWENFUFRJT04iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgotICAgICAgICAgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCi0gICAgICAgICAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotICAgICAgICAgKiBkYXRhYmFzZSBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0gICAgICAgICAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLSAgICAgICAgICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0gICAgICAgICAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYXJpYWJsZSBvbmUgdG8gb25lIG1hcHBpbmdzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHBvaW50ZXIgCi0gICAgICAgICAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotICAgICAgICAgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0gICAgICAgICAqIGluc3RhbmNlIHZhcmlhYmxlKSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvYmplY3RzLiBJbiB0aGUgCi0gICAgICAgICAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0gICAgICAgICAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWYXJpYWJsZU9uZVRvT25lIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLSAgICAgICAgICAgKiBhc3NvY2lhdGlvbi4gSWYgbm90IHNwZWNpZmllZCBpdCB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgCi0gICAgICAgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHRhcmdldEludGVyZmFjZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0gICAgICAgICAgICogdGhlIGFzc29jaWF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotICAgICAgICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdpbGwgaG9sZCB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLSAgICAgICAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBTVFJJTkcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCi0gICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAotICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCi0gICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTIzYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzAueHNkIDIuMCAgT2N0b2JlciA1IDIwMDgKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuYXRpdmUgRWNsaXBzZWxpbmsgWE1MIG1hcHBpbmcgZmlsZQotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlCi0gICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KLSAgICAgICBPYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGVzIG11c3QgaW5kaWNhdGUgdGhlIG9iamVjdC9yZWxhdGlvbmFsCi0gICAgICAgbWFwcGluZyBmaWxlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybQotCi0gICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgIDxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCi0gICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0gCi0gICAgICAgZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKLSAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgICAgIC4uLgotICAgICAgIDwvZW50aXR5LW1hcHBpbmdzPgotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5pbnZhbGlkYXRpb24uQ2FjaGVJbnZhbGlkYXRpb25Qb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIHNldHMgb2JqZWN0cyBpbiBFY2xpcHNlTGluaydzIGlkZW50aXR5IG1hcHMgdG8gYmUgaW52YWxpZCAKLSAgICAgICAgICogZm9sbG93aW5nIGdpdmVuIHJ1bGVzLiBCeSBkZWZhdWx0IGluIEVjbGlwc2VMaW5rLCBvYmplY3RzIGRvIG5vdCAKLSAgICAgICAgICogZXhwaXJlIGluIHRoZSBjYWNoZS4gU2V2ZXJhbCBkaWZmZXJlbnQgcG9saWNpZXMgYXJlIGF2YWlsYWJsZSB0byAKLSAgICAgICAgICogYWxsb3cgb2JqZWN0cyB0byBleHBpcmUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDYWNoZSBhbm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDYWNoZSBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgCi0gICAgICAgICAqIG9uIHRoZSByb290IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlVHlwZSB0eXBlKCkgZGVmYXVsdCBTT0ZUX1dFQUs7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzaXplIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IDEwMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotICAgICAgICAgICAqIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhZnRlciBhIGZpeCBwZXJpb2Qgb2YgdGltZSAobXMpLiAKLSAgICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLSAgICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLSAgICAgICAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhlIAotICAgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXkoKSBkZWZhdWx0IEBUaW1lT2ZEYXkoc3BlY2lmaWVkPWZhbHNlKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotICAgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0gICAgICAgICAgICogY2FjaGUgb25seSBpZiB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkYXRhYmFzZSBieSBhIHF1ZXJ5IGlzIAotICAgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotICAgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLSAgICAgICAgICAgKiBjYWNoZSBmb3IgaGl0cyBidXQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWNoZSBmb3IgaWRlbnRpdHkuIAotICAgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZUhpdHMoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKCkgZGVmYXVsdCBTRU5EX09CSkVDVF9DSEFOR0VTOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0gICAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiB0aGUgaWRlbnRpdGllcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gICAgICAgICAgICogVGhlIHJlY2VpdmluZyBjYWNoZSBpbnZhbGlkYXRlcyB0aGUgb2JqZWN0cyAocmF0aGVyIHRoYW4gY2hhbmdpbmcgCi0gICAgICAgICAgICogYW55IG9mIHRoZSBkYXRhKQotICAgICAgICAgICAqLwotICAgICAgICAgIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotICAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9CSkVDVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21pemVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAgICogaW50ZXJmYWNlIGFuZCBpcyB0byBydW4gYWdhaW5zdCBhbiBlbmV0aXR5J3MgY2xhc3MgZGVzY3JpcHRvciBhZnRlciBhbGwgCi0gICAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyAKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9taXplciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MgdGhhdCAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgYXBwbGllZCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9yIGVtYmVkZGFibGUgY2xhc3MuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24uCi0gICAgICAgICAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIAotICAgICAgICAgKiBwYXJhbWV0ZXJzIG9mIGEgbmFtZWQgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU4sCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTl9PVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgY3Vyc29yCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VUX0NVUlNPUgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVF9DVVJTT1IiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbwotICAgICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZwotICAgICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIGZpeGVkPSIyLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4KLQotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViLWVsZW1lbnRzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1tYXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY01hcCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgbWFwIAotICAgICAgICAgICAqIGtleS4gSWYgdGhlIG5hbWUgb24gdGUga2V5IGNvbHVtbiBpcyAiIiwgdGhlIG5hbWUgd2lsbCBkZWZhdWx0IHRvOgotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBmaWVsZDsgIl9LRVkiLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiBrZXlDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqIG9uIGFuIEVudGl0eS4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdGhlIGRlZmF1bHQgQ29weVBvbGljeSBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsgYW5kIHRoZXJlZm9yZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIG9ubHkgdXNlZCB0byAKLSAgICAgICAgICogb3ZlcnJpZGUgb3RoZXIgdHlwZXMgb2YgY29weSBwb2xpY2llcwotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBJbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsCi0gICAgICAgIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwKLSAgICAgICAgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAotICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCi0gICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAotICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCi0gICAgICAgICAgICogZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCi0gICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAgCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0gICAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIEBJZCBpZiB0aGUgcHJpbWFyeSBrZXkgaW5jbHVkZXMgYSBub24gYmFzaWMgZmllbGQsCi0gICAgICAgICAgICogc3VjaCBhcyBhIGZvcmVpZ24ga2V5LCBvciBhIGluaGVyaXRhbmNlIGRpc2NyaW1pbmF0b3IsIGVtYmVkZGVkLCBvciB0cmFuc2Zvcm1hdGlvbiBtYXBwZWQgZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9Im9ybTppZC12YWxpZGF0aW9uIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLUBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBRdWVyeVJlZGlyZWN0b3JzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIEFsbFF1ZXJpZXMgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZyBvYmplY3QgcXVlcnkKLSAgICAgKiB0aGF0IGRvZXMgbm90IGhhdmUgYSBtb3JlIHByZWNpc2UgcmVkaXJlY3RvciAobGlrZSB0aGUgCi0gICAgICogUmVhZE9iamVjdFF1ZXJ5IFJlZGlyZWN0b3IpIG9yIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIAotICAgICAqLwotICAgIENsYXNzIGFsbFF1ZXJpZXMoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRBbGwgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRSZXN1bHRMaXN0KCkgQVBJIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkQWxsKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZWFkT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0U2luZ2xlUmVzdWx0KCkgQVBJIG9yIEVudGl0eU1hbmFnZXIuZmluZCgpIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkT2JqZWN0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZXBvcnRRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVwb3J0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhhdCBjb250YWlucyBhZ3JlZ2F0ZSBmdW5jdGlvbnMgb3Igc2VsZWN0cyBtdWx0aXBsZSBlbnRpdGllcyB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICovCi0gICAgQ2xhc3MgcmVwb3J0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBVcGRhdGUgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFVwZGF0ZU9iamVjdFF1ZXJ5IG9yIFVwZGF0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBVcGRhdGVPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuZXZlciBmbHVzaGluZyBjaGFuZ2VzIHRvIHRoZSBkYXRhc291cmNlLgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqLyAKLSAgICBDbGFzcyB1cGRhdGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IEluc2VydCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogSW5zZXJ0T2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIEluc2VydE9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW4gcGVyc2lzdGluZyBhbiBvYmplY3QgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgaW5zZXJ0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBEZWxldGUgT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBEZWxldGVPYmplY3RRdWVyeSBvciBEZWxldGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgZGVsZXRlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi19Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsLXF1ZXJpZXMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLWFsbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb2JqZWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotICAgICAgICAgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotICAgICAgICAgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLSAgICAgICAgICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0gICAgICAgICAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLSAgICAgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLSAgICAgICAgICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgSmF2YSBjbGFzcyBkZXNpcmVkIGJhY2sgZnJvbSB0aGUgcHJvY2VkdXJlLCAKLSAgICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLSAgICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0gICAgICAgICAgICogU1RSVUNUIHR5cGVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzY2U1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAxMi8yLzIwMDktMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTYyODk6IEFkZCBjdXJyZW50IGFubm90YXRpb24gbWV0YWRhdGEgc3VwcG9ydCBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzIHRvIEVjbGlwc2VMaW5rLU9STS5YTUwgU2NoZW1hICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgLS0+Ci08IS0tICAgICAgICAtIGZvcm1hdHRlZCB0byBtYXRjaCBvcm1fMl8wLnhzZCBzbyB0aGF0IHVzZXJzIGNhbiBlYXNpbHkgY29tcGFyZSB0aGUgdHdvIHNjaGVtYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNS80LzIwMTAtMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjEiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgMi4xICBBcHJpbCAwNSAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8xLnhzZAotICAgICAgIHZlcnNpb249IjIuMSI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0gICAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotICAgICAgICAgICAqIFF1ZXJpZXMgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIAotICAgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgZXhwaXJ5KCkgZGVmYXVsdCAtMTsgLy8gbWludXMgb25lIGlzIG5vIGV4cGlyeS4KLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotICAgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0gICAgICAgICAgICogZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3JjZSBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSB0byBhbHdheXMgCi0gICAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gYWx3YXlzUmVmcmVzaCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLSAgICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0gICAgICAgICAgICogbmV3ZXIgdGhhbiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgKGFzIGRldGVybWluZWQgYnkgdGhlIG9wdGltaXN0aWMgCi0gICAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotICAgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0gICAgICAgICAgICogVGhpcyBmb3JjZXMgYWxsIHF1ZXJpZXMgdG8gaGl0IHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYWNoZSBjb29yZGluYXRpb24gbW9kZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeSIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvb3JkaW5hdGlvbi10eXBlIiB0eXBlPSJvcm06Y2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGVJbnRlcmNlcHRvciB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZVR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0gICAgICAgICAgICogYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtLiAKLSAgICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0gICAgICAgICAgICogcmVhZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGVUxMLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBXRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93IGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kCi0gICAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLSAgICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLSAgICAgICAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcCBhcyBzcGVjaWZpZWQgYnkKLSAgICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0gICAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLSAgICAgICAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZUX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhlIHNvZnQgY2FjaGUgd2VhayAoU09GVF9XRUFLKSBpZGVudGl0eSBtYXAgZXhjZXB0IAotICAgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0gICAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0gICAgICAgICAgICovCi0gICAgICAgICAgSEFSRF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0gICAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLSAgICAgICAgICAgKiBXQVJOSU5HOiBGdXJuaXNoZXMgY2FjaGluZyBhbmQgaWRlbnRpdHksIGJ1dCBkb2VzIG5vdCBndWFyYW50ZWUgCi0gICAgICAgICAgICogaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0FDSEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotICAgICAgICAgICAqIG9iamVjdHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUkRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKLSAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIyLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBkZWxpbWl0ZWQtaWRlbnRpZmllcnMgLSBVc2VkIHRvIHRyZWF0IGRhdGFiYXNlIGlkZW50aWZpZXJzIGFzCi0gICAgICAgICAgICBkZWxpbWl0ZWQgaWRlbnRpZmllcnMuCi0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gYWxsIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsaW1pdGVkLWlkZW50aWZpZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVJUVUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1pbnNlcnQiIHR5cGU9Im9ybTpyZXR1cm4taW5zZXJ0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4tdXBkYXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX0tFWSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUga2V5IGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgZGlyZWN0IG1hcCBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCBrZXlDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB2YWx1ZSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIHZhbHVlIGNvbHVtbiBtYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQgdmFsdWVDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIG9yIAotICAgICAgICAgKiBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRm9yIGluc3RhbmNlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDb3B5UG9saWN5KCJleGFtcGxlLk15Q29weVBvbGljeSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb3B5UG9saWN5IHsKLQotICAgICAgICAvKgotICAgICAgICAqIChSZXF1aXJlZCkKLSAgICAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoZSBjb3B5IHBvbGljeS4gSXQgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgCi0gICAgICAgICogdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeQotICAgICAgICAqLwotICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCi0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9Im9ybTpmZXRjaC1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCgpIGRlZmF1bHQgdHJ1ZTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmF0Y2gtZmV0Y2giPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQmF0Y2hGZXRjaCBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIG9uIGFueSByZWxhdGlvbnNoaXAgbWFwcGluZywKLSAgICAgICAgICogKE9uZVRvT25lLCBNYW55VG9PbmUsIE9uZVRvTWFueSwgTWFueVRvTWFueSwgRWxlbWVudENvbGxlY3Rpb24sIEJhc2ljQ29sbGVjdGlvbiwgQmFzaWNNYXApLgotICAgICAgICAgKiBJdCBhbGxvd3MgdGhlIHJlbGF0ZWQgb2JqZWN0cyB0byBiZSBiYXRjaCByZWFkIGluIGEgc2luZ2xlIHF1ZXJ5LgotICAgICAgICAgKiBCYXRjaCBmZXRjaGluZyBjYW4gYWxzbyBiZSBzZXQgYXQgdGhlIHF1ZXJ5IGxldmVsLCBhbmQgaXQgaXMgCi0gICAgICAgICAqIG5vcm1hbGx5IHJlY29tbWVuZGVkIHRvIGRvIHNvIGFzIGFsbCBxdWVyaWVzIG1heSBub3QgcmVxdWlyZSBiYXRjaGluZy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXRjaEZldGNoIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBiYXRjaC1mZXRjaCB0byB1c2UuCi0gICAgICAgICAgICAgKiBFaXRoZXIgSk9JTiwgRVhJU1RTIG9yIElOLgotICAgICAgICAgICAgICogSk9JTiBpcyB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEJhdGNoRmV0Y2hUeXBlIHZhbHVlKCkgZGVmYXVsdCBCYXRjaEZldGNoVHlwZS5KT0lOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZSB0aGUgZGVmYXVsdCBiYXRjaCBmZXRjaCBzaXplLgotICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIElOIHR5cGUgYmF0Y2ggcmVhZGluZyBhbmQgZGVmaW5lcwotICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBrZXlzIHVzZWQgaW4gZWFjaCBJTiBjbGF1c2UuCi0gICAgICAgICAgICAgKiBUaGUgZGVmYXVsdCBzaXplIGlzIDI1Niwgb3IgdGhlIHF1ZXJ5J3MgcGFnZVNpemUgZm9yIGN1cnNvciBxdWVyaWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgLTE7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwMjllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDc3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08IS0tIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDEyLzIvMjAwOS0yLjEgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2Mjg5OiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG1ldGFkYXRhIHN1cHBvcnQgb24gbWFwcGVkIHN1cGVyY2xhc3NlcyB0byBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gZm9ybWF0dGVkIHRvIG1hdGNoIG9ybV8yXzAueHNkIHNvIHRoYXQgdXNlcnMgY2FuIGVhc2lseSBjb21wYXJlIHRoZSB0d28gc2NoZW1hcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDUvNC8yMDEwLTIuMSBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDYvMTQvMjAxMC0yLjIgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjQ3MDc4OiBlY2xpcHNlbGluay1vcm0ueG1sIHNjaGVtYSBzaG91bGQgYWxsb3cgbG9iIGFuZCBlbnVtZXJhdGVkIG9uIHZlcnNpb24gYW5kIGlkIG1hcHBpbmdzICh1cGRhdGUgdmVyc2lvbiB0byAyLjIpICAtLT4KLTwhLS0gICAgIDEwLzE1LzIwMTAtMi4yIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgLSAzMjIwMDg6IEltcHJvdmUgdXNhYmlsaXR5IG9mIGFkZGl0aW9uYWwgY3JpdGVyaWEgYXBwbGllZCB0byBxdWVyaWVzIGF0IHRoZSBzZXNzaW9uL0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzIueHNkIDIuMiAgSnVuZSAxNCAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8yLnhzZAotICAgICAgIHZlcnNpb249IjIuMiI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhZGRpdGlvbmFsIGNyaXRlcmlhIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBsZXZlbC4gV2hlbiBzcGVjaWZpZWQgYXQgdGhlIG1hcHBlZCBzdXBlcmNsYXNzIGxldmVsLCBpdCBhcHBsaWVzIHRvIGFsbCAKLSAgICAgICAgICogaW5oZXJpdGluZyBlbnRpdGllcyB1bmxlc3MgdGhvc2UgZW50aXRpZXMgZGVmaW5lIHRoZWlyIG93biBhZGRpdGlvbmFsIAotICAgICAgICAgKiBjcml0ZXJpYSwgYXQgd2hpY2ggcG9pbnQgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgCi0gICAgICAgICAqIGlzIGlnbm9yZWQuICAKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgc3VwcG9ydHMgYW55IHZhbGlkIEpQUUwgc3RyaW5nIGFuZCBtdXN0IHVzZSAndGhpcycgCi0gICAgICAgICAqIGFzIGFuIGFsaWFzIHRvIGZvcm0geW91ciBhZGRpdGlvbmFsIGNyaXRlcmlhLiBFLkcuLAotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQWRkaXRpb25hbENyaXRlcmlhKCJ0aGlzLm51dC5zaXplID0gOk5VVF9TSVpFIGFuZCB0aGlzLm51dC5jb2xvciA9IDpOVVRfQ09MT1IiKQotICAgICAgICAgKiBwdWJsaWMgY2xhc3MgQm9sdCB7Li4ufQotICAgICAgICAgKiAKLSAgICAgICAgICogQWRkaXRpb25hbCBjcml0ZXJpYSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGFjY2VwdGVkIGFuZCBhcmUgc2V0IHRocm91Z2ggCi0gICAgICAgICAqIHByb3BlcnRpZXMgb24gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnksIG9yIG9uIGFuIGVudGl0eSBtYW5hZ2VyLiBXaGVuIHNldCAKLSAgICAgICAgICogb24gdGhlIGVudGl0eSBtYW5hZ2VyLCB0aGUgcHJvcGVydGllcyBtdXN0IGJlIHNldCBiZWZvcmUgYW55IHF1ZXJ5IGV4ZWN1dGlvbgotICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZvciB0aGUgbGlmZSBzcGFuIG9mIHRoYXQgZW50aXR5IG1hbmFnZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQcm9wZXJ0aWVzIHNldCBvbiB0aGUgZW50aXR5IG1hbmFnZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBzaW1pbGFybHkgbmFtZWQgCi0gICAgICAgICAqIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBBZGRpdGlvbmFsIGNyaXRlcmlhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBhbnkgbmF0aXZlIHF1ZXJpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEd1eSBQZWxsZXRpZXIKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQWRkaXRpb25hbENyaXRlcmlhIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgSlBRTCBmcmFnbWVudCB0byB1c2UgYXMgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlLAotICAgICAgICAgICogb3Igb25seSBhIHBlciBFbnRpdHlNYW5hZ2VyIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgc2hhcmVkLgotICAgICAgICAgICogQGRlcHJlY2F0ZWQgIEFzIG9mIEVjbGlwc2VsaW5rIDIuMi4gIFNlZSB0aGUgYXR0cmlidXRlICdpc29sYXRpb24nCi0gICAgICAgICAgKi8gCi0gICAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogKE9wdGlvbmFsKSBDb250cm9scyB0aGUgbGV2ZWwgb2YgY2FjaGluZyB0aGlzIEVudGl0eSB3aWxsIHVzZS4KLSAgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQgd2hpY2ggaGFzIEVjbGlwc2VMaW5rCi0gICAgICAgICAgKiBDYWNoaW5nIGFsbCBFbnRpdGllcyBpbiB0aGUgU2hhcmVkIENhY2hlLgotICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuQ2FjaGVJc29sYXRpb25UeXBlCi0gICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uKCkgZGVmYXVsdCBTSEFSRUQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc29sYXRpb24iIHR5cGU9Im9ybTpjYWNoZS1pc29sYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtaXNvbGF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9wdGlvbnMgZm9yIGhvdyBFbnRpdHkgaW5zdGFuY2VzIHNob3VsZCBiZSBzaGFyZWQgd2l0aGluIGFuIEVjbGlwc2VMaW5rIFBlcnNpc3RlbmNlIFVuaXQgLyBTZXJ2ZXJTZXNzaW9uCi0gICAgICAgICAqIEBzZWUgQ2xhc3NEZXNjcmlwdG9yI3NldENhY2hlSXNvbGF0aW9uVHlwZShDYWNoZUlzb2xhdGlvblR5cGUpCi0gICAgICAgICAqIEBhdXRob3IgR29yZG9uIFlvcmtlCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlSXNvbGF0aW9uVHlwZSB7Ci0gICAgICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgaW5zdGFuY2VzIHdpbGwgYmUgY2FjaGVkIHdpdGhpbiB0aGUgRW50aXR5TWFuYWdlckZhY3RvcnkvU2VydmVyU2Vzc2lvbiBsZXZlbC4KLSAgICAgICAgICAqIEFueSB1c2VyIHF1ZXJpZXMgZm9yIHNoYXJlZCBjYWNoZSBpbnN0YW5jZXMgKGllIFJlYWQtT25seSBxdWVyeSBoaW50KSB3aWxsIHJldHVybiBhbiBFbnRpdHkKLSAgICAgICAgICAqIGluc3RhbmNlIHRoYXQgbWF5IGJlIHNoYXJlZCBieSBtdWx0aXBsZSBjbGllbnRzLiAKLSAgICAgICAgICAqIAotICAgICAgICAgICogVGhpcyBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbC4KLSAgICAgICAgICAqLwotICAgICAgICAgU0hBUkVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBiZSBjYWNoZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBidXQgRW50aXR5Ci0gICAgICAgICAgKiBpbnN0YW5jZXMgd2lsbCBub3QgYmUgc2hhcmVkLiBBbnkgdXNlciBxdWVyaWVzIGZvciBzaGFyZWQgY2FjaGUgaW5zdGFuY2VzCi0gICAgICAgICAgKiAoaWUgUmVhZC1Pbmx5IHF1ZXJ5IGhpbnQpIHdpbGwgcmV0dXJuIGEgbmV3IEVudGl0eSBpbnN0YW5jZSB3aXRoIHRoZSBjYWNoZWQgc3RhdGUuCi0gICAgICAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBpbnN0YW5jZSBpcyA8aT5wcm90ZWN0ZWQ8L2k+IGZyb20gYW55IGNvbmN1cnJlbnQKLSAgICAgICAgICAqIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICAqLwotICAgICAgICAgUFJPVEVDVEVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBUaGUgRW50aXR5IGFuZCBpdHMgZGF0YSBpcyBub3Qgc3RvcmVkIGluIHRoZSBzaGFyZWQgY2FjaGUgYnV0IGlzCi0gICAgICAgICAgKiA8aT5pc29sYXRlZDwvaT4gdG8gdGhlIFBlcnNpc3RlbmNlIENvbnRleHQvVW5pdE9mV29yayBvcgotICAgICAgICAgICogSXNvbGF0ZWRDbGllbnRTZXNzaW9uLiBUaGlzIHNldHRpbmcgZWZmZWN0aXZlbHkgZGlzYWJsZXMgc2Vjb25kIGxldmVsCi0gICAgICAgICAgKiBjYWNoaW5nIGZvciB0aGlzIGVudGl0eSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB1c2VycyBkbyBub3Qgd2FudCBjYWNoaW5nIGZvcgotICAgICAgICAgICogYSBwYXJ0aWN1bGFyIEVudGl0eS4KLSAgICAgICAgICAqLwotICAgICAgICAgSVNPTEFURUQ7Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hBUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9URUNURUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTT0xBVEVEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgcmVzdWx0LXNldC1tYXBwaW5nIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgCi0gICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpwYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5uZWQtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGlubmVkLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cmFuZ2UtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imhhc2gtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06aGFzaC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnVuaW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGRlbGltaXRlZC1pZGVudGlmaWVycyAtIFVzZWQgdG8gdHJlYXQgZGF0YWJhc2UgaWRlbnRpZmllcnMgYXMKLSAgICAgICAgICAgIGRlbGltaXRlZCBpZGVudGlmaWVycy4KLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSIgdHlwZT0ib3JtOmFkZGl0aW9uYWwtY3JpdGVyaWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJwYXJ0aXRpb25pbmctZ3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGlubmVkLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnBpbm5lZC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJhbmdlLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJhbmdlLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06dmFsdWUtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOmhhc2gtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp1bmlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcnRpdGlvbmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0gICAgICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklSVFVBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdHt9OwotICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUoKSBkZWZhdWx0IEBKb2luVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4taW5zZXJ0IiB0eXBlPSJvcm06cmV0dXJuLWluc2VydCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXVwZGF0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAotICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAotICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKLSAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKLSAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKLSAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAotICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCi0gICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAotICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAotICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCi0gICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQYXJ0aXRpb25pbmcgaXMgdXNlZCB0byBwYXJ0aXRpb24gdGhlIGRhdGEgZm9yIGEgY2xhc3MgYWNyb3NzIG11bHRpcGxlIGRpZmZlcmVuY2UgZGF0YWJhc2VzCi0gICAgICAgICAgICAgKiBvciBhY3Jvc3MgYSBkYXRhYmFzZSBjbHVzdGVyIHN1Y2ggYXMgT3JhY2xlIFJBQy4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gcHJvdmlkZSBpbXByb3ZlZCBzY2FsYWJpbGl0eSBieSBhbGxvd2luZyBtdWx0aXBsZSBkYXRhYmFzZSBtYWNoaW5lcyB0byBzZXJ2aWNlIHJlcXVlc3RzLgotICAgICAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNvbmZpZ3VyZXMgYSBjdXN0b20gUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBJZiBtdWx0aXBsZSBwYXJ0aXRpb25zIGFyZSB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIEpUQSBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVyIFhBIHRyYW5zYWN0aW9uIHN1cHBvcnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbiBwb2xpY2llcyBhcmUgZ2xvYmFsbHkgbmFtZWQgdG8gYWxsb3cgcmV1c2UsCi0gICAgICAgICAgICAgKiB0aGUgcGFydGl0aW9uaW5nIHBvbGljeSBtdXN0IGFsc28gYmUgc2V0IHVzaW5nIHRoZSBAUGFydGl0aW9uZWQgYW5ub3RhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIFBhcnRpdGlvbmVkCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5QYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIEZ1bGwgcGFja2FnZS5jbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHBhcnRpdGlvbmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBIYXNoUGFydGl0aW9uaW5nIHBhcnRpdGlvbnMgYWNjZXNzIHRvIGEgZGF0YWJhc2UgY2x1c3RlciBieSB0aGUgaGFzaCBvZiBhIGZpZWxkIHZhbHVlIGZyb20gdGhlIG9iamVjdCwKLSAgICAgICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAgICAgKiBUaGUgaGFzaCBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCBoYXNoIHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgICAgICogdG8gYWxsIHNlcnZlcidzIGFuZCB1bmlvbmVkLCBvciBsZWZ0IHRvIHRoZSBzZXNpb24ncyBkZWZhdWx0IGJlaGF2aW9yLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLkhhc2hQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBIYXNoUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHRhYmxlIGNvbHVtbiBuYW1lLCBub3QgdGhlIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgY29udGFpbiB0aGUgZmllbGQgdGhlIHF1ZXJ5IHdpbGwgbm90IGJlIHBhcnRpdGlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIHBhcnRpdGlvbiBhY3Jvc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29ubmVjdGlvblBvb2xzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBEZWZpbmVzIGlmIHF1ZXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcGFydGl0aW9uIGZpZWxkIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pb25VbnBhcnRpdGlvbmFibGVRdWVyaWVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeSBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGlkLCBsb2NhdGlvbiwgb3IgdGVuYW50LgotICAgICAgICAgKiBFYWNoIHNlcnZlciBpcyBhc3NpZ25lZCBhIHJhbmdlIG9mIHZhbHVlcy4KLSAgICAgICAgICogQWxsIHdyaXRlIG9yIHJlYWQgcmVxdWVzdCBmb3Igb2JqZWN0J3Mgd2l0aCB0aGF0IHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmllbGQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gaXQgY2FuIGVpdGhlciBiZSBzZW50Ci0gICAgICAgICAqIHRvIGFsbCBzZXJ2ZXIncyBhbmQgdW5pb25lZCwgb3IgbGVmdCB0byB0aGUgc2VzaW9uJ3MgZGVmYXVsdCBiZWhhdmlvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIG11bHRpcGxlIHBhcnRpdGlvbnMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgSlRBIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXIgWEEgdHJhbnNhY3Rpb24gc3VwcG9ydC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogUGFydGl0aW9uIHBvbGljaWVzIGFyZSBnbG9iYWxseSBuYW1lZCB0byBhbGxvdyByZXVzZSwKLSAgICAgICAgICogdGhlIHBhcnRpdGlvbmluZyBwb2xpY3kgbXVzdCBhbHNvIGJlIHNldCB1c2luZyB0aGUgQFBhcnRpdGlvbmVkIGFubm90YXRpb24gdG8gYmUgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUGFydGl0aW9uZWQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5wYXJ0aXRpb25pbmcuUmFuZ2VQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSYW5nZVBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgdGFibGUgY29sdW1uIG5hbWUsIG5vdCB0aGUgY2xhc3MgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgKiBUaGUgY29sdW1uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5IGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgcGFydCBvZiB0aGUgb2JqZWN0J3MgSWQuCi0gICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICogSWYgYSBxdWVyeSBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgcGFydGl0aW9uZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIGxvYWQgYmFsYW5jZSBhY3Jvc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFJhbmdlUGFydGl0aW9uW10gcGFydGl0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZXMgaWYgcXVlcmllcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBwYXJ0aXRpb24gZmllbGQgc2hvdWxkIGJlIHNlbnQKLSAgICAgICAgICAgICAqIHRvIGV2ZXJ5IGRhdGFiYXNlIGFuZCBoYXZlIHRoZSByZXN1bHQgdW5pb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiB1bmlvblVucGFydGl0aW9uYWJsZVF1ZXJpZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTpyYW5nZS1wYXJ0aXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyYW5nZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHJhbmdlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVmFsdWVzID0gc3RhcnRWYWx1ZSBhbmQgPSBlbmRWYWx1ZSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbgotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhbmdlUGFydGl0aW9uIHsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBlbmRWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCB0byByb3V0ZSBxdWVyaWVzIHRvIGZvciB0aGlzIHJhbmdlLiAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW5kLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYWx1ZVBhcnRpdGlvbmluZyBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAqIEVhY2ggdmFsdWUgaXMgYXNzaWduZWQgYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCB2YWx1ZSBhcmUgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgKiB0byBhbGwgc2VydmVyJ3MgYW5kIHVuaW9uZWQsIG9yIGxlZnQgdG8gdGhlIHNlc2lvbidzIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5WYWx1ZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhbHVlUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIGRhdGFiYXNlIGNvbHVtbiBvciBxdWVyeSBwYXJhbWV0ZXIgdG8gcGFydGl0aW9uIHF1ZXJpZXMgYnkuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSB0YWJsZSBjb2x1bW4gbmFtZSwgbm90IHRoZSBjbGFzcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdGhlIG5hbWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpZWxkIHRoZSBxdWVyeSB3aWxsIG5vdCBiZSBwYXJ0aXRpb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29sdW1uIHBhcnRpdGlvbkNvbHVtbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogU3RvcmUgdGhlIHZhbHVlIHBhcnRpdGlvbnMuIEVhY2ggcGFydGl0aW9uIG1hcHMgYSB2YWx1ZSB0byBhIGNvbm5lY3Rpb25Qb29sLiAqLwotICAgICAgICAgICAgVmFsdWVQYXJ0aXRpb25bXSBwYXJ0aXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgYW55IHVubWFwcGVkIHZhbHVlcy4gKi8KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lcyBpZiBxdWVyaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHBhcnRpdGlvbiBmaWVsZCBzaG91bGQgYmUgc2VudAotICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHVuaW9uVW5wYXJ0aXRpb25hYmxlUXVlcmllcygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaW9uLXVucGFydGl0aW9uYWJsZS1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHZhbHVlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVGhlIHZhbHVlIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4yCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFsdWVQYXJ0aXRpb24gewotICAgICAgICAgICAgLyoqIFRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIHN0YXJ0IHZhbHVlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcm91dGUgcXVlcmllcyB0byBmb3IgdGhpcyB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUG9vbCgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHNlbmRzIHJlcXVlc3RzIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiB0byB0aGUgc2V0IG9mIGNvbm5lY3Rpb24gcG9vbHMuCi0gICAgICAgICAgICAgKiBJdCBpcyBmb3IgbG9hZC1iYWxhbmNpbmcgcmVhZCBxdWVyaWVzIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBmdWxsIGRhdGFiYXNlIGJlIHJlcGxpY2F0ZWQgb24gZWFjaCBtYWNoaW5lLCBzbyBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpdGlvbmluZy4KLSAgICAgICAgICAgICAqIFRoZSBkYXRhIHNob3VsZCBlaXRoZXIgYmUgcmVhZC1vbmx5LCBvciB3cml0ZXMgc2hvdWxkIGJlIHJlcGxpY2F0ZWQgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJvdW5kUm9iaW5Qb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChSZXF1aXJlZCkgTGlzdCBvZiBjb25uZWN0aW9uIHBvb2wgbmFtZXMgdG8gbG9hZCBiYWxhbmNlIGFjcm9zcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25uZWN0aW9uUG9vbHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBzZXQgb2YgZGF0YWJhc2UgdG8gYmUgd3JpdHRlbiB0byBhbmQga2VwdCBpbiBzeW5jaCwKLSAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSByZWFkcyBsb2FkLWJhbGFuY2VkIGFjcm9zcyB0aGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGljYXRlV3JpdGVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwbGljYXRlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgc2VuZHMgcmVxdWVzdHMgdG8gYSBzZXQgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEl0IGlzIGZvciByZXBsaWNhdGluZyBkYXRhIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBPbmx5IG1vZGlmaWNhdGlvbiBxdWVyaWVzIGFyZSByZXBsaWNhdGVkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJlcGxpY2F0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogVW5pb25QYXJ0aXRpb25pbmcgc2VuZHMgcXVlcmllcyB0byBhbGwgY29ubmVjdGlvbiBwb29scyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLgotICAgICAgICAgICAgICogVGhpcyBpcyBmb3IgcXVlcmllcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgc3BhbiBwYXJ0aXRpb25zIHdoZW4gcGFydGl0aW9uaW5nIGlzIHVzZWQsCi0gICAgICAgICAgICAgKiBzdWNoIGFzIG9uIGEgTWFueVRvTWFueSBjcm9zcyBwYXJ0aXRpb24gcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlVuaW9uUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIERlZmluZXMgaWYgd3JpdGUgcXVlcmllcyBzaG91bGQgYmUgcmVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgKiBXcml0ZXMgYXJlIG5vcm1hbGx5IG5vdCByZXBsaWNhdGVkIHdoZW4gdW5pb25pbmcsCi0gICAgICAgICAgICAgICAgICogYnV0IGNhbiBiZSBmb3IgTWFueVRvTWFueSByZWxhdGlvbnNoaXBzLCB3aGVuIHRoZSBqb2luIHRhYmxlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsaWNhdGVXcml0ZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBsaWNhdGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBpbm5lZC1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFBpbm5lZFBhcnRpdGlvbmluZyBwaW5zIHJlcXVlc3RzIHRvIGEgc2luZ2xlIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlBpbm5lZFBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBpbm5lZFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHBvb2wgbmFtZSB0byBwaW4gcXVlcmllcyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLQotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NrLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLCBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtY3JpdGVyaWEiIHR5cGU9Im9ybTphZGRpdGlvbmFsLWNyaXRlcmlhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUoKSBkZWZhdWx0IE5PTkU7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNyZWF0aW9uLXN1ZmZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXgiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFsbG93IGEgZGF0YWJhc2UgSU5ERVggdG8gYmUgZGVmaW5lIHdoZW4gZ2VuZXJhdGluZyBEREwuCi0gICAgICAgICAqIFRoZSBASW5kZXggY2FuIGJlIGRlZmluZWQgb24gYSBFbnRpdHkgY2xhc3MsIG9yIG9uIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICogVGhlIGNvbHVtbiBpcyBkZWZhdWx0ZWQgd2hlbiBkZWZpbmVkIG9uIGEgYXR0cmlidXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7Ci0gICAgICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIElOREVYLCBkZWZhdWx0cyB0byBJTkRFWF8odGFibGUtbmFtZSkgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc2NoZW1hIG9mIHRoZSBJTkRFWCAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgY2F0YWxvZyBvZiB0aGUgSU5ERVggKi8KLSAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB0YWJsZSB0byBkZWZpbmUgdGhlIGluZGV4IG9uLCBkZWZhdWx0cyB0byBlbnRpdGllcyBwcmltYXJ5IHRhYmxlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgdGhlIHNldCBvZiBjb2x1bW5zIHRvIGRlZmluZSB0aGUgaW5kZXggb24uCi0gICAgICAgICAgICAgKiBOb3QgcmVxdWlyZWQgd2hlbiBhbm5vdGF0ZWQgb24gYSBmaWVsZC9tZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0ib3JtOmluZGV4IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXRjaC1mZXRjaCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBCYXRjaEZldGNoIGFubm90YXRpb24gY2FuIGJlIHVzZWQgb24gYW55IHJlbGF0aW9uc2hpcCBtYXBwaW5nLAotICAgICAgICAgKiAoT25lVG9PbmUsIE1hbnlUb09uZSwgT25lVG9NYW55LCBNYW55VG9NYW55LCBFbGVtZW50Q29sbGVjdGlvbiwgQmFzaWNDb2xsZWN0aW9uLCBCYXNpY01hcCkuCi0gICAgICAgICAqIEl0IGFsbG93cyB0aGUgcmVsYXRlZCBvYmplY3RzIHRvIGJlIGJhdGNoIHJlYWQgaW4gYSBzaW5nbGUgcXVlcnkuCi0gICAgICAgICAqIEJhdGNoIGZldGNoaW5nIGNhbiBhbHNvIGJlIHNldCBhdCB0aGUgcXVlcnkgbGV2ZWwsIGFuZCBpdCBpcyAKLSAgICAgICAgICogbm9ybWFsbHkgcmVjb21tZW5kZWQgdG8gZG8gc28gYXMgYWxsIHF1ZXJpZXMgbWF5IG5vdCByZXF1aXJlIGJhdGNoaW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjEKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhdGNoRmV0Y2ggewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGJhdGNoLWZldGNoIHRvIHVzZS4KLSAgICAgICAgICAgICAqIEVpdGhlciBKT0lOLCBFWElTVFMgb3IgSU4uCi0gICAgICAgICAgICAgKiBKT0lOIGlzIHRoZSBkZWZhdWx0LgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQmF0Y2hGZXRjaFR5cGUgdmFsdWUoKSBkZWZhdWx0IEJhdGNoRmV0Y2hUeXBlLkpPSU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lIHRoZSBkZWZhdWx0IGJhdGNoIGZldGNoIHNpemUuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgSU4gdHlwZSBiYXRjaCByZWFkaW5nIGFuZCBkZWZpbmVzCi0gICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGtleXMgdXNlZCBpbiBlYWNoIElOIGNsYXVzZS4KLSAgICAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNpemUgaXMgMjU2LCBvciB0aGUgcXVlcnkncyBwYWdlU2l6ZSBmb3IgY3Vyc29yIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAtMTsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpiYXRjaC1mZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPC94c2Q6c2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTBjZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgZG1jY2FubiAtIE5vdmVtYmVyIDI0LzIwMDkgLSAyLjAgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIgCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgIHZlcnNpb249IjIuMCI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYmluZGluZ3MiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yb290LWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNlZS1hbHNvIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1jdXN0b21pemVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtYXR0cmlidXRlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsUEFDS0FHRX0pIC0tPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtQQUNLQUdFLEZJRUxELE1FVEhPRCxUWVBFLFBBUkFNRVRFUn0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxUWVBFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zaWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1UWVBFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9EfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGF4IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb20taGFuZGxlciIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlczQ0RvbUhhbmRsZXIiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLW1hcCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtd3JhcHBlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdmFsdWUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci08L3hzOnNjaGVtYT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGVhODQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIGRtY2Nhbm4gLSBEZWNlbWJlciAwOC8yMDA5IC0gMi4xIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iIAotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICB2ZXJzaW9uPSIyLjEiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWJpbmRpbmdzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJ5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LWRlY2wiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iXHUwMDAwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsLkdMT0JBTCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uSGVhZE5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC10cmFuc2llbnQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtY3VzdG9taXplciIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLQotICAgIDwhLS0gRW51bXMgLS0+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy1vcmRlciI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTFBIQUJFVElDQUwiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy10eXBlIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW5zLWZvcm0iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5RVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5TRVQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1tYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVBBQ0tBR0UpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW5zIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudC1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEtdHlwZXMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxQQUNLQUdFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFRZUEV9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNpZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVRZUEUpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0tdmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YS5sYW5nLlN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9wLW9yZGVyIj4KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJvb3QtZWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zZWUtYWxzbyI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTER9KSAgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0tdmFsdWUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1lbnVtLXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9EfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1tYXAiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudC5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50cyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtcmVmIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtcmVmcyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXJlZiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWludmVyc2UtcmVmZXJlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXdyYXBwZXIiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZhbHVlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiB0eXBlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW51bGwtcG9saWN5IiBzdWJzdGl0dXRpb25Hcm91cD0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1pcy1zZXQtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzIueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTM3YzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgZG1jY2FubiAtIE9jdG9iZXIgMTIvMjAxMCAtIDIuMiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIiAKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMi4yIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1iaW5kaW5ncyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yZWdpc3RyaWVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbnVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS10eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFja2FnZS1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJ5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LWRlY2wiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0VmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iXHUwMDAwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzY29wZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsLkdMT0JBTCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic3Vic3RpdHV0aW9uSGVhZE5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXJvb3QtZWxlbWVudCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2VlLWFsc28iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1jbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdXBlci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1jdXN0b21pemVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1kaXNjcmltaW5hdG9yLW5vZGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC10cmFuc2llbnQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtYXR0cmlidXRlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW1ldGhvZHMiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieG1sLWNsYXNzLWV4dHJhY3RvciIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNsYXNzLWV4dHJhY3RvciI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXByb3BlcnRpZXMiIHR5cGU9InhtbC1wcm9wZXJ0aWVzIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtcHJvcGVydGllcyI+Ci0gICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1wcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgPgotICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmEubGFuZy5TdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwhLS0gRW51bXMgLS0+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy1vcmRlciI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBTFBIQUJFVElDQUwiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLWFjY2Vzcy10eXBlIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9QRVJUWSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW5zLWZvcm0iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5RVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5TRVQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1tYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVBBQ0tBR0UpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW5zIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudC1mb3JtLWRlZmF1bHQiIHR5cGU9InhtbC1ucy1mb3JtIiBkZWZhdWx0PSJVTlNFVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibG9jYXRpb24iIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEtdHlwZXMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxQQUNLQUdFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFRZUEV9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNpZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVRZUEUpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0tdmFsdWUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0iIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YS5sYW5nLlN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcm9wLW9yZGVyIj4KLSAgICAgICAgICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzOmF0dHJpYnV0ZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJvb3QtZWxlbWVudCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zZWUtYWxzbyI+Ci0gICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTER9KSAgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0tdmFsdWUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1lbnVtLXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIAotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9EfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1rZXkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYXR0YWNobWVudC1yZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taW1lLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC1yZWZzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibGF4IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkb20taGFuZGxlciIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlczQ0RvbUhhbmRsZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLW1hcCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudC5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwta2V5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50cyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qb2luLW5vZGVzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtcmVmIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIHR5cGU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWZzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtcmVmIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWludmVyc2UtcmVmZXJlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC13cmFwcGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC12YWx1ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1tYXAiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtleSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZhbHVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4gCi0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgdHlwZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgZGVmYXVsdD0iQUJTRU5UX05PREUiIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWlzLXNldC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlYWQtdHJhbnNmb3JtZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtd3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWpvaW4tbm9kZXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSIgPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qb2luLW5vZGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLXhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzZjNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMCIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDEuMCAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIHRvIGFsbG93IGZsZXhpYmlsaXR5IGluIHRoZSB0eXBlcyBvZiBjbGFzc2VzIGFuZCBkYXRhc3RvcmVzIHBlcnNpc3RlZCwgaS5lLiBpbnRlcmZhY2VzLCBhYnN0cmFjdCBjbGFzc2VzLCBhZ2dyZWdhdGVzLCBub24tcmVsYXRpb25hbCBwZXJzaXN0ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsZW1lbnRhdGlvbi5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhbiBhbGlhcyBuYW1lIGNhbiBiZSBnaXZlbiBmb3IgdGhlIGNsYXNzLiAgVGhlIGFsaWFzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHBsYWNlIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBuYW1lLCBzdWNoIGFzIGluIHF1ZXJ5aW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxhbGlhcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5FbXBsb3llZTwvYWxpYXM+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzL2NvbHVtbnMgdGhhdCBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBvciB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nLCByZWxhdGlvbnNoaXBzLCBhbmQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IGtleSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNsYXNzIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnRzIiB0eXBlPSJldmVudC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnlpbmciIHR5cGU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG1hcHBpbmdzIHRoYXQgZGVmaW5lIGhvdyB0aGUgY2xhc3MnIGF0dHJpYnV0ZXMgYXJlIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciIHR5cGU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVzY3JpcHRvci10eXBlIiB0eXBlPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSwgc3VjaCBhcyBhZ2dyZWdhdGUgb3IgaW5kZXBlbmRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRlcmZhY2VzIiB0eXBlPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvY2tpbmciIHR5cGU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBsb2NraW5nIGJlaGF2aW9yIGZvciB0aGUgY2xhc3MuICBTdWNoIGFzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdmVyc2lvbiwgdGltZXN0YW1wIG9yIGNoYW5nZSBzZXQgb2YgY29sdW1ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciIHR5cGU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVtb3RlLWNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIG9uIHJlbW90ZSBjbGllbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybmluZy1wb2xpY3kiIHR5cGU9InJldHVybmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbWVuZG1lbnQiIHR5cGU9ImFtZW5kbWVudCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnN0YW50aWF0aW9uIiB0eXBlPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvcHlpbmciIHR5cGU9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnkta2V5cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJ5IGtleXMgb3IgYWxpYXNlcyBmb3IgZGF0YWJhc2UgaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5IiB0eXBlPSJxdWVyeS1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbXAtcG9saWN5IiB0eXBlPSJjbXAtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5QbGFjZSBob2xkZXIgb2YgQ01QIGluZm9ybWF0aW9uIHNwZWNpZmljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXBzIiB0eXBlPSJmZXRjaC1ncm91cHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMgYXQgdGhlIGRlc2NyaXB0b3IgbGV2ZWw8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hhbmdlLXBvbGljeSIgdHlwZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIENoYW5nZSBQb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIxMCIgbmFtZT0ic2NoZW1hLW1ham9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIwIiBuYW1lPSJzY2hlbWEtbWlub3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2xhc3MgZGVzY3JpcHRvciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5kZXBlbmRlbnQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUtY29sbGVjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludGVyZmFjZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW50ZXJmYWNlcyB0aGF0IGEgY2xhc3MgZGVzY3JpcHRvciBpbXBsZW1lbnRzLCBvciB0aGUgaW1wbGVtZW50aW9uIGNsYXNzIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYSBzZXQgb2YgcHVibGljIGludGVyZmFjZXMgZm9yIHRoZSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyBhbGxvd3MgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHR3byBjbGFzc2VzIGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UsIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBkZWZpbmVkIGZvciB0aGUgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlZmluZSBpbmhlcml0YW5jZSBiZXR3ZWVuIGludGVyZmFjZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgaW50ZXJmYWNlIGNsYXNzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuYXBpLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbXBsZW1lbnRvci1kZXNjcmlwdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyZmFjZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBpbnRlcmZhY2UgaGFzIG9ubHkgYSBzaW5nbGUgaW1wbGVtZW50b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbC5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DcmVhdGVzIGEgY29weWluZyB0aHJvdWdoIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHRvIGNvcHkgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xvbmUgbWV0aG9kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjbG9uZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgaS5lLiAnY2xvbmUnPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGZhY3RvcnkgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdCBpbnN0YW5jZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgZmFjdG9yeSBjbGFzcy4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFtZW5kbWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIGNsYXNzIGFuZCBzdGF0aWMgbWV0aG9kIHRvIGJlIGNhbGxlZCB0byBhbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFtZW5kbWVudCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFtZW5kbWVudCBtZXRob2Qgb24gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZShzKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YWJsZXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGhlIHRhYmxlcyB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVHlwaWNhbGx5IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGEgc2luZ2xlIHRhYmxlLCBidXQgbXVsdGlwbGUgdGFibGVzIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InRhYmxlIiB0eXBlPSJ0YWJsZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXlzLWZvci1tdWx0aXBsZS10YWJsZSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGZvcmVpZ24ga2V5IGZpZWxkIHJlZmVyZW5jZXMgdG8gYmUgZGVmaW5lIGZvciBtdWx0aXBsZSB0YWJsZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im11bHRpcGxlLXRhYmxlLWpvaW4tY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBjb21wbGV4IG11bHRpcGxlIHRhYmxlIGpvaW4gY29uZGl0aW9ucyBhbiBleHByZXNzaW9uIG1heSBiZSBwcm92aWRlZCBpbnN0ZWFkIG9mIHRoZSB0YWJsZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGEgbnVtZXJpYyB2ZXJzaW9uIGZpZWxkL2NvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbi1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ic3RvcmUtdmVyc2lvbi1pbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdmVyc2lvbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXN0YW1wLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHRpbWVzdGFtcCB2ZXJzaW9uIGNvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzZXJ2ZXItdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGltZXN0YW1wIHNob3VsZCBiZSBvYnRhaW5lZCBsb2NhbGx5IG9yIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWxsLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWxlY3RlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhIHNwZWNpZmllZCBzZXQgb2YgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlIG9uIHVwZGF0ZSBhbmQgZGVsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGRhdGFiYXNlIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IuICBUaGlzIGNvdWxkIGJlIHRoZSBuYW1lIG9mIGEgc2VxdWVuY2Ugb2JqZWN0LCBvciBhIHJvdyB2YWx1ZSBpbiBhIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBpZCBpcyBhc3NpZ25lZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhY2hpbmcgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYXJkLWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgaG93IG9iamVjdCBpZGVudGl0eSBzaG91bGQgYmUgbWFpbnRhaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIG5hbWU9ImNhY2hlLXR5cGUiIHR5cGU9ImNhY2hlLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgY2FjaGluZywgc3VjaCBhcyBMUlUsIHdlYWsgcmVmZXJlbmNlIG9yIG5vbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9ImNhY2hlLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbml0aWFsIG9yIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyByZWZyZXNoIGNhY2hlZCBvYmplY3RzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib25seS1yZWZyZXNoLWNhY2hlLWlmLW5ld2VyLXZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIHJlZnJlc2ggaWYgdGhlIGNhY2hlZCBvYmplY3QgaXMgYW4gb2xkZXIgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkaXNhYmxlLWNhY2hlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNhYmxlIG9idGFpbmluZyBjYWNoZSBoaXRzIG9uIHByaW1hcnkga2V5IHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLWNvbmZvcm0iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBjb25mb3JtIHF1ZXJpZXMgd2l0aGluIGEgdHJhbnNhY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaXNvbGF0ZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tIHRoZSBzaGFyZWQgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCIgdHlwZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGFuZ2Utc2V0IiBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiIHR5cGU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGRlc2NyaXBvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUtcmVhZC10aW1lLW9uLXVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWV4cGlyeS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGluIHRoZSBjYWNoZSBkbyBub3QgZXhwaXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtdG8tbGl2ZS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGxpdmUgYSBzcGVjaWZpYyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZXkgYXJlIHJlYWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWUtdG8tbGl2ZSIgdHlwZT0ieHNkOmxvbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYWlseS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIFBvbGljeSB3aGVyZSBvYmplY3RzIGV4cGlyZSBhdCBhIHNwZWNpZmljIHRpbWUgZXZlcnkgZGF5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaGFuZGxlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWRhdGFiYXNlLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS10YWJsZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG5hbWVzIG9mIHRoZSBtaXJyb3JpbmcgaGlzdG9yaWNhbCB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJoaXN0b3J5LXRhYmxlIiB0eXBlPSJoaXN0b3J5LXRhYmxlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdGFydC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHN0YXJ0IGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic3RhcnQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJlbmQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBlbmQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJlbmQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FYWNoIGVudHJ5IGlzIGEgc291cmNlIChkZXNjcmlwdG9yKSB0byBoaXN0b3J5IHRhYmxlIG5hbWUgYXNzb2NpYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9InNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9Imhpc3RvcnkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm9zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyB0aGUgZmllbGRzIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgdHlwZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWVsZCB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHR5cGUgYW5kIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9ucy4gQXQgbGVhc3Qgb25lIG9mIGluc2VydCwgdXBkYXRlIHNob3VsZCBiZSB0cnVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRvIGJlIHJldHVybmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0LW1vZGUtcmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBpbnNlcnQ9PXRydWUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIGluc2VydGVkICh0cnVlKS4gSWYgaW5zZXJ0PT1mYWxzZSAtIGlnbm9yZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmVudC9zdXBlcmNsYXNzIG9mIHRoZSBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkICAgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InJlYWQtc3ViY2xhc3Nlcy1vbi1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGlmIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZCBvbiBxdWVyaWVzLCBvciBvbmx5IHRoZSBleGFjdCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLXZpZXciIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZpZXcgdGhhdCBqb2lucyBhbGwgb2YgdGhlIHN1YmNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWNsYXNzLW5hbWUtYXMtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3MgdHlwZSBpbmRpY2F0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0aW9uLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIGNsYXNzIHRoYXQgdGFrZXMgdGhlIGNsYXNzJyByb3cgYXMgYXJndW1lbnQgYSBjb21wdXRlZCB0aGF0IGNsYXNzIHR5cGUgdG8gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBmcm9tIHRoZSByb3cuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgY2xhc3MgdHlwZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNsYXNzIGV4dHJhY3RvciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvbmx5LWluc3RhbmNlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IGFsbCBzaWJsaW5nIGFuZCBzdWJjbGFzcyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgc2libGluZyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lLWluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4dGVuZHMgaW5oZXJpdGFuY2UgcG9saWN5LiBBbGxvd3MgZm9yIHByZWZpeGVkIG5hbWVzIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWUgdG8gZmluZCB0aGUgYXBwcm9yaWF0ZSBjbGFzczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmhlcml0YW5jZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmciPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIHR5cGUgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1pbmRpY2F0b3IiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdmFsdWUgdXNlZCB0byBkZWZpbmUgdGhlIGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnQtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudC1saXN0ZW5lcnMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXZlbnQtbGlzdGVuZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBldmVudCBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWJ1aWxkLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGJ1aWxkaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3Qtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8tdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1jbG9uZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBjbG9uaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LW1lcmdlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIG1lcmdpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtcmVmcmVzaC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciByZWZyZXNoaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBhbmQgcXVlcnkgcHJvcGVydGllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0icXVlcnkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzJyBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGFwcGx5IHRvIGFsbCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hlY2stY2FjaGUiIG5hbWU9ImV4aXN0ZW5jZSIgdHlwZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGJlaGF2b2lyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGluc2VydCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBpbnNlcnQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXBkYXRlLXF1ZXJ5IiB0eXBlPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gdXBkYXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHVwZGF0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkZWxldGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiIHR5cGU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkb2VzIGV4aXN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIG9iamVjdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtYWxsLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgYWxsIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYWxsIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBwb2xpY2llcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5LWtleSBhbGlhcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gdXNlIHdpdGggYSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZGF0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tY2hhbmdlcyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQtd2l0aC1uZXctb2JqZWN0cyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgaXNvbGF0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzZS1zZXNzaW9uLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFsd2F5cyIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGJlaW5nIGFsaWFzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGpvaW4gY29uZGl0aW9uIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgam9pbiBjcml0ZXJpYSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLTEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLW0gam9pbiBmcm9tIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHZhbHVlIHRoYXQgbnVsbCBkYXRhIHZhbHVlcyBzaG91bGQgYmUgY29udmVydGVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHNpbXBsZSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZmllbGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWVyLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nIHRoYXQgdXNlcyBKYXZhIGNvZGUgdG8gdHJhbnNmb3JtIGJldHdlZW4gdGhlIGRhdGEgYW5kIG9iamVjdCB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1hdGlvbiBkZWZpbmVkIGluIHRoZSBkb21haW4gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtdHJhbnNmb3JtZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1lci4gVXNlZCBpbiBwbGFjZSBvZiBhdHRyaWJ1dGUtdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdHJhbnNmb3JtYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIHR5cGU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIHRhcmdldCBvYmplY3QgaXMgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0IGFuZCBzdG9yZXMgd2l0aGluIHRoZSBzb3VyY2Ugb2JqZWN0cyByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImFsbG93LW51bGwiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgYSByb3cgb2YgYWxsIG51bGxzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBudWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgbWFwcGluZyB0byB1c2UgZGlmZmVyZW50IGZpZWxkIG5hbWVzIHRoYW4gdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIGRlc2NyaXB0b3IncyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgYWdncmVnYXRlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzZXMgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRhcmdldCBvYmplY3RzIGFyZSBwcml2YXRlbHkgb3duZWQgZGVwZW5kZW50IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvbmUtdG8tb25lLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWdyb3VwaW5nLWVsZW1lbnQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSB0eXBlcyByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UgcHJpbWFyeSBrZXkgYW5kIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3QtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgc2Vzc2lvbiB0aGF0IGRlZmluZXMgdGhlIHJlZmVyZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Yga2V5IHZhbHVlcyBwYWlycyBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3Qta2V5LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzb3JlcyB0aGUgbWFwIGtleSBkYXRhIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGtleSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcyB3aGVyZSB0aGUgdGFyZ2V0IGluc3RhbmNlcyBhcmUgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbi10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZS90YXJnZXQgcHJpbWFyeSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UgdGhhdCBtYXkgYmUgb2Ygc2V2ZXJhbCB0eXBlcyByZWxhdGVkIHRocm91Z2ggYW4gaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgY29sdW1uIHRvIHN0b3JlIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSByZWxhdGVkIG9iamVjdCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleS10by1xdWVyeS1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBjb2x1bW4vcXVlcnkga2V5IHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHF1ZXJ5IGtleXMgZGVmaW5pbmcgYSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgdmFsdWUgaW4gdGhlIG90aGVyIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcXVlcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcXVlcnkta2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBrZXkgbmFtZSBvZiB0aGUgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29udGFpbmVyL2NvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic29ydGVkLWNvbGxlY3Rpb24tY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzb3J0ZWQgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXJhdG9yLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbXBhcml0b3IsIHVzZWQgdG8gY29tcGFyZSBvYmplY3RzIGluIHNvcnRpbmcgdGhlIGNvbGxlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3QtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBsaXN0IGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjcm9sbGFibGUtY3Vyc29yLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzY3JvbGxhYmxlIGN1cnNvciBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3Vyc29yZWQtc3RyZWFtLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjdXJzb3JlZCBzdHJlYW0gY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGlyZWN0aW9uLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGVmZXJyZWQgcmVhZCBpbmRpcmVjdGlvbiBtZWNoYW5pc20uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1ob2xkZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB2YWx1ZSBob2xkZXJzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm94eS1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHByb3hpZXMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcGFyZW50LWNvbGxlY3Rpb24taW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB0cmFuc3BhcmVudCBjb2xsZWN0aW9ucyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHRvIHVzZSwgaS5lLiBMaXN0LCBTZXQsIE1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBhIHVzZXIgZGVmaW5lZCBjb250YWluZXIgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb250YWluZXIgaW1wbGVtZW50ZXIgdG8gdXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlc2FmZS1lbnVtZXJhdGlvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UeXBlc2FmZSBFbnVtZXJhdGlvbiBjb252ZXJzaW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJzaW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIGFuZCBhbiBvYmplY3QgdHlwZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQgYmV0d2Vlbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcmlhbGl6ZWQtb2JqZWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgb2JqZWN0IHNlcmlhbGl6YXRpb24gdG8gY29udmVydCBiZXR3ZWVuIHRoZSBvYmplY3QgYW5kIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiB2YWx1ZXMgZnJvbSBkYXRhYmFzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgZmllbGQgYW5kIG9iamVjdCB2YWx1ZXMgdXNlZCBpbiB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgdmFsdWUgaXMgdXNlZCBpZiBhIGRhdGFiYXNlIHR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSB0eXBlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1hcHBpbmcgb2YgdmFsdWVzLiAgQm90aCB0aGUgb2JqZWN0IGFuZCBkYXRhYmFzZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1vbmx5LXR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiBhZGRpdGlvbmFsIHZhbHVlcyB0aGF0IG1hcCBub24tdW5pcXVlIGRhdGEgdmFsdWVzIHRvIGEgdW5pcXVlIGF0dHJpYnV0ZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgYW4gb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIG9iamVjdCdzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIGRhdGFiYXNlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkvaW50ZXJhY3Rpb24gYWdhaW5zdCBhIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibWFpbnRhaW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJ5cGFzcyB0aGUgY2FjaGUgY29tcGxldGVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHVzZSBwYXJhbWF0ZXIgYmluZGluZyBmb3IgYXJndW1lbnRzLCBvciBwcmludCB0aGUgYXJndW1lbnRzIGluLWxpbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1zdGF0ZW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIGNhY2hlZCwgdGhpcyBtdXN0IGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gY2FuY2VsIHRoZSBxdWVyeSBpbiBpZiB0aGUgcmVxdWVzdCB0YWtlcyB0b28gbG9uZyB0byBjb21wbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InByZXBhcmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHByZXBhcmUgYW5kIGNhY2hlIGl0cyBnZW5lcmF0ZWQgU1FMLCBvciByZWdlbmVyYXRlIHRoZSBTUUwgb24gZWFjaCBleGVjdXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxsIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3Igc3RhdGljIGNhbGxzIHRoZSBTUUwgb3IgU3RvcmVkIFByb2NlZHVyZSBjYWxsIGRlZmluaXRpb24gY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgam9pbiBmZXRjaCBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyLWpvaW4iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvdXRlci1qb2luIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FzY2FkZSBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcml2YXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBzaW5nbGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyByYXcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLXF1ZXJ5LXJlc3VsdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGNhY2hlIHRoZSBxdWVyeSByZXN1bHRzIHRvIGF2b2lkIGZ1dHVyZSBleGVjdXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWF4LXJvd3MiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCwgcmVzdWx0cyB3aWxsIGJlIHRydW5jdGF0ZSBvbiB0aGUgZGF0YWJhc2UgdG8gdGhpcyBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlyc3QtcmVzdWx0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIGN1cnNvciBpbiBhIHJlc3VsdCBzZXQgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFJlc3VsdHMgcHJpb3IgdG8gdGhpcyBudW1iZXIgd2lsbCBub3QgYmUgYnVpbHQgaW50byBvYmplY3RzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXNzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSBvbiBlYWNoIHJlc3VsdCBzZXQgbmV4dCBvcGVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5IiB0eXBlPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHF1ZXJ5J3MgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0ibWF4aW11bS1jYWNoZWQtcmVzdWx0cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHF1ZXJ5IHJlc3VsdCBzZXRzIHRoYXQgd2lsbCBiZSBjYWNoZWQuIFRoZSBMUlUgcXVlcnkgcmVzdWx0cyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbW9kaWZ5aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHVwZGF0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgaW5zZXJ0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgZXhpc3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIiB0eXBlPSJleGlzdGVuY2UtY2hlY2siPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGV4aXN0ZW5jZSBjaGVjayBvcHRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBjaGVjayBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhIGNyaXRlcmlhIG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG9iamVjdHMgKGFzIGFwcG9zZWQgdG8gZGF0YSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2Ygb2JqZWN0cyBiZWluZyBxdWVyaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZW1vdGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IHJlbW90ZWx5IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImNhc2NhZGUtcG9saWN5IiB0eXBlPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc2V0dGluZ3MgKHN1Y2ggYXMgcmVmcmVzaCwgbWFpbnRhaW4tY2FjaGUpIHNob3VsZCBhcHBseSB0byB0aGUgb2JqZWN0J3MgcmVsYXRpb25zaGlwIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJwcmltYXJ5LWtleSIgbmFtZT0iY2FjaGUtdXNhZ2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHNob3VsZCBpbnRlcmFjdCB3aXRoIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgbG9jayB0aGUgcmVzdWx0aW5nIHJvd3Mgb24gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iZGlzdGluY3Qtc3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGZpbHRlciBkaXN0aW5jdCByZXN1bHRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW4tbWVtb3J5LXF1ZXJ5aW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbiBtZW1vcnkgcXVlcnlpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgZGVmYXVsdD0iaWdub3JlLWV4Y2VwdGlvbnMtcmV0dXJuLWNvbmZvcm1lZCIgbmFtZT0icG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IGluZGlyZWN0aW9uIG9yIHVuY29uZm9ybWFibGUgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHRyZWF0aW5nIHdpdGggaW4tbWVtb3J5IHF1ZXJ5aW5nIGFuZCBjb25mb3JtaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ1c2UtZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBhIHByZS1kZWZpbmVkIG5hbWVkIGZldGNoIGdyb3VwIHRvIGFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIChWUEQpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2luZWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyBiZWluZyBqb2luZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igam9pbmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGFyZSByZWFkLW9ubHksIGFuZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSB1bml0IG9mIHdvcmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNldCBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXRjaC1yZWFkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYWxsIGF0dHJpYnV0ZXMgZm9yIGJhdGNoIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgYmF0Y2ggcmVhZGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvcmRlci1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIHRoZSBvcmRlciBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIG9yZGVyaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2luZ2xlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNldCBvZiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybi1jaG9pY2UiIHR5cGU9InJldHVybi1jaG9pY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyIgdHlwZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXBvcnQtaXRlbXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SXRlbXMgdG8gYmUgc2VsZWN0ZWQsIHRoZXNlIGNvdWxkIGJlIGF0dHJpYnV0ZXMgb3IgYWdncmVnYXRlIGZ1bmN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Iml0ZW0iIHR5cGU9InJlcG9ydC1pdGVtIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ3JvdXAtYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyBHUk9VUCBCWSBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGdyb3VwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXR1cm4tY2hvaWNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtcmVzdWx0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS12YWx1ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtYXR0cmlidXRlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaXJzdC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXByaW1hcnkta2V5IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1pdGVtIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZCBpbiBSZXBvcnRRdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5OYW1lIGdpdmVuIGZvciBpdGVtLCBjYW4gYmUgdXNlZCB0byByZXRpZXZlIHZhbHVlIGZyb20gcmVzdWx0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHByZXNzaW9uIChwYXJ0aWFsKSB0aGF0IGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlIHdhbnRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZmlsdGVyIGV4cHJlc3Npb24gdHJlZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb24gZXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHRvIGV4cHJlc3Npb25zIHRocm91Z2ggb3BlcmF0b3JzIHN1Y2ggYXMgZXF1YWwsIGxlc3NUaGFuLCBldGMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2ljLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0d28gc3ViLWV4cHJlc3Npb25zIGpvaW5lZCB0aHJvdWdoIGFuIG9wZXJhdG9yIHN1Y2ggYXMgQU5ELCBPUi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGEgbGlzdCBvZiBzdWItZXhwcmVzc2lvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb24iIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25zdGFudC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlIHZhbHVlIHRhZyBjYW4gaXMgYWJzZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXktZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBxdWVyeS1rZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYW55LW9mIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0ZXItam9pbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXItZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBwYXJhbWV0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzZS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGJ1aWxkZXIvYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcGVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBvcGVyYXRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gU1FMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgU1FMIHF1ZXJ5IHN0cmluZy4gIEFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggI2FyZy1uYW1lIHRva2VucyBpbiB0aGUgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamJxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSkItUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYnFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBFSkItUUwgcXVlcnkgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjdXJzb3Itb3V0cHV0LXByb2NlZHVyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBjYWxsIHRvIHVzZSBhIGN1cnNvciBvdXRwdXQgcGFyYW1ldGVyIHRvIGRlZmluZSB0aGUgcmVzdWx0IHNldC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBwcm9jZWR1cmUgYXJndW1lbnRzIGlmIG5vdCBuYW1lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgZnVuY3Rpb24gaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1yZXN1bHQiIHR5cGU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkLWZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdG9yZWQgcHJvY2VkdXJlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudCB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcmd1bWVudCBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUiIHR5cGU9InhzZDppbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGludCB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiBqYXZhLmpkYmMuVHlwZXM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGlmIHByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIGlzIFNUUlVDVCBvciBBUlJBWTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1pbm91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRwdXQtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbiB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBhdCBsZWFzdCBvbmUgT3JhY2xlIFBML1NRTCB0eXBlIHRoYXQgaGFzIG5vIEpEQkMgcmVwcmVzZW50YXRpb24gKGUuZy4gQk9PTEVBTiwgUExTX0lOVEVHRVIsIFBML1NRTCByZWNvcmQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGV4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXJlY29yZCI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWNvcmQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBvbmUgb3IgbW9yZSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkLWFzc29jaWF0aW9uIiB0eXBlPSJmb3JlaWduLWtleSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIFhNTCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQtZmllbGQiIHR5cGU9Im5vZGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIFhNTEZpZWxkIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCByb290IGVsZW1lbnQgb2YgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtcHJlc2VydmUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBub2RlcyBzaG91bGQgYmUgY2FjaGVkIHRvIHByZXNlcnZlIHVubWFwcGVkIGRhdGE8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2NoZW1hIiB0eXBlPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIG9iamVjdCB0byBhbiB4czphbnkgZGVjbGFyYXRpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgTm9kZSB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgTm9kZXMgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2Utb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWZpZWxkIiB0eXBlPSJub2RlIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb252ZXJzaW9uLXBhaXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0byBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpbiBhbiBYTUwgZG9jdW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3NpdGlvbiIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBwYXJlbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZWFmLWVsZW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhlIGVsZW1lbnRzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcmVpZ24ta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBmaWVsZC9jb2x1bW4gcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGluIGFub3RoZXIgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgdGFibGUgcHJpbWFyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHRhcmdldCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBzcGVjaWZpY2F0aW9uIGZvciBxdWVyeWluZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VsZWN0aW9uIGNyaXRlcmlhIG9mIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgcXVlcnkgYXJndW1lbnRzLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBwYXNzZWQgdG8gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icXVlcnktYXJndW1lbnQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBuYW1lIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhbmQgZXhlY3V0ZSB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGZpbHRlcmluZyBjbGF1c2Ugb2YgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0eXBlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IG1heSBiZSBwcm92aWRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiAgVGhlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCB3aXRoIHRoZSBzY2hlbWEsIHRhYmxlc3BhY2Ugb3IgbGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlCi0gICAgICAgIG9iamVjdCB2YWx1ZS4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0NmVhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTwhLS0gRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlIFByb2plY3QgOjogTWFwIFNjaGVtYSBmaWxlIGZvciBPUk0vT1hNL0VJUyAtLT4KLTx4c2Q6c2NoZW1hCi0gIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIgotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICB2ZXJzaW9uPSIxLjEiCi0gID4KLSAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgdHlwZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiAvPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1wZXJzaXN0ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9iamVjdC1wZXJzaXN0ZW5jZSBtYXBwaW5nIG1vZHVsZSwgYSBzZXQgb2YgY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbmFtZSBmb3IgdGhlIG1vZGVsIGJlaW5nIG1hcHBlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGNsYXNzIG1hcHBpbmcgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciIgdHlwZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvZ2luIiB0eXBlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRlZmF1bHQtdGVtcG9yYWwtbXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlZmF1bHQgZm9yIGhvdyBEYXRlIGFuZCBDYWxlbmRhciB0eXBlcyBhcmUgdXNlZCB3aXRoIGNoYW5nZSB0cmFja2luZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5CeSBkZWZhdWx0IHRoZXkgYXJlIGFzc3VtZWQgbm90IHRvIGJlIGNoYW5nZWQgZGlyZWN0bHkgKG9ubHkgcmVwbGFjZWQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGRlZmF1bHQ9IkVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZXMgLSAxLjEgKEJ1aWxkIFlZTU1ERCkiIG5hbWU9InZlcnNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgcGxhdGZvcm0gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHVzZXItbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSBwYXNzd29yZCwgdGhpcyBpcyBzdG9yZWQgaW4gZW5jcnlwdGVkIGZvcm0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIGRhdGFzb3VyY2UgZHJpdmVyLCBhbmQgYSBuZXcgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZSBwZXIgY2FsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgdHJhbnNhY3Rpb24gYXJlIG1hbmFnZWQgYnkgYSB0cmFuc2FjdGlvbiBtYW5hZ2VyLCBhbmQgc2hvdWxkIG5vdCBiZSBtYW5hZ2VkIGJ5IFRvcExpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIGlmIHRoZSBkYXRhc291cmNlIGRvZXMgbm90IHN1cHBvcnQgdHJhbnNhY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2luZyBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jZXMiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGRyaXZlciBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZHJpdmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSkRCQyBkcml2ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBKREJDIGRyaXZlciBjb25uZWN0aW9uIFVSTC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBwYXJhbWV0ZXIgYmluZGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0YXRlbWVudCBjYWNoaW5nIHNob3VsZCBiZSB1c2VkLiAgVGhpcyBzaG91bGQgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLCB0aGlzIGNhbm5vdCBiZSB1c2VkIHdpdGggZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYnl0ZSBhcnJheSBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJpbmctYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCB1c2UgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjI1NiIgbmFtZT0ic3RyaW5nLWJpbmRpbmctc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aHJlc2hvbGQgc3RyaW5nIHNpemUgZm9yIHVzYWdlIG9mIHN0cmluZyBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBsYXJnZSBieXRlIGFycmF5IGFuZCBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgYmUgYm91bmQgYXMgc3RyZWFtcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdG8gZm9yY2UgYWxsIGZpZWxkIG5hbWVzIHRvIHVwcGVyLWNhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBkYXRhIG9wdGltaXphdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHN0cmluZyB0cmFpbGluZyBibGFua3Mgc2hvdWxkIGJlIHRyaW1tZWQuICBUaGlzIGlzIG5vcm1hbGx5IHJlcXVpcmVkIGZvciBDSEFSIGRhdGEtdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHVzaW5nIGJhdGNoIHdyaXRpbmcsIGNvbmZpZ3VyZSBpZiB0aGUgSkRCQyBkcml2ZXJzIGJhdGNoIHdyaXRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKQ0EgZHJpdmVyIGFuZCBFSVMgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgVG9wTGluayBwbGF0Zm9ybSBzcGVjaWZpYyBjb25uZWN0aW9uIHNwZWMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKTkRJIHVybCBmb3IgdGhlIG1hbmFnZWQgSkNBIGFkYXB0ZXIncyBjb25uZWN0aW9uIGZhY3RvcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgCTx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiCi0gICAgICAgIAkJbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIAk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAgICAgCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IiBtYXhPY2N1cnM9IjEiCi0gICAgICAgIAkJbWluT2NjdXJzPSIwIj4KLSAgICAgICAgCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmZvcm1hdGlvbiBvZiBob3cgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gaXRzIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIGFuIGFic3RyYWN0IGRlZmluaXRpb24gdG8gYWxsb3cgZmxleGliaWxpdHkgaW4gdGhlIHR5cGVzIG9mIGNsYXNzZXMgYW5kIGRhdGFzdG9yZXMgcGVyc2lzdGVkLCBpLmUuIGludGVyZmFjZXMsIGFic3RyYWN0IGNsYXNzZXMsIGFnZ3JlZ2F0ZXMsIG5vbi1yZWxhdGlvbmFsIHBlcnNpc3RlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGxlbWVudGF0aW9uLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsaWFzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGFuIGFsaWFzIG5hbWUgY2FuIGJlIGdpdmVuIGZvciB0aGUgY2xhc3MuICBUaGUgYWxpYXMgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgY2xhc3MgaW4gcGxhY2Ugb2YgaXRzIGltcGxlbWVudGF0aW9uIG5hbWUsIHN1Y2ggYXMgaW4gcXVlcnlpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGFsaWFzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPkVtcGxveWVlPC9hbGlhcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMvY29sdW1ucyB0aGF0IG1ha2UgdXAgdGhlIHByaW1hcnkga2V5IG9yIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGlzIHVzZWQgZm9yIGNhY2hpbmcsIHJlbGF0aW9uc2hpcHMsIGFuZCBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByaW1hcnkga2V5IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBpZiB0aGUgY2xhc3MgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudHMiIHR5cGU9ImV2ZW50LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeWluZyIgdHlwZT0icXVlcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgbWFwcGluZ3MgdGhhdCBkZWZpbmUgaG93IHRoZSBjbGFzcycgYXR0cmlidXRlcyBhcmUgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyIgdHlwZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZXNjcmlwdG9yLXR5cGUiIHR5cGU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVzY3JpcHRvciB0eXBlLCBzdWNoIGFzIGFnZ3JlZ2F0ZSBvciBpbmRlcGVuZGVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludGVyZmFjZXMiIHR5cGU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGludGVyZmFjZXMgdGhhdCB0aGlzIGNsYXNzIGltcGxlbWVudHMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9ja2luZyIgdHlwZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGxvY2tpbmcgYmVoYXZpb3IgZm9yIHRoZSBjbGFzcy4gIFN1Y2ggYXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB2ZXJzaW9uLCB0aW1lc3RhbXAgb3IgY2hhbmdlIHNldCBvZiBjb2x1bW5zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2luZyIgdHlwZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZW1vdGUtY2FjaGluZyIgdHlwZT0iY2FjaGluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgb24gcmVtb3RlIGNsaWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuaW5nLXBvbGljeSIgdHlwZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFtZW5kbWVudCIgdHlwZT0iYW1lbmRtZW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc3RhbnRpYXRpb24iIHR5cGU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29weWluZyIgdHlwZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1rZXlzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcnkga2V5cyBvciBhbGlhc2VzIGZvciBkYXRhYmFzZSBpbmZvcm1hdGlvbi4gIFRoZXNlIGNhbiBiZSB1c2VkIGluIHF1ZXJpZXMgaW5zdGVhZCBvZiB0aGUgZGF0YWJhc2UgY29sdW1uIG5hbWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXkiIHR5cGU9InF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNtcC1wb2xpY3kiIHR5cGU9ImNtcC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlBsYWNlIGhvbGRlciBvZiBDTVAgaW5mb3JtYXRpb24gc3BlY2lmaWMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cHMiIHR5cGU9ImZldGNoLWdyb3VwcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3VwcyBhdCB0aGUgZGVzY3JpcHRvciBsZXZlbDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJjaGFuZ2UtcG9saWN5IiB0eXBlPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgQ2hhbmdlIFBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjEwIiBuYW1lPSJzY2hlbWEtbWFqb3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZml4ZWQ9IjAiIG5hbWU9InNjaGVtYS1taW5vci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbGFzcyBkZXNjcmlwdG9yIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmRlcGVuZGVudCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW50ZXJmYWNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyZmFjZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbnRlcmZhY2VzIHRoYXQgYSBjbGFzcyBkZXNjcmlwdG9yIGltcGxlbWVudHMsIG9yIHRoZSBpbXBsZW1lbnRpb24gY2xhc3MgZm9yIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhIHNldCBvZiBwdWJsaWMgaW50ZXJmYWNlcyBmb3IgdGhlIGNsYXNzIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIGFsbG93cyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdHdvIGNsYXNzZXMgaW1wbGVtZW50IHRoZSBzYW1lIGludGVyZmFjZSwgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGRlZmluZWQgZm9yIHRoZSBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGluaGVyaXRhbmNlIGJldHdlZW4gaW50ZXJmYWNlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBpbnRlcmZhY2UgY2xhc3MgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5hcGkuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImltcGxlbWVudG9yLWRlc2NyaXB0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIHdoaWNoIHRoaXMgaW50ZXJmYWNlIGlzIHRoZSBwdWJsaWMgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgdGhlIGludGVyZmFjZSBoYXMgb25seSBhIHNpbmdsZSBpbXBsZW1lbnRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNyZWF0ZXMgYSBjb3B5aW5nIHRocm91Z2ggY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UgdG8gY29weSBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkIHRocm91Z2ggYSBjbG9uZSBtZXRob2QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNsb25lIG1ldGhvZCBvbiB0aGUgb2JqZWN0LCBpLmUuICdjbG9uZSc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGluc3RhbnRpYXRpb24gYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgZmFjdG9yeSB0byBpbnN0YW50aWF0ZSB0aGUgb2JqZWN0IGluc3RhbmNlLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGluc3RhbnRpYXRlIHRoZSBmYWN0b3J5IGNsYXNzLic8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYW1lbmRtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgY2xhc3MgYW5kIHN0YXRpYyBtZXRob2QgdG8gYmUgY2FsbGVkIHRvIGFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYW1lbmRtZW50IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFtZW5kbWVudC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYW1lbmRtZW50IG1ldGhvZCBvbiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlKHMpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhYmxlcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0aGUgdGFibGVzIHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUeXBpY2FsbHkgYSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8gYSBzaW5nbGUgdGFibGUsIGJ1dCBtdWx0aXBsZSB0YWJsZXMgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idGFibGUiIHR5cGU9InRhYmxlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleXMtZm9yLW11bHRpcGxlLXRhYmxlIiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgZm9yZWlnbiBrZXkgZmllbGQgcmVmZXJlbmNlcyB0byBiZSBkZWZpbmUgZm9yIG11bHRpcGxlIHRhYmxlIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibXVsdGlwbGUtdGFibGUtam9pbi1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGNvbXBsZXggbXVsdGlwbGUgdGFibGUgam9pbiBjb25kaXRpb25zIGFuIGV4cHJlc3Npb24gbWF5IGJlIHByb3ZpZGVkIGluc3RlYWQgb2YgdGhlIHRhYmxlIGZvcmVpZ24ga2V5IGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gYSBudW1lcmljIHZlcnNpb24gZmllbGQvY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGNvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJzdG9yZS12ZXJzaW9uLWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB2ZXJzaW9uIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIGNhY2hlLCBvciBpZiBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lc3RhbXAtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdGltZXN0YW1wIHZlcnNpb24gY29sdW1uIHRoYXQgdHJhY2tzIGNoYW5nZXMgYW5kIHRoZSB2ZXJzaW9uIHRvIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InNlcnZlci10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIG9idGFpbmVkIGxvY2FsbHkgb3IgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbGwtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYWxsIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2VkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlbGVjdGVkLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGEgc3BlY2lmaWVkIHNldCBvZiBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBzZXQgb2YgZmllbGRzIHRvIGNvbXBhcmUgb24gdXBkYXRlIGFuZCBkZWxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgZGF0YWJhc2UgZ2VuZXJhdGVkIHVuaXF1ZSBpZCBzaG91bGQgYmUgYXNzaWduZWQgdG8gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGdlbmVyYXRvci4gIFRoaXMgY291bGQgYmUgdGhlIG5hbWUgb2YgYSBzZXF1ZW5jZSBvYmplY3QsIG9yIGEgcm93IHZhbHVlIGluIGEgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgZ2VuZXJhdGVkIHNlcXVlbmNlIGlkIGlzIGFzc2lnbmVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FjaGluZyB0eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImhhcmQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIGFuZCBob3cgb2JqZWN0IGlkZW50aXR5IHNob3VsZCBiZSBtYWludGFpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ic29mdC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgbmFtZT0iY2FjaGUtdHlwZSIgdHlwZT0iY2FjaGUtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBjYWNoaW5nLCBzdWNoIGFzIExSVSwgd2VhayByZWZlcmVuY2Ugb3Igbm9uZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0iY2FjaGUtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGluaXRpYWwgb3IgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIHJlZnJlc2ggY2FjaGVkIG9iamVjdHMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvbmx5LXJlZnJlc2gtY2FjaGUtaWYtbmV3ZXItdmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gcmVmcmVzaCBpZiB0aGUgY2FjaGVkIG9iamVjdCBpcyBhbiBvbGRlciB2ZXJzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImRpc2FibGUtY2FjaGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRpc2FibGUgb2J0YWluaW5nIGNhY2hlIGhpdHMgb24gcHJpbWFyeSBrZXkgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJhbHdheXMtY29uZm9ybSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGNvbmZvcm0gcXVlcmllcyB3aXRoaW4gYSB0cmFuc2FjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpc29sYXRlZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIGlzb2xhdGVkIGZyb20gdGhlIHNoYXJlZCBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIiB0eXBlPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBzaG91bGQgYmUgaXNvbGF0ZWQgdG8gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoYW5nZS1zZXQiIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSIgdHlwZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gYmUgdXNlZCB3aXRoIHRoaXMgZGVzY3JpcG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnZhbGlkYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3IgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZS1yZWFkLXRpbWUtb24tdXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZXhwaXJ5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgaW4gdGhlIGNhY2hlIGRvIG5vdCBleHBpcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS10by1saXZlLWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5IHdoZXJlIG9iamVjdHMgbGl2ZSBhIHNwZWNpZmljIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhleSBhcmUgcmVhZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGltZS10by1saXZlIiB0eXBlPSJ4c2Q6bG9uZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhaWx5LWNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DYWNoZSBpbnZhbGlkYXRpb24gUG9saWN5IHdoZXJlIG9iamVjdHMgZXhwaXJlIGF0IGEgc3BlY2lmaWMgdGltZSBldmVyeSBkYXk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUiIHR5cGU9InhzZDpkYXRlVGltZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSB0byBiZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJoYW5kbGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZGF0YWJhc2UtdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXRhYmxlcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbmFtZXMgb2YgdGhlIG1pcnJvcmluZyBoaXN0b3JpY2FsIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Imhpc3RvcnktdGFibGUiIHR5cGU9Imhpc3RvcnktdGFibGUiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0YXJ0LWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc3RhcnQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzdGFydC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImVuZC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGVuZCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImVuZC1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkVhY2ggZW50cnkgaXMgYSBzb3VyY2UgKGRlc2NyaXB0b3IpIHRvIGhpc3RvcnkgdGFibGUgbmFtZSBhc3NvY2lhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ic291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0iaGlzdG9yeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mb3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkxpc3RzIHRoZSBmaWVsZHMgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIiB0eXBlPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZpZWxkIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdHlwZSBhbmQgdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zLiBBdCBsZWFzdCBvbmUgb2YgaW5zZXJ0LCB1cGRhdGUgc2hvdWxkIGJlIHRydWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdG8gYmUgcmV0dXJuZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQtbW9kZS1yZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIGluc2VydD09dHJ1ZSwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBub3QgYmUgaW5zZXJ0ZWQgKHRydWUpLiBJZiBpbnNlcnQ9PWZhbHNlIC0gaWdub3JlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcGFyZW50L3N1cGVyY2xhc3Mgb2YgdGhlIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgICB3aXRoIGl0cyBwYWNrYWdlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icmVhZC1zdWJjbGFzc2VzLW9uLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgaWYgc3ViY2xhc3NlcyBvZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHJldHVybmVkIG9uIHF1ZXJpZXMsIG9yIG9ubHkgdGhlIGV4YWN0IGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtdmlldyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBuYW1lIG9mIGEgdmlldyB0aGF0IGpvaW5zIGFsbCBvZiB0aGUgc3ViY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtY2xhc3MtbmFtZS1hcy1pbmRpY2F0b3IiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjbGFzcyB0eXBlIGluZGljYXRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3Rpb24tbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCB0YWtlcyB0aGUgY2xhc3MnIHJvdyBhcyBhcmd1bWVudCBhIGNvbXB1dGVkIHRoYXQgY2xhc3MgdHlwZSB0byBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGZyb20gdGhlIHJvdy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBjbGFzcyB0eXBlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY2xhc3MgZXh0cmFjdG9yIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9ubHktaW5zdGFuY2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgYWxsIHNpYmxpbmcgYW5kIHN1YmNsYXNzIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxsLXN1YmNsYXNzZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBzaWJsaW5nIGluc3RhbmNlcyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icW5hbWUtaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXh0ZW5kcyBpbmhlcml0YW5jZSBwb2xpY3kuIEFsbG93cyBmb3IgcHJlZml4ZWQgbmFtZXMgdG8gYmUgcmVzb2x2ZWQgYXQgcnVudGltZSB0byBmaW5kIHRoZSBhcHByb3JpYXRlIGNsYXNzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluaGVyaXRhbmNlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyB0aGUgdHlwZSBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWluZGljYXRvciIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB2YWx1ZSB1c2VkIHRvIGRlZmluZSB0aGUgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJldmVudC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50LWxpc3RlbmVycyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJldmVudC1saXN0ZW5lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGFuIGV2ZW50IGxpc3RlbmVyIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgZGVzY3JpcHRvciBldmVudCBsaXN0ZW5lciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtYnVpbGQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgYnVpbGRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC13cml0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtaW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWNsb25lLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGNsb25pbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtbWVyZ2UtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgbWVyZ2luZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1yZWZyZXNoLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHJlZnJlc2hpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGFuZCBxdWVyeSBwcm9wZXJ0aWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJxdWVyeSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MnIGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gYXBwbHkgdG8gYWxsIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGVjay1jYWNoZSIgbmFtZT0iZXhpc3RlbmNlIiB0eXBlPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgYmVoYXZvaXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdCB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gaW5zZXJ0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGluc2VydCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ1cGRhdGUtcXVlcnkiIHR5cGU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSB1cGRhdGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgdXBkYXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRlbGV0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSIgdHlwZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGRvZXMgZXhpc3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgb2JqZWN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1hbGwtcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBhbGwgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBhbGwgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIHBvbGljaWVzIGZvciBkZXRlcm1pbmluZyBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkta2V5IGFsaWFzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byB1c2Ugd2l0aCBhIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnZhbGlkYXRpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1jaGFuZ2VzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldC13aXRoLW5ldy1vYmplY3RzIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hhbmdlLXNldCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHVuaXQgb2Ygd29yayBpc29sYXRlZCBmcm9tIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXNlLXNlc3Npb24tY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWx3YXlzIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gYmVpbmcgYWxpYXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgam9pbiBjb25kaXRpb24gYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBqb2luIGNyaXRlcmlhIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtMSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1xdWVyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBhIDEtbSBqb2luIGZyb20gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im51bGwtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdmFsdWUgdGhhdCBudWxsIGRhdGEgdmFsdWVzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3NpZmljYXRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MgYXR0cmlidXRlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgYXR0cmlidXRlIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBnZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHNldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgc2ltcGxlIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBmaWVsZCB0cmFuc2Zvcm1hdGlvbiBmb3IgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtZXItYmFzZWQtZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmcgdGhhdCB1c2VzIEphdmEgY29kZSB0byB0cmFuc2Zvcm0gYmV0d2VlbiB0aGUgZGF0YSBhbmQgb2JqZWN0IHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWF0aW9uIGRlZmluZWQgaW4gdGhlIGRvbWFpbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS10cmFuc2Zvcm1lciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRyYW5zZm9ybWVyLiBVc2VkIGluIHBsYWNlIG9mIGF0dHJpYnV0ZS10cmFuc2Zvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0cmFuc2Zvcm1hdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgdHlwZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uc2hpcCB3aGVyZSB0aGUgdGFyZ2V0IG9iamVjdCBpcyBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QgYW5kIHN0b3JlcyB3aXRoaW4gdGhlIHNvdXJjZSBvYmplY3RzIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYWxsb3ctbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBhIHJvdyBvZiBhbGwgbnVsbHMgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIG51bGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBtYXBwaW5nIHRvIHVzZSBkaWZmZXJlbnQgZmllbGQgbmFtZXMgdGhhbiB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgZGVzY3JpcHRvcidzIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBhZ2dyZWdhdGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gY2xhc3NlcyBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGFyZ2V0IG9iamVjdHMgYXJlIHByaXZhdGVseSBvd25lZCBkZXBlbmRlbnQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZWZyZXNoIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSByZW1vdmUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9uZS10by1vbmUtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRhcmdldC1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZ3JvdXBpbmctZWxlbWVudCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygc2ltcGxlIHR5cGVzIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZSBwcmltYXJ5IGtleSBhbmQgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBzZXNzaW9uIHRoYXQgZGVmaW5lcyB0aGUgcmVmZXJlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBrZXkgdmFsdWVzIHBhaXJzIG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpcmVjdC1rZXktZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHNvcmVzIHRoZSBtYXAga2V5IGRhdGEgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUga2V5IGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzIHdoZXJlIHRoZSB0YXJnZXQgaW5zdGFuY2VzIGFyZSBzdHJpY3RseSBwcml2YXRlbHkgb3duZWQgYnkgdGhlIHNvdXJjZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG0tbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbGF0aW9uLXRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbiB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlL3RhcmdldCBwcmltYXJ5IGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gaW5zZXJ0IGEgcm93IGludG8gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZSB0aGF0IG1heSBiZSBvZiBzZXZlcmFsIHR5cGVzIHJlbGF0ZWQgdGhyb3VnaCBhbiBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBjb2x1bW4gdG8gc3RvcmUgdGhlIGNsYXNzIHR5cGUgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5LXRvLXF1ZXJ5LWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBzb3VyY2UvdGFyZ2V0IGNvbHVtbi9xdWVyeSBrZXkgcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcXVlcnkga2V5cyBkZWZpbmluZyBhIHByaW1hcnkgb3IgdW5pcXVlIGtleSB2YWx1ZSBpbiB0aGUgb3RoZXIgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5LXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmVmZXJlbmNlIG9mIGEgc291cmNlIHRhYmxlIGZvcmVpZ24ga2V5IGFuZCBhIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvciBxdWVyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1xdWVyeS1rZXkiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IGtleSBuYW1lIG9mIHRoZSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIiB0eXBlPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb250YWluZXIvY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzb3J0ZWQtY29sbGVjdGlvbi1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNvcnRlZCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhcmF0b3ItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29tcGFyaXRvciwgdXNlZCB0byBjb21wYXJlIG9iamVjdHMgaW4gc29ydGluZyB0aGUgY29sbGVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibGlzdC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGxpc3QgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Nyb2xsYWJsZS1jdXJzb3ItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHNjcm9sbGFibGUgY3Vyc29yIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXJzb3JlZC1zdHJlYW0tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGN1cnNvcmVkIHN0cmVhbSBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kaXJlY3Rpb24tcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkZWZlcnJlZCByZWFkIGluZGlyZWN0aW9uIG1lY2hhbmlzbS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWhvbGRlci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHZhbHVlIGhvbGRlcnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3h5LWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgcHJveGllcyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwYXJlbnQtY29sbGVjdGlvbi1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHRyYW5zcGFyZW50IGNvbGxlY3Rpb25zIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbnRlcmZhY2UgdG8gdXNlLCBpLmUuIExpc3QsIFNldCwgTWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIGEgdXNlciBkZWZpbmVkIGNvbnRhaW5lciB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBpbXBsZW1lbnRlciB0byB1c2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGVzYWZlLWVudW1lcmF0aW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlR5cGVzYWZlIEVudW1lcmF0aW9uIGNvbnZlcnNpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnNpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUgYW5kIGFuIG9iamVjdCB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUgdG8gY29udmVydCBiZXR3ZWVuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VyaWFsaXplZC1vYmplY3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBvYmplY3Qgc2VyaWFsaXphdGlvbiB0byBjb252ZXJ0IGJldHdlZW4gdGhlIG9iamVjdCBhbmQgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIHZhbHVlcyBmcm9tIGRhdGFiYXNlIHZhbHVlcyB1c2VkIGluIHRoZSBmaWVsZCBhbmQgb2JqZWN0IHZhbHVlcyB1c2VkIGluIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb3B0aW9uYWwgZGVmYXVsdCB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyB2YWx1ZSBpcyB1c2VkIGlmIGEgZGF0YWJhc2UgdHlwZSBpcyBub3QgZm91bmQgaW4gdGhlIHR5cGUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWFwcGluZyBvZiB2YWx1ZXMuICBCb3RoIHRoZSBvYmplY3QgYW5kIGRhdGFiYXNlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW9ubHktdHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBtYXBwaW5nIG9mIGFkZGl0aW9uYWwgdmFsdWVzIHRoYXQgbWFwIG5vbi11bmlxdWUgZGF0YSB2YWx1ZXMgdG8gYSB1bmlxdWUgYXR0cmlidXRlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBhbiBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgb2JqZWN0J3MgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIHZhbHVlIHRvIHVzZSBpbiB0aGUgZGF0YWJhc2UgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeS9pbnRlcmFjdGlvbiBhZ2FpbnN0IGEgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtYWludGFpbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgYnlwYXNzIHRoZSBjYWNoZSBjb21wbGV0ZWx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgdXNlIHBhcmFtYXRlciBiaW5kaW5nIGZvciBhcmd1bWVudHMsIG9yIHByaW50IHRoZSBhcmd1bWVudHMgaW4tbGluZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLXN0YXRlbWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHN0YXRlbWVudCBzaG91bGQgYmUgY2FjaGVkLCB0aGlzIG11c3QgYmUgdXNlZCB3aXRoIHBhcmFtZXRlciBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGltZW91dCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBjYW5jZWwgdGhlIHF1ZXJ5IGluIGlmIHRoZSByZXF1ZXN0IHRha2VzIHRvbyBsb25nIHRvIGNvbXBsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0icHJlcGFyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgcHJlcGFyZSBhbmQgY2FjaGUgaXRzIGdlbmVyYXRlZCBTUUwsIG9yIHJlZ2VuZXJhdGUgdGhlIFNRTCBvbiBlYWNoIGV4ZWN1dGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhbGwiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBzdGF0aWMgY2FsbHMgdGhlIFNRTCBvciBTdG9yZWQgUHJvY2VkdXJlIGNhbGwgZGVmaW5pdGlvbiBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBqb2luIGZldGNoIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5uZXItam9pbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im91dGVyLWpvaW4iIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYXNjYWRlIHBvbGljaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InByaXZhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIHNpbmdsZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgY29sbGVjdGlvbiBvZiB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGEtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIHJhdyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtcXVlcnktcmVzdWx0cyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyeSBzaG91bGQgY2FjaGUgdGhlIHF1ZXJ5IHJlc3VsdHMgdG8gYXZvaWQgZnV0dXJlIGV4ZWN1dGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXgtcm93cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIGZldGNoLCByZXN1bHRzIHdpbGwgYmUgdHJ1bmN0YXRlIG9uIHRoZSBkYXRhYmFzZSB0byB0aGlzIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaXJzdC1yZXN1bHQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB3aGVyZSB0byBzdGFydCB0aGUgY3Vyc29yIGluIGEgcmVzdWx0IHNldCByZXR1cm5lZCBmcm9tIHRoZSBkYXRhYmFzZS4gUmVzdWx0cyBwcmlvciB0byB0aGlzIG51bWJlciB3aWxsIG5vdCBiZSBidWlsdCBpbnRvIG9iamVjdHM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllc3MgdGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGZyb20gdGhlIGRhdGFiYXNlIG9uIGVhY2ggcmVzdWx0IHNldCBuZXh0IG9wZXJhdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiIHR5cGU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcXVlcnkncyByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnZhbGlkYXRpb24tcG9saWN5IiB0eXBlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJtYXhpbXVtLWNhY2hlZC1yZXN1bHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcXVlcnkgcmVzdWx0IHNldHMgdGhhdCB3aWxsIGJlIGNhY2hlZC4gVGhlIExSVSBxdWVyeSByZXN1bHRzIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIG1heCBzaXplIGlzIHJlYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtYW5pcHVsYXRpbmcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1tb2RpZnktcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBtb2RpZnlpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgdXBkYXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnNlcnQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBpbnNlcnRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRldGVybWluaW5nIGlmIGFuIG9iamVjdCBleGlzdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJleGlzdGVuY2UtY2hlY2siIHR5cGU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtY2hlY2siPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgZXhpc3RlbmNlIGNoZWNrIG9wdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGEgY3JpdGVyaWEgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3Igb2JqZWN0cyAoYXMgYXBwb3NlZCB0byBkYXRhKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcyBvZiBvYmplY3RzIGJlaW5nIHF1ZXJpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlbW90ZS1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgcmVtb3RlbHkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgc2VydmVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iY2FzY2FkZS1wb2xpY3kiIHR5cGU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzZXR0aW5ncyAoc3VjaCBhcyByZWZyZXNoLCBtYWludGFpbi1jYWNoZSkgc2hvdWxkIGFwcGx5IHRvIHRoZSBvYmplY3QncyByZWxhdGlvbnNoaXAgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InByaW1hcnkta2V5IiBuYW1lPSJjYWNoZS11c2FnZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgc2hvdWxkIGludGVyYWN0IHdpdGggdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBsb2NrIHRoZSByZXN1bHRpbmcgcm93cyBvbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJkaXN0aW5jdC1zdGF0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgZmlsdGVyIGRpc3RpbmN0IHJlc3VsdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbi1tZW1vcnktcXVlcnlpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluIG1lbW9yeSBxdWVyeWluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBkZWZhdWx0PSJpZ25vcmUtZXhjZXB0aW9ucy1yZXR1cm4tY29uZm9ybWVkIiBuYW1lPSJwb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgaW5kaXJlY3Rpb24gb3IgdW5jb25mb3JtYWJsZSBleHByZXNzaW9ucyBzaG91bGQgYmUgdHJlYXRpbmcgd2l0aCBpbi1tZW1vcnkgcXVlcnlpbmcgYW5kIGNvbmZvcm1pbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InVzZS1kZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBkZWZhdWx0IGZldGNoIGdyb3VwIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGEgcHJlLWRlZmluZWQgbmFtZWQgZmV0Y2ggZ3JvdXAgdG8gYWxsb3cgdGhlIHF1ZXJ5IHRvIHBhcnRpYWxseSBmZXRjaCB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1leGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZXhjbHVzaXZlIGNvbm5lY3Rpb24gKFZQRCkgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImpvaW5lZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGVzIGJlaW5nIGpvaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBqb2luaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgb2JqZWN0cyByZXN1bHRpbmcgZnJvbSB0aGUgcXVlcnkgYXJlIHJlYWQtb25seSwgYW5kIHdpbGwgbm90IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHVuaXQgb2Ygd29yay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBpbmhlcml0YW5jZSBxdWVyaWVzIHNwZWNpZnkgaWYgYWxsIHN1YmNsYXNzZXMgc2hvdWxkIGJlIG91dGVyIGpvaW5lZCwgaW5zdGVhZCBvZiBhIHF1ZXJ5IHBlciBzdWJjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1hbGwtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2V0IG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJhdGNoLXJlYWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhbGwgYXR0cmlidXRlcyBmb3IgYmF0Y2ggcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBiYXRjaCByZWFkaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9yZGVyLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgdGhlIG9yZGVyIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igb3JkZXJpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzaW5nbGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIG9iamVjdHMgaW5zdGVhZCBvZiB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0dXJuLWNob2ljZSIgdHlwZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIiB0eXBlPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlcG9ydC1pdGVtcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JdGVtcyB0byBiZSBzZWxlY3RlZCwgdGhlc2UgY291bGQgYmUgYXR0cmlidXRlcyBvciBhZ2dyZWdhdGUgZnVuY3Rpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXRlbSIgdHlwZT0icmVwb3J0LWl0ZW0iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJncm91cC1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIEdST1VQIEJZIGV4cHJlc3Npb25zIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgZ3JvdXBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHVybi1jaG9pY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TaW1wbGlmaWVzIHRoZSByZXN1bHQgYnkgb25seSByZXR1cm5pbmcgdGhlIGZpcnN0IHJlc3VsdCwgZmlyc3QgdmFsdWUsIG9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1yZXN1bHQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXZhbHVlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS1hdHRyaWJ1dGUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpcnN0LXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tcHJpbWFyeS1rZXkiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVwb3J0LWl0ZW0iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkIGluIFJlcG9ydFF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk5hbWUgZ2l2ZW4gZm9yIGl0ZW0sIGNhbiBiZSB1c2VkIHRvIHJldGlldmUgdmFsdWUgZnJvbSByZXN1bHQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4cHJlc3Npb24gKHBhcnRpYWwpIHRoYXQgZGVzY3JpYmVzIHRoZSBhdHRyaWJ1dGUgd2FudGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJleHByZXNzaW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmaWx0ZXIgZXhwcmVzc2lvbiB0cmVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbiBleHByZXNzaW9uIHRoYXQgY29tcGFyZXMgdG8gZXhwcmVzc2lvbnMgdGhyb3VnaCBvcGVyYXRvcnMgc3VjaCBhcyBlcXVhbCwgbGVzc1RoYW4sIGV0Yy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naWMtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHR3byBzdWItZXhwcmVzc2lvbnMgam9pbmVkIHRocm91Z2ggYW4gb3BlcmF0b3Igc3VjaCBhcyBBTkQsIE9SLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZ1bmN0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gYSBsaXN0IG9mIHN1Yi1leHByZXNzaW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZ1bmN0aW9uIGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgZXhwcmVzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbiIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnN0YW50LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gdmFsdWUuICBJZiB0aGUgdmFsdWUgaXMgbnVsbCB0aGUgdmFsdWUgdGFnIGNhbiBpcyBhYnNlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHF1ZXJ5LWtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbnktb2YiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvdXRlci1qb2luIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBhcmFtZXRlci1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHBhcmFtZXRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNlLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gYnVpbGRlci9iYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIG9wZXJhdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBTUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBTUUwgcXVlcnkgc3RyaW5nLiAgQXJndW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdGhyb3VnaCAjYXJnLW5hbWUgdG9rZW5zIGluIHRoZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVqYnFsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVKQi1RTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWpicWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEVKQi1RTCBxdWVyeSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImN1cnNvci1vdXRwdXQtcHJvY2VkdXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIGNhbGwgdG8gdXNlIGEgY3Vyc29yIG91dHB1dCBwYXJhbWV0ZXIgdG8gZGVmaW5lIHRoZSByZXN1bHQgc2V0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuIFRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnRzIG11c3QgbWF0Y2ggdGhlIHByb2NlZHVyZSBhcmd1bWVudHMgaWYgbm90IG5hbWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBmdW5jdGlvbiBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLXJlc3VsdCIgdHlwZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBzdG9yZWQtZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHN0b3JlZCBwcm9jZWR1cmUgbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50IHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSIgdHlwZT0ieHNkOmludCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgaW50IHR5cGUgb2YgdGhlIGFyZ3VtZW50LCBhcyBkZWZpbmVkIGluIGphdmEuamRiYy5UeXBlczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgaWYgcHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUgaXMgU1RSVUNUIG9yIEFSUkFZPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWlub3V0cHV0LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBvdXRwdXQgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InByb2NlZHVyZS1hcmd1bWVudCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im91dHB1dC1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtc3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uIHdob3NlIGFyZ3VtZW50cyBjb250YWluIGF0IGxlYXN0IG9uZSBPcmFjbGUgUEwvU1FMIHR5cGUgdGhhdCBoYXMgbm8gSkRCQyByZXByZXNlbnRhdGlvbiAoZS5nLiBCT09MRUFOLCBQTFNfSU5URUdFUiwgUEwvU1FMIHJlY29yZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kZXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpkYmMtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcmVjb3JkIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmaWVsZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIEVJUyByZWNvcmQgZGF0YSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGF0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSByZWNvcmQgc3RydWN0dXJlIG5hbWUgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgTWFwcGVkUmVjb3JkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgWE1MIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZWNvcmQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSB0byB1c2UgZm9yIHRoZSBpbnB1dCByZWNvcmQsIGlmIHJlcXVpcmVkIGJ5IHRoZSBhZGFwdGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcm9vdC1lbGVtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXhlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBJbmRleGVkIHJlY29yZHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmFjdGlvbi1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gaW50ZXJhY3Rpb24gYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcm9jZWR1cmUgYXJndW1lbnQgdmFsdWUgbWF5YmUgYmUgc3BlY2lmaWVkIGlmIG5vdCB1c2luZyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGludGVyYWN0aW9uIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudHMgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBuYW1lIG9mIHRoZSBhcmd1bWVuLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LCBvciB0aGUgZGVzY3JpcHRvciBmaWVsZCBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYSBTdHJ1Y3R1cmUgdHlwZSBpbiBhbiBvYmplY3QtcmVsYXRpb25hbCBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgb2JqZWN0IHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtb3JkZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG9yZGVyZWQgbGlzdCBvZiB0aGUgZmllbGQgZGVmaW5lZCBpbiB0aGUgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmVzdGVkLXRhYmxlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tL20tbSByZWxhdGlvbnNoaXAgdGhhdCBtYWtlcyB1c2Ugb2YgdGhlIG9iamVjdC1yZWxhdGlvbmFsIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSBzb3VyY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIG5lc3RlZC10YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHByaW1pdGl2ZS9zaW1wbGUgdHlwZSB2YWx1ZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIGFycmF5IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgdHlwZSBuYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0dXJlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RydWN0dXJlIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgb2JqZWN0LXR5cGUgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHJlZmVyZW5jZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSB0eXBlIHRoYXQgc3RvcmVzIHRoZSByZWZlcmVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBPYmplY3RSZWxhdGlvbmFsRGF0YWJhc2VGaWVsZDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmVzdGVkLXR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXhtbC10eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IG1hcHBpbmcgdG8gYW4gT3JhY2xlIFhEQiBYTUwgVHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtd2hvbGUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGlyZWN0IGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHVzZXIgZGVmaW5lZCBjb252ZXJ0ZXIgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbGxlY3Rpb24tcmVmZXJlbmNlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1NIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgWE1MIGVsZW1lbnQgdG8gdGhlIHRhcmdldCBYTUwgZWxlbWVudCBiYXNlZCBvbiBhIGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVycG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlcy1zaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gb25lIG9yIG1vcmUga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZC1hc3NvY2lhdGlvbiIgdHlwZT0iZm9yZWlnbi1rZXkiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCTwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItc2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIFhNTCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQtZmllbGQiIHR5cGU9Im5vZGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIFhNTEZpZWxkIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCByb290IGVsZW1lbnQgb2YgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtcHJlc2VydmUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBub2RlcyBzaG91bGQgYmUgY2FjaGVkIHRvIHByZXNlcnZlIHVubWFwcGVkIGRhdGE8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2NoZW1hIiB0eXBlPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIG9iamVjdCB0byBhbiB4czphbnkgZGVjbGFyYXRpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgTm9kZSB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gb2YgTm9kZXMgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2Utb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLWZpZWxkIiB0eXBlPSJub2RlIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb252ZXJzaW9uLXBhaXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gWFBhdGggZXhwcmVzc2lvbiB0byBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSBpbiBhbiBYTUwgZG9jdW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3NpdGlvbiIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlIGluIHRoZSBwYXJlbnQgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZWFmLWVsZW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgdGhlIGVsZW1lbnRzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcmVpZ24ta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBmaWVsZC9jb2x1bW4gcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGluIGFub3RoZXIgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgdGFibGUgcHJpbWFyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHRhcmdldCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBzcGVjaWZpY2F0aW9uIGZvciBxdWVyeWluZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VsZWN0aW9uIGNyaXRlcmlhIG9mIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgcXVlcnkgYXJndW1lbnRzLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBwYXNzZWQgdG8gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icXVlcnktYXJndW1lbnQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBuYW1lIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhbmQgZXhlY3V0ZSB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGZpbHRlcmluZyBjbGF1c2Ugb2YgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0eXBlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IG1heSBiZSBwcm92aWRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiAgVGhlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCB3aXRoIHRoZSBzY2hlbWEsIHRhYmxlc3BhY2Ugb3IgbGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlCi0gICAgICAgIG9iamVjdCB2YWx1ZS4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgCTx4c2Q6c2VxdWVuY2U+Ci0gIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAJCTwveHNkOmVsZW1lbnQ+Ci0gIAk8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTU2OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZSBQcm9qZWN0IDo6IE1hcCBTY2hlbWEgZmlsZSBmb3IgT1JNL09YTS9FSVMgLS0+Ci08eHNkOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4yIgotICA+Ci0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiIHR5cGU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgLz4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvYmplY3QtcGVyc2lzdGVuY2UgbWFwcGluZyBtb2R1bGUsIGEgc2V0IG9mIGNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIG5hbWUgZm9yIHRoZSBtb2RlbCBiZWluZyBtYXBwZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBjbGFzcyBtYXBwaW5nIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiIHR5cGU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2dpbiIgdHlwZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkZWZhdWx0LXRlbXBvcmFsLW11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBob3cgRGF0ZSBhbmQgQ2FsZW5kYXIgdHlwZXMgYXJlIHVzZWQgd2l0aCBjaGFuZ2UgdHJhY2tpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QnkgZGVmYXVsdCB0aGV5IGFyZSBhc3N1bWVkIG5vdCB0byBiZSBjaGFuZ2VkIGRpcmVjdGx5IChvbmx5IHJlcGxhY2VkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyaWVzIHRvIGJlIHN0b3JlZCBvbiB0aGUgc2Vzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBkZWZhdWx0PSJFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIC0gMS4xIChCdWlsZCBZWU1NREQpIiBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBsYXRmb3JtIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSB1c2VyLW5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgcGFzc3dvcmQsIHRoaXMgaXMgc3RvcmVkIGluIGVuY3J5cHRlZCBmb3JtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBkYXRhc291cmNlIGRyaXZlciwgYW5kIGEgbmV3IGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmUgcGVyIGNhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIHRyYW5zYWN0aW9uIGFyZSBtYW5hZ2VkIGJ5IGEgdHJhbnNhY3Rpb24gbWFuYWdlciwgYW5kIHNob3VsZCBub3QgYmUgbWFuYWdlZCBieSBUb3BMaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCBpZiB0aGUgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNpbmcgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2VzIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ob24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZSBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBkcml2ZXIgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRyaXZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgSkRCQyBkcml2ZXIgY29ubmVjdGlvbiBVUkwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgcGFyYW1ldGVyIGJpbmRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdGF0ZW1lbnQgY2FjaGluZyBzaG91bGQgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZywgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJ5dGUgYXJyYXkgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyaW5nLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIyNTYiIG5hbWU9InN0cmluZy1iaW5kaW5nLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGhyZXNob2xkIHN0cmluZyBzaXplIGZvciB1c2FnZSBvZiBzdHJpbmcgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgbGFyZ2UgYnl0ZSBhcnJheSBhbmQgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIGJlIGJvdW5kIGFzIHN0cmVhbXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRvIGZvcmNlIGFsbCBmaWVsZCBuYW1lcyB0byB1cHBlci1jYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgZGF0YSBvcHRpbWl6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgdHJhaWxpbmcgYmxhbmtzIHNob3VsZCBiZSB0cmltbWVkLiAgVGhpcyBpcyBub3JtYWxseSByZXF1aXJlZCBmb3IgQ0hBUiBkYXRhLXR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB1c2luZyBiYXRjaCB3cml0aW5nLCBjb25maWd1cmUgaWYgdGhlIEpEQkMgZHJpdmVycyBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkNBIGRyaXZlciBhbmQgRUlTIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRvcExpbmsgcGxhdGZvcm0gc3BlY2lmaWMgY29ubmVjdGlvbiBzcGVjIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSk5ESSB1cmwgZm9yIHRoZSBtYW5hZ2VkIEpDQSBhZGFwdGVyJ3MgY29ubmVjdGlvbiBmYWN0b3J5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIAk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAJCW5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgICAgIAkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAJCW1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIAk8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIHRvIGFsbG93IGZsZXhpYmlsaXR5IGluIHRoZSB0eXBlcyBvZiBjbGFzc2VzIGFuZCBkYXRhc3RvcmVzIHBlcnNpc3RlZCwgaS5lLiBpbnRlcmZhY2VzLCBhYnN0cmFjdCBjbGFzc2VzLCBhZ2dyZWdhdGVzLCBub24tcmVsYXRpb25hbCBwZXJzaXN0ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsZW1lbnRhdGlvbi5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhbiBhbGlhcyBuYW1lIGNhbiBiZSBnaXZlbiBmb3IgdGhlIGNsYXNzLiAgVGhlIGFsaWFzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHBsYWNlIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBuYW1lLCBzdWNoIGFzIGluIHF1ZXJ5aW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxhbGlhcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5FbXBsb3llZTwvYWxpYXM+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzL2NvbHVtbnMgdGhhdCBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBvciB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nLCByZWxhdGlvbnNoaXBzLCBhbmQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IGtleSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNsYXNzIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnRzIiB0eXBlPSJldmVudC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnlpbmciIHR5cGU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG1hcHBpbmdzIHRoYXQgZGVmaW5lIGhvdyB0aGUgY2xhc3MnIGF0dHJpYnV0ZXMgYXJlIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciIHR5cGU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVzY3JpcHRvci10eXBlIiB0eXBlPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSwgc3VjaCBhcyBhZ2dyZWdhdGUgb3IgaW5kZXBlbmRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRlcmZhY2VzIiB0eXBlPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvY2tpbmciIHR5cGU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBsb2NraW5nIGJlaGF2aW9yIGZvciB0aGUgY2xhc3MuICBTdWNoIGFzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdmVyc2lvbiwgdGltZXN0YW1wIG9yIGNoYW5nZSBzZXQgb2YgY29sdW1ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciIHR5cGU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVtb3RlLWNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIG9uIHJlbW90ZSBjbGllbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybmluZy1wb2xpY3kiIHR5cGU9InJldHVybmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbWVuZG1lbnQiIHR5cGU9ImFtZW5kbWVudCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnN0YW50aWF0aW9uIiB0eXBlPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvcHlpbmciIHR5cGU9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnkta2V5cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJ5IGtleXMgb3IgYWxpYXNlcyBmb3IgZGF0YWJhc2UgaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5IiB0eXBlPSJxdWVyeS1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbXAtcG9saWN5IiB0eXBlPSJjbXAtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5QbGFjZSBob2xkZXIgb2YgQ01QIGluZm9ybWF0aW9uIHNwZWNpZmljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXBzIiB0eXBlPSJmZXRjaC1ncm91cHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMgYXQgdGhlIGRlc2NyaXB0b3IgbGV2ZWw8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hhbmdlLXBvbGljeSIgdHlwZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIENoYW5nZSBQb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIxMCIgbmFtZT0ic2NoZW1hLW1ham9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIwIiBuYW1lPSJzY2hlbWEtbWlub3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2xhc3MgZGVzY3JpcHRvciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5kZXBlbmRlbnQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUtY29sbGVjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludGVyZmFjZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW50ZXJmYWNlcyB0aGF0IGEgY2xhc3MgZGVzY3JpcHRvciBpbXBsZW1lbnRzLCBvciB0aGUgaW1wbGVtZW50aW9uIGNsYXNzIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYSBzZXQgb2YgcHVibGljIGludGVyZmFjZXMgZm9yIHRoZSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyBhbGxvd3MgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHR3byBjbGFzc2VzIGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UsIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBkZWZpbmVkIGZvciB0aGUgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlZmluZSBpbmhlcml0YW5jZSBiZXR3ZWVuIGludGVyZmFjZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgaW50ZXJmYWNlIGNsYXNzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuYXBpLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbXBsZW1lbnRvci1kZXNjcmlwdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyZmFjZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBpbnRlcmZhY2UgaGFzIG9ubHkgYSBzaW5nbGUgaW1wbGVtZW50b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbC5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DcmVhdGVzIGEgY29weWluZyB0aHJvdWdoIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHRvIGNvcHkgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xvbmUgbWV0aG9kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjbG9uZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgaS5lLiAnY2xvbmUnPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGZhY3RvcnkgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdCBpbnN0YW5jZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgZmFjdG9yeSBjbGFzcy4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFtZW5kbWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIGNsYXNzIGFuZCBzdGF0aWMgbWV0aG9kIHRvIGJlIGNhbGxlZCB0byBhbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFtZW5kbWVudCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFtZW5kbWVudCBtZXRob2Qgb24gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZShzKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YWJsZXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGhlIHRhYmxlcyB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVHlwaWNhbGx5IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGEgc2luZ2xlIHRhYmxlLCBidXQgbXVsdGlwbGUgdGFibGVzIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InRhYmxlIiB0eXBlPSJ0YWJsZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXlzLWZvci1tdWx0aXBsZS10YWJsZSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGZvcmVpZ24ga2V5IGZpZWxkIHJlZmVyZW5jZXMgdG8gYmUgZGVmaW5lIGZvciBtdWx0aXBsZSB0YWJsZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im11bHRpcGxlLXRhYmxlLWpvaW4tY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBjb21wbGV4IG11bHRpcGxlIHRhYmxlIGpvaW4gY29uZGl0aW9ucyBhbiBleHByZXNzaW9uIG1heSBiZSBwcm92aWRlZCBpbnN0ZWFkIG9mIHRoZSB0YWJsZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGEgbnVtZXJpYyB2ZXJzaW9uIGZpZWxkL2NvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbi1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ic3RvcmUtdmVyc2lvbi1pbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdmVyc2lvbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXN0YW1wLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHRpbWVzdGFtcCB2ZXJzaW9uIGNvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzZXJ2ZXItdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGltZXN0YW1wIHNob3VsZCBiZSBvYnRhaW5lZCBsb2NhbGx5IG9yIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWxsLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWxlY3RlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhIHNwZWNpZmllZCBzZXQgb2YgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlIG9uIHVwZGF0ZSBhbmQgZGVsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGRhdGFiYXNlIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IuICBUaGlzIGNvdWxkIGJlIHRoZSBuYW1lIG9mIGEgc2VxdWVuY2Ugb2JqZWN0LCBvciBhIHJvdyB2YWx1ZSBpbiBhIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBpZCBpcyBhc3NpZ25lZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhY2hpbmcgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYXJkLWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgaG93IG9iamVjdCBpZGVudGl0eSBzaG91bGQgYmUgbWFpbnRhaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIG5hbWU9ImNhY2hlLXR5cGUiIHR5cGU9ImNhY2hlLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgY2FjaGluZywgc3VjaCBhcyBMUlUsIHdlYWsgcmVmZXJlbmNlIG9yIG5vbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9ImNhY2hlLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbml0aWFsIG9yIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyByZWZyZXNoIGNhY2hlZCBvYmplY3RzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib25seS1yZWZyZXNoLWNhY2hlLWlmLW5ld2VyLXZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIHJlZnJlc2ggaWYgdGhlIGNhY2hlZCBvYmplY3QgaXMgYW4gb2xkZXIgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkaXNhYmxlLWNhY2hlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNhYmxlIG9idGFpbmluZyBjYWNoZSBoaXRzIG9uIHByaW1hcnkga2V5IHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLWNvbmZvcm0iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBjb25mb3JtIHF1ZXJpZXMgd2l0aGluIGEgdHJhbnNhY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaXNvbGF0ZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tIHRoZSBzaGFyZWQgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCIgdHlwZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGFuZ2Utc2V0IiBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiIHR5cGU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGRlc2NyaXBvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUtcmVhZC10aW1lLW9uLXVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWV4cGlyeS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGluIHRoZSBjYWNoZSBkbyBub3QgZXhwaXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtdG8tbGl2ZS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGxpdmUgYSBzcGVjaWZpYyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZXkgYXJlIHJlYWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWUtdG8tbGl2ZSIgdHlwZT0ieHNkOmxvbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYWlseS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIFBvbGljeSB3aGVyZSBvYmplY3RzIGV4cGlyZSBhdCBhIHNwZWNpZmljIHRpbWUgZXZlcnkgZGF5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaGFuZGxlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWRhdGFiYXNlLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS10YWJsZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG5hbWVzIG9mIHRoZSBtaXJyb3JpbmcgaGlzdG9yaWNhbCB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJoaXN0b3J5LXRhYmxlIiB0eXBlPSJoaXN0b3J5LXRhYmxlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdGFydC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHN0YXJ0IGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic3RhcnQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJlbmQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBlbmQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJlbmQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FYWNoIGVudHJ5IGlzIGEgc291cmNlIChkZXNjcmlwdG9yKSB0byBoaXN0b3J5IHRhYmxlIG5hbWUgYXNzb2NpYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9InNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9Imhpc3RvcnkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm9zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyB0aGUgZmllbGRzIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgdHlwZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWVsZCB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHR5cGUgYW5kIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9ucy4gQXQgbGVhc3Qgb25lIG9mIGluc2VydCwgdXBkYXRlIHNob3VsZCBiZSB0cnVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRvIGJlIHJldHVybmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0LW1vZGUtcmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBpbnNlcnQ9PXRydWUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIGluc2VydGVkICh0cnVlKS4gSWYgaW5zZXJ0PT1mYWxzZSAtIGlnbm9yZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmVudC9zdXBlcmNsYXNzIG9mIHRoZSBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkICAgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InJlYWQtc3ViY2xhc3Nlcy1vbi1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGlmIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZCBvbiBxdWVyaWVzLCBvciBvbmx5IHRoZSBleGFjdCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLXZpZXciIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZpZXcgdGhhdCBqb2lucyBhbGwgb2YgdGhlIHN1YmNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWNsYXNzLW5hbWUtYXMtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3MgdHlwZSBpbmRpY2F0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0aW9uLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIGNsYXNzIHRoYXQgdGFrZXMgdGhlIGNsYXNzJyByb3cgYXMgYXJndW1lbnQgYSBjb21wdXRlZCB0aGF0IGNsYXNzIHR5cGUgdG8gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBmcm9tIHRoZSByb3cuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgY2xhc3MgdHlwZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNsYXNzIGV4dHJhY3RvciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvbmx5LWluc3RhbmNlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IGFsbCBzaWJsaW5nIGFuZCBzdWJjbGFzcyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgc2libGluZyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lLWluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4dGVuZHMgaW5oZXJpdGFuY2UgcG9saWN5LiBBbGxvd3MgZm9yIHByZWZpeGVkIG5hbWVzIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWUgdG8gZmluZCB0aGUgYXBwcm9yaWF0ZSBjbGFzczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmhlcml0YW5jZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmciPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIHR5cGUgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1pbmRpY2F0b3IiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdmFsdWUgdXNlZCB0byBkZWZpbmUgdGhlIGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnQtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudC1saXN0ZW5lcnMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXZlbnQtbGlzdGVuZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBldmVudCBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWJ1aWxkLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGJ1aWxkaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3Qtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8tdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1jbG9uZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBjbG9uaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LW1lcmdlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIG1lcmdpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtcmVmcmVzaC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciByZWZyZXNoaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBhbmQgcXVlcnkgcHJvcGVydGllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0icXVlcnkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzJyBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGFwcGx5IHRvIGFsbCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hlY2stY2FjaGUiIG5hbWU9ImV4aXN0ZW5jZSIgdHlwZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGJlaGF2b2lyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGluc2VydCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBpbnNlcnQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXBkYXRlLXF1ZXJ5IiB0eXBlPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gdXBkYXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHVwZGF0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkZWxldGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiIHR5cGU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkb2VzIGV4aXN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIG9iamVjdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtYWxsLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgYWxsIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYWxsIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBwb2xpY2llcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5LWtleSBhbGlhcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gdXNlIHdpdGggYSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZGF0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tY2hhbmdlcyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQtd2l0aC1uZXctb2JqZWN0cyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgaXNvbGF0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzZS1zZXNzaW9uLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFsd2F5cyIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGJlaW5nIGFsaWFzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGpvaW4gY29uZGl0aW9uIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgam9pbiBjcml0ZXJpYSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLTEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLW0gam9pbiBmcm9tIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHZhbHVlIHRoYXQgbnVsbCBkYXRhIHZhbHVlcyBzaG91bGQgYmUgY29udmVydGVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHNpbXBsZSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZmllbGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWVyLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nIHRoYXQgdXNlcyBKYXZhIGNvZGUgdG8gdHJhbnNmb3JtIGJldHdlZW4gdGhlIGRhdGEgYW5kIG9iamVjdCB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1hdGlvbiBkZWZpbmVkIGluIHRoZSBkb21haW4gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtdHJhbnNmb3JtZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1lci4gVXNlZCBpbiBwbGFjZSBvZiBhdHRyaWJ1dGUtdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdHJhbnNmb3JtYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIHR5cGU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIHRhcmdldCBvYmplY3QgaXMgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0IGFuZCBzdG9yZXMgd2l0aGluIHRoZSBzb3VyY2Ugb2JqZWN0cyByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImFsbG93LW51bGwiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgYSByb3cgb2YgYWxsIG51bGxzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBudWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgbWFwcGluZyB0byB1c2UgZGlmZmVyZW50IGZpZWxkIG5hbWVzIHRoYW4gdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIGRlc2NyaXB0b3IncyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgYWdncmVnYXRlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzZXMgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRhcmdldCBvYmplY3RzIGFyZSBwcml2YXRlbHkgb3duZWQgZGVwZW5kZW50IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvbmUtdG8tb25lLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWdyb3VwaW5nLWVsZW1lbnQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSB0eXBlcyByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UgcHJpbWFyeSBrZXkgYW5kIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3QtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgc2Vzc2lvbiB0aGF0IGRlZmluZXMgdGhlIHJlZmVyZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Yga2V5IHZhbHVlcyBwYWlycyBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3Qta2V5LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzb3JlcyB0aGUgbWFwIGtleSBkYXRhIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGtleSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcyB3aGVyZSB0aGUgdGFyZ2V0IGluc3RhbmNlcyBhcmUgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbi10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZS90YXJnZXQgcHJpbWFyeSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UgdGhhdCBtYXkgYmUgb2Ygc2V2ZXJhbCB0eXBlcyByZWxhdGVkIHRocm91Z2ggYW4gaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgY29sdW1uIHRvIHN0b3JlIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSByZWxhdGVkIG9iamVjdCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleS10by1xdWVyeS1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBjb2x1bW4vcXVlcnkga2V5IHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHF1ZXJ5IGtleXMgZGVmaW5pbmcgYSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgdmFsdWUgaW4gdGhlIG90aGVyIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcXVlcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcXVlcnkta2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBrZXkgbmFtZSBvZiB0aGUgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29udGFpbmVyL2NvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic29ydGVkLWNvbGxlY3Rpb24tY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzb3J0ZWQgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXJhdG9yLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbXBhcml0b3IsIHVzZWQgdG8gY29tcGFyZSBvYmplY3RzIGluIHNvcnRpbmcgdGhlIGNvbGxlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3QtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBsaXN0IGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjcm9sbGFibGUtY3Vyc29yLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzY3JvbGxhYmxlIGN1cnNvciBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3Vyc29yZWQtc3RyZWFtLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjdXJzb3JlZCBzdHJlYW0gY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGlyZWN0aW9uLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGVmZXJyZWQgcmVhZCBpbmRpcmVjdGlvbiBtZWNoYW5pc20uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1ob2xkZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB2YWx1ZSBob2xkZXJzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm94eS1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHByb3hpZXMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcGFyZW50LWNvbGxlY3Rpb24taW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB0cmFuc3BhcmVudCBjb2xsZWN0aW9ucyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHRvIHVzZSwgaS5lLiBMaXN0LCBTZXQsIE1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBhIHVzZXIgZGVmaW5lZCBjb250YWluZXIgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb250YWluZXIgaW1wbGVtZW50ZXIgdG8gdXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbGlzdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0IGNvbnZlcnRlcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGxpc3QncyBlbGVtZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+IAotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlc2FmZS1lbnVtZXJhdGlvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UeXBlc2FmZSBFbnVtZXJhdGlvbiBjb252ZXJzaW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJzaW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIGFuZCBhbiBvYmplY3QgdHlwZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQgYmV0d2Vlbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcmlhbGl6ZWQtb2JqZWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgb2JqZWN0IHNlcmlhbGl6YXRpb24gdG8gY29udmVydCBiZXR3ZWVuIHRoZSBvYmplY3QgYW5kIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiB2YWx1ZXMgZnJvbSBkYXRhYmFzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgZmllbGQgYW5kIG9iamVjdCB2YWx1ZXMgdXNlZCBpbiB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgdmFsdWUgaXMgdXNlZCBpZiBhIGRhdGFiYXNlIHR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSB0eXBlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1hcHBpbmcgb2YgdmFsdWVzLiAgQm90aCB0aGUgb2JqZWN0IGFuZCBkYXRhYmFzZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1vbmx5LXR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiBhZGRpdGlvbmFsIHZhbHVlcyB0aGF0IG1hcCBub24tdW5pcXVlIGRhdGEgdmFsdWVzIHRvIGEgdW5pcXVlIGF0dHJpYnV0ZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgYW4gb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIG9iamVjdCdzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIGRhdGFiYXNlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkvaW50ZXJhY3Rpb24gYWdhaW5zdCBhIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibWFpbnRhaW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJ5cGFzcyB0aGUgY2FjaGUgY29tcGxldGVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHVzZSBwYXJhbWF0ZXIgYmluZGluZyBmb3IgYXJndW1lbnRzLCBvciBwcmludCB0aGUgYXJndW1lbnRzIGluLWxpbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1zdGF0ZW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIGNhY2hlZCwgdGhpcyBtdXN0IGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gY2FuY2VsIHRoZSBxdWVyeSBpbiBpZiB0aGUgcmVxdWVzdCB0YWtlcyB0b28gbG9uZyB0byBjb21wbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InByZXBhcmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHByZXBhcmUgYW5kIGNhY2hlIGl0cyBnZW5lcmF0ZWQgU1FMLCBvciByZWdlbmVyYXRlIHRoZSBTUUwgb24gZWFjaCBleGVjdXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxsIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3Igc3RhdGljIGNhbGxzIHRoZSBTUUwgb3IgU3RvcmVkIFByb2NlZHVyZSBjYWxsIGRlZmluaXRpb24gY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgam9pbiBmZXRjaCBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyLWpvaW4iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvdXRlci1qb2luIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FzY2FkZSBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcml2YXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBzaW5nbGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyByYXcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLXF1ZXJ5LXJlc3VsdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGNhY2hlIHRoZSBxdWVyeSByZXN1bHRzIHRvIGF2b2lkIGZ1dHVyZSBleGVjdXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWF4LXJvd3MiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCwgcmVzdWx0cyB3aWxsIGJlIHRydW5jdGF0ZSBvbiB0aGUgZGF0YWJhc2UgdG8gdGhpcyBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlyc3QtcmVzdWx0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIGN1cnNvciBpbiBhIHJlc3VsdCBzZXQgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFJlc3VsdHMgcHJpb3IgdG8gdGhpcyBudW1iZXIgd2lsbCBub3QgYmUgYnVpbHQgaW50byBvYmplY3RzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXNzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSBvbiBlYWNoIHJlc3VsdCBzZXQgbmV4dCBvcGVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5IiB0eXBlPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHF1ZXJ5J3MgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0ibWF4aW11bS1jYWNoZWQtcmVzdWx0cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHF1ZXJ5IHJlc3VsdCBzZXRzIHRoYXQgd2lsbCBiZSBjYWNoZWQuIFRoZSBMUlUgcXVlcnkgcmVzdWx0cyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbW9kaWZ5aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHVwZGF0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgaW5zZXJ0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgZXhpc3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIiB0eXBlPSJleGlzdGVuY2UtY2hlY2siPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGV4aXN0ZW5jZSBjaGVjayBvcHRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBjaGVjayBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhIGNyaXRlcmlhIG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG9iamVjdHMgKGFzIGFwcG9zZWQgdG8gZGF0YSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2Ygb2JqZWN0cyBiZWluZyBxdWVyaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZW1vdGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IHJlbW90ZWx5IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImNhc2NhZGUtcG9saWN5IiB0eXBlPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc2V0dGluZ3MgKHN1Y2ggYXMgcmVmcmVzaCwgbWFpbnRhaW4tY2FjaGUpIHNob3VsZCBhcHBseSB0byB0aGUgb2JqZWN0J3MgcmVsYXRpb25zaGlwIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJwcmltYXJ5LWtleSIgbmFtZT0iY2FjaGUtdXNhZ2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHNob3VsZCBpbnRlcmFjdCB3aXRoIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgbG9jayB0aGUgcmVzdWx0aW5nIHJvd3Mgb24gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iZGlzdGluY3Qtc3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGZpbHRlciBkaXN0aW5jdCByZXN1bHRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW4tbWVtb3J5LXF1ZXJ5aW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbiBtZW1vcnkgcXVlcnlpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgZGVmYXVsdD0iaWdub3JlLWV4Y2VwdGlvbnMtcmV0dXJuLWNvbmZvcm1lZCIgbmFtZT0icG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IGluZGlyZWN0aW9uIG9yIHVuY29uZm9ybWFibGUgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHRyZWF0aW5nIHdpdGggaW4tbWVtb3J5IHF1ZXJ5aW5nIGFuZCBjb25mb3JtaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ1c2UtZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBhIHByZS1kZWZpbmVkIG5hbWVkIGZldGNoIGdyb3VwIHRvIGFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIChWUEQpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2luZWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyBiZWluZyBqb2luZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igam9pbmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGFyZSByZWFkLW9ubHksIGFuZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSB1bml0IG9mIHdvcmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNldCBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXRjaC1yZWFkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYWxsIGF0dHJpYnV0ZXMgZm9yIGJhdGNoIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgYmF0Y2ggcmVhZGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvcmRlci1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIHRoZSBvcmRlciBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIG9yZGVyaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2luZ2xlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNldCBvZiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybi1jaG9pY2UiIHR5cGU9InJldHVybi1jaG9pY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyIgdHlwZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXBvcnQtaXRlbXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SXRlbXMgdG8gYmUgc2VsZWN0ZWQsIHRoZXNlIGNvdWxkIGJlIGF0dHJpYnV0ZXMgb3IgYWdncmVnYXRlIGZ1bmN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Iml0ZW0iIHR5cGU9InJlcG9ydC1pdGVtIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ3JvdXAtYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyBHUk9VUCBCWSBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGdyb3VwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXR1cm4tY2hvaWNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtcmVzdWx0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS12YWx1ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtYXR0cmlidXRlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaXJzdC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXByaW1hcnkta2V5IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1pdGVtIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZCBpbiBSZXBvcnRRdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5OYW1lIGdpdmVuIGZvciBpdGVtLCBjYW4gYmUgdXNlZCB0byByZXRpZXZlIHZhbHVlIGZyb20gcmVzdWx0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHByZXNzaW9uIChwYXJ0aWFsKSB0aGF0IGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlIHdhbnRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZmlsdGVyIGV4cHJlc3Npb24gdHJlZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb24gZXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHRvIGV4cHJlc3Npb25zIHRocm91Z2ggb3BlcmF0b3JzIHN1Y2ggYXMgZXF1YWwsIGxlc3NUaGFuLCBldGMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2ljLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0d28gc3ViLWV4cHJlc3Npb25zIGpvaW5lZCB0aHJvdWdoIGFuIG9wZXJhdG9yIHN1Y2ggYXMgQU5ELCBPUi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGEgbGlzdCBvZiBzdWItZXhwcmVzc2lvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb24iIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25zdGFudC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlIHZhbHVlIHRhZyBjYW4gaXMgYWJzZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXktZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBxdWVyeS1rZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYW55LW9mIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0ZXItam9pbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXItZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBwYXJhbWV0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzZS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGJ1aWxkZXIvYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcGVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBvcGVyYXRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gU1FMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgU1FMIHF1ZXJ5IHN0cmluZy4gIEFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggI2FyZy1uYW1lIHRva2VucyBpbiB0aGUgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamJxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSkItUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYnFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBFSkItUUwgcXVlcnkgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjdXJzb3Itb3V0cHV0LXByb2NlZHVyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBjYWxsIHRvIHVzZSBhIGN1cnNvciBvdXRwdXQgcGFyYW1ldGVyIHRvIGRlZmluZSB0aGUgcmVzdWx0IHNldC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBwcm9jZWR1cmUgYXJndW1lbnRzIGlmIG5vdCBuYW1lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgZnVuY3Rpb24gaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1yZXN1bHQiIHR5cGU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkLWZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdG9yZWQgcHJvY2VkdXJlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudCB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcmd1bWVudCBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUiIHR5cGU9InhzZDppbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGludCB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiBqYXZhLmpkYmMuVHlwZXM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGlmIHByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIGlzIFNUUlVDVCBvciBBUlJBWTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1pbm91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRwdXQtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbiB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBhdCBsZWFzdCBvbmUgT3JhY2xlIFBML1NRTCB0eXBlIHRoYXQgaGFzIG5vIEpEQkMgcmVwcmVzZW50YXRpb24gKGUuZy4gQk9PTEVBTiwgUExTX0lOVEVHRVIsIFBML1NRTCByZWNvcmQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGV4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXJlY29yZCI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBFSVMgcmVjb3JkIGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHN0cnVjdHVyZSBuYW1lIHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIE1hcHBlZFJlY29yZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIFhNTCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVjb3JkLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgaW5wdXQgcmVjb3JkLCBpZiByZXF1aXJlZCBieSB0aGUgYWRhcHRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJvb3QtZWxlbWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGV4ZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgSW5kZXhlZCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGludGVyYWN0aW9uIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbnRlcmFjdGlvbiBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnRzIHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbi4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeSwgb3IgdGhlIGRlc2NyaXB0b3IgZmllbGQgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgU3RydWN0dXJlIHR5cGUgaW4gYW4gb2JqZWN0LXJlbGF0aW9uYWwgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLW9yZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBvcmRlcmVkIGxpc3Qgb2YgdGhlIGZpZWxkIGRlZmluZWQgaW4gdGhlIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5lc3RlZC10YWJsZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbS9tLW0gcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBvYmplY3QtcmVsYXRpb25hbCBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBuZXN0ZWQtdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUvc2ltcGxlIHR5cGUgdmFsdWVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1hcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdHVyZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0cnVjdHVyZSBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC10eXBlIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCByZWZlcmVuY2UgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgdHlwZSB0aGF0IHN0b3JlcyB0aGUgcmVmZXJlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1maWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gT2JqZWN0UmVsYXRpb25hbERhdGFiYXNlRmllbGQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC14bWwtdHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXBwaW5nIHRvIGFuIE9yYWNsZSBYREIgWE1MIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLXdob2xlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB1c2VyIGRlZmluZWQgY29udmVydGVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb2xsZWN0aW9uLXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtTSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gYSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lcnBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXMtc2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gb25lIG9yIG1vcmUga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZC1hc3NvY2lhdGlvbiIgdHlwZT0iZm9yZWlnbi1rZXkiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIFhNTCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQtZmllbGQiIHR5cGU9Im5vZGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIFhNTEZpZWxkIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCByb290IGVsZW1lbnQgb2YgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtcHJlc2VydmUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBub2RlcyBzaG91bGQgYmUgY2FjaGVkIHRvIHByZXNlcnZlIHVubWFwcGVkIGRhdGE8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2NoZW1hIiB0eXBlPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZXN1bHQtYWx3YXlzLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluY2x1ZGUtbmFtZXNwYWNlLWRlY2xhcmF0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLXNjaGVtYS1pbnN0YW5jZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBvYmplY3QgdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgTm9kZSB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIE5vZGVzIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1maWVsZCIgdHlwZT0ibm9kZSIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29udmVyc2lvbi1wYWlyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFhQYXRoIGV4cHJlc3Npb24gdG8gYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gYW4gWE1MIGRvY3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zaXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiB0aGUgcGFyZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVhZi1lbGVtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZXF1aXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pb24tbm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZSB0byByZXByZXNlbnQgbm9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byB1bmlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ibmFtZXNwYWNlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Im5hbWVzcGFjZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0LW5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYS1jb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWNsYXNzLXBhdGgtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtZmlsZS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS11cmwtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtY2hhcmFjdGVyIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXRpbWVzdGFtcCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXV0aWwtZGF0ZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciIHR5cGU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNtcCBiZWFuLWxldmVsIHBlc3NpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0IiB0eXBlPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgbW9kaWZpY2F0aW9uIGRlZmVycmFsIGxldmVsIGZvciBub24tZGVmZXJyZWQgd3JpdGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIiB0eXBlPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcG9pbnQgYXQgd2hpY2ggaW5zZXJ0IHdpbGwgYmUgaXNzdWVkIHRvIERhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0id2FpdCIgbmFtZT0ibG9ja2luZy1tb2RlIiB0eXBlPSJsb2NraW5nLW1vZGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJwb3N0Y3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW5kZWZpbmVkIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9ja2luZy1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SG9sZHMgdGhlIHBlc3NpbWlzdGljIGxvY2tpbmcgbW9kZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndhaXQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby13YWl0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iNTAiIG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBmZXRjaCBncm91cCBhdHRyaWJ1dGVzIGluZm8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhIGZldGNoIGdyb3VwJ3MgYXR0cmlidXRlIGxpc3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmVycmVkLWRldGVjdGlvbi1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBiYWNrdXAgY2xvbmUgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyAibWFyayBkaXJ0eSIgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBhIENoYW5nZVRyYWNrZXIgZmlyaW5nIFByb3BlcnR5Q2hhbmdlRXZlbnQncyB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBOdWxsIFBvbGljeSBpbiB1c2UgZm9yIHRoaXMgcmVsYXRpb25zaGlwIGN1cnJlbnRseSBhIGNob2ljZSBvZiBbTnVsbFBvbGljeSBhbmQgSXNTZXROdWxsUG9saWN5XS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaXMtc2V0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPldyaXRlIG51bGwsIG5vIHRhZyhkZWZhdWx0KSBvciBhbiBlbXB0eSB0YWcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdlbmVyaWMgZmllbGQgY29uY2VwdCwgc3VjaCBhcyBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sdW1uIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4ncyB0YWJsZS4gVGhpcyB0YWJsZSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgY2xhc3MnIHRhYmxlcy4gSWYgbm90IHNwZWNpZmllZCB0aGUgZmlyc3QgdGFibGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3FsLXR5cGVjb2RlIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPihvcHRpb25hbCBmaWVsZCkgVGhlIEpEQkMgdHlwZWNvZGUgb2YgdGhpcyBjb2x1bW48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIE5hbWUgb2YgdGhlIEpEQkMgdHlwZWNvZGUgZm9yIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcmVpZ24ta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBmaWVsZC9jb2x1bW4gcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGluIGFub3RoZXIgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgdGFibGUgcHJpbWFyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHRhcmdldCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBzcGVjaWZpY2F0aW9uIGZvciBxdWVyeWluZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VsZWN0aW9uIGNyaXRlcmlhIG9mIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgcXVlcnkgYXJndW1lbnRzLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBwYXNzZWQgdG8gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icXVlcnktYXJndW1lbnQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBuYW1lIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhbmQgZXhlY3V0ZSB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGZpbHRlcmluZyBjbGF1c2Ugb2YgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0eXBlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IG1heSBiZSBwcm92aWRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiAgVGhlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCB3aXRoIHRoZSBzY2hlbWEsIHRhYmxlc3BhY2Ugb3IgbGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlCi0gICAgICAgIG9iamVjdCB2YWx1ZS4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgCTx4c2Q6c2VxdWVuY2U+Ci0gIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAJCTwveHNkOmVsZW1lbnQ+Ci0gIAk8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzIuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5M2I5ZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzIuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZSBQcm9qZWN0IDo6IE1hcCBTY2hlbWEgZmlsZSBmb3IgT1JNL09YTS9FSVMgLS0+Ci08eHNkOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMi4wIgotICA+Ci0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiIHR5cGU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgLz4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvYmplY3QtcGVyc2lzdGVuY2UgbWFwcGluZyBtb2R1bGUsIGEgc2V0IG9mIGNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIG5hbWUgZm9yIHRoZSBtb2RlbCBiZWluZyBtYXBwZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBjbGFzcyBtYXBwaW5nIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiIHR5cGU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2dpbiIgdHlwZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkZWZhdWx0LXRlbXBvcmFsLW11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBob3cgRGF0ZSBhbmQgQ2FsZW5kYXIgdHlwZXMgYXJlIHVzZWQgd2l0aCBjaGFuZ2UgdHJhY2tpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QnkgZGVmYXVsdCB0aGV5IGFyZSBhc3N1bWVkIG5vdCB0byBiZSBjaGFuZ2VkIGRpcmVjdGx5IChvbmx5IHJlcGxhY2VkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyaWVzIHRvIGJlIHN0b3JlZCBvbiB0aGUgc2Vzc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9ImRhdGFiYXNlLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBkZWZhdWx0PSJFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIC0gMi4wIChCdWlsZCBZWU1NREQpIiBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBsYXRmb3JtIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSB1c2VyLW5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgcGFzc3dvcmQsIHRoaXMgaXMgc3RvcmVkIGluIGVuY3J5cHRlZCBmb3JtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBkYXRhc291cmNlIGRyaXZlciwgYW5kIGEgbmV3IGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmUgcGVyIGNhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIHRyYW5zYWN0aW9uIGFyZSBtYW5hZ2VkIGJ5IGEgdHJhbnNhY3Rpb24gbWFuYWdlciwgYW5kIHNob3VsZCBub3QgYmUgbWFuYWdlZCBieSBUb3BMaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCBpZiB0aGUgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNpbmcgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2VzIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ob24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZSBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBkcml2ZXIgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRyaXZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgSkRCQyBkcml2ZXIgY29ubmVjdGlvbiBVUkwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgcGFyYW1ldGVyIGJpbmRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdGF0ZW1lbnQgY2FjaGluZyBzaG91bGQgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZywgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJ5dGUgYXJyYXkgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyaW5nLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIyNTYiIG5hbWU9InN0cmluZy1iaW5kaW5nLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGhyZXNob2xkIHN0cmluZyBzaXplIGZvciB1c2FnZSBvZiBzdHJpbmcgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgbGFyZ2UgYnl0ZSBhcnJheSBhbmQgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIGJlIGJvdW5kIGFzIHN0cmVhbXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRvIGZvcmNlIGFsbCBmaWVsZCBuYW1lcyB0byB1cHBlci1jYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgZGF0YSBvcHRpbWl6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgdHJhaWxpbmcgYmxhbmtzIHNob3VsZCBiZSB0cmltbWVkLiAgVGhpcyBpcyBub3JtYWxseSByZXF1aXJlZCBmb3IgQ0hBUiBkYXRhLXR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB1c2luZyBiYXRjaCB3cml0aW5nLCBjb25maWd1cmUgaWYgdGhlIEpEQkMgZHJpdmVycyBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkNBIGRyaXZlciBhbmQgRUlTIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRvcExpbmsgcGxhdGZvcm0gc3BlY2lmaWMgY29ubmVjdGlvbiBzcGVjIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSk5ESSB1cmwgZm9yIHRoZSBtYW5hZ2VkIEpDQSBhZGFwdGVyJ3MgY29ubmVjdGlvbiBmYWN0b3J5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIHRvIGFsbG93IGZsZXhpYmlsaXR5IGluIHRoZSB0eXBlcyBvZiBjbGFzc2VzIGFuZCBkYXRhc3RvcmVzIHBlcnNpc3RlZCwgaS5lLiBpbnRlcmZhY2VzLCBhYnN0cmFjdCBjbGFzc2VzLCBhZ2dyZWdhdGVzLCBub24tcmVsYXRpb25hbCBwZXJzaXN0ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsZW1lbnRhdGlvbi5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhbiBhbGlhcyBuYW1lIGNhbiBiZSBnaXZlbiBmb3IgdGhlIGNsYXNzLiAgVGhlIGFsaWFzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHBsYWNlIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBuYW1lLCBzdWNoIGFzIGluIHF1ZXJ5aW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxhbGlhcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5FbXBsb3llZTwvYWxpYXM+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzL2NvbHVtbnMgdGhhdCBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBvciB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nLCByZWxhdGlvbnNoaXBzLCBhbmQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IGtleSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNsYXNzIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnRzIiB0eXBlPSJldmVudC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnlpbmciIHR5cGU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG1hcHBpbmdzIHRoYXQgZGVmaW5lIGhvdyB0aGUgY2xhc3MnIGF0dHJpYnV0ZXMgYXJlIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciIHR5cGU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVzY3JpcHRvci10eXBlIiB0eXBlPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSwgc3VjaCBhcyBhZ2dyZWdhdGUgb3IgaW5kZXBlbmRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRlcmZhY2VzIiB0eXBlPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvY2tpbmciIHR5cGU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBsb2NraW5nIGJlaGF2aW9yIGZvciB0aGUgY2xhc3MuICBTdWNoIGFzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdmVyc2lvbiwgdGltZXN0YW1wIG9yIGNoYW5nZSBzZXQgb2YgY29sdW1ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciIHR5cGU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVtb3RlLWNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIG9uIHJlbW90ZSBjbGllbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybmluZy1wb2xpY3kiIHR5cGU9InJldHVybmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbWVuZG1lbnQiIHR5cGU9ImFtZW5kbWVudCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnN0YW50aWF0aW9uIiB0eXBlPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvcHlpbmciIHR5cGU9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnkta2V5cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJ5IGtleXMgb3IgYWxpYXNlcyBmb3IgZGF0YWJhc2UgaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5IiB0eXBlPSJxdWVyeS1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbXAtcG9saWN5IiB0eXBlPSJjbXAtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5QbGFjZSBob2xkZXIgb2YgQ01QIGluZm9ybWF0aW9uIHNwZWNpZmljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXBzIiB0eXBlPSJmZXRjaC1ncm91cHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMgYXQgdGhlIGRlc2NyaXB0b3IgbGV2ZWw8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hhbmdlLXBvbGljeSIgdHlwZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIENoYW5nZSBQb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIxMCIgbmFtZT0ic2NoZW1hLW1ham9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIwIiBuYW1lPSJzY2hlbWEtbWlub3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2xhc3MgZGVzY3JpcHRvciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5kZXBlbmRlbnQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUtY29sbGVjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludGVyZmFjZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW50ZXJmYWNlcyB0aGF0IGEgY2xhc3MgZGVzY3JpcHRvciBpbXBsZW1lbnRzLCBvciB0aGUgaW1wbGVtZW50aW9uIGNsYXNzIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYSBzZXQgb2YgcHVibGljIGludGVyZmFjZXMgZm9yIHRoZSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyBhbGxvd3MgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHR3byBjbGFzc2VzIGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UsIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBkZWZpbmVkIGZvciB0aGUgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlZmluZSBpbmhlcml0YW5jZSBiZXR3ZWVuIGludGVyZmFjZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgaW50ZXJmYWNlIGNsYXNzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuYXBpLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbXBsZW1lbnRvci1kZXNjcmlwdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyZmFjZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBpbnRlcmZhY2UgaGFzIG9ubHkgYSBzaW5nbGUgaW1wbGVtZW50b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbC5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DcmVhdGVzIGEgY29weWluZyB0aHJvdWdoIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHRvIGNvcHkgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xvbmUgbWV0aG9kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjbG9uZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgaS5lLiAnY2xvbmUnPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGZhY3RvcnkgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdCBpbnN0YW5jZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgZmFjdG9yeSBjbGFzcy4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFtZW5kbWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIGNsYXNzIGFuZCBzdGF0aWMgbWV0aG9kIHRvIGJlIGNhbGxlZCB0byBhbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFtZW5kbWVudCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFtZW5kbWVudCBtZXRob2Qgb24gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZShzKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YWJsZXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGhlIHRhYmxlcyB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVHlwaWNhbGx5IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGEgc2luZ2xlIHRhYmxlLCBidXQgbXVsdGlwbGUgdGFibGVzIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InRhYmxlIiB0eXBlPSJ0YWJsZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXlzLWZvci1tdWx0aXBsZS10YWJsZSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGZvcmVpZ24ga2V5IGZpZWxkIHJlZmVyZW5jZXMgdG8gYmUgZGVmaW5lIGZvciBtdWx0aXBsZSB0YWJsZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im11bHRpcGxlLXRhYmxlLWpvaW4tY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBjb21wbGV4IG11bHRpcGxlIHRhYmxlIGpvaW4gY29uZGl0aW9ucyBhbiBleHByZXNzaW9uIG1heSBiZSBwcm92aWRlZCBpbnN0ZWFkIG9mIHRoZSB0YWJsZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGEgbnVtZXJpYyB2ZXJzaW9uIGZpZWxkL2NvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbi1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ic3RvcmUtdmVyc2lvbi1pbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdmVyc2lvbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXN0YW1wLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHRpbWVzdGFtcCB2ZXJzaW9uIGNvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzZXJ2ZXItdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGltZXN0YW1wIHNob3VsZCBiZSBvYnRhaW5lZCBsb2NhbGx5IG9yIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWxsLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWxlY3RlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhIHNwZWNpZmllZCBzZXQgb2YgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlIG9uIHVwZGF0ZSBhbmQgZGVsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGRhdGFiYXNlIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IuICBUaGlzIGNvdWxkIGJlIHRoZSBuYW1lIG9mIGEgc2VxdWVuY2Ugb2JqZWN0LCBvciBhIHJvdyB2YWx1ZSBpbiBhIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBpZCBpcyBhc3NpZ25lZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhY2hpbmcgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYXJkLWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgaG93IG9iamVjdCBpZGVudGl0eSBzaG91bGQgYmUgbWFpbnRhaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIG5hbWU9ImNhY2hlLXR5cGUiIHR5cGU9ImNhY2hlLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgY2FjaGluZywgc3VjaCBhcyBMUlUsIHdlYWsgcmVmZXJlbmNlIG9yIG5vbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9ImNhY2hlLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbml0aWFsIG9yIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyByZWZyZXNoIGNhY2hlZCBvYmplY3RzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib25seS1yZWZyZXNoLWNhY2hlLWlmLW5ld2VyLXZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIHJlZnJlc2ggaWYgdGhlIGNhY2hlZCBvYmplY3QgaXMgYW4gb2xkZXIgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkaXNhYmxlLWNhY2hlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNhYmxlIG9idGFpbmluZyBjYWNoZSBoaXRzIG9uIHByaW1hcnkga2V5IHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLWNvbmZvcm0iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBjb25mb3JtIHF1ZXJpZXMgd2l0aGluIGEgdHJhbnNhY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaXNvbGF0ZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tIHRoZSBzaGFyZWQgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCIgdHlwZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGFuZ2Utc2V0IiBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiIHR5cGU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGRlc2NyaXBvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUtcmVhZC10aW1lLW9uLXVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWV4cGlyeS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGluIHRoZSBjYWNoZSBkbyBub3QgZXhwaXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtdG8tbGl2ZS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGxpdmUgYSBzcGVjaWZpYyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZXkgYXJlIHJlYWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWUtdG8tbGl2ZSIgdHlwZT0ieHNkOmxvbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYWlseS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIFBvbGljeSB3aGVyZSBvYmplY3RzIGV4cGlyZSBhdCBhIHNwZWNpZmljIHRpbWUgZXZlcnkgZGF5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaGFuZGxlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWRhdGFiYXNlLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS10YWJsZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG5hbWVzIG9mIHRoZSBtaXJyb3JpbmcgaGlzdG9yaWNhbCB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJoaXN0b3J5LXRhYmxlIiB0eXBlPSJoaXN0b3J5LXRhYmxlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdGFydC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHN0YXJ0IGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic3RhcnQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJlbmQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBlbmQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJlbmQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FYWNoIGVudHJ5IGlzIGEgc291cmNlIChkZXNjcmlwdG9yKSB0byBoaXN0b3J5IHRhYmxlIG5hbWUgYXNzb2NpYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9InNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9Imhpc3RvcnkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm9zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyB0aGUgZmllbGRzIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgdHlwZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWVsZCB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHR5cGUgYW5kIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9ucy4gQXQgbGVhc3Qgb25lIG9mIGluc2VydCwgdXBkYXRlIHNob3VsZCBiZSB0cnVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRvIGJlIHJldHVybmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0LW1vZGUtcmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBpbnNlcnQ9PXRydWUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIGluc2VydGVkICh0cnVlKS4gSWYgaW5zZXJ0PT1mYWxzZSAtIGlnbm9yZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmVudC9zdXBlcmNsYXNzIG9mIHRoZSBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkICAgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InJlYWQtc3ViY2xhc3Nlcy1vbi1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGlmIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZCBvbiBxdWVyaWVzLCBvciBvbmx5IHRoZSBleGFjdCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLXZpZXciIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZpZXcgdGhhdCBqb2lucyBhbGwgb2YgdGhlIHN1YmNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWNsYXNzLW5hbWUtYXMtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3MgdHlwZSBpbmRpY2F0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0aW9uLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIGNsYXNzIHRoYXQgdGFrZXMgdGhlIGNsYXNzJyByb3cgYXMgYXJndW1lbnQgYSBjb21wdXRlZCB0aGF0IGNsYXNzIHR5cGUgdG8gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBmcm9tIHRoZSByb3cuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgY2xhc3MgdHlwZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNsYXNzIGV4dHJhY3RvciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvbmx5LWluc3RhbmNlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IGFsbCBzaWJsaW5nIGFuZCBzdWJjbGFzcyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgc2libGluZyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lLWluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4dGVuZHMgaW5oZXJpdGFuY2UgcG9saWN5LiBBbGxvd3MgZm9yIHByZWZpeGVkIG5hbWVzIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWUgdG8gZmluZCB0aGUgYXBwcm9yaWF0ZSBjbGFzczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmhlcml0YW5jZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmciPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIHR5cGUgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1pbmRpY2F0b3IiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdmFsdWUgdXNlZCB0byBkZWZpbmUgdGhlIGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnQtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudC1saXN0ZW5lcnMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXZlbnQtbGlzdGVuZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBldmVudCBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWJ1aWxkLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGJ1aWxkaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3Qtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8tdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1jbG9uZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBjbG9uaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LW1lcmdlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIG1lcmdpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtcmVmcmVzaC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciByZWZyZXNoaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBhbmQgcXVlcnkgcHJvcGVydGllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0icXVlcnkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzJyBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGFwcGx5IHRvIGFsbCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hlY2stY2FjaGUiIG5hbWU9ImV4aXN0ZW5jZSIgdHlwZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGJlaGF2b2lyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGluc2VydCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBpbnNlcnQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXBkYXRlLXF1ZXJ5IiB0eXBlPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gdXBkYXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHVwZGF0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkZWxldGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiIHR5cGU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkb2VzIGV4aXN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIG9iamVjdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtYWxsLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgYWxsIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYWxsIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBwb2xpY2llcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5LWtleSBhbGlhcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gdXNlIHdpdGggYSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZGF0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tY2hhbmdlcyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQtd2l0aC1uZXctb2JqZWN0cyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgaXNvbGF0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzZS1zZXNzaW9uLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFsd2F5cyIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGJlaW5nIGFsaWFzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGpvaW4gY29uZGl0aW9uIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgam9pbiBjcml0ZXJpYSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLTEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLW0gam9pbiBmcm9tIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHZhbHVlIHRoYXQgbnVsbCBkYXRhIHZhbHVlcyBzaG91bGQgYmUgY29udmVydGVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHNpbXBsZSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZmllbGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWVyLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nIHRoYXQgdXNlcyBKYXZhIGNvZGUgdG8gdHJhbnNmb3JtIGJldHdlZW4gdGhlIGRhdGEgYW5kIG9iamVjdCB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1hdGlvbiBkZWZpbmVkIGluIHRoZSBkb21haW4gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtdHJhbnNmb3JtZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1lci4gVXNlZCBpbiBwbGFjZSBvZiBhdHRyaWJ1dGUtdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdHJhbnNmb3JtYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIHR5cGU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIHRhcmdldCBvYmplY3QgaXMgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0IGFuZCBzdG9yZXMgd2l0aGluIHRoZSBzb3VyY2Ugb2JqZWN0cyByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImFsbG93LW51bGwiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgYSByb3cgb2YgYWxsIG51bGxzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBudWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgbWFwcGluZyB0byB1c2UgZGlmZmVyZW50IGZpZWxkIG5hbWVzIHRoYW4gdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIGRlc2NyaXB0b3IncyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgYWdncmVnYXRlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzZXMgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRhcmdldCBvYmplY3RzIGFyZSBwcml2YXRlbHkgb3duZWQgZGVwZW5kZW50IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvbmUtdG8tb25lLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWdyb3VwaW5nLWVsZW1lbnQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSB0eXBlcyByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UgcHJpbWFyeSBrZXkgYW5kIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3QtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgc2Vzc2lvbiB0aGF0IGRlZmluZXMgdGhlIHJlZmVyZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Yga2V5IHZhbHVlcyBwYWlycyBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3Qta2V5LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzb3JlcyB0aGUgbWFwIGtleSBkYXRhIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGtleSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcyB3aGVyZSB0aGUgdGFyZ2V0IGluc3RhbmNlcyBhcmUgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbi10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZS90YXJnZXQgcHJpbWFyeSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UgdGhhdCBtYXkgYmUgb2Ygc2V2ZXJhbCB0eXBlcyByZWxhdGVkIHRocm91Z2ggYW4gaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgY29sdW1uIHRvIHN0b3JlIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSByZWxhdGVkIG9iamVjdCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleS10by1xdWVyeS1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBjb2x1bW4vcXVlcnkga2V5IHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHF1ZXJ5IGtleXMgZGVmaW5pbmcgYSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgdmFsdWUgaW4gdGhlIG90aGVyIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcXVlcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcXVlcnkta2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBrZXkgbmFtZSBvZiB0aGUgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29udGFpbmVyL2NvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic29ydGVkLWNvbGxlY3Rpb24tY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzb3J0ZWQgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXJhdG9yLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbXBhcml0b3IsIHVzZWQgdG8gY29tcGFyZSBvYmplY3RzIGluIHNvcnRpbmcgdGhlIGNvbGxlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3QtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBsaXN0IGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjcm9sbGFibGUtY3Vyc29yLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzY3JvbGxhYmxlIGN1cnNvciBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3Vyc29yZWQtc3RyZWFtLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjdXJzb3JlZCBzdHJlYW0gY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGlyZWN0aW9uLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGVmZXJyZWQgcmVhZCBpbmRpcmVjdGlvbiBtZWNoYW5pc20uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1ob2xkZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB2YWx1ZSBob2xkZXJzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm94eS1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHByb3hpZXMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcGFyZW50LWNvbGxlY3Rpb24taW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB0cmFuc3BhcmVudCBjb2xsZWN0aW9ucyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHRvIHVzZSwgaS5lLiBMaXN0LCBTZXQsIE1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBhIHVzZXIgZGVmaW5lZCBjb250YWluZXIgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb250YWluZXIgaW1wbGVtZW50ZXIgdG8gdXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbGlzdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0IGNvbnZlcnRlcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im9iamVjdC1jbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGxpc3QncyBlbGVtZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+IAotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlc2FmZS1lbnVtZXJhdGlvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UeXBlc2FmZSBFbnVtZXJhdGlvbiBjb252ZXJzaW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJzaW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIGFuZCBhbiBvYmplY3QgdHlwZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQgYmV0d2Vlbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcmlhbGl6ZWQtb2JqZWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgb2JqZWN0IHNlcmlhbGl6YXRpb24gdG8gY29udmVydCBiZXR3ZWVuIHRoZSBvYmplY3QgYW5kIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiB2YWx1ZXMgZnJvbSBkYXRhYmFzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgZmllbGQgYW5kIG9iamVjdCB2YWx1ZXMgdXNlZCBpbiB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgdmFsdWUgaXMgdXNlZCBpZiBhIGRhdGFiYXNlIHR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSB0eXBlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1hcHBpbmcgb2YgdmFsdWVzLiAgQm90aCB0aGUgb2JqZWN0IGFuZCBkYXRhYmFzZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1vbmx5LXR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiBhZGRpdGlvbmFsIHZhbHVlcyB0aGF0IG1hcCBub24tdW5pcXVlIGRhdGEgdmFsdWVzIHRvIGEgdW5pcXVlIGF0dHJpYnV0ZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgYW4gb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIG9iamVjdCdzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIGRhdGFiYXNlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkvaW50ZXJhY3Rpb24gYWdhaW5zdCBhIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibWFpbnRhaW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJ5cGFzcyB0aGUgY2FjaGUgY29tcGxldGVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHVzZSBwYXJhbWF0ZXIgYmluZGluZyBmb3IgYXJndW1lbnRzLCBvciBwcmludCB0aGUgYXJndW1lbnRzIGluLWxpbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1zdGF0ZW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIGNhY2hlZCwgdGhpcyBtdXN0IGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gY2FuY2VsIHRoZSBxdWVyeSBpbiBpZiB0aGUgcmVxdWVzdCB0YWtlcyB0b28gbG9uZyB0byBjb21wbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InByZXBhcmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHByZXBhcmUgYW5kIGNhY2hlIGl0cyBnZW5lcmF0ZWQgU1FMLCBvciByZWdlbmVyYXRlIHRoZSBTUUwgb24gZWFjaCBleGVjdXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxsIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3Igc3RhdGljIGNhbGxzIHRoZSBTUUwgb3IgU3RvcmVkIFByb2NlZHVyZSBjYWxsIGRlZmluaXRpb24gY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgam9pbiBmZXRjaCBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyLWpvaW4iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvdXRlci1qb2luIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FzY2FkZSBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcml2YXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBzaW5nbGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyByYXcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLXF1ZXJ5LXJlc3VsdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGNhY2hlIHRoZSBxdWVyeSByZXN1bHRzIHRvIGF2b2lkIGZ1dHVyZSBleGVjdXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWF4LXJvd3MiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCwgcmVzdWx0cyB3aWxsIGJlIHRydW5jdGF0ZSBvbiB0aGUgZGF0YWJhc2UgdG8gdGhpcyBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlyc3QtcmVzdWx0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIGN1cnNvciBpbiBhIHJlc3VsdCBzZXQgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFJlc3VsdHMgcHJpb3IgdG8gdGhpcyBudW1iZXIgd2lsbCBub3QgYmUgYnVpbHQgaW50byBvYmplY3RzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXNzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSBvbiBlYWNoIHJlc3VsdCBzZXQgbmV4dCBvcGVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5IiB0eXBlPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHF1ZXJ5J3MgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0ibWF4aW11bS1jYWNoZWQtcmVzdWx0cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHF1ZXJ5IHJlc3VsdCBzZXRzIHRoYXQgd2lsbCBiZSBjYWNoZWQuIFRoZSBMUlUgcXVlcnkgcmVzdWx0cyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbW9kaWZ5aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHVwZGF0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgaW5zZXJ0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgZXhpc3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIiB0eXBlPSJleGlzdGVuY2UtY2hlY2siPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGV4aXN0ZW5jZSBjaGVjayBvcHRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBjaGVjayBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhIGNyaXRlcmlhIG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG9iamVjdHMgKGFzIGFwcG9zZWQgdG8gZGF0YSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2Ygb2JqZWN0cyBiZWluZyBxdWVyaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZW1vdGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IHJlbW90ZWx5IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImNhc2NhZGUtcG9saWN5IiB0eXBlPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc2V0dGluZ3MgKHN1Y2ggYXMgcmVmcmVzaCwgbWFpbnRhaW4tY2FjaGUpIHNob3VsZCBhcHBseSB0byB0aGUgb2JqZWN0J3MgcmVsYXRpb25zaGlwIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJwcmltYXJ5LWtleSIgbmFtZT0iY2FjaGUtdXNhZ2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHNob3VsZCBpbnRlcmFjdCB3aXRoIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgbG9jayB0aGUgcmVzdWx0aW5nIHJvd3Mgb24gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iZGlzdGluY3Qtc3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGZpbHRlciBkaXN0aW5jdCByZXN1bHRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW4tbWVtb3J5LXF1ZXJ5aW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbiBtZW1vcnkgcXVlcnlpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgZGVmYXVsdD0iaWdub3JlLWV4Y2VwdGlvbnMtcmV0dXJuLWNvbmZvcm1lZCIgbmFtZT0icG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IGluZGlyZWN0aW9uIG9yIHVuY29uZm9ybWFibGUgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHRyZWF0aW5nIHdpdGggaW4tbWVtb3J5IHF1ZXJ5aW5nIGFuZCBjb25mb3JtaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ1c2UtZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBhIHByZS1kZWZpbmVkIG5hbWVkIGZldGNoIGdyb3VwIHRvIGFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIChWUEQpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2luZWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyBiZWluZyBqb2luZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igam9pbmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGFyZSByZWFkLW9ubHksIGFuZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSB1bml0IG9mIHdvcmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNldCBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXRjaC1yZWFkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYWxsIGF0dHJpYnV0ZXMgZm9yIGJhdGNoIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgYmF0Y2ggcmVhZGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvcmRlci1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIHRoZSBvcmRlciBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIG9yZGVyaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2luZ2xlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNldCBvZiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybi1jaG9pY2UiIHR5cGU9InJldHVybi1jaG9pY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyIgdHlwZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXBvcnQtaXRlbXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SXRlbXMgdG8gYmUgc2VsZWN0ZWQsIHRoZXNlIGNvdWxkIGJlIGF0dHJpYnV0ZXMgb3IgYWdncmVnYXRlIGZ1bmN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Iml0ZW0iIHR5cGU9InJlcG9ydC1pdGVtIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ3JvdXAtYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyBHUk9VUCBCWSBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGdyb3VwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXR1cm4tY2hvaWNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtcmVzdWx0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS12YWx1ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtYXR0cmlidXRlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaXJzdC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXByaW1hcnkta2V5IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1pdGVtIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZCBpbiBSZXBvcnRRdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5OYW1lIGdpdmVuIGZvciBpdGVtLCBjYW4gYmUgdXNlZCB0byByZXRpZXZlIHZhbHVlIGZyb20gcmVzdWx0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHByZXNzaW9uIChwYXJ0aWFsKSB0aGF0IGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlIHdhbnRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZmlsdGVyIGV4cHJlc3Npb24gdHJlZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb24gZXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHRvIGV4cHJlc3Npb25zIHRocm91Z2ggb3BlcmF0b3JzIHN1Y2ggYXMgZXF1YWwsIGxlc3NUaGFuLCBldGMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2ljLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0d28gc3ViLWV4cHJlc3Npb25zIGpvaW5lZCB0aHJvdWdoIGFuIG9wZXJhdG9yIHN1Y2ggYXMgQU5ELCBPUi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGEgbGlzdCBvZiBzdWItZXhwcmVzc2lvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb24iIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25zdGFudC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlIHZhbHVlIHRhZyBjYW4gaXMgYWJzZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXktZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBxdWVyeS1rZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYW55LW9mIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0ZXItam9pbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXItZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBwYXJhbWV0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzZS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGJ1aWxkZXIvYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcGVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBvcGVyYXRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gU1FMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgU1FMIHF1ZXJ5IHN0cmluZy4gIEFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggI2FyZy1uYW1lIHRva2VucyBpbiB0aGUgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamJxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSkItUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYnFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBFSkItUUwgcXVlcnkgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjdXJzb3Itb3V0cHV0LXByb2NlZHVyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBjYWxsIHRvIHVzZSBhIGN1cnNvciBvdXRwdXQgcGFyYW1ldGVyIHRvIGRlZmluZSB0aGUgcmVzdWx0IHNldC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBwcm9jZWR1cmUgYXJndW1lbnRzIGlmIG5vdCBuYW1lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgZnVuY3Rpb24gaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1yZXN1bHQiIHR5cGU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkLWZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdG9yZWQgcHJvY2VkdXJlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudCB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcmd1bWVudCBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUiIHR5cGU9InhzZDppbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGludCB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiBqYXZhLmpkYmMuVHlwZXM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGlmIHByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIGlzIFNUUlVDVCBvciBBUlJBWTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1pbm91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRwdXQtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbiB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBhdCBsZWFzdCBvbmUgT3JhY2xlIFBML1NRTCB0eXBlIHRoYXQgaGFzIG5vIEpEQkMgcmVwcmVzZW50YXRpb24gKGUuZy4gQk9PTEVBTiwgUExTX0lOVEVHRVIsIFBML1NRTCByZWNvcmQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGV4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXJlY29yZCI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBFSVMgcmVjb3JkIGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHN0cnVjdHVyZSBuYW1lIHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIE1hcHBlZFJlY29yZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIFhNTCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVjb3JkLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgaW5wdXQgcmVjb3JkLCBpZiByZXF1aXJlZCBieSB0aGUgYWRhcHRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJvb3QtZWxlbWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGV4ZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgSW5kZXhlZCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGludGVyYWN0aW9uIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbnRlcmFjdGlvbiBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnRzIHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbi4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeSwgb3IgdGhlIGRlc2NyaXB0b3IgZmllbGQgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgU3RydWN0dXJlIHR5cGUgaW4gYW4gb2JqZWN0LXJlbGF0aW9uYWwgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLW9yZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBvcmRlcmVkIGxpc3Qgb2YgdGhlIGZpZWxkIGRlZmluZWQgaW4gdGhlIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5lc3RlZC10YWJsZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbS9tLW0gcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBvYmplY3QtcmVsYXRpb25hbCBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBuZXN0ZWQtdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUvc2ltcGxlIHR5cGUgdmFsdWVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1hcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdHVyZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0cnVjdHVyZSBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC10eXBlIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCByZWZlcmVuY2UgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgdHlwZSB0aGF0IHN0b3JlcyB0aGUgcmVmZXJlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1maWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gT2JqZWN0UmVsYXRpb25hbERhdGFiYXNlRmllbGQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC14bWwtdHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXBwaW5nIHRvIGFuIE9yYWNsZSBYREIgWE1MIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLXdob2xlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB1c2VyIGRlZmluZWQgY29udmVydGVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb2xsZWN0aW9uLXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtTSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gYSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lcnBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXMtc2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gb25lIG9yIG1vcmUga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWdncmVnYXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzb3VyY2UtdG8tdGFyZ2V0LWtleS1maWVsZC1hc3NvY2lhdGlvbiIgdHlwZT0iZm9yZWlnbi1rZXkiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1nZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZWVwLWFzLWVsZW1lbnQtcG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGFuIFhNTCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJkZWZhdWx0LXJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQtZmllbGQiIHR5cGU9Im5vZGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIFhNTEZpZWxkIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCByb290IGVsZW1lbnQgb2YgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtcHJlc2VydmUtZG9jdW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBub2RlcyBzaG91bGQgYmUgY2FjaGVkIHRvIHByZXNlcnZlIHVubWFwcGVkIGRhdGE8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciIgdHlwZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lc3BhY2UgcmVzb2x2ZXIgZm9yIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2NoZW1hIiB0eXBlPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIFNjaGVtYS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZXN1bHQtYWx3YXlzLXhtbC1yb290IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFueS1hdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluY2x1ZGUtbmFtZXNwYWNlLWRlY2xhcmF0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLXNjaGVtYS1pbnN0YW5jZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBvYmplY3QgdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1mcmFnbWVudC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgTm9kZSB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIE5vZGVzIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmFyeS1kYXRhLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1maWVsZCIgdHlwZT0ibm9kZSIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29udmVyc2lvbi1wYWlyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFhQYXRoIGV4cHJlc3Npb24gdG8gYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gYW4gWE1MIGRvY3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zaXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiB0aGUgcGFyZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVhZi1lbGVtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpcy1yZXF1aXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pb24tbm9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZSB0byByZXByZXNlbnQgbm9kZXMgd2hpY2ggYXJlIG1hcHBlZCB0byB1bmlvbnM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGVkLXRleHQtZmllbGQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHRoaXMgaXMgYSB0eXBlZCB0ZXh0IGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyBpZiBlYWNoIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb24gaXMgaW4gdGhlIHNhbWUgbm9kZSBpbnN0ZWFkIG9mIGhhdmluZyBvbmUgbm9kZSBwZXIgaXRlbSBpbiB0aGUgY29sbGVjdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNjaGVtYS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzY2hlbWEgdHlwZSBvZiB0aGUgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ4bWwtdG8tamF2YS1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImphdmEtdG8teG1sLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0ibmFtZXNwYWNlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9Im5hbWVzcGFjZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJkZWZhdWx0LW5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVzcGFjZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlc291cmNlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYS1jb250ZXh0IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWNsYXNzLXBhdGgtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtZmlsZS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS11cmwtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtY2hhcmFjdGVyIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXRpbWVzdGFtcCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLXV0aWwtZGF0ZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY21wLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciIHR5cGU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNtcCBiZWFuLWxldmVsIHBlc3NpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0IiB0eXBlPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgbW9kaWZpY2F0aW9uIGRlZmVycmFsIGxldmVsIGZvciBub24tZGVmZXJyZWQgd3JpdGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIiB0eXBlPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcG9pbnQgYXQgd2hpY2ggaW5zZXJ0IHdpbGwgYmUgaXNzdWVkIHRvIERhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0id2FpdCIgbmFtZT0ibG9ja2luZy1tb2RlIiB0eXBlPSJsb2NraW5nLW1vZGUiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1cGRhdGUtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZnRlci1lamJwb3N0Y3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idW5kZWZpbmVkIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9ja2luZy1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SG9sZHMgdGhlIHBlc3NpbWlzdGljIGxvY2tpbmcgbW9kZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndhaXQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby13YWl0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iNTAiIG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfTkFNRSIgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1ncm91cCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBmZXRjaCBncm91cCBhdHRyaWJ1dGVzIGluZm8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhIGZldGNoIGdyb3VwJ3MgYXR0cmlidXRlIGxpc3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZXNjcmliZXMgdGhlIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmVycmVkLWRldGVjdGlvbi1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBiYWNrdXAgY2xvbmUgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyAibWFyayBkaXJ0eSIgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1sZXZlbC1jaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlcyBhIENoYW5nZVRyYWNrZXIgZmlyaW5nIFByb3BlcnR5Q2hhbmdlRXZlbnQncyB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBOdWxsIFBvbGljeSBpbiB1c2UgZm9yIHRoaXMgcmVsYXRpb25zaGlwIGN1cnJlbnRseSBhIGNob2ljZSBvZiBbTnVsbFBvbGljeSBhbmQgSXNTZXROdWxsUG9saWN5XS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaXMtc2V0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPldyaXRlIG51bGwsIG5vIHRhZyhkZWZhdWx0KSBvciBhbiBlbXB0eSB0YWcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUJTRU5UX05PREUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGdlbmVyaWMgZmllbGQgY29uY2VwdCwgc3VjaCBhcyBhIGRhdGFiYXNlIGNvbHVtbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sdW1uIGluIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjb2x1bW4ncyB0YWJsZS4gVGhpcyB0YWJsZSBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgY2xhc3MnIHRhYmxlcy4gSWYgbm90IHNwZWNpZmllZCB0aGUgZmlyc3QgdGFibGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3FsLXR5cGVjb2RlIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPihvcHRpb25hbCBmaWVsZCkgVGhlIEpEQkMgdHlwZWNvZGUgb2YgdGhpcyBjb2x1bW48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIE5hbWUgb2YgdGhlIEpEQkMgdHlwZWNvZGUgZm9yIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZvcmVpZ24ta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBmaWVsZC9jb2x1bW4gcmVmZXJlbmNlcyByZWxhdGluZyBhIGZvcmVpZ24ga2V5IGluIG9uZSB0YWJsZSB0byB0aGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGluIGFub3RoZXIgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXJlZmVyZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgdGFibGUgcHJpbWFyeSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmaWVsZC9jb2x1bW4gbmFtZSBpbiB0aGUgc291cmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHRhcmdldCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBzcGVjaWZpY2F0aW9uIGZvciBxdWVyeWluZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2VsZWN0aW9uIGNyaXRlcmlhIG9mIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgcXVlcnkgYXJndW1lbnRzLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50IG11c3QgbWF0Y2ggdGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCB2YWx1ZSBwYXNzZWQgdG8gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icXVlcnktYXJndW1lbnQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBuYW1lIGNhbiBiZSB1c2VkIHRvIHJlZmVyZW5jZSBhbmQgZXhlY3V0ZSB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGZpbHRlcmluZyBjbGF1c2Ugb2YgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyB0eXBlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IG1heSBiZSBwcm92aWRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgY29uc3RhbnQgdmFsdWUgZm9yIHRoZSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlUeXBlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiAgVGhlIG5hbWUgY2FuIGJlIGZ1bGx5IHF1YWxpZmllZCB3aXRoIHRoZSBzY2hlbWEsIHRhYmxlc3BhY2Ugb3IgbGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlCi0gICAgICAgIG9iamVjdCB2YWx1ZS4KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgICAgICAgICB0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgICAgIG5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzFhZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE0NzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIAotCi1YTUwgU2NoZW1hIGRlZmluaXRpb24gZm9yIHRoZSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIFByb2plY3QgU2Vzc2lvbiBDb25maWd1cmF0aW9uIGZpbGUuIEluc3RhbmNlcwotb2YgdGhpcyBmaWxlIGFyZSB0eXBpY2FsbHkgbG9jYXRlZCBhczogJ01FVEEtSU5GL3Nlc3Npb25zLnhtbCcKLQotIC0tPgotCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjAiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9ucyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSByb290IGVsZW1lbnQgYW5kIGV4aXN0cyBvbmx5IGZvciBYTUwKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIiB0eXBlPSJzZXNzaW9uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgc2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgZWxlbWVudCB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gaXRlbQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1wbGF0Zm9ybSIgdHlwZT0ic2VydmVyLXBsYXRmb3JtIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZS1jb21tYW5kIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBlbGVtZW50IHRoYXQgZGVmaW5lIHRoZSBSZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIE1vZHVsZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iRWNsaXBzZUxpbmtDb21tYW5kQ2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZlYXR1cmVzLCB0aGUgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1zeW5jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBlbGVtZW50LiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG9uIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgc2VuZGluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FjaGUgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0cmFuc3BvcnQtbWFuYWdlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUk1JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9maWxlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIGlmIHRoZSBwcm9maWxlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlY2xpcHNlbGluayIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHNlc3Npb24gd2lsbCB1c2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBleGNlcHRpb25zIGdlbmVyYXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nIiB0eXBlPSJsb2ciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWN1c3RvbWl6ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHNlc3Npb24gY3VzdG9taXplcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdG8gcnVuIG9uIGEgbG9hZGVkIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3aGljaCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybSB0byB1c2UsIEpUQSBzZXR0aW5ncyBhbmQgcnVudGltZSBzZXJ2aWNlcwotICAgICAgICAgICAgICAgIHNldHRpbmdzCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1ydW50aW1lLXNlcnZpY2VzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgSk1YIE1CZWFuIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkaW5nIHJ1bnRpbWUgc2VydmljZXMgaXMgZGVwbG95ZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLWp0YSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBzZXNzaW9uIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZSB3aXRoIHRoZSBKVEEgKGkuZS4gd2hldGhlciB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiBUaGUgY2hvaWNlIG9mIHNlcnZlci1jbGFzcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b20tcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLkN1c3RvbVNlcnZlclBsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5QbGF0Zm9ybUJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSB3aGljaCBzZXJ2ZXIgcGxhdGZvcm0gdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDQtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMi1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTExMTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIi8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTcwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy04MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtOS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtMTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS00MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYm9zcy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1icm9rZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXMgYSBzaW5nbGUgdmlldyB0byBhIHNlc3Npb24gdGhhdAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50bHkgYWNjZXNzZXMgbXVsdHBsZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb2plY3QiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieG1sIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpbnRvIEVjbGlwc2VMaW5rLCB0aGUKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgZG8gYWxsIG9mIGl0cyByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi0gICAgICAgICAgICAgICAgb2JqZWN0cyB0aHJvdWdoIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBhbHNvIG1hbmFnZXMKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIHVuaXRzIG9mIHdvcmsuIFRoZSBkYXRhYmFzZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgaW50ZW5kZWQgZm9yIHVzYWdlIGluIHR3by10aWVyIGNsaWVudC1zZXJ2ZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIEFsdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gYSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBzaXR1YXRpb24sIGl0IGlzIGxpbWl0dGVkIHRvIG9ubHkgaGF2aW5nIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgb25seSBhbGxvd3MgYSBzaW5nbGUgb3BlbgotICAgICAgICAgICAgICAgIGRhdGFiYXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LXByb2plY3QiIHR5cGU9InByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9qZWN0IChjbGFzcyBvciB4bWwpIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGFzIHRoZSBwcmltYXJ5IHByb2plY3QgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHByb2plY3RzIHdpbGwgaGF2ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBhcHBlbmRlZCB0byB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElzIGFuIGV4dGVuc2lvbiBvZiBhIERhdGFiYXNlU2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2xzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gcG9vbHMgYXJlIG9ubHkgZm9yIHVzYWdlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIHVzZWQgaWYgdXNpbmcgZXh0ZXJuYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlYWQtY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0id3JpdGUtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2VxdWVuY2UtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgdGFnIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGRlZmF1bHQgY2xpZW50IHNlc3Npb25zIGFyZSBhY3F1aXJlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciByZWFkcywgcmVxdWlyZWQgZm9yIFZQRCwgb3IgdXNlciBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBzZWN1cml0eS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXp5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGEgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxkIHVwZnJvbnQgaW4gdGhlIGNsaWVudCBzZXNzaW9uLCBvciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCB3aGVuIG5lZWRlZCBhbmQgdGhlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbW1vbiBmaWVsZHMgZm9yIGRhdGFiYXNlLWxvZ2luIGFuZCBlaXMtbG9naW4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1xdWFsaWZpZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXIgZm9yIGFsbCB0YWJsZXMuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGFibGUgb3IgZGF0YWJhc2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhYmxlIGV4aXN0cyBvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgc3VjaCBhcyBPcmFjbGUgYW5kIERCMi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBzZXNzaW9uIHdpbGwgYmUgdXNpbmcgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiBhIGxvZ2luLgotICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgZXh0cmEgcHJvcGVydGllcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBIb2xkcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgIHRvIGEgSkRCQyBkcml2ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkcml2ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlciBjbGFzcyBpcyB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciB0aGUgSkRCQyBkcml2ZXIgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCBvZiBhIGRhdGFzb3VyY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHVzZWQgYnkgdGhlIHNlc3Npb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb29rdXAtZW51bSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGJpbmQgYWxsIGFyZ3VtZW50cyB0byBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgcHJlcGFyZWQgc3RhdGVtZW50cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGxhcmdlIGJpbmFyeSBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHdpbGwgcHJpbnQgdGhpcyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGhleCB0aHJvdWdoIHRoZSBKREJDIGJpbmFyeSBleGNhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlLiBCb3RoIGJpbmRpbmcgYW5kIHByaW50aW5nIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBsaW1pdHMgb24gYWxsIGRhdGFiYXNlcyAoZS5nLiA1awotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMyaykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmctYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGJvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIGhlbHAgYmVhbiBpbnRyb3NwZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3JlIGxhcmdlIGJpbmFyeSBkYXRhLiBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHRoZSBtYXggc2l6ZSBmb3IgcmVhZGluZy93cml0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHNvbWUgSkRCQyBkcml2ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXhwZWN0cyB1cHBlciBjYXNlIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZG9lcyBub3QgcmV0dXJuIGNvbnNpc3RlbnQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgZHJpdmVyIGxldmVsIGRhdGEgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZC4gVGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgYXMgc29tZSBkcml2ZXJzIHBlcmZvcm0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRoZW1zZWx2ZXMgaW5jb3JyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQ0hBUiBmaWVsZCB2YWx1ZXMgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBibGFua3MgdHJpbW1lZCwgdGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyBmYWNpbGl0eSBhbGxvd3MgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucyB0byBiZSBzdWJtaXR0ZWQgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBmb3IgcHJvY2Vzc2luZyBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXR0aW5nIG11bHRpcGxlIHVwZGF0ZXMgdG9nZXRoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5LCBjYW4gZ3JlYXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHRhZyB3aXRoIHRydWUgaW5kaWNhdGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIHRoYXQgdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIHdyaXRpbmcuIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBpcyBkaXNhYmxlZC4gU2V0dGluZyB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZhbHNlIGluZGljYXRlcyB0byBFY2xpcHNlTGluayB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgd2lsbCByZXZlcnQgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHdoaWNoIGlzIHRvIGRlbGVnYXRlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2ggd3JpdGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1iYXRjaC13cml0aW5nLXNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzIwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBmb3IgdGhlIG1heCBiYXRjaCB3cml0aW5nIHNpemUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgdGhlIGJhdGNoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbGltaXRlZCBhcyBtb3N0IGRhdGFiYXNlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0IGxpbWl0cy4gVGhlIHNpemUgaXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgdGhlIGRlZmF1bHQgaXMgMzIwMDAgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXRpdmUtc3FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIHNwZWNpZmljIHNxbCBncmFtbWFyIG5vdCBKREJDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljLiBUaGlzIGlzIGJlY2F1c2UgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyaWRnZXMgdG8gbm90IHN1cHBvcnQgdGhlIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBzdGFuZGFyZC4gQnkgZGVmYXVsdCBFY2xpcHNlTGluayB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKREJDIHNxbCBncmFtbWFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0ic3RydWN0LWNvbnZlcnRlcnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taGVhbHRoLXZhbGlkYXRlZC1vbi1lcnJvciIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRydWUgd2lsbCBjYXVzZSBFY2xpcHNlTGluayB0byBwaW5nIGRhdGFiYXNlIHRvIGRldGVybWluZSBpZiBhbiBTUUxFeGNlcHRpb24gd2FzIGNhdXNlIGJ5IGEgY29tbXVuaWNhdGlvbiBmYWlsdXJlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZXRyeS1hdHRlbXB0LWNvdW50IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgRWNsaXBzZUxpbmsgd2lsbCBtYWtlIGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlbGF5LWJldHdlZW4tcmVjb25uZWN0LWF0dGVtcHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCB3YWl0IGJldHdlZW4gYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmctc3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdmVycmlkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgU1FMIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCBpc3N1ZSB0byBhIGNvbm5lY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGxpdmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb29rdXAtZW51bSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvdW5kLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGFuZCBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gY29ubmVjdCB0aHJvdWdoIEVJUywKLSAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlIENvbm5lY3Rpb25GYWN0b3J5IGFuZCB1c2UKLSAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBnZXRDb25uZWN0aW9uIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSwgYW5kIGEgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25TcGVjCi0gICAgICAgICAgICAgICAgdG8gcGFzcyB0byB0aGUgZ2V0Q29ubmVjdGlvbiAtIENvbm5lY3QgaW4gYSBub24tbWFuYWdlZAotICAgICAgICAgICAgICAgIHdheSBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IEFuCi0gICAgICAgICAgICAgICAgRUlTQ29ubmVjdGlvblNwZWMgbXVzdCBiZSBwcm92aWRlZCB0byBkZWZpbmUgaG93IHRvCi0gICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgRUlTIGFkYXB0ZXIuIFRoZSBFSVMgcGxhdGZvcm0gY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICB0byBwcm92aWRlIGRhdGFzb3VyY2UvZHJpdmVyIHNwZWNpZmljIGJlaGF2b2lyIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICBJbnRlcmFjdGlvblNwZWMgYW5kIFJlY29yZCBjb252ZXJzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBsb2dpbiBhbmQgcGxhdGZvcm0gdHlwZSB0byBiZSB1c2VkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHBvb2xlZCBpbiBhCi0gICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1pbiBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGF3YXlzIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZWFkIGNvbm5lY3Rpb24gcG9vbCBpcyB1c2VkIGZvciByZWFkIGFjY2VzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgdGhlIHNlcnZlciBzZXNzaW9uLiBBbnkgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbHMgY2FuIGJlCi0gICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHJlYWQgcG9vbCBob3dldmVyIHRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoaXMKLSAgICAgICAgICAgICAgICBwb29sIGFsbG93cyBmb3IgY29uY3VycmVudCByZWFkcyBhZ2FpbnN0IHRoZSBzYW1lIEpEQkMKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBKREJDIGNvbm5lY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVhZCBhY2Nlc3MuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSByZWFkIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCBhcmUgZXhjbHVzaXZlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tb24gbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgSmF2YSBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgRWNsaXBzZUxpbmsgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWxldmVsIiBkZWZhdWx0PSJpbmZvIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9mZiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2V2ZXJlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmZvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb25maWciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lc3QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWxlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbG9nZ2luZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBTZXJ2ZXIgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2dpbmctb3B0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWV4Y2VwdGlvbi1zdGFja3RyYWNlIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBleGNlcHRpb24gc3RhY2t0cmFjZS4gV2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50LCB0aGUgc3RhY2t0cmFjZSBpcyBsb2dnZWQgZm9yIEZJTkVSCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBsZXNzIChGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtdGhyZWFkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyB0aHJlYWQuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCBpcyBsb2dnZWQgZm9yIEZJTkUgb3IgbGVzcyAoRklORVIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1zZXNzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHNlc3Npb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIHNlc3Npb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGNvbm5lY3Rpb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1kYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGRhdGUuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20gaXMgUk1JCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uLWNvbm5lY3Rpb24tZXJyb3IiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iRGlzY2FyZENvbm5lY3Rpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZiAiRGlzY2FyZENvbm5lY3Rpb24iIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAiS2VlcENvbm5lY3Rpb24iLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBSQ00gc2VydmljZSBzaG91bGQgYmUgZHJvcHBlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21tdW5pY2F0aW9uIGVycm9yIHdpdGggdGhhdCBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjYXJkQ29ubmVjdGlvbiIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NhcmRDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlIFJNSSB0cmFuc3BvcnQgbWVjaGFuaXNtLiBUaGUKLSAgICAgICAgICAgICAgICBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbmQtbW9kZSIgZGVmYXVsdD0iQXN5bmNocm9ub3VzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIgb3IgIlN5bmNocm9ub3VzIi4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBSQ00gcHJvcGFnYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCBkb2VzIG5vdCB3YWl0IGZvciBjb21tYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGluIGFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5IHNldHRpbmdzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBkZWZhdWx0IERpc2NvdmVyeSB3aXRoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgcm1pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im11bHRpY2FzdC1ncm91cC1hZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMjI2LjEwLjEyLjY0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aWNhc3QtcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMTIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdW5jZW1lbnQtZGVsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMTAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbXVsdGljYXN0IGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyAiMTAwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2tldC10aW1lLXRvLWxpdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdGltZS10by1saXZlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXRzIHRoYXQgYXJlIHNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgRGlzY292ZXJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsc3RpY2FzdCBzb2NrZXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZWxlbWVudCBpcyAiMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJtaS1yZWdpc3RyeS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygcm1pIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBSTUkgcmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktaWlvcC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFJNSS1JSU9QIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YKLSAgICAgICAgICAgICAgICB0aGUgUkNNLiBUaGUgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icm1pLXRyYW5zcG9ydCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbXMtdG9waWMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBKTVMgdG9waWMgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWhvc3QtdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtY29ubmVjdGlvbi1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLWpncm91cHMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBPQzRKIEpHcm91cHMgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgbWVjaGFuaXNtIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1zaW5nbGUtdGhyZWFkZWQtbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN1bi1jb3JiYS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFN1biBDT1JCQSB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGVmaW5lZC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdXNlciBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBmb3IgbmFtaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZG1pbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJwYXNzd29yZCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPCEtLSAgVE9ETzogTmVlZCB0byBoYXZlIGEgbm9uIE9yYWNsZS1BUyBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImNvbS5ldmVybWluZC5zZXJ2ZXIucm1pLlJNSUluaXRpYWxDb250ZXh0RmFjdG9yeSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgY29udGV4dCBmYWN0b3J5IGNsYXNzIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtaW5nIHNlcnZpY2UgcmVxdWlyZXMgZXh0cmEgcHJvcGVydHkgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgRWNsaXBzZUxpbmsgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iNTAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lCi0gICAgICAgICAgICAgICAgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwKLSAgICAgICAgICAgICAgICB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODcyYTE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIAotLS0+Ci08IS0tIAotCi1YTUwgU2NoZW1hIGRlZmluaXRpb24gZm9yIHRoZSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIFByb2plY3QgU2Vzc2lvbiBDb25maWd1cmF0aW9uIGZpbGUuIEluc3RhbmNlcwotb2YgdGhpcyBmaWxlIGFyZSB0eXBpY2FsbHkgbG9jYXRlZCBhczogJ01FVEEtSU5GL3Nlc3Npb25zLnhtbCcKLQotIC0tPgotCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjEiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9ucyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSByb290IGVsZW1lbnQgYW5kIGV4aXN0cyBvbmx5IGZvciBYTUwKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIiB0eXBlPSJzZXNzaW9uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgc2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgZWxlbWVudCB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gaXRlbQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1wbGF0Zm9ybSIgdHlwZT0ic2VydmVyLXBsYXRmb3JtIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZS1jb21tYW5kIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBlbGVtZW50IHRoYXQgZGVmaW5lIHRoZSBSZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIE1vZHVsZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iRWNsaXBzZUxpbmtDb21tYW5kQ2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZlYXR1cmVzLCB0aGUgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1zeW5jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBlbGVtZW50LiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG9uIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgc2VuZGluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FjaGUgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0cmFuc3BvcnQtbWFuYWdlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUk1JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9maWxlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIGlmIHRoZSBwcm9maWxlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlY2xpcHNlbGluayIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHNlc3Npb24gd2lsbCB1c2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBleGNlcHRpb25zIGdlbmVyYXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nIiB0eXBlPSJsb2ciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWN1c3RvbWl6ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHNlc3Npb24gY3VzdG9taXplcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdG8gcnVuIG9uIGEgbG9hZGVkIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3aGljaCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybSB0byB1c2UsIEpUQSBzZXR0aW5ncyBhbmQgcnVudGltZSBzZXJ2aWNlcwotICAgICAgICAgICAgICAgIHNldHRpbmdzCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1ydW50aW1lLXNlcnZpY2VzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgSk1YIE1CZWFuIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkaW5nIHJ1bnRpbWUgc2VydmljZXMgaXMgZGVwbG95ZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLWp0YSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBzZXNzaW9uIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZSB3aXRoIHRoZSBKVEEgKGkuZS4gd2hldGhlciB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiBUaGUgY2hvaWNlIG9mIHNlcnZlci1jbGFzcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b20tcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLkN1c3RvbVNlcnZlclBsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5QbGF0Zm9ybUJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSB3aGljaCBzZXJ2ZXIgcGxhdGZvcm0gdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDQtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMi1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTExMTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIi8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTcwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy04MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtOS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtMTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS00MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYm9zcy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1icm9rZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXMgYSBzaW5nbGUgdmlldyB0byBhIHNlc3Npb24gdGhhdAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50bHkgYWNjZXNzZXMgbXVsdHBsZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb2plY3QiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieG1sIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpbnRvIEVjbGlwc2VMaW5rLCB0aGUKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgZG8gYWxsIG9mIGl0cyByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi0gICAgICAgICAgICAgICAgb2JqZWN0cyB0aHJvdWdoIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBhbHNvIG1hbmFnZXMKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIHVuaXRzIG9mIHdvcmsuIFRoZSBkYXRhYmFzZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgaW50ZW5kZWQgZm9yIHVzYWdlIGluIHR3by10aWVyIGNsaWVudC1zZXJ2ZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIEFsdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gYSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBzaXR1YXRpb24sIGl0IGlzIGxpbWl0dGVkIHRvIG9ubHkgaGF2aW5nIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgb25seSBhbGxvd3MgYSBzaW5nbGUgb3BlbgotICAgICAgICAgICAgICAgIGRhdGFiYXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LXByb2plY3QiIHR5cGU9InByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9qZWN0IChjbGFzcyBvciB4bWwpIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGFzIHRoZSBwcmltYXJ5IHByb2plY3QgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHByb2plY3RzIHdpbGwgaGF2ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBhcHBlbmRlZCB0byB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElzIGFuIGV4dGVuc2lvbiBvZiBhIERhdGFiYXNlU2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2xzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gcG9vbHMgYXJlIG9ubHkgZm9yIHVzYWdlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIHVzZWQgaWYgdXNpbmcgZXh0ZXJuYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlYWQtY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0id3JpdGUtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2VxdWVuY2UtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgdGFnIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGRlZmF1bHQgY2xpZW50IHNlc3Npb25zIGFyZSBhY3F1aXJlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciByZWFkcywgcmVxdWlyZWQgZm9yIFZQRCwgb3IgdXNlciBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBzZWN1cml0eS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXp5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGEgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxkIHVwZnJvbnQgaW4gdGhlIGNsaWVudCBzZXNzaW9uLCBvciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCB3aGVuIG5lZWRlZCBhbmQgdGhlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbW1vbiBmaWVsZHMgZm9yIGRhdGFiYXNlLWxvZ2luIGFuZCBlaXMtbG9naW4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1xdWFsaWZpZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXIgZm9yIGFsbCB0YWJsZXMuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGFibGUgb3IgZGF0YWJhc2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhYmxlIGV4aXN0cyBvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgc3VjaCBhcyBPcmFjbGUgYW5kIERCMi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBzZXNzaW9uIHdpbGwgYmUgdXNpbmcgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiBhIGxvZ2luLgotICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgZXh0cmEgcHJvcGVydGllcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBIb2xkcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgIHRvIGEgSkRCQyBkcml2ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkcml2ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlciBjbGFzcyBpcyB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciB0aGUgSkRCQyBkcml2ZXIgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCBvZiBhIGRhdGFzb3VyY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHVzZWQgYnkgdGhlIHNlc3Npb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb29rdXAtZW51bSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGJpbmQgYWxsIGFyZ3VtZW50cyB0byBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgcHJlcGFyZWQgc3RhdGVtZW50cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGxhcmdlIGJpbmFyeSBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHdpbGwgcHJpbnQgdGhpcyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGhleCB0aHJvdWdoIHRoZSBKREJDIGJpbmFyeSBleGNhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlLiBCb3RoIGJpbmRpbmcgYW5kIHByaW50aW5nIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBsaW1pdHMgb24gYWxsIGRhdGFiYXNlcyAoZS5nLiA1awotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMyaykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmctYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGJvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIGhlbHAgYmVhbiBpbnRyb3NwZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3JlIGxhcmdlIGJpbmFyeSBkYXRhLiBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHRoZSBtYXggc2l6ZSBmb3IgcmVhZGluZy93cml0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHNvbWUgSkRCQyBkcml2ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXhwZWN0cyB1cHBlciBjYXNlIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZG9lcyBub3QgcmV0dXJuIGNvbnNpc3RlbnQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgZHJpdmVyIGxldmVsIGRhdGEgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZC4gVGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgYXMgc29tZSBkcml2ZXJzIHBlcmZvcm0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRoZW1zZWx2ZXMgaW5jb3JyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQ0hBUiBmaWVsZCB2YWx1ZXMgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBibGFua3MgdHJpbW1lZCwgdGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyBmYWNpbGl0eSBhbGxvd3MgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucyB0byBiZSBzdWJtaXR0ZWQgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBmb3IgcHJvY2Vzc2luZyBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXR0aW5nIG11bHRpcGxlIHVwZGF0ZXMgdG9nZXRoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5LCBjYW4gZ3JlYXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHRhZyB3aXRoIHRydWUgaW5kaWNhdGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIHRoYXQgdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIHdyaXRpbmcuIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBpcyBkaXNhYmxlZC4gU2V0dGluZyB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZhbHNlIGluZGljYXRlcyB0byBFY2xpcHNlTGluayB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgd2lsbCByZXZlcnQgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHdoaWNoIGlzIHRvIGRlbGVnYXRlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2ggd3JpdGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1iYXRjaC13cml0aW5nLXNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzIwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBmb3IgdGhlIG1heCBiYXRjaCB3cml0aW5nIHNpemUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgdGhlIGJhdGNoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbGltaXRlZCBhcyBtb3N0IGRhdGFiYXNlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0IGxpbWl0cy4gVGhlIHNpemUgaXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgdGhlIGRlZmF1bHQgaXMgMzIwMDAgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXRpdmUtc3FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIHNwZWNpZmljIHNxbCBncmFtbWFyIG5vdCBKREJDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljLiBUaGlzIGlzIGJlY2F1c2UgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyaWRnZXMgdG8gbm90IHN1cHBvcnQgdGhlIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBzdGFuZGFyZC4gQnkgZGVmYXVsdCBFY2xpcHNlTGluayB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKREJDIHNxbCBncmFtbWFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0ic3RydWN0LWNvbnZlcnRlcnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taGVhbHRoLXZhbGlkYXRlZC1vbi1lcnJvciIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRydWUgd2lsbCBjYXVzZSBFY2xpcHNlTGluayB0byBwaW5nIGRhdGFiYXNlIHRvIGRldGVybWluZSBpZiBhbiBTUUxFeGNlcHRpb24gd2FzIGNhdXNlIGJ5IGEgY29tbXVuaWNhdGlvbiBmYWlsdXJlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZXRyeS1hdHRlbXB0LWNvdW50IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgRWNsaXBzZUxpbmsgd2lsbCBtYWtlIGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlbGF5LWJldHdlZW4tcmVjb25uZWN0LWF0dGVtcHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCB3YWl0IGJldHdlZW4gYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmctc3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdmVycmlkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgU1FMIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCBpc3N1ZSB0byBhIGNvbm5lY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGxpdmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb29rdXAtZW51bSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvdW5kLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGFuZCBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gY29ubmVjdCB0aHJvdWdoIEVJUywKLSAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlIENvbm5lY3Rpb25GYWN0b3J5IGFuZCB1c2UKLSAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBnZXRDb25uZWN0aW9uIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSwgYW5kIGEgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25TcGVjCi0gICAgICAgICAgICAgICAgdG8gcGFzcyB0byB0aGUgZ2V0Q29ubmVjdGlvbiAtIENvbm5lY3QgaW4gYSBub24tbWFuYWdlZAotICAgICAgICAgICAgICAgIHdheSBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IEFuCi0gICAgICAgICAgICAgICAgRUlTQ29ubmVjdGlvblNwZWMgbXVzdCBiZSBwcm92aWRlZCB0byBkZWZpbmUgaG93IHRvCi0gICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgRUlTIGFkYXB0ZXIuIFRoZSBFSVMgcGxhdGZvcm0gY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICB0byBwcm92aWRlIGRhdGFzb3VyY2UvZHJpdmVyIHNwZWNpZmljIGJlaGF2b2lyIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICBJbnRlcmFjdGlvblNwZWMgYW5kIFJlY29yZCBjb252ZXJzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJRGVmaW5lcyBsb2dpbiBhbmQgcGxhdGZvcm0gdHlwZSB0byBiZSB1c2VkCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgIAkJCTx4c2Q6c2VxdWVuY2U+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIgotICAgIAkJCQkJdHlwZT0ieHNkOmJvb2xlYW4iIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgCQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIKLSAgICAJCQkJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotCi0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJPC94c2Q6c2VxdWVuY2U+Ci0gICAgCQk8L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHBvb2xlZCBpbiBhCi0gICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1pbiBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGF3YXlzIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZWFkIGNvbm5lY3Rpb24gcG9vbCBpcyB1c2VkIGZvciByZWFkIGFjY2VzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgdGhlIHNlcnZlciBzZXNzaW9uLiBBbnkgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbHMgY2FuIGJlCi0gICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHJlYWQgcG9vbCBob3dldmVyIHRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoaXMKLSAgICAgICAgICAgICAgICBwb29sIGFsbG93cyBmb3IgY29uY3VycmVudCByZWFkcyBhZ2FpbnN0IHRoZSBzYW1lIEpEQkMKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBKREJDIGNvbm5lY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVhZCBhY2Nlc3MuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSByZWFkIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCBhcmUgZXhjbHVzaXZlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tb24gbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgSmF2YSBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgRWNsaXBzZUxpbmsgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWxldmVsIiBkZWZhdWx0PSJpbmZvIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9mZiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2V2ZXJlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmZvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb25maWciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lc3QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWxlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbG9nZ2luZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBTZXJ2ZXIgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2dpbmctb3B0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWV4Y2VwdGlvbi1zdGFja3RyYWNlIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBleGNlcHRpb24gc3RhY2t0cmFjZS4gV2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50LCB0aGUgc3RhY2t0cmFjZSBpcyBsb2dnZWQgZm9yIEZJTkVSCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBsZXNzIChGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtdGhyZWFkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyB0aHJlYWQuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCBpcyBsb2dnZWQgZm9yIEZJTkUgb3IgbGVzcyAoRklORVIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1zZXNzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHNlc3Npb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIHNlc3Npb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGNvbm5lY3Rpb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1kYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGRhdGUuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20gaXMgUk1JCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uLWNvbm5lY3Rpb24tZXJyb3IiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iRGlzY2FyZENvbm5lY3Rpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZiAiRGlzY2FyZENvbm5lY3Rpb24iIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAiS2VlcENvbm5lY3Rpb24iLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBSQ00gc2VydmljZSBzaG91bGQgYmUgZHJvcHBlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21tdW5pY2F0aW9uIGVycm9yIHdpdGggdGhhdCBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjYXJkQ29ubmVjdGlvbiIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NhcmRDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlIFJNSSB0cmFuc3BvcnQgbWVjaGFuaXNtLiBUaGUKLSAgICAgICAgICAgICAgICBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbmQtbW9kZSIgZGVmYXVsdD0iQXN5bmNocm9ub3VzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIgb3IgIlN5bmNocm9ub3VzIi4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBSQ00gcHJvcGFnYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCBkb2VzIG5vdCB3YWl0IGZvciBjb21tYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGluIGFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5IHNldHRpbmdzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBkZWZhdWx0IERpc2NvdmVyeSB3aXRoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgcm1pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im11bHRpY2FzdC1ncm91cC1hZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMjI2LjEwLjEyLjY0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aWNhc3QtcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMTIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdW5jZW1lbnQtZGVsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMTAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbXVsdGljYXN0IGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyAiMTAwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2tldC10aW1lLXRvLWxpdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdGltZS10by1saXZlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXRzIHRoYXQgYXJlIHNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgRGlzY292ZXJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsc3RpY2FzdCBzb2NrZXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZWxlbWVudCBpcyAiMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJtaS1yZWdpc3RyeS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygcm1pIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBSTUkgcmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktaWlvcC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFJNSS1JSU9QIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YKLSAgICAgICAgICAgICAgICB0aGUgUkNNLiBUaGUgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icm1pLXRyYW5zcG9ydCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbXMtdG9waWMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBKTVMgdG9waWMgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWhvc3QtdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtY29ubmVjdGlvbi1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLWpncm91cHMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBPQzRKIEpHcm91cHMgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgbWVjaGFuaXNtIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1zaW5nbGUtdGhyZWFkZWQtbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN1bi1jb3JiYS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFN1biBDT1JCQSB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGVmaW5lZC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdXNlciBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBmb3IgbmFtaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZG1pbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJwYXNzd29yZCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPCEtLSAgVE9ETzogTmVlZCB0byBoYXZlIGEgbm9uIFdlYkxvZ2ljIChwcmV2aW91c2x5IE9DNEopIGRlZmF1bHQgb3Igcm91dGUgdGhyb3VnaCBzZXJ2ZXIgcGxhdGZvcm0gYnkgZGVmYXVsdCAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsLWNvbnRleHQtZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0id2VibG9naWMuam5kaS5XTEluaXRpYWxDb250ZXh0RmFjdG9yeSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgY29udGV4dCBmYWN0b3J5IGNsYXNzIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtaW5nIHNlcnZpY2UgcmVxdWlyZXMgZXh0cmEgcHJvcGVydHkgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgRWNsaXBzZUxpbmsgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iNTAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lCi0gICAgICAgICAgICAgICAgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwKLSAgICAgICAgICAgICAgICB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBkb2N1bWVudCBwcmVzZXJ2YXRpb24KLSAgICAgICAgCQlzdHJhdGVneSB3aWxsIGJlIHVzZWQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQk8L3hzZDplbGVtZW50PgotICAgIAk8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBub2RlIG9yZGVyaW5nIHN0cmF0ZWd5IHdpbGwKLSAgICAJCQliZSB1c2VkLgotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj48L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uIFBvbGljeSB0aGF0Ci0gICAgICAgIAkJYWNjZXNzZXMgdGhlIHNlc3Npb24gY2FjaGUgdG8gc3RvcmUgT2JqZWN0cyBhbmQgdGhlaXIKLSAgICAgICAgCQlhc3NvY2lhdGVkIG5vZGVzLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQSBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0byBpbmRpY2F0ZSB0aGF0IG5vCi0gICAgICAgIAkJZG9jdW1lbnQgcHJlc2VydmF0aW9uIHdvcmsgc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdGhhdAotICAgICAgICAJCW1haW50YWlucyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBKYXZhCi0gICAgICAgIAkJT2JqZWN0cyBhbmQgdGhlIFhNTE5vZGVzIHRoZXkgb3JpZ2luYXRlZCBmcm9tLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IHNpbXBseQotICAgICAgICAJCWFwcGVuZHMgdGhlIG5ldyBjaGlsZCBlbGVtZW50IHRvIHRoZSBwYXJlbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGlnbm9yZXMgYW55Ci0gICAgICAgIAkJbmV3IGVsZW1lbnRzIHdoZW4gdXBkYXRpbmcgYSBjYWNoZWQgZG9jdW1lbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBhZGRzIG5ldwotICAgICAgICAJCWVsZW1lbnRzIHRvIGFuIFhNTCBEb2N1bWVudCBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVkCi0gICAgICAgIAkJc2libGluZyBpbiB0aGVpciBjb250ZXh0LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4yLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODI0MjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMS4yCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIAotLS0+Ci08IS0tIAotCi1YTUwgU2NoZW1hIGRlZmluaXRpb24gZm9yIHRoZSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIFByb2plY3QgU2Vzc2lvbiBDb25maWd1cmF0aW9uIGZpbGUuIEluc3RhbmNlcwotb2YgdGhpcyBmaWxlIGFyZSB0eXBpY2FsbHkgbG9jYXRlZCBhczogJ01FVEEtSU5GL3Nlc3Npb25zLnhtbCcKLQotIC0tPgotCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIxLjIiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9ucyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSByb290IGVsZW1lbnQgYW5kIGV4aXN0cyBvbmx5IGZvciBYTUwKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIiB0eXBlPSJzZXNzaW9uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgc2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgZWxlbWVudCB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gaXRlbQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1wbGF0Zm9ybSIgdHlwZT0ic2VydmVyLXBsYXRmb3JtIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZS1jb21tYW5kIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBlbGVtZW50IHRoYXQgZGVmaW5lIHRoZSBSZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIE1vZHVsZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iRWNsaXBzZUxpbmtDb21tYW5kQ2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZlYXR1cmVzLCB0aGUgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1zeW5jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBlbGVtZW50LiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG9uIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgc2VuZGluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FjaGUgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0cmFuc3BvcnQtbWFuYWdlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUk1JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9maWxlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIGlmIHRoZSBwcm9maWxlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlY2xpcHNlbGluayIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHNlc3Npb24gd2lsbCB1c2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBleGNlcHRpb25zIGdlbmVyYXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nIiB0eXBlPSJsb2ciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWN1c3RvbWl6ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHNlc3Npb24gY3VzdG9taXplcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdG8gcnVuIG9uIGEgbG9hZGVkIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3aGljaCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybSB0byB1c2UsIEpUQSBzZXR0aW5ncyBhbmQgcnVudGltZSBzZXJ2aWNlcwotICAgICAgICAgICAgICAgIHNldHRpbmdzCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1ydW50aW1lLXNlcnZpY2VzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgSk1YIE1CZWFuIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkaW5nIHJ1bnRpbWUgc2VydmljZXMgaXMgZGVwbG95ZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLWp0YSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBzZXNzaW9uIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZSB3aXRoIHRoZSBKVEEgKGkuZS4gd2hldGhlciB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiBUaGUgY2hvaWNlIG9mIHNlcnZlci1jbGFzcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b20tcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLkN1c3RvbVNlcnZlclBsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5QbGF0Zm9ybUJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSB3aGljaCBzZXJ2ZXIgcGxhdGZvcm0gdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDQtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMi1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTExMTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIi8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTcwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy04MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtOS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtMTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS00MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYm9zcy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1icm9rZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXMgYSBzaW5nbGUgdmlldyB0byBhIHNlc3Npb24gdGhhdAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50bHkgYWNjZXNzZXMgbXVsdHBsZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb2plY3QiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieG1sIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpbnRvIEVjbGlwc2VMaW5rLCB0aGUKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgZG8gYWxsIG9mIGl0cyByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi0gICAgICAgICAgICAgICAgb2JqZWN0cyB0aHJvdWdoIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBhbHNvIG1hbmFnZXMKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIHVuaXRzIG9mIHdvcmsuIFRoZSBkYXRhYmFzZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgaW50ZW5kZWQgZm9yIHVzYWdlIGluIHR3by10aWVyIGNsaWVudC1zZXJ2ZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIEFsdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gYSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBzaXR1YXRpb24sIGl0IGlzIGxpbWl0dGVkIHRvIG9ubHkgaGF2aW5nIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgb25seSBhbGxvd3MgYSBzaW5nbGUgb3BlbgotICAgICAgICAgICAgICAgIGRhdGFiYXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LXByb2plY3QiIHR5cGU9InByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9qZWN0IChjbGFzcyBvciB4bWwpIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGFzIHRoZSBwcmltYXJ5IHByb2plY3QgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHByb2plY3RzIHdpbGwgaGF2ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBhcHBlbmRlZCB0byB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElzIGFuIGV4dGVuc2lvbiBvZiBhIERhdGFiYXNlU2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2xzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gcG9vbHMgYXJlIG9ubHkgZm9yIHVzYWdlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIHVzZWQgaWYgdXNpbmcgZXh0ZXJuYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlYWQtY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0id3JpdGUtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2VxdWVuY2UtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgdGFnIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGRlZmF1bHQgY2xpZW50IHNlc3Npb25zIGFyZSBhY3F1aXJlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciByZWFkcywgcmVxdWlyZWQgZm9yIFZQRCwgb3IgdXNlciBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBzZWN1cml0eS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXp5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGEgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxkIHVwZnJvbnQgaW4gdGhlIGNsaWVudCBzZXNzaW9uLCBvciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCB3aGVuIG5lZWRlZCBhbmQgdGhlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbW1vbiBmaWVsZHMgZm9yIGRhdGFiYXNlLWxvZ2luIGFuZCBlaXMtbG9naW4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1xdWFsaWZpZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXIgZm9yIGFsbCB0YWJsZXMuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGFibGUgb3IgZGF0YWJhc2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhYmxlIGV4aXN0cyBvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgc3VjaCBhcyBPcmFjbGUgYW5kIERCMi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBzZXNzaW9uIHdpbGwgYmUgdXNpbmcgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiBhIGxvZ2luLgotICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgZXh0cmEgcHJvcGVydGllcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBIb2xkcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgIHRvIGEgSkRCQyBkcml2ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkcml2ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlciBjbGFzcyBpcyB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciB0aGUgSkRCQyBkcml2ZXIgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCBvZiBhIGRhdGFzb3VyY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHVzZWQgYnkgdGhlIHNlc3Npb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb29rdXAtZW51bSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGJpbmQgYWxsIGFyZ3VtZW50cyB0byBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgcHJlcGFyZWQgc3RhdGVtZW50cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGxhcmdlIGJpbmFyeSBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHdpbGwgcHJpbnQgdGhpcyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGhleCB0aHJvdWdoIHRoZSBKREJDIGJpbmFyeSBleGNhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlLiBCb3RoIGJpbmRpbmcgYW5kIHByaW50aW5nIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBsaW1pdHMgb24gYWxsIGRhdGFiYXNlcyAoZS5nLiA1awotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMyaykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmctYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGJvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIGhlbHAgYmVhbiBpbnRyb3NwZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3JlIGxhcmdlIGJpbmFyeSBkYXRhLiBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHRoZSBtYXggc2l6ZSBmb3IgcmVhZGluZy93cml0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHNvbWUgSkRCQyBkcml2ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXhwZWN0cyB1cHBlciBjYXNlIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZG9lcyBub3QgcmV0dXJuIGNvbnNpc3RlbnQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgZHJpdmVyIGxldmVsIGRhdGEgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZC4gVGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgYXMgc29tZSBkcml2ZXJzIHBlcmZvcm0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRoZW1zZWx2ZXMgaW5jb3JyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQ0hBUiBmaWVsZCB2YWx1ZXMgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBibGFua3MgdHJpbW1lZCwgdGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyBmYWNpbGl0eSBhbGxvd3MgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucyB0byBiZSBzdWJtaXR0ZWQgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBmb3IgcHJvY2Vzc2luZyBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXR0aW5nIG11bHRpcGxlIHVwZGF0ZXMgdG9nZXRoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5LCBjYW4gZ3JlYXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHRhZyB3aXRoIHRydWUgaW5kaWNhdGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIHRoYXQgdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIHdyaXRpbmcuIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBpcyBkaXNhYmxlZC4gU2V0dGluZyB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZhbHNlIGluZGljYXRlcyB0byBFY2xpcHNlTGluayB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgd2lsbCByZXZlcnQgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHdoaWNoIGlzIHRvIGRlbGVnYXRlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2ggd3JpdGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1iYXRjaC13cml0aW5nLXNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzIwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBmb3IgdGhlIG1heCBiYXRjaCB3cml0aW5nIHNpemUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgdGhlIGJhdGNoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbGltaXRlZCBhcyBtb3N0IGRhdGFiYXNlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0IGxpbWl0cy4gVGhlIHNpemUgaXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgdGhlIGRlZmF1bHQgaXMgMzIwMDAgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXRpdmUtc3FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIHNwZWNpZmljIHNxbCBncmFtbWFyIG5vdCBKREJDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljLiBUaGlzIGlzIGJlY2F1c2UgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyaWRnZXMgdG8gbm90IHN1cHBvcnQgdGhlIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBzdGFuZGFyZC4gQnkgZGVmYXVsdCBFY2xpcHNlTGluayB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKREJDIHNxbCBncmFtbWFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0ic3RydWN0LWNvbnZlcnRlcnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taGVhbHRoLXZhbGlkYXRlZC1vbi1lcnJvciIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRydWUgd2lsbCBjYXVzZSBFY2xpcHNlTGluayB0byBwaW5nIGRhdGFiYXNlIHRvIGRldGVybWluZSBpZiBhbiBTUUxFeGNlcHRpb24gd2FzIGNhdXNlIGJ5IGEgY29tbXVuaWNhdGlvbiBmYWlsdXJlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZXRyeS1hdHRlbXB0LWNvdW50IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgRWNsaXBzZUxpbmsgd2lsbCBtYWtlIGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlbGF5LWJldHdlZW4tcmVjb25uZWN0LWF0dGVtcHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCB3YWl0IGJldHdlZW4gYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmctc3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdmVycmlkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgU1FMIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCBpc3N1ZSB0byBhIGNvbm5lY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGxpdmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb29rdXAtZW51bSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvdW5kLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGFuZCBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gY29ubmVjdCB0aHJvdWdoIEVJUywKLSAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlIENvbm5lY3Rpb25GYWN0b3J5IGFuZCB1c2UKLSAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBnZXRDb25uZWN0aW9uIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSwgYW5kIGEgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25TcGVjCi0gICAgICAgICAgICAgICAgdG8gcGFzcyB0byB0aGUgZ2V0Q29ubmVjdGlvbiAtIENvbm5lY3QgaW4gYSBub24tbWFuYWdlZAotICAgICAgICAgICAgICAgIHdheSBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IEFuCi0gICAgICAgICAgICAgICAgRUlTQ29ubmVjdGlvblNwZWMgbXVzdCBiZSBwcm92aWRlZCB0byBkZWZpbmUgaG93IHRvCi0gICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgRUlTIGFkYXB0ZXIuIFRoZSBFSVMgcGxhdGZvcm0gY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICB0byBwcm92aWRlIGRhdGFzb3VyY2UvZHJpdmVyIHNwZWNpZmljIGJlaGF2b2lyIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICBJbnRlcmFjdGlvblNwZWMgYW5kIFJlY29yZCBjb252ZXJzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJRGVmaW5lcyBsb2dpbiBhbmQgcGxhdGZvcm0gdHlwZSB0byBiZSB1c2VkCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgIAkJCTx4c2Q6c2VxdWVuY2U+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIgotICAgIAkJCQkJdHlwZT0ieHNkOmJvb2xlYW4iIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgCQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIKLSAgICAJCQkJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotCi0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJPC94c2Q6c2VxdWVuY2U+Ci0gICAgCQk8L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHBvb2xlZCBpbiBhCi0gICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1pbiBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGF3YXlzIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZWFkIGNvbm5lY3Rpb24gcG9vbCBpcyB1c2VkIGZvciByZWFkIGFjY2VzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgdGhlIHNlcnZlciBzZXNzaW9uLiBBbnkgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbHMgY2FuIGJlCi0gICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHJlYWQgcG9vbCBob3dldmVyIHRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoaXMKLSAgICAgICAgICAgICAgICBwb29sIGFsbG93cyBmb3IgY29uY3VycmVudCByZWFkcyBhZ2FpbnN0IHRoZSBzYW1lIEpEQkMKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBKREJDIGNvbm5lY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVhZCBhY2Nlc3MuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSByZWFkIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCBhcmUgZXhjbHVzaXZlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tb24gbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgSmF2YSBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgRWNsaXBzZUxpbmsgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWxldmVsIiBkZWZhdWx0PSJpbmZvIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9mZiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2V2ZXJlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmZvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb25maWciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lc3QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWxlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbG9nZ2luZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBTZXJ2ZXIgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2dpbmctb3B0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWV4Y2VwdGlvbi1zdGFja3RyYWNlIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBleGNlcHRpb24gc3RhY2t0cmFjZS4gV2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50LCB0aGUgc3RhY2t0cmFjZSBpcyBsb2dnZWQgZm9yIEZJTkVSCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBsZXNzIChGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtdGhyZWFkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyB0aHJlYWQuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCBpcyBsb2dnZWQgZm9yIEZJTkUgb3IgbGVzcyAoRklORVIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1zZXNzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHNlc3Npb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIHNlc3Npb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGNvbm5lY3Rpb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1kYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGRhdGUuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20gaXMgUk1JCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uLWNvbm5lY3Rpb24tZXJyb3IiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iRGlzY2FyZENvbm5lY3Rpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZiAiRGlzY2FyZENvbm5lY3Rpb24iIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAiS2VlcENvbm5lY3Rpb24iLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBSQ00gc2VydmljZSBzaG91bGQgYmUgZHJvcHBlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21tdW5pY2F0aW9uIGVycm9yIHdpdGggdGhhdCBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjYXJkQ29ubmVjdGlvbiIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NhcmRDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlIFJNSSB0cmFuc3BvcnQgbWVjaGFuaXNtLiBUaGUKLSAgICAgICAgICAgICAgICBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbmQtbW9kZSIgZGVmYXVsdD0iQXN5bmNocm9ub3VzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIgb3IgIlN5bmNocm9ub3VzIi4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBSQ00gcHJvcGFnYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCBkb2VzIG5vdCB3YWl0IGZvciBjb21tYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGluIGFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5IHNldHRpbmdzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBkZWZhdWx0IERpc2NvdmVyeSB3aXRoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgcm1pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im11bHRpY2FzdC1ncm91cC1hZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMjI2LjEwLjEyLjY0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aWNhc3QtcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMTIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdW5jZW1lbnQtZGVsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMTAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbXVsdGljYXN0IGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyAiMTAwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2tldC10aW1lLXRvLWxpdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdGltZS10by1saXZlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXRzIHRoYXQgYXJlIHNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgRGlzY292ZXJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsc3RpY2FzdCBzb2NrZXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZWxlbWVudCBpcyAiMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJtaS1yZWdpc3RyeS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygcm1pIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBSTUkgcmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktaWlvcC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFJNSS1JSU9QIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YKLSAgICAgICAgICAgICAgICB0aGUgUkNNLiBUaGUgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icm1pLXRyYW5zcG9ydCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbXMtdG9waWMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBKTVMgdG9waWMgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWhvc3QtdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtY29ubmVjdGlvbi1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLWpncm91cHMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBPQzRKIEpHcm91cHMgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgbWVjaGFuaXNtIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1zaW5nbGUtdGhyZWFkZWQtbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN1bi1jb3JiYS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFN1biBDT1JCQSB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGVmaW5lZC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdXNlciBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBmb3IgbmFtaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZG1pbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJwYXNzd29yZCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPCEtLSAgVE9ETzogTmVlZCB0byBoYXZlIGEgbm9uIFdlYkxvZ2ljIChwcmV2aW91c2x5IE9DNEopIGRlZmF1bHQgb3Igcm91dGUgdGhyb3VnaCBzZXJ2ZXIgcGxhdGZvcm0gYnkgZGVmYXVsdCAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsLWNvbnRleHQtZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0id2VibG9naWMuam5kaS5XTEluaXRpYWxDb250ZXh0RmFjdG9yeSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgY29udGV4dCBmYWN0b3J5IGNsYXNzIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtaW5nIHNlcnZpY2UgcmVxdWlyZXMgZXh0cmEgcHJvcGVydHkgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgRWNsaXBzZUxpbmsgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iNTAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lCi0gICAgICAgICAgICAgICAgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwKLSAgICAgICAgICAgICAgICB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBkb2N1bWVudCBwcmVzZXJ2YXRpb24KLSAgICAgICAgCQlzdHJhdGVneSB3aWxsIGJlIHVzZWQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQk8L3hzZDplbGVtZW50PgotICAgIAk8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBub2RlIG9yZGVyaW5nIHN0cmF0ZWd5IHdpbGwKLSAgICAJCQliZSB1c2VkLgotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj48L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uIFBvbGljeSB0aGF0Ci0gICAgICAgIAkJYWNjZXNzZXMgdGhlIHNlc3Npb24gY2FjaGUgdG8gc3RvcmUgT2JqZWN0cyBhbmQgdGhlaXIKLSAgICAgICAgCQlhc3NvY2lhdGVkIG5vZGVzLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQSBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0byBpbmRpY2F0ZSB0aGF0IG5vCi0gICAgICAgIAkJZG9jdW1lbnQgcHJlc2VydmF0aW9uIHdvcmsgc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdGhhdAotICAgICAgICAJCW1haW50YWlucyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBKYXZhCi0gICAgICAgIAkJT2JqZWN0cyBhbmQgdGhlIFhNTE5vZGVzIHRoZXkgb3JpZ2luYXRlZCBmcm9tLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IHNpbXBseQotICAgICAgICAJCWFwcGVuZHMgdGhlIG5ldyBjaGlsZCBlbGVtZW50IHRvIHRoZSBwYXJlbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGlnbm9yZXMgYW55Ci0gICAgICAgIAkJbmV3IGVsZW1lbnRzIHdoZW4gdXBkYXRpbmcgYSBjYWNoZWQgZG9jdW1lbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBhZGRzIG5ldwotICAgICAgICAJCWVsZW1lbnRzIHRvIGFuIFhNTCBEb2N1bWVudCBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVkCi0gICAgICAgIAkJc2libGluZyBpbiB0aGVpciBjb250ZXh0LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDgyMWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIAotLS0+Ci08IS0tIAotCi1YTUwgU2NoZW1hIGRlZmluaXRpb24gZm9yIHRoZSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIFByb2plY3QgU2Vzc2lvbiBDb25maWd1cmF0aW9uIGZpbGUuIEluc3RhbmNlcwotb2YgdGhpcyBmaWxlIGFyZSB0eXBpY2FsbHkgbG9jYXRlZCBhczogJ01FVEEtSU5GL3Nlc3Npb25zLnhtbCcKLQotIC0tPgotCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIyLjAiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9ucyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSByb290IGVsZW1lbnQgYW5kIGV4aXN0cyBvbmx5IGZvciBYTUwKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIiB0eXBlPSJzZXNzaW9uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgc2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgZWxlbWVudCB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gaXRlbQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1wbGF0Zm9ybSIgdHlwZT0ic2VydmVyLXBsYXRmb3JtIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZS1jb21tYW5kIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBlbGVtZW50IHRoYXQgZGVmaW5lIHRoZSBSZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIE1vZHVsZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iRWNsaXBzZUxpbmtDb21tYW5kQ2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZlYXR1cmVzLCB0aGUgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1zeW5jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBlbGVtZW50LiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG9uIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgc2VuZGluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FjaGUgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0cmFuc3BvcnQtbWFuYWdlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUk1JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9maWxlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIGlmIHRoZSBwcm9maWxlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlY2xpcHNlbGluayIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHNlc3Npb24gd2lsbCB1c2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBleGNlcHRpb25zIGdlbmVyYXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nIiB0eXBlPSJsb2ciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWN1c3RvbWl6ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHNlc3Npb24gY3VzdG9taXplcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdG8gcnVuIG9uIGEgbG9hZGVkIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3aGljaCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybSB0byB1c2UsIEpUQSBzZXR0aW5ncyBhbmQgcnVudGltZSBzZXJ2aWNlcwotICAgICAgICAgICAgICAgIHNldHRpbmdzCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1ydW50aW1lLXNlcnZpY2VzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgSk1YIE1CZWFuIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkaW5nIHJ1bnRpbWUgc2VydmljZXMgaXMgZGVwbG95ZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLWp0YSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBzZXNzaW9uIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZSB3aXRoIHRoZSBKVEEgKGkuZS4gd2hldGhlciB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiBUaGUgY2hvaWNlIG9mIHNlcnZlci1jbGFzcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b20tcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLkN1c3RvbVNlcnZlclBsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5QbGF0Zm9ybUJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSB3aGljaCBzZXJ2ZXIgcGxhdGZvcm0gdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDQtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMi1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTExMTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIi8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTcwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy04MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtOS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtMTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS00MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCURlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAJCQk8eHNkOnNlcXVlbmNlPgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIKLSAgICAJCQkJCXR5cGU9InhzZDpib29sZWFuIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgIAkJCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiCi0gICAgCQkJCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLQotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCTwveHNkOnNlcXVlbmNlPgotICAgIAkJPC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBXZWJMb2dpYyAocHJldmlvdXNseSBPQzRKKSBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IndlYmxvZ2ljLmpuZGkuV0xJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggZG9jdW1lbnQgcHJlc2VydmF0aW9uCi0gICAgICAgIAkJc3RyYXRlZ3kgd2lsbCBiZSB1c2VkLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJPC94c2Q6ZWxlbWVudD4KLSAgICAJPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggbm9kZSBvcmRlcmluZyBzdHJhdGVneSB3aWxsCi0gICAgCQkJYmUgdXNlZC4KLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvbiBQb2xpY3kgdGhhdAotICAgICAgICAJCWFjY2Vzc2VzIHRoZSBzZXNzaW9uIGNhY2hlIHRvIHN0b3JlIE9iamVjdHMgYW5kIHRoZWlyCi0gICAgICAgIAkJYXNzb2NpYXRlZCBub2Rlcy4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUEgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdG8gaW5kaWNhdGUgdGhhdCBubwotICAgICAgICAJCWRvY3VtZW50IHByZXNlcnZhdGlvbiB3b3JrIHNob3VsZCBiZSBkb25lLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRoYXQKLSAgICAgICAgCQltYWludGFpbnMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gSmF2YQotICAgICAgICAJCU9iamVjdHMgYW5kIHRoZSBYTUxOb2RlcyB0aGV5IG9yaWdpbmF0ZWQgZnJvbS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBzaW1wbHkKLSAgICAgICAgCQlhcHBlbmRzIHRoZSBuZXcgY2hpbGQgZWxlbWVudCB0byB0aGUgcGFyZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBpZ25vcmVzIGFueQotICAgICAgICAJCW5ldyBlbGVtZW50cyB3aGVuIHVwZGF0aW5nIGEgY2FjaGVkIGRvY3VtZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgYWRkcyBuZXcKLSAgICAgICAgCQllbGVtZW50cyB0byBhbiBYTUwgRG9jdW1lbnQgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlZAotICAgICAgICAJCXNpYmxpbmcgaW4gdGhlaXIgY29udGV4dC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMS54c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjEueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY5NzExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotICAgICBwa3JvZ2gtIHVwZGF0ZSB2ZXJzaW9uIG51bWJlciB0byAyLjEKLSAgICAgYWdvZXJsZXIgLSBhZGQgTmV0IHdlYXZlciBzdXBwb3J0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gIAotLS0+Ci08IS0tIAotCi1YTUwgU2NoZW1hIGRlZmluaXRpb24gZm9yIHRoZSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIFByb2plY3QgU2Vzc2lvbiBDb25maWd1cmF0aW9uIGZpbGUuIEluc3RhbmNlcwotb2YgdGhpcyBmaWxlIGFyZSB0eXBpY2FsbHkgbG9jYXRlZCBhczogJ01FVEEtSU5GL3Nlc3Npb25zLnhtbCcKLQotIC0tPgotCi08eHNkOnNjaGVtYSB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiB2ZXJzaW9uPSIyLjEiPgotICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9ucyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSByb290IGVsZW1lbnQgYW5kIGV4aXN0cyBvbmx5IGZvciBYTUwKLSAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uIiB0eXBlPSJzZXNzaW9uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyBhIHBhcnRpY3VsYXIgc2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgZWxlbWVudCB1c2VkIHRvIGRlc2NyaWJlIGEgc3RyaW5nIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYW4gaXRlbQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1wbGF0Zm9ybSIgdHlwZT0ic2VydmVyLXBsYXRmb3JtIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbW90ZS1jb21tYW5kIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBlbGVtZW50IHRoYXQgZGVmaW5lIHRoZSBSZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kIE1vZHVsZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgc3luY2hyb25pemF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iRWNsaXBzZUxpbmtDb21tYW5kQ2hhbm5lbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29tbWFuZHMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lIHdoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGZlYXR1cmVzLCB0aGUgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1zeW5jIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBlbGVtZW50LiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG9uIGNhY2hlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cgc2VuZGluZyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZpbmcgY2FjaGUgc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ0cmFuc3BvcnQtbWFuYWdlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgcmVtb3RlLWNvbW1hbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgUk1JCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9maWxlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCByZXByZXNlbnRzIGlmIHRoZSBwcm9maWxlciB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGJ5IHRoZSBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJkbXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJlY2xpcHNlbGluayIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjZXB0aW9uLWhhbmRsZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgdGhlIHNlc3Npb24gd2lsbCB1c2UgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBleGNlcHRpb25zIGdlbmVyYXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nIiB0eXBlPSJsb2ciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLWN1c3RvbWl6ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIHNlc3Npb24gY3VzdG9taXplcgotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdG8gcnVuIG9uIGEgbG9hZGVkIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5vZGUgZWxlbWVudCB0aGF0IGRlc2NyaWJlcyB3aGljaCBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBwbGF0Zm9ybSB0byB1c2UsIEpUQSBzZXR0aW5ncyBhbmQgcnVudGltZSBzZXJ2aWNlcwotICAgICAgICAgICAgICAgIHNldHRpbmdzCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1ydW50aW1lLXNlcnZpY2VzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgSk1YIE1CZWFuIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkaW5nIHJ1bnRpbWUgc2VydmljZXMgaXMgZGVwbG95ZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5hYmxlLWp0YSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBzZXNzaW9uIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZSB3aXRoIHRoZSBKVEEgKGkuZS4gd2hldGhlciB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiBUaGUgY2hvaWNlIG9mIHNlcnZlci1jbGFzcyB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IGJlIGNob3NlbiBiYXNlZCBvbiB0aGUgdHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b20tcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VydmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLkN1c3RvbVNlcnZlclBsYXRmb3JtIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHN1YmNsYXNzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5QbGF0Zm9ybUJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3BlY2lmeSB3aGljaCBzZXJ2ZXIgcGxhdGZvcm0gdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTkwMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDQtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMi1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMDEzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTExMTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIi8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtNjEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTcwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy04MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtOS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtMTAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS00MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNTEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5ldHdlYXZlci03MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbi1icm9rZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXMgYSBzaW5nbGUgdmlldyB0byBhIHNlc3Npb24gdGhhdAotICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50bHkgYWNjZXNzZXMgbXVsdHBsZSBkYXRhYmFzZXMuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlc3Npb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InByb2plY3QiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ieG1sIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJwcm9qZWN0IiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSBzZXNzaW9uIGlzIHRoZSBwcmltYXJ5IGludGVyZmFjZSBpbnRvIEVjbGlwc2VMaW5rLCB0aGUKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgZG8gYWxsIG9mIGl0cyByZWFkaW5nIGFuZCB3cml0aW5nIG9mCi0gICAgICAgICAgICAgICAgb2JqZWN0cyB0aHJvdWdoIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBhbHNvIG1hbmFnZXMKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMgYW5kIHVuaXRzIG9mIHdvcmsuIFRoZSBkYXRhYmFzZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgaW50ZW5kZWQgZm9yIHVzYWdlIGluIHR3by10aWVyIGNsaWVudC1zZXJ2ZXIKLSAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIEFsdGhvdWdoIGl0IGNvdWxkIGJlIHVzZWQgaW4gYSBzZXJ2ZXIKLSAgICAgICAgICAgICAgICBzaXR1YXRpb24sIGl0IGlzIGxpbWl0dGVkIHRvIG9ubHkgaGF2aW5nIGEgc2luZ2xlCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgb25seSBhbGxvd3MgYSBzaW5nbGUgb3BlbgotICAgICAgICAgICAgICAgIGRhdGFiYXNlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LXByb2plY3QiIHR5cGU9InByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9qZWN0IChjbGFzcyBvciB4bWwpIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGFzIHRoZSBwcmltYXJ5IHByb2plY3QgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1wcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icHJvamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsIHByb2plY3RzIHdpbGwgaGF2ZSB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycyBhcHBlbmRlZCB0byB0aGUgcHJpbWFyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1zZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIElzIGFuIGV4dGVuc2lvbiBvZiBhIERhdGFiYXNlU2Vzc2lvbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2xzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gcG9vbHMgYXJlIG9ubHkgZm9yIHVzYWdlIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgY29ubmVjdGlvbiBwb29saW5nIGFuZCBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlIHVzZWQgaWYgdXNpbmcgZXh0ZXJuYWwgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29saW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InJlYWQtY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0id3JpdGUtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ic2VxdWVuY2UtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoaXMgdGFnIHRvIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2UgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGRlZmF1bHQgY2xpZW50IHNlc3Npb25zIGFyZSBhY3F1aXJlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciByZWFkcywgcmVxdWlyZWQgZm9yIFZQRCwgb3IgdXNlciBiYXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBzZWN1cml0eS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsYXp5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGEgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNxdWlyZWQgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxkIHVwZnJvbnQgaW4gdGhlIGNsaWVudCBzZXNzaW9uLCBvciBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3F1aXJlZCB3aGVuIG5lZWRlZCBhbmQgdGhlbiByZWxlYXNlZC4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbW1vbiBmaWVsZHMgZm9yIGRhdGFiYXNlLWxvZ2luIGFuZCBlaXMtbG9naW4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGxhdGZvcm0tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1xdWFsaWZpZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgZGVmYXVsdCBxdWFsaWZpZXIgZm9yIGFsbCB0YWJsZXMuIFRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0aGUgY3JlYXRvciBvZiB0aGUgdGFibGUgb3IgZGF0YWJhc2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRhYmxlIGV4aXN0cyBvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZXMgc3VjaCBhcyBPcmFjbGUgYW5kIERCMi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgY29ubmVjdGlvbiBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBzZXNzaW9uIHdpbGwgYmUgdXNpbmcgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHRyYW5zYWN0aW9uIGNvbnRyb2xsZXIKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2luZyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHkgc3RyaW5nIHdpbGwgYmUgdXNlZCBhcyBhIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2VzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VxdWVuY2UgaGFzIHVuaXF1ZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzZXF1ZW5jZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiBhIGxvZ2luLgotICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCB0byBkZWZpbmUgZXh0cmEgcHJvcGVydGllcyBvbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBIb2xkcyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gY29ubmVjdAotICAgICAgICAgICAgICAgIHRvIGEgSkRCQyBkcml2ZXIuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkcml2ZXItY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRyaXZlciBjbGFzcyBpcyB0aGUgSmF2YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGZvciB0aGUgSkRCQyBkcml2ZXIgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIChlLmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLmpkYmMub2RiYy5KZGJjT2RiY0RyaXZlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhc291cmNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCBvZiBhIGRhdGFzb3VyY2UgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIHVzZWQgYnkgdGhlIHNlc3Npb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9va3VwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb29rdXAtZW51bSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGJpbmQgYWxsIGFyZ3VtZW50cyB0byBhbnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1FMIHN0YXRlbWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgcHJlcGFyZWQgc3RhdGVtZW50cyBzaG91bGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY2FjaGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYnl0ZS1hcnJheS1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGxhcmdlIGJpbmFyeSBkYXRhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHdpbGwgcHJpbnQgdGhpcyBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGhleCB0aHJvdWdoIHRoZSBKREJDIGJpbmFyeSBleGNhcGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhdXNlLiBCb3RoIGJpbmRpbmcgYW5kIHByaW50aW5nIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaW91cyBsaW1pdHMgb24gYWxsIGRhdGFiYXNlcyAoZS5nLiA1awotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIDMyaykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJpbmctYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHN0cmluZ3Mgc2hvdWxkIGJlIGJvdW5kLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VkIHRvIGhlbHAgYmVhbiBpbnRyb3NwZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3JlIGxhcmdlIGJpbmFyeSBkYXRhLiBUaGlzIGNhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHRoZSBtYXggc2l6ZSBmb3IgcmVhZGluZy93cml0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHNvbWUgSkRCQyBkcml2ZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBjYW4gYmUgdXNlZCBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXhwZWN0cyB1cHBlciBjYXNlIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZG9lcyBub3QgcmV0dXJuIGNvbnNpc3RlbnQgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBkaWZmZXJlbnQgZGF0YWJhc2VzKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgZHJpdmVyIGxldmVsIGRhdGEgY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZC4gVGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgYXMgc29tZSBkcml2ZXJzIHBlcmZvcm0gZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uIHRoZW1zZWx2ZXMgaW5jb3JyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgQ0hBUiBmaWVsZCB2YWx1ZXMgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZyBibGFua3MgdHJpbW1lZCwgdGhpcyBjYW4gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyBmYWNpbGl0eSBhbGxvd3MgbXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgb3BlcmF0aW9ucyB0byBiZSBzdWJtaXR0ZWQgdG8gYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBmb3IgcHJvY2Vzc2luZyBhdCBvbmNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJtaXR0aW5nIG11bHRpcGxlIHVwZGF0ZXMgdG9nZXRoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW5kaXZpZHVhbGx5LCBjYW4gZ3JlYXRseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyB0aGlzIHRhZyB3aXRoIHRydWUgaW5kaWNhdGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIHRoYXQgdGhlIEpEQkMgZHJpdmVyIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdGNoIHdyaXRpbmcuIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZyBpcyBkaXNhYmxlZC4gU2V0dGluZyB0aGlzIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZhbHNlIGluZGljYXRlcyB0byBFY2xpcHNlTGluayB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgd2lsbCByZXZlcnQgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3VyIHdoaWNoIGlzIHRvIGRlbGVnYXRlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rJ3MgaW50ZXJuYWwgYmF0Y2ggd3JpdGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1iYXRjaC13cml0aW5nLXNpemUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzIwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBmb3IgdGhlIG1heCBiYXRjaCB3cml0aW5nIHNpemUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0LiBUaGlzIGFsbG93cyBmb3IgdGhlIGJhdGNoIHNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgbGltaXRlZCBhcyBtb3N0IGRhdGFiYXNlIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0IGxpbWl0cy4gVGhlIHNpemUgaXMgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycywgdGhlIGRlZmF1bHQgaXMgMzIwMDAgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsIHZhbHVlIGRlcGVuZHMgb24gdGhlIGRhdGFiYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYXRpdmUtc3FsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIHNwZWNpZmljIHNxbCBncmFtbWFyIG5vdCBKREJDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljLiBUaGlzIGlzIGJlY2F1c2UgdW5mb3J0dW5hdGVseQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb21lIGJyaWRnZXMgdG8gbm90IHN1cHBvcnQgdGhlIGZ1bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBzdGFuZGFyZC4gQnkgZGVmYXVsdCBFY2xpcHNlTGluayB1c2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBKREJDIHNxbCBncmFtbWFyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0ic3RydWN0LWNvbnZlcnRlcnMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24taGVhbHRoLXZhbGlkYXRlZC1vbi1lcnJvciIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPklmIHRydWUgd2lsbCBjYXVzZSBFY2xpcHNlTGluayB0byBwaW5nIGRhdGFiYXNlIHRvIGRldGVybWluZSBpZiBhbiBTUUxFeGNlcHRpb24gd2FzIGNhdXNlIGJ5IGEgY29tbXVuaWNhdGlvbiBmYWlsdXJlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZXRyeS1hdHRlbXB0LWNvdW50IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgRWNsaXBzZUxpbmsgd2lsbCBtYWtlIGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRlbGF5LWJldHdlZW4tcmVjb25uZWN0LWF0dGVtcHRzIiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRoZSB0aW1lIGluIG1pbGlzZWNvbmRzIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCB3YWl0IGJldHdlZW4gYXR0ZW1wdHMgdG8gcmVjb25uZWN0IGlmIEVjbGlwc2VMaW5rIGlzIGF0dGVtcHRpbmcgdG8gcmV0cnkgYSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InBpbmctc3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5PdmVycmlkZSB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgU1FMIHRoYXQgRWNsaXBzZUxpbmsgd2lsbCBpc3N1ZSB0byBhIGNvbm5lY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGxpdmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb29rdXAtZW51bSI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvdW5kLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb25uZWN0aW9uIGluZm9ybWF0aW9uIGFuZCBkYXRhc291cmNlCi0gICAgICAgICAgICAgICAgcHJvcGVydGllcy4gVGhlcmUgYXJlIHRocmVlIHdheXMgdG8gY29ubmVjdCB0aHJvdWdoIEVJUywKLSAgICAgICAgICAgICAgICAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlIENvbm5lY3Rpb25GYWN0b3J5IGFuZCB1c2UKLSAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBnZXRDb25uZWN0aW9uIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUKLSAgICAgICAgICAgICAgICBDb25uZWN0aW9uRmFjdG9yeSwgYW5kIGEgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25TcGVjCi0gICAgICAgICAgICAgICAgdG8gcGFzcyB0byB0aGUgZ2V0Q29ubmVjdGlvbiAtIENvbm5lY3QgaW4gYSBub24tbWFuYWdlZAotICAgICAgICAgICAgICAgIHdheSBkaXJlY3RseSB0byB0aGUgZHJpdmVyIHNwZWNpZmljIENvbm5lY3Rpb25GYWN0b3J5IEFuCi0gICAgICAgICAgICAgICAgRUlTQ29ubmVjdGlvblNwZWMgbXVzdCBiZSBwcm92aWRlZCB0byBkZWZpbmUgaG93IHRvCi0gICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgRUlTIGFkYXB0ZXIuIFRoZSBFSVMgcGxhdGZvcm0gY2FuIGJlIHVzZWQKLSAgICAgICAgICAgICAgICB0byBwcm92aWRlIGRhdGFzb3VyY2UvZHJpdmVyIHNwZWNpZmljIGJlaGF2b2lyIHN1Y2ggYXMKLSAgICAgICAgICAgICAgICBJbnRlcmFjdGlvblNwZWMgYW5kIFJlY29yZCBjb252ZXJzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1zcGVjLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJRGVmaW5lcyBsb2dpbiBhbmQgcGxhdGZvcm0gdHlwZSB0byBiZSB1c2VkCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgIAkJCTx4c2Q6c2VxdWVuY2U+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIgotICAgIAkJCQkJdHlwZT0ieHNkOmJvb2xlYW4iIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgCQkJCQltYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCIKLSAgICAJCQkJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotCi0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJPC94c2Q6c2VxdWVuY2U+Ci0gICAgCQk8L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgY29ubmVjdGlvbnMgc2hvdWxkIGJlIHBvb2xlZCBpbiBhCi0gICAgICAgICAgICAgICAgc2VydmVyIHNlc3Npb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWluLWNvbm5lY3Rpb25zIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1pbiBudW1iZXIgb2YgY29ubmVjdGlvbnMgdGhhdCB3aWxsIGF3YXlzIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoZSByZWFkIGNvbm5lY3Rpb24gcG9vbCBpcyB1c2VkIGZvciByZWFkIGFjY2VzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgdGhlIHNlcnZlciBzZXNzaW9uLiBBbnkgb2YgdGhlIGNvbm5lY3Rpb24gcG9vbHMgY2FuIGJlCi0gICAgICAgICAgICAgICAgdXNlZCBmb3IgdGhlIHJlYWQgcG9vbCBob3dldmVyIHRoaXMgaXMgdGhlIGRlZmF1bHQuIFRoaXMKLSAgICAgICAgICAgICAgICBwb29sIGFsbG93cyBmb3IgY29uY3VycmVudCByZWFkcyBhZ2FpbnN0IHRoZSBzYW1lIEpEQkMKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBKREJDIGNvbm5lY3Rpb24gc3VwcG9ydAotICAgICAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVhZCBhY2Nlc3MuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29ubmVjdGlvbi1wb29sIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucyBmcm9tIHRoZSByZWFkIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbCBhcmUgZXhjbHVzaXZlIG9yIG5vdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBjb21tb24gbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgSmF2YSBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgRWNsaXBzZUxpbmsgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWxldmVsIiBkZWZhdWx0PSJpbmZvIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBzcGVjaWZpZXMgdGhlIGxvZyBsZXZlbCBmb3IgbG9nZ2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im9mZiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic2V2ZXJlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YXJuaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbmZvIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb25maWciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVyIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lc3QiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWxlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgZmlsZSB0byB3cml0ZSB0aGUgbG9nZ2luZyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBTZXJ2ZXIgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2dpbmctb3B0aW9ucyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nLWV4Y2VwdGlvbi1zdGFja3RyYWNlIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBleGNlcHRpb24gc3RhY2t0cmFjZS4gV2l0aG91dAotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBlbGVtZW50LCB0aGUgc3RhY2t0cmFjZSBpcyBsb2dnZWQgZm9yIEZJTkVSCi0gICAgICAgICAgICAgICAgICAgICAgICBvciBsZXNzIChGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtdGhyZWFkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyB0aHJlYWQuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCBpcyBsb2dnZWQgZm9yIEZJTkUgb3IgbGVzcyAoRklORVIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1zZXNzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHNlc3Npb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIHNlc3Npb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGNvbm5lY3Rpb24uIFdpdGhvdXQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgdGhlIGNvbm5lY3Rpb24gaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC1kYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGRhdGUuIFdpdGhvdXQgdGhpcyBlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRhdGUgaXMgYWx3YXlzIHByaW50ZWQKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZiB0aGUgUkNNLgotICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBtZWNoYW5pc20gaXMgUk1JCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uLWNvbm5lY3Rpb24tZXJyb3IiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iRGlzY2FyZENvbm5lY3Rpb24iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZiAiRGlzY2FyZENvbm5lY3Rpb24iIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAiS2VlcENvbm5lY3Rpb24iLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBSQ00gc2VydmljZSBzaG91bGQgYmUgZHJvcHBlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBjb21tdW5pY2F0aW9uIGVycm9yIHdpdGggdGhhdCBSQ00KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2UuIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICJEaXNjYXJkQ29ubmVjdGlvbiIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJLZWVwQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRpc2NhcmRDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRlZmluZXMgdGhlIFJNSSB0cmFuc3BvcnQgbWVjaGFuaXNtLiBUaGUKLSAgICAgICAgICAgICAgICBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbmQtbW9kZSIgZGVmYXVsdD0iQXN5bmNocm9ub3VzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIgb3IgIlN5bmNocm9ub3VzIi4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBSQ00gcHJvcGFnYXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGFuZCBkb2VzIG5vdCB3YWl0IGZvciBjb21tYW5kIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaCBpdHMgZXhlY3V0aW9uIGluIGFzeW5jaHJvbm91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIHdhaXQgZm9yIGNvbW1hbmQgdG8gZmluaXNoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gaW4gc3luY2hyb25vdXMgbW9kZS4gVGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFzeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY292ZXJ5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY292ZXJ5IHNldHRpbmdzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBkZWZhdWx0IERpc2NvdmVyeSB3aXRoIGl0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHNldHRpbmdzIGlzIGNyZWF0ZWQgd2hlbiB0aGUgcm1pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgc3BlY2lmaWVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im11bHRpY2FzdC1ncm91cC1hZGRyZXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMjI2LjEwLjEyLjY0IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtdWx0aWNhc3QtcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMTIxIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbm5vdW5jZW1lbnQtZGVsYXkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMTAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgbXVsdGljYXN0IGdyb3VwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyAiMTAwMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2tldC10aW1lLXRvLWxpdmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIGRpc2NvdmVyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGUgdGltZS10by1saXZlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYWNrZXRzIHRoYXQgYXJlIHNlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgRGlzY292ZXJ5J3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsc3RpY2FzdCBzb2NrZXQgc2hvdWxkIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQuIFRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZWxlbWVudCBpcyAiMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InJtaS1yZWdpc3RyeS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygcm1pIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hldGhlciBSTUkgcmVnaXN0cnkgc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJybWktaWlvcC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFJNSS1JSU9QIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YKLSAgICAgICAgICAgICAgICB0aGUgUkNNLiBUaGUgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icm1pLXRyYW5zcG9ydCIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbXMtdG9waWMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBKTVMgdG9waWMgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWhvc3QtdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtY29ubmVjdGlvbi1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpY0Nvbm5lY3Rpb25GYWN0b3J5IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iam5kaS1uYW1pbmctc2VydmljZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLWpncm91cHMtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBPQzRKIEpHcm91cHMgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgbWVjaGFuaXNtIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZS1zaW5nbGUtdGhyZWFkZWQtbm90aWZpY2F0aW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN1bi1jb3JiYS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIFN1biBDT1JCQSB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVzZXItZGVmaW5lZC10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdXNlciBpbXBsZW1lbnRlZAotICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBtZWNoYW5pc20gdGhhdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydC1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFVSTCBmb3IgbmFtaW5nIHNlcnZpY2Ugc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJhZG1pbiIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuY3J5cHRpb24tY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuaW50ZXJuYWwuc2VjdXJpdHkuSkNFRW5jcnlwdG9yIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJwYXNzd29yZCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPCEtLSAgVE9ETzogTmVlZCB0byBoYXZlIGEgbm9uIFdlYkxvZ2ljIChwcmV2aW91c2x5IE9DNEopIGRlZmF1bHQgb3Igcm91dGUgdGhyb3VnaCBzZXJ2ZXIgcGxhdGZvcm0gYnkgZGVmYXVsdCAtLT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbml0aWFsLWNvbnRleHQtZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0id2VibG9naWMuam5kaS5XTEluaXRpYWxDb250ZXh0RmFjdG9yeSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWwgY29udGV4dCBmYWN0b3J5IGNsYXNzIGZvciBuYW1pbmcgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNoYW5nZWQuIAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgIGpuZGktbmFtaW5nLXNlcnZpY2UuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtaW5nIHNlcnZpY2UgcmVxdWlyZXMgZXh0cmEgcHJvcGVydHkgdGhhdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZWQgYnkgRWNsaXBzZUxpbmsgYnV0IGl0IGlzIHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iNTAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBSZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lCi0gICAgICAgICAgICAgICAgYW5kIChvcHRpb25hbGx5KSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsCi0gICAgICAgICAgICAgICAgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERhdGFiYXNlIHNlcXVlbmNlIG1lY2hhbmlzbSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVW5hcnkgdGFibGUgc2VxdWVuY2UgLSBzZXF1ZW5jZSBuYW1lIGlzIGEgdGFibGUgbmFtZSwKLSAgICAgICAgICAgICAgICB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWVsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBkb2N1bWVudCBwcmVzZXJ2YXRpb24KLSAgICAgICAgCQlzdHJhdGVneSB3aWxsIGJlIHVzZWQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgIAkJPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgIAkJCXR5cGU9Im5vZGUtb3JkZXJpbmctcG9saWN5IiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQk8L3hzZDplbGVtZW50PgotICAgIAk8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmFubm90YXRpb24+Ci0gICAgCQk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCQkJVGhpcyBlbGVtZW50IHNwZWNpZmllcyB3aGljaCBub2RlIG9yZGVyaW5nIHN0cmF0ZWd5IHdpbGwKLSAgICAJCQliZSB1c2VkLgotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj48L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uIFBvbGljeSB0aGF0Ci0gICAgICAgIAkJYWNjZXNzZXMgdGhlIHNlc3Npb24gY2FjaGUgdG8gc3RvcmUgT2JqZWN0cyBhbmQgdGhlaXIKLSAgICAgICAgCQlhc3NvY2lhdGVkIG5vZGVzLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQSBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0byBpbmRpY2F0ZSB0aGF0IG5vCi0gICAgICAgIAkJZG9jdW1lbnQgcHJlc2VydmF0aW9uIHdvcmsgc2hvdWxkIGJlIGRvbmUuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdGhhdAotICAgICAgICAJCW1haW50YWlucyBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBKYXZhCi0gICAgICAgIAkJT2JqZWN0cyBhbmQgdGhlIFhNTE5vZGVzIHRoZXkgb3JpZ2luYXRlZCBmcm9tLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFwcGVuZC1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IHNpbXBseQotICAgICAgICAJCWFwcGVuZHMgdGhlIG5ldyBjaGlsZCBlbGVtZW50IHRvIHRoZSBwYXJlbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGlnbm9yZXMgYW55Ci0gICAgICAgIAkJbmV3IGVsZW1lbnRzIHdoZW4gdXBkYXRpbmcgYSBjYWNoZWQgZG9jdW1lbnQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBhZGRzIG5ldwotICAgICAgICAJCWVsZW1lbnRzIHRvIGFuIFhNTCBEb2N1bWVudCBiYXNlZCBvbiB0aGUgbGFzdCB1cGRhdGVkCi0gICAgICAgIAkJc2libGluZyBpbiB0aGVpciBjb250ZXh0LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtKcGFQcm9qZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua0pwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZTY4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua0pwYVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKUEEgcHJvamVjdC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKcGFQcm9qZWN0Ci0JZXh0ZW5kcyBKcGFQcm9qZWN0Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBmaWxlCi0JICogPGNvZGU+TUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbDwvY29kZT4gaWYgdGhhdCBmaWxlIGhhcyB0aGUKLQkgKiBFY2xpcHNlTGluayBjb250ZW50IHR5cGUuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luI0RFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4jRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUKLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua01hcHBpbmdLZXlzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9FY2xpcHNlTGlua01hcHBpbmdLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YTJjZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtNYXBwaW5nS2V5cyB7Ci0KLQlTdHJpbmcgQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiYmFzaWNDb2xsZWN0aW9uIjsKLQlTdHJpbmcgQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJiYXNpY01hcCI7Ci0JU3RyaW5nIFRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ0cmFuc2Zvcm1hdGlvbiI7Ci0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInZhcmlhYmxlT25lVG9PbmUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNDU2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIuRWNsaXBzZUxpbmsxXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4KLXsKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMS4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8xXzAgPSAiMS4wIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMSA9ICIxLjEiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDEuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMV8yID0gIjEuMiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmVyc2lvbiBzdHJpbmcgZm9yIEVjbGlwc2VMaW5rIHBsYXRmb3JtIHZlcnNpb24gMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzAgPSAiMi4wIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBWZXJzaW9uIHN0cmluZyBmb3IgRWNsaXBzZUxpbmsgcGxhdGZvcm0gdmVyc2lvbiAyLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzJfMSA9ICIyLjEiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFZlcnNpb24gc3RyaW5nIGZvciBFY2xpcHNlTGluayBwbGF0Zm9ybSB2ZXJzaW9uIDIuMgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8yID0gIjIuMiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVmFsdWUgb2YgdGhlIGNvbnRlbnQtdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCAgbWFwcGluZ3MgZmlsZXMuIFVzZSB0aGlzIAotCSAqIHZhbHVlIHRvIHJldHJpZXZlIHRoZSBPUk0geG1sIGNvbnRlbnQgdHlwZSBmcm9tIHRoZSBjb250ZW50IHR5cGUgbWFuYWdlciAKLQkgKiBhbmQgdG8gYWRkIG5ldyBlY2xpcHNlbGluay1vcm0ueG1sLWxpa2UgZXh0ZW5zaW9ucyB0byB0aGlzIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXIjZ2V0Q29udGVudFR5cGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFID0gCi0JCQlQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShQTFVHSU5fSUQgKyAiLmNvbnRlbnQub3JtIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDEuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAxLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwdFJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sIHZlcnNpb24gMS4xIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFCi0JCQk9IG5ldyBKcHRSZXNvdXJjZVR5cGUoRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgZWNsaXBzZWxpbmstb3JtLnhtbCB2ZXJzaW9uIDIuMCBtYXBwaW5nIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRQotCQkJPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCBFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGVjbGlwc2VsaW5rLW9ybS54bWwgdmVyc2lvbiAyLjEgbWFwcGluZyBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEUKLQkJCT0gbmV3IEpwdFJlc291cmNlVHlwZShFQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBlY2xpcHNlbGluay1vcm0ueG1sIHZlcnNpb24gMi4yIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBFQ0xJUFNFTElOS19PUk1fWE1MXzJfMl9SRVNPVVJDRV9UWVBFCi0JCQk9IG5ldyBKcHRSZXNvdXJjZVR5cGUoRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIEVjbGlwc2VMaW5rMl8yLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIERFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiBJTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBKUFQgRWNsaXBzZUxpbmsgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioJCi0JCi0JcHVibGljIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhMmMxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgYmFzaWMgY29sbGVjdGlvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk3MTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGJhc2ljIG1hcCBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YTJhZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBiYXNpYyBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKLQlleHRlbmRzIEJhc2ljTWFwcGluZwotewotCUVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhODU4MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0KLQlTRU5EX09CSkVDVF9DSEFOR0VTLAotCUlOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCVNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCU5PTkU7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoamF2YUNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJCWNhc2UgU0VORF9PQkpFQ1RfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6Ci0JCQkJcmV0dXJuIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOwotCQkJY2FzZSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzoKLQkJCQlyZXR1cm4gU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIE5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBqYXZhQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBjYWNoZUNvb3JkaW5hdGlvblR5cGUpIHsKLQkJaWYgKGNhY2hlQ29vcmRpbmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLk5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgY29vcmRpbmF0aW9uIHR5cGU6ICIgKyBjYWNoZUNvb3JkaW5hdGlvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIG9ybUNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgotCQkJCXJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBOT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgb3JtQ2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGNhY2hlQ29vcmRpbmF0aW9uVHlwZSkgewotCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCQljYXNlIFNFTkRfT0JKRUNUX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JCQljYXNlIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVM6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlOiAiICsgY2FjaGVDb29yZGluYXRpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMWRiNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0NhY2hlVHlwZSB7Ci0KLQlTT0ZUX1dFQUssCi0JSEFSRF9XRUFLLAotCVdFQUssCi0JU09GVCwKLQlGVUxMLAotCUNBQ0hFLAotCU5PTkU7Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUgamF2YUNhY2hlVHlwZSkgewotCQlpZiAoamF2YUNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFDYWNoZVR5cGUpIHsKLQkJCWNhc2UgRlVMTDoKLQkJCQlyZXR1cm4gRlVMTDsKLQkJCWNhc2UgV0VBSzoKLQkJCQlyZXR1cm4gV0VBSzsKLQkJCWNhc2UgU09GVDoKLQkJCQlyZXR1cm4gU09GVDsKLQkJCWNhc2UgU09GVF9XRUFLOgotCQkJCXJldHVybiBTT0ZUX1dFQUs7Ci0JCQljYXNlIEhBUkRfV0VBSzoKLQkJCQlyZXR1cm4gSEFSRF9XRUFLOwotCQkJY2FzZSBDQUNIRToKLQkJCQlyZXR1cm4gQ0FDSEU7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIE5PTkU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2FjaGUgdHlwZTogIiArIGphdmFDYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5GVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuV0VBSzsKLQkJCWNhc2UgU09GVDoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLOwotCQkJY2FzZSBDQUNIRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkNBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgY2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSBvcm1DYWNoZVR5cGUpIHsKLQkJaWYgKG9ybUNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKG9ybUNhY2hlVHlwZSkgewotCQkJY2FzZSBGVUxMOgotCQkJCXJldHVybiBGVUxMOwotCQkJY2FzZSBXRUFLOgotCQkJCXJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUOgotCQkJCXJldHVybiBTT0ZUOwotCQkJY2FzZSBTT0ZUX1dFQUs6Ci0JCQkJcmV0dXJuIFNPRlRfV0VBSzsKLQkJCWNhc2UgSEFSRF9XRUFLOgotCQkJCXJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFOgotCQkJCXJldHVybiBDQUNIRTsKLQkJCWNhc2UgTk9ORToKLQkJCQlyZXR1cm4gTk9ORTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjYWNoZSB0eXBlOiAiICsgb3JtQ2FjaGVUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlpZiAoY2FjaGVUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoY2FjaGVUeXBlKSB7Ci0JCQljYXNlIEZVTEw6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEw7Ci0JCQljYXNlIFdFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLldFQUs7Ci0JCQljYXNlIFNPRlQ6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLlNPRlQ7Ci0JCQljYXNlIFNPRlRfV0VBSzoKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUs6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSzsKLQkJCWNhc2UgQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkNBQ0hFOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5OT05FOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNhY2hlIHR5cGU6ICIgKyBjYWNoZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWZlMzI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGNhY2hpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi0vLyBUT0RPIGJqdiBFY2xpcHNlTGlua0NhY2hpbmdQb2xpY3kKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDYWNoaW5nCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5hdGlvbiBvZiBkZWZhdWx0VHlwZSBhbmQgc3BlY2lmaWVkVHlwZS4KLQkgKiBJZiBnZXRTcGVjaWZpZWRUeXBlKCkgcmV0dXJucyBudWxsLCB0aGVuIHJldHVybiBnZXREZWZhdWx0VHlwZSgpCi0JICovCi0JRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpOwotCQotCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKTsJCi0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHR5cGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2FjaGVUeXBlIERFRkFVTFRfVFlQRSA9IEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSzsKLQkJCi0JCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQkJCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRTaXplIGFuZCBzcGVjaWZpZWRTaXplLgotCSAqIElmIGdldFNwZWNpZmllZFNpemUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRTaXplKCkKLQkgKi8KLQlpbnQgZ2V0U2l6ZSgpOwotCi0JSW50ZWdlciBnZXRTcGVjaWZpZWRTaXplKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTaXplKEludGVnZXIgc2l6ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0laRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTaXplIjsgLy8kTk9OLU5MUy0xJAotCQotCWludCBnZXREZWZhdWx0U2l6ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9TSVpFX1BST1BFUlRZID0gImRlZmF1bHRTaXplIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgREVGQVVMVF9TSVpFID0gMTAwOwotCi0KLQkvLyAqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgZGVmYXVsdFNoYXJlZCBhbmQgc3BlY2lmaWVkU2hhcmVkLgotCSAqIElmIGdldFNwZWNpZmllZFNoYXJlZCgpIHJldHVybnMgbnVsbCwgdGhlbiByZXR1cm4gaXNEZWZhdWx0U2hhcmVkKCkKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRTaGFyZWQoKTsKLQkKLQkvKioKLQkgKiBTcGVjaWZ5aW5nIDxlbT5zaGFyZWQ8L2VtPiA8Y29kZT5mYWxzZTwvY29kZT4gd2lsbCByZXR1cm4gdGhlIGZvbGxvd2luZwotCSAqIGNhY2hpbmcgc2V0dGluZ3MgdG8gdGhlaXIgZGVmYXVsdHM6PHVsPgotCSAqIDxsaT50eXBlCi0JICogPGxpPnNpemUKLQkgKiA8bGk+YWx3YXlzIHJlZnJlc2gKLQkgKiA8bGk+cmVmcmVzaCBvbmx5IGlmIG5ld2VyCi0JICogPGxpPmRpc2FibGUgaGl0cwotCSAqIDxsaT5jb29yZGluYXRpb24gdHlwZQotCSAqIDwvdWw+Ci0JICogQWRkaXRpb25hbGx5LCB0aGUgZm9sbG93aW5nIHNldHRpbmdzIHdpbGwgYmUgY2xlYXJlZDo8dWw+Ci0JICogPGxpPmV4cGlyeQotCSAqIDxsaT5leHBpcnkgdGltZSBvZiBkYXkKLQkgKiA8L3VsPgotCSAqIFRoZXNlIHNldHRpbmdzIGRvIG5vdCBhcHBseSB0byBhbiB1bmNoYXJlZCBjYWNoZS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIHNoYXJlZCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0hBUkVEX1BST1BFUlRZID0gInNwZWNpZmllZFNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzRGVmYXVsdFNoYXJlZCgpOwotCQlTdHJpbmcgREVGQVVMVF9TSEFSRURfUFJPUEVSVFkgPSAiZGVmYXVsdFNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX1NIQVJFRCA9IHRydWU7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBhbHdheXMgcmVmcmVzaCAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRBbHdheXNSZWZyZXNoIGFuZCBzcGVjaWZpZWRBbHdheXNSZWZyZXNoLgotCSAqIElmIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKQotCSAqLwotCWJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpOwotCQlTdHJpbmcgREVGQVVMVF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSA9ICJkZWZhdWx0QWx3YXlzUmVmcmVzaCI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX0FMV0FZU19SRUZSRVNIID0gZmFsc2U7Ci0JCi0KLQkvLyAqKioqKioqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlciAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIgYW5kIHNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlci4KLQkgKiBJZiBnZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICovCi0JYm9vbGVhbiBpc1JlZnJlc2hPbmx5SWZOZXdlcigpOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkgPSAiZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX1JFRlJFU0hfT05MWV9JRl9ORVdFUiA9IGZhbHNlOwotCQotCQkKLQkvLyAqKioqKioqKioqIGRpc2FibGUgaGl0cyAqKioqKioqKioqCi0JCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHREaXNhYmxlSGl0cyBhbmQgc3BlY2lmaWVkRGlzYWJsZUhpdHMuCi0JICogSWYgZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHREaXNhYmxlSGl0cygpCi0JICovCi0JYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCk7Ci0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCXZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZID0gInNwZWNpZmllZERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBpc0RlZmF1bHREaXNhYmxlSGl0cygpOwotCQlTdHJpbmcgREVGQVVMVF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkgPSAiZGVmYXVsdERpc2FibGVIaXRzIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfRElTQUJMRV9ISVRTID0gZmFsc2U7Ci0JCi0JCQotCS8vICoqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRDb29yZGluYXRpb25UeXBlIGFuZCBzcGVjaWZpZWRDb29yZGluYXRpb25UeXBlLgotCSAqIElmIGdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCi0JRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpOwkKLQl2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7CQkKLQkJU3RyaW5nIERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdENvb3JkaW5hdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIERFRkFVTFRfQ09PUkRJTkFUSU9OX1RZUEUgPSBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTOwotCi0JCQotCS8vICoqKioqKioqKiogZXhwaXJ5ICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBDYWNoZSBleHBpcnkgZWxlbWVudC4gIElmIHRoaXMgcmV0dXJucwotCSAqIGEgbm9uLW51bGwgdmFsdWUgdGhlbiBnZXRFeHBpcnlUaW1lT2ZEYXkgd2lsbCByZXR1cm4gbnVsbC4KLQkgKiBJdCBpcyBub3QgdmFsaWQgdG8gc3BlY2lmeSBib3RoCi0JICovCi0JSW50ZWdlciBnZXRFeHBpcnkoKTsKLQkKLQkvKioKLQkgKiBTZXR0aW5nIHRoaXMgdG8gYSBub24tbnVsbCB2YWx1ZSB3aWxsIHNldCB0aW1lT2ZEYXlFeHBpcnkgdG8gbnVsbAotCSAqLwotCXZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KTsKLQkJU3RyaW5nIEVYUElSWV9QUk9QRVJUWSA9ICJleHBpcnkiOyAvLyROT04tTkxTLTEkCi0JCi0JCQotCS8vICoqKioqKioqKiogZXhwaXJ5IHRpbWUgb2YgZGF5ICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvcnJlc3BvbmRzIHRvIHRoZSBDYWNoZSBleHBpcnlUaW1lT2ZEYXkgYW5ub3RhdGlvbiBvciB4bWwgZWxlbWVudC4gIAotCSAqIElmIHRoaXMgcmV0dXJucyBhIG5vbi1udWxsIHZhbHVlIHRoZW4gZ2V0RXhwaXJ5IHdpbGwgcmV0dXJuIG51bGwuCi0JICogSXQgaXMgbm90IHZhbGlkIHRvIHNwZWNpZnkgYm90aC4KLQkgKi8KLQlFY2xpcHNlTGlua1RpbWVPZkRheSBnZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSA9ICJleHBpcnlUaW1lT2ZEYXkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQWRkIENhY2hlIGV4cGlyeVRpbWVPZkRheSBhbm5vdGF0aW9uIG9yIHhtbCBlbGVtZW50LCB0aGlzIHdpbGwgc2V0IAotCSAqIEV4cGlyeSB0byBudWxsIGFzIGl0IGlzIG5vdCB2YWxpZCB0byBzZXQgYm90aCBleHBpcnkgYW5kIHRpbWVPZkRheUV4cGlyeQotCSAqLwotCUVjbGlwc2VMaW5rVGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIENhY2hlIGV4cGlyeVRpbWVPZkRheSBhbm5vdGF0aW9uL3htbCBlbGVtZW50Ci0JICovCi0Jdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkKLQotCS8vICoqKioqKioqKiogZXhpc3RlbmNlIHR5cGUgKioqKioqKioqKgotCS8vIFRPRE8gYmp2IHJlbmFtZSBleGlzdGVuY2VDaGVja2luZ1BvbGljeQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIGRlZmF1bHRFeGlzdGVuY2VUeXBlIGFuZCBzcGVjaWZpZWRFeGlzdGVuY2VUeXBlLgotCSAqIElmIGdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSByZXR1cm5zIG51bGwsIHRoZW4gcmV0dXJuIGdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkKLQkgKi8KLQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpOwotCQotCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCk7CQotCXZvaWQgc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRXhpc3RlbmNlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwkJCi0JCVN0cmluZyBERUZBVUxUX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRFeGlzdGVuY2VUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgREVGQVVMVF9FWElTVEVOQ0VfVFlQRSA9IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNGFmZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBjaGFuZ2UgdHJhY2tpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIGlmIGl0IGlzIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiB0eXBlLgotCSAqLwotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFR5cGUoKTsKLQotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFNwZWNpZmllZFR5cGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFR5cGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgREVGQVVMVF9UWVBFID0gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTzsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0ZDVhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotCi0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgewotCi0JQVRUUklCVVRFLAotCU9CSkVDVCwKLQlERUZFUlJFRCwKLQlBVVRPOwotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlIGphdmFDaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJaWYgKGphdmFDaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChqYXZhQ2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCQljYXNlIEFUVFJJQlVURToKLQkJCQlyZXR1cm4gQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIE9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIERFRkVSUkVEOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBBVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgamF2YUNoYW5nZVRyYWNraW5nVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgY2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCWlmIChjaGFuZ2VUcmFja2luZ1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJCWNhc2UgQVRUUklCVVRFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1Q7Ci0JCQljYXNlIERFRkVSUkVEOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQ7Ci0JCQljYXNlIEFVVE86Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgY2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG9ybUNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlpZiAob3JtQ2hhbmdlVHJhY2tpbmdUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAob3JtQ2hhbmdlVHJhY2tpbmdUeXBlKSB7Ci0JCQljYXNlIEFUVFJJQlVURToKLQkJCQlyZXR1cm4gQVRUUklCVVRFOwotCQkJY2FzZSBPQkpFQ1Q6Ci0JCQkJcmV0dXJuIE9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIERFRkVSUkVEOwotCQkJY2FzZSBBVVRPOgotCQkJCXJldHVybiBBVVRPOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGNoYW5nZSB0cmFja2luZyB0eXBlOiAiICsgb3JtQ2hhbmdlVHJhY2tpbmdUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBjaGFuZ2VUcmFja2luZ1R5cGUpIHsKLQkJaWYgKGNoYW5nZVRyYWNraW5nVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGNoYW5nZVRyYWNraW5nVHlwZSkgewotCQkJY2FzZSBBVFRSSUJVVEU6Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEU7Ci0JCQljYXNlIE9CSkVDVDoKLQkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRUQ6Ci0JCQkJcmV0dXJuIFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRDsKLQkJCWNhc2UgQVVUTzoKLQkJCQlyZXR1cm4gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE87Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gY2hhbmdlIHRyYWNraW5nIHR5cGU6ICIgKyBjaGFuZ2VUcmFja2luZ1R5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMzQxMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIGEgQ29udmVyc2lvblZhbHVlIHJlc291cmNlIG1vZGVsIG9iamVjdAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpOwotCi0JU3RyaW5nIGdldERhdGFWYWx1ZSgpOwkKLQl2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKTsKLQkJU3RyaW5nIERBVEFfVkFMVUVfUFJPUEVSVFkgPSAiZGF0YVZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKTsJCi0Jdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpOwotCQlTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjczYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgY29udmVydCAobm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggRWNsaXBzZSBjb252ZXJ0ZXIpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NvbnZlcnQKLQlleHRlbmRzIENvbnZlcnRlcgotewotCVN0cmluZyBnZXRDb252ZXJ0ZXJOYW1lKCk7Ci0JCi0JU3RyaW5nIGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKLQl2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoU3RyaW5nIGNvbnZlcnRlck5hbWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZENvbnZlcnRlck5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRDb252ZXJ0ZXJOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVzZXJ2ZWQgbmFtZSBmb3Igc3BlY2lmeWluZyBhIHNlcmlhbGl6ZWQgb2JqZWN0IGNvbnZlcnRlci4KLQkgKiBJbiB0aGlzIGNhc2UgYSBjb3JyZXNwb25kaW5nIEBDdXN0b21Db252ZXJ0ZXIgaXMgdW5uZWNlc3NhcnkuCi0JICovCi0JU3RyaW5nIFNFUklBTElaRURfQ09OVkVSVEVSID0gInNlcmlhbGl6ZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmVzZXJ2ZWQgbmFtZSBmb3Igc3BlY2lmeWluZyBhIGNsYXNzIGluc3RhbmNlIGNvbnZlcnRlci4KLQkgKiBXaWxsIHVzZSBhIENsYXNzSW5zdGFuY2VDb252ZXJ0ZXIKLQkgKiBvbiB0aGUgYXNzb2NpYXRlZCBtYXBwaW5nLiBXaGVuIHVzaW5nIGEgQ2xhc3NJbnN0YW5jZUNvbnZlcnRlciB0aGUgZGF0YWJhc2UgcmVwcmVzZW50YXRpb24gaXMgYSAKLQkgKiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBDbGFzcyBuYW1lIGFuZCB0aGUgb2JqZWN0LW1vZGVsIHJlcHJlc2VudGF0aW9uIGlzIGFuIGluc3RhbmNlIAotCSAqIG9mIHRoYXQgY2xhc3MgYnVpbHQgd2l0aCB0aGUgemVyby1hcmd1bWVudCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGlzIGNhc2UgYSBjb3JyZXNwb25kaW5nIEBDdXN0b21Db252ZXJ0ZXIgaXMgdW5uZWNlc3NhcnkuCi0JICovCi0JU3RyaW5nIENMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiA9ICJjbGFzcy1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXNlcnZlZCBuYW1lIGZvciBzcGVjaWZ5aW5nIG5vIGNvbnZlcnRlci4KLQkgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIGEgc2l0dWF0aW9uIHdoZXJlIGVpdGhlciAKLQkgKiBhbm90aGVyIGNvbnZlcnRlciBpcyBkZWZhdWx0ZWQgb3IgYW5vdGhlciBjb252ZXJ0ZXIgaXMgc2V0LgotCSAqIEluIHRoaXMgY2FzZSBhIGNvcnJlc3BvbmRpbmcgQEN1c3RvbUNvbnZlcnRlciBpcyB1bm5lY2Vzc2FyeS4KLQkgKi8KLQlTdHJpbmcgTk9fQ09OVkVSVEVSID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nW10gUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTID0ge05PX0NPTlZFUlRFUiwgQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCBTRVJJQUxJWkVEX0NPTlZFUlRFUn07Ci0JCi0JU3RyaW5nIERFRkFVTFRfQ09OVkVSVEVSX05BTUUgPSBOT19DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBjb252ZXJ0ZXIuCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7Ci0JCVN0cmluZyBDT05WRVJURVJfUFJPUEVSVFkgPSAiY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGNvbnZlcnRlciB0eXBlIGFyZTo8dWw+Ci0JICogPGxpPntAbGluayBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcn0KLQkgKiA8bGk+e0BsaW5rIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcn0KLQkgKiA8bGk+e0BsaW5rIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcn0KLQkgKiA8bGk+e0BsaW5rIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyfQotCSAqIDxsaT48Y29kZT5udWxsPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0Jdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFhYjMzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGNvbnZlcnRlcjo8dWw+Ci0gKiA8bGk+VHlwZSAoe0BsaW5rIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcn0pCi0gKiA8bGk+T2JqZWN0IFR5cGUgKHtAbGluayBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJ9KQotICogPGxpPlN0cnVjdCAoe0BsaW5rIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyfSkKLSAqIDxsaT5DdXN0b20gKHtAbGluayBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcn0pCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JU3RyaW5nIEVDTElQU0VMSU5LX0NPTlZFUlRFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIncyB0eXBlLgotCSAqLwotCUNsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gZ2V0VHlwZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8Q2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4gVFlQRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PigKLQkJCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzLAotCQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLAotCQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsCi0JCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3MKLQkJKTsKLQkJCi0KLQlTdHJpbmcgZ2V0TmFtZSgpOwkKLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgZm9yIGJyb3dzaW5nIG9yIGNyZWF0aW5nIHRoZSBjb252ZXJ0ZXIKLQkgKiBjbGFzcyB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUgSVR5cGV9LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCi0JICovCi0JY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udmVydGVyICJvdmVycmlkZXMiIHRoZSBzcGVjaWZpZWQgY29udmVydGVyCi0JICogKGUuZy4gYSBjb252ZXJ0ZXIgZGVmaW5lZCBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvdmVycmlkZXMgb25lCi0JICogZGVmaW5lZCBpbiBKYXZhKS4KLQkgKi8KLQlib29sZWFuIG92ZXJyaWRlcyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIuCi0JICogQSBjb252ZXJ0ZXIgaXMgbm90IGEgZHVwbGljYXRlIG9mIGFub3RoZXIgY29udmVydGVyIGlmIGlzIHRoZSBleGFjdAotCSAqIHNhbWUgY29udmVydGVyLCBpZiBpdCBpcyBhIG5hbWVsZXNzIGNvbnZlcnRlciAod2hpY2ggaXMgYW4gZXJyb3IKLQkgKiBjb25kaXRpb24pLCBvciBpZiBpdCBvdmVycmlkZXMgb3IgaXMgb3ZlcnJpZGRlbiBieSB0aGUgb3RoZXIgY29udmVydGVyLgotCSAqLwotCWJvb2xlYW4gZHVwbGljYXRlcyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1Nzk0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBhICpDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlciByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuNAotICogQHNpbmNlIDIuNAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlcgotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLXsKLQlTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKTsJCi0JCVN0cmluZyBDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFkgPSAiY29udmVydGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTliODRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgY3VzdG9tIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIKLXsKLQkvLyBub3RoaW5nLi4uCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3NGUxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIGEgQ3VzdG9taXplciByZXNvdXJjZSBtb2RlbCBvYmplY3QKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ3VzdG9taXplcgotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzKCk7Ci0JCi0JU3RyaW5nIGdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpOwkKLQl2b2lkIHNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhTdHJpbmcgY3VzdG9taXplckNsYXNzKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZID0gInNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkgPSAiZGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGN1c3RvbWl6ZXIgY2xhc3MgSVR5cGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLQkgKi8KLQljaGFyIGdldEN1c3RvbWl6ZXJDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjgzOGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFbWJlZGRhYmxlIAotCWV4dGVuZHMgRW1iZWRkYWJsZSwgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0VudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzRlMzIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRW50aXR5Ci0JZXh0ZW5kcyBFbnRpdHksIEVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU2OThlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLS8vIFRPRE8gYmp2IHJlbmFtZSB0byBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nUG9saWN5Ci1wdWJsaWMgZW51bSBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgewotCi0gICAgQ0hFQ0tfQ0FDSEUsCi0gICAgQ0hFQ0tfREFUQUJBU0UsCi0gICAgQVNTVU1FX0VYSVNURU5DRSwKLSAgICBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlIGphdmFFeGlzdGVuY2VUeXBlKSB7Ci0JCWlmIChqYXZhRXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGphdmFFeGlzdGVuY2VUeXBlKSB7Ci0JCQljYXNlIENIRUNLX0NBQ0hFOgotCQkJCXJldHVybiBDSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIENIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgotCQkJCXJldHVybiBBU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBqYXZhRXhpc3RlbmNlVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VUeXBlKSB7Ci0JCWlmIChleGlzdGVuY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoZXhpc3RlbmNlVHlwZSkgewotCQkJY2FzZSBDSEVDS19DQUNIRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0U7Ci0JCQljYXNlIEFTU1VNRV9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRTsKLQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBleGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIG9ybUV4aXN0ZW5jZVR5cGUpIHsKLQkJaWYgKG9ybUV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1FeGlzdGVuY2VUeXBlKSB7Ci0JCQljYXNlIENIRUNLX0NBQ0hFOgotCQkJCXJldHVybiBDSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIENIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFOgotCQkJCXJldHVybiBBU1NVTUVfRVhJU1RFTkNFOwotCQkJY2FzZSBBU1NVTUVfTk9OX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBvcm1FeGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlVHlwZSkgewotCQlpZiAoZXhpc3RlbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGV4aXN0ZW5jZVR5cGUpIHsKLQkJCWNhc2UgQ0hFQ0tfQ0FDSEU6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRTsKLQkJCWNhc2UgQ0hFQ0tfREFUQUJBU0U6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRTsKLQkJCWNhc2UgQVNTVU1FX0VYSVNURU5DRToKLQkJCQlyZXR1cm4gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0U7Ci0JCQljYXNlIEFTU1VNRV9OT05fRVhJU1RFTkNFOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gZXhpc3RlbmNlIHR5cGU6ICIgKyBleGlzdGVuY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjEwYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBJRCBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0lkTWFwcGluZwotCWV4dGVuZHMgSWRNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmYTFjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSm9pbkZldGNoCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCUVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpOwotCXZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgREVGQVVMVF9WQUxVRSA9IEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk2NmY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBqb2luLWZldGNoIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotCUVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWEyYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHsKLQotCUlOTkVSLAotCU9VVEVSOwotCQotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUgamF2YUpvaW5GZXRjaFR5cGUpIHsKLQkJaWYgKGphdmFKb2luRmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoamF2YUpvaW5GZXRjaFR5cGUpIHsKLQkJCWNhc2UgSU5ORVI6Ci0JCQkJcmV0dXJuIElOTkVSOwotCQkJY2FzZSBPVVRFUjoKLQkJCQlyZXR1cm4gT1VURVI7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gam9pbiBmZXRjaCB0eXBlOiAiICsgamF2YUpvaW5GZXRjaFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgam9pbkZldGNoVHlwZSkgewotCQlpZiAoam9pbkZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGpvaW5GZXRjaFR5cGUpIHsKLQkJCWNhc2UgSU5ORVI6Ci0JCQkJcmV0dXJuIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVI7Ci0JCQljYXNlIE9VVEVSOgotCQkJCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGpvaW4gZmV0Y2ggdHlwZTogIiArIGpvaW5GZXRjaFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChYbWxKb2luRmV0Y2hUeXBlIG9ybUpvaW5GZXRjaFR5cGUpIHsKLQkJaWYgKG9ybUpvaW5GZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChvcm1Kb2luRmV0Y2hUeXBlKSB7Ci0JCQljYXNlIElOTkVSOgotCQkJCXJldHVybiBJTk5FUjsKLQkJCWNhc2UgT1VURVI6Ci0JCQkJcmV0dXJuIE9VVEVSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGpvaW4gZmV0Y2ggdHlwZTogIiArIG9ybUpvaW5GZXRjaFR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYbWxKb2luRmV0Y2hUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZmV0Y2hUeXBlKSB7Ci0JCWlmIChmZXRjaFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJc3dpdGNoIChmZXRjaFR5cGUpIHsKLQkJCWNhc2UgSU5ORVI6Ci0JCQkJcmV0dXJuIFhtbEpvaW5GZXRjaFR5cGUuSU5ORVI7Ci0JCQljYXNlIE9VVEVSOgotCQkJCXJldHVybiBYbWxKb2luRmV0Y2hUeXBlLk9VVEVSOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGpvaW4gZmV0Y2ggdHlwZTogIiArIGZldGNoVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTc0NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLQlleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MsIEVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjExZTYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtNdXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTXV0YWJsZQotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlib29sZWFuIGlzTXV0YWJsZSgpOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuIG11dGFibGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkTXV0YWJsZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc0RlZmF1bHRNdXRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX01VVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdE11dGFibGUiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDg5YjNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgbm9uLWVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nCi17Ci0JRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKLQotCUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhlNDI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgb2JqZWN0IHR5cGUgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JLy8gKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JU3RyaW5nIGdldERhdGFUeXBlKCk7CQotCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKLQkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwkKLQl2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIncyBjb252ZXJzaW9uIHZhbHVlcy4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBMaXN0SXRlcmF0b3I8VD4gY29udmVyc2lvblZhbHVlcygpOwotCQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCA9ICJjb252ZXJzaW9uVmFsdWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29udmVyc2lvbiB2YWx1ZXMuCi0JICovCi0JaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBjb252ZXJzaW9uIHZhbHVlIHRvIHRoZSBjb252ZXJ0ZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCByZXR1cm4gaXQuCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBjb252ZXJzaW9uIHZhbHVlIHRvIHRoZSBjb252ZXJ0ZXIgYW5kIHJldHVybiBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY29udmVyc2lvbiB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb252ZXJzaW9uIHZhbHVlLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBjb252ZXJzaW9uIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdmFsdWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyJ3MgZGF0YSB2YWx1ZXMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREYXRhVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkYXRhIHZhbHVlcy4KLQkgKi8KLQlpbnQgZ2V0RGF0YVZhbHVlc1NpemUoKTsKLQotCQotCS8vICoqKioqKioqKiogZGVmYXVsdCBvYmplY3QgdmFsdWUgKioqKioqKioqKgotCQotCVN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQl2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdE9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OGI3MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDE6bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgCi0JZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nLCBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLQkKLQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0YjYxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayAxOm0gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCS8vIGFkZCBqb2luIGNvbHVtbiBzdXBwb3J0IHRvIEpQQSAxLjAgMTptCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjE5MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayAxOjEgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcKLQlleHRlbmRzIE9uZVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JT25lVG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzYjdmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNQcml2YXRlT3duZWQoKTsKLQl2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHByaXZhdGVPd25lZCk7Ci0JCVN0cmluZyBQUklWQVRFX09XTkVEX1BST1BFUlRZID0gInByaXZhdGVPd25lZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDIxMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcmVhZC1vbmx5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlYWRPbmx5Ci0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNSZWFkT25seSgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpOwotCQlTdHJpbmcgREVGQVVMVF9SRUFEX09OTFlfUFJPUEVSVFkgPSAiZGVmYXVsdFJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfUkVBRF9PTkxZID0gZmFsc2U7Ci0KLQlCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuIG5ld1NwZWNpZmllZFJlYWRPbmx5KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzNDkxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbToxLCBtOm0pIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nLCBFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWMxMzQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgc3RydWN0IGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyCi17Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19TVFJVQ1RfQ09OVkVSVEVSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uZGF0YWJhc2UuY29udmVydGVycy5TdHJ1Y3RDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVGltZU9mRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjdhMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1RpbWVPZkRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGNhY2hpbmcgZXhwaXJ5IHRpbWUgb2YgZGF5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RpbWVPZkRheQotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlJbnRlZ2VyIGdldEhvdXIoKTsKLQl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKLQkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCUludGVnZXIgZ2V0TWludXRlKCk7Ci0Jdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpOwotCQlTdHJpbmcgTUlOVVRFX1BST1BFUlRZID0gIm1pbnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlJbnRlZ2VyIGdldFNlY29uZCgpOwotCXZvaWQgc2V0U2Vjb25kKEludGVnZXIgc2Vjb25kKTsKLQkJU3RyaW5nIFNFQ09ORF9QUk9QRVJUWSA9ICJzZWNvbmQiOyAvLyROT04tTkxTLTEkCi0JCi0JSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpOwotCXZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyZmRlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIxNWNkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayB0eXBlIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcgotewotCVN0cmluZyBnZXREYXRhVHlwZSgpOwkKLQl2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSk7Ci0JCVN0cmluZyBEQVRBX1RZUEVfUFJPUEVSVFkgPSAiZGF0YVR5cGUiOyAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBnZXRPYmplY3RUeXBlKCk7CQotCXZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSk7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJvYmplY3RUeXBlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZTNiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotCWV4dGVuZHMgVHlwZU1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpOwotCQotCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgdHlwZSBtYXBwaW5nIHNwZWNpZmllcyBwcmltYXJ5IGtleSBjb2x1bW5zIHJhdGhlciB0aGFuIHVzaW5nCi0JICogSlBBLXN0eWxlIGF0dHJpYnV0ZXMKLQkgKiAoVXNlcyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiBmb3IgamF2YSwgb3IgdGhlIHByaW1hcnkta2V5IGVsZW1lbnQgZm9yIHhtbCkKLQkgKiAKLQkgKiBOb3RlOiB0aGVyZSBpcyBubyBjb250ZXh0LWxldmVsIG9yIFVJIHN1cHBvcnQgZm9yIHRoaXMgZmVhdHVyZSBhcyBvZiB5ZXQuCi0JICogTm90ZTogdGhpcyBpcyBhIDEuMSBmZWF0dXJlLCBidXQgdGhpcyBjaGVjayBoYXMgYmVlbiBpbXBsZW1lbnRlZCBmb3IgYWxsIHZlcnNpb25zCi0JICovCi0JYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMWEyMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayB2YXJpYWJsZSAxOjEgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L0VjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDlmYzc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHZlcnNpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgVmVyc2lvbk1hcHBpbmcKLXsKLQlFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI4YTFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSAxOm0gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTUxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcKLQlleHRlbmRzIEphdmFUeXBlTWFwcGluZywgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCS8vIHRoaXMgaXMgcHJldHR5IGRpZmZlcmVudCBmcm9tIHRoZSBvcm0gY29udGFpbmVyIChzbywgbm8gY29tbW9uIHN1cGVyLWludGVyZmFjZSkKLQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUxN2Q5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgY2FjaGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhpc3RlbmNlLWNoZWNraW5nIG1vZGVsIG9iamVjdCBleGlzdHMuICAKLQkgKiBIYXZlIHRvIGhhdmUgYSBzZXBhcmF0ZSBmbGFnIGZvciB0aGlzIHNpbmNlIHRoZSBkZWZhdWx0IGV4aXN0ZW5jZQotCSAqIHR5cGUgaXMgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB3aGV0aGVyIGhhc0V4aXN0ZW5jZUNoZWNraW5nKCkgcmV0dXJucwotCSAqIHRydWUgb3IgZmFsc2UuCi0JICovCi0JYm9vbGVhbiBpc0V4aXN0ZW5jZUNoZWNraW5nKCk7Ci0Jdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZyhib29sZWFuIGV4aXN0ZW5jZUNoZWNraW5nKTsKLQkJU3RyaW5nIEVYSVNURU5DRV9DSEVDS0lOR19QUk9QRVJUWSA9ICJleGlzdGVuY2VDaGVja2luZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMWZkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEgY29udmVydGVyIGNvbnRhaW5lcgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGlzIGlzIG9ubHkgbWlsZGx5LXJlbGF0ZWQgdG8KLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJ9OwotICogdGh1cyB0aGUgbGFjayBvZiBjb21tb24gc3VwZXItaW50ZXJmYWNlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyCi0JZXh0ZW5kcyBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZ2V0Q3VzdG9tQ29udmVydGVyKCk7Ci0JSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcigpOwotCXZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKCk7Ci0JU3RyaW5nIENVU1RPTV9DT05WRVJURVJfUFJPUEVSVFkgPSAiY3VzdG9tQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCUphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCUphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCXZvaWQgcmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfUFJPUEVSVFkgPSAib2JqZWN0VHlwZUNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcigpOwotCXZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKCk7Ci0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFkgPSAic3RydWN0Q29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCUphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOwotCUphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcigpOwotCXZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcigpOwotCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSA9ICJ0eXBlQ29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzNlNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rCi0gKiBKYXZhIGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlCi0JZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZSwgRWNsaXBzZUxpbmtFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTc4YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rCi0gKiBKYXZhIGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ci0JZXh0ZW5kcyBKYXZhRW50aXR5LCBFY2xpcHNlTGlua0VudGl0eSwgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU0MWM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogSmF2YSBtYXBwZWQgc3VwZXJjbGFzcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotCWV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3MsIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4ZDNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKYXZhIG5vbi1lbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcKLQlleHRlbmRzIEVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLCBFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZwotewotCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWY0NjJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgCi0JZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncwotewotCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmZlZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDxjb2RlPm9ybS54bWw8L2NvZGU+IDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTRjMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nCi0JZXh0ZW5kcyBPcm1UeXBlTWFwcGluZywgRWNsaXBzZUxpbmtUeXBlTWFwcGluZwotewotCS8vIHRoaXMgaXMgcHJldHR5IGRpZmZlcmVudCBmcm9tIHRoZSBKYXZhIGNvbnRhaW5lciAoc28sIG5vIGNvbW1vbiBzdXBlci1pbnRlcmZhY2UpCi0JT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0KLQlFY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGFjYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FjaGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtDYWNoaW5nCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcsIFhtbENvbnRleHROb2RlCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFmM2Y2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIDxjb2RlPm9ybS54bWw8L2NvZGU+IGNvbnZlcnRlciBjb250YWluZXIKLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhpcyBpcyBvbmx5IG1pbGRseS1yZWxhdGVkIHRvCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJ9OwotICogdGh1cyB0aGUgbGFjayBvZiBjb21tb24gc3VwZXItaW50ZXJmYWNlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIKLQlleHRlbmRzIFhtbENvbnRleHROb2RlCi17Ci0JLy8qKioqKioqKioqKiogY3VzdG9tQ29udmVydGVycyAqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBjdXN0b20gY29udmVydGVycy4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JPFQgZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gTGlzdEl0ZXJhdG9yPFQ+IGN1c3RvbUNvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGN1c3RvbSBjb252ZXJ0ZXJzLgotCSAqLwotCWludCBjdXN0b21Db252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgY3VzdG9tIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBjdXN0b20gY29udmVydGVyIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlQ3VzdG9tQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGN1c3RvbSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgY3VzdG9tIGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIENVU1RPTV9DT05WRVJURVJTX0xJU1QgPSAiY3VzdG9tQ29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCS8vKioqKioqKioqKioqIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG9mIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXJzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gTGlzdEl0ZXJhdG9yPFQ+IG9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3QgdHlwZSBjb252ZXJ0ZXJzLgotCSAqLwotCWludCBvYmplY3RUeXBlQ29udmVydGVyc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIG9iamVjdCB0eXBlIGNvbnZlcnRlciB0byB0aGUgY29udmVydGVyIGhvbGRlciwgcmV0dXJuIHRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBhZGRPYmplY3RUeXBlQ29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIG9iamVjdCB0eXBlIGNvbnZlcnRlciBhdCB0aGUgaW5kZXggZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgb2JqZWN0IHR5cGUgY29udmVydGVyIGF0IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCi0JICovCi0Jdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgb2JqZWN0IHR5cGUgY29udmVydGVyIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCA9ICJvYmplY3RUeXBlQ29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvLyoqKioqKioqKioqKiBzdHJ1Y3QgY29udmVydGVycyAqKioqKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgaXRlcmF0b3Igb2YgdGhlIHN0cnVjdCBjb252ZXJ0ZXJzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBMaXN0SXRlcmF0b3I8VD4gc3RydWN0Q29udmVydGVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3RydWN0IGNvbnZlcnRlcnMuCi0JICovCi0JaW50IHN0cnVjdENvbnZlcnRlcnNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzdHJ1Y3QgY29udmVydGVyIHRvIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYWRkU3RydWN0Q29udmVydGVyKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHN0cnVjdCBjb252ZXJ0ZXIgYXQgdGhlIGluZGV4IGZyb20gdGhlIGNvbnZlcnRlciBob2xkZXIuCi0JICovCi0Jdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3RydWN0IGNvbnZlcnRlciBhdCBmcm9tIHRoZSBjb252ZXJ0ZXIgaG9sZGVyLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzdHJ1Y3QgY29udmVydGVyIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVN0cnVjdENvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUlNfTElTVCA9ICJzdHJ1Y3RDb252ZXJ0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLy8qKioqKioqKioqKiogdHlwZSBjb252ZXJ0ZXJzICoqKioqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgdHlwZSBjb252ZXJ0ZXJzLgotCSAqIFRoaXMgd2lsbCBub3QgYmUgbnVsbC4KLQkgKi8KLQk8VCBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gTGlzdEl0ZXJhdG9yPFQ+IHR5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0eXBlIGNvbnZlcnRlcnMuCi0JICovCi0JaW50IHR5cGVDb252ZXJ0ZXJzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgdHlwZSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnZlcnRlciBob2xkZXIsIHJldHVybiB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4KLQkgKi8KLQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYWRkVHlwZUNvbnZlcnRlcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0eXBlIGNvbnZlcnRlciBhdCB0aGUgaW5kZXggZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgdHlwZSBjb252ZXJ0ZXIgYXQgZnJvbSB0aGUgY29udmVydGVyIGhvbGRlci4KLQkgKi8KLQl2b2lkIHJlbW92ZVR5cGVDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSB0eXBlIGNvbnZlcnRlciBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVUeXBlQ29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCVN0cmluZyBUWVBFX0NPTlZFUlRFUlNfTElTVCA9ICJ0eXBlQ29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSk7Ci0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwMWFlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkYWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlCi0JZXh0ZW5kcyBPcm1FbWJlZGRhYmxlLCBFY2xpcHNlTGlua0VtYmVkZGFibGUsIEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcKLXsKLQlYbWxFbWJlZGRhYmxlIGdldFhtbFR5cGVNYXBwaW5nKCk7Ci0KLQlKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGdldEphdmFUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYjNiOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLQotLyoqCi0gKiBFY2xpcHNlTGluayA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbnRpdHkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rRW50aXR5Ci0JZXh0ZW5kcyBPcm1FbnRpdHksIEVjbGlwc2VMaW5rRW50aXR5LCBPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotewotCVhtbEVudGl0eSBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFUeXBlTWFwcGluZygpOwotCi0JSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg4NmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGVkIHN1cGVyY2xhc3MKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotCWV4dGVuZHMgT3JtTWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzLCBPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZwotewotCVhtbE1hcHBlZFN1cGVyY2xhc3MgZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0KLQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2YWViMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLQotLyoqCi0gKiBFY2xpcHNlTGluayA8Y29kZT5vcm0ueG1sPC9jb2RlPiBub24tZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcKLQlleHRlbmRzIEVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nLCBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nCi17Ci0JT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ4NjYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuSW1wbGllZE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5HZW5lcmFsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FY2xpcHNlTGlua0N1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5FY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgcGVyc2lzdGVuY2UgdW5pdAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0Ci17Ci0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmOwotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgaW1wbGllZCBlY2xpcHNlbGluayBtYXBwaW5nIGZpbGUgcmVmCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZID0gImltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcml2YXRlLypmaW5hbCovIEdlbmVyYWxQcm9wZXJ0aWVzIGdlbmVyYWxQcm9wZXJ0aWVzOwotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uOwotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgTG9nZ2luZyBsb2dnaW5nOwotCXByaXZhdGUgU2NoZW1hR2VuZXJhdGlvbiBzY2hlbWFHZW5lcmF0aW9uOwotCi0JLyogZ2xvYmFsIGNvbnZlcnRlciBkZWZpbml0aW9ucywgZGVmaW5lZCBlbHNld2hlcmUgaW4gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJzID0gbmV3IFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4oKTsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KFBlcnNpc3RlbmNlIHBhcmVudCwgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCkgewotCQlzdXBlcihwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQkvLyBUT0RPIGJqdiBjYWxjdWxhdGUgY29udmVydGVycyBkaXJlY3RseS4uLgotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJzLmNsZWFyKCk7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDT05WRVJURVJTX0NPTExFQ1RJT04sIHRoaXMuY29udmVydGVycyk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmFsUHJvcGVydGllcyBnZXRHZW5lcmFsUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChDb25uZWN0aW9uKSBzdXBlci5nZXRDb25uZWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIEN1c3RvbWl6YXRpb24gZ2V0Q3VzdG9taXphdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbjsKLQl9Ci0KLQlwdWJsaWMgQ2FjaGluZyBnZXRDYWNoaW5nKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCXB1YmxpYyBMb2dnaW5nIGdldExvZ2dpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsKLQkJcmV0dXJuIChPcHRpb25zKSBzdXBlci5nZXRPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb24gZ2V0U2NoZW1hR2VuZXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhbFByb3BlcnRpZXMgYnVpbGRFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXModGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb24gYnVpbGRFY2xpcHNlTGlua0Nvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiAoQ29ubmVjdGlvbikgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb24odGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEN1c3RvbWl6YXRpb24gYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBDYWNoaW5nIGJ1aWxkRWNsaXBzZUxpbmtDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ2FjaGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTG9nZ2luZyBidWlsZEVjbGlwc2VMaW5rTG9nZ2luZygpIHsKLQkJcmV0dXJuIChMb2dnaW5nKSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkTG9nZ2luZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3B0aW9ucyBidWlsZEVjbGlwc2VMaW5rT3B0aW9ucygpIHsKLQkJcmV0dXJuIChPcHRpb25zKSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3B0aW9ucyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdGlvbiBidWlsZEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24odGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVQcm9wZXJ0aWVzKCk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMgPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcygpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uKCk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRFY2xpcHNlTGlua0NhY2hpbmcoKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5idWlsZEVjbGlwc2VMaW5rTG9nZ2luZygpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24gPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuY2FjaGluZy5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5sb2dnaW5nLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24ucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy5jYWNoaW5nLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLmxvZ2dpbmcucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gZ2V0TWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgPwotCQkJCXN1cGVyLmdldE1hcHBpbmdGaWxlUmVmcygpIDoKLQkJCQluZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPihzdXBlci5nZXRNYXBwaW5nRmlsZVJlZnMoKSwgdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBtYXBwaW5nRmlsZVJlZnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgPwotCQkJCXN1cGVyLm1hcHBpbmdGaWxlUmVmc1NpemUoKSA6Ci0JCQkJc3VwZXIubWFwcGluZ0ZpbGVSZWZzU2l6ZSgpICsgMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW1wbGllZCBlY2xpcHNlbGluayBtYXBwaW5nIGZpbGUgcmVmICoqKioqKioqKioKLQotCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWY7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIGFkZEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBFY2xpcHNlTGluayBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgcHJlc2VudDogIiArIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSB0aGlzLmJ1aWxkRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IG1hcHBpbmdGaWxlUmVmOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU1QTElFRF9FQ0xJUFNFTElOS19NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZLCBudWxsLCBtYXBwaW5nRmlsZVJlZik7Ci0JCXJldHVybiBtYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQlwcml2YXRlIEltcGxpZWRNYXBwaW5nRmlsZVJlZiBidWlsZEVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlyZXR1cm4gbmV3IEltcGxpZWRNYXBwaW5nRmlsZVJlZih0aGlzLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpIHsKLQkJaWYgKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGltcGxpZWQgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIHJlZiBpcyBudWxsLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSB0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmOwotCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmLmRpc3Bvc2UoKTsKLQkJdGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9IG51bGw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX0VDTElQU0VMSU5LX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG1hcHBpbmdGaWxlUmVmLCBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlzdXBlci5zeW5jSW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCWlmICh0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmICE9IG51bGwpIHsKLQkJCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlzdXBlci51cGRhdGVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQotCQlpZiAodGhpcy5idWlsZHNJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZSgpKSB7Ci0JCQlpZiAodGhpcy5pbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmLnVwZGF0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgewotCQkJCXRoaXMucmVtb3ZlSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgdmlydHVhbCBFY2xpcHNlTGluayBtYXBwaW5nIGZpbGUgaWYgYWxsIHRoZSBmb2xsb3dpbmcgYXJlIHRydWU6PHVsPgotCSAqIDxsaT50aGUgcHJvcGVydGllcyBkbyBub3QgZXhwbGljaXRseSBleGNsdWRlIGl0Ci0JICogPGxpPml0IGlzIG5vdCBzcGVjaWZpZWQgZXhwbGljaXRseSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCSAqIDxsaT50aGUgZmlsZSBhY3R1YWxseSBleGlzdHMKLQkgKiA8L3VsPgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBidWlsZHNJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc05vdEV4Y2x1ZGVkKCkgJiYKLQkJCQl0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNOb3RTcGVjaWZpZWQoKSAmJgotCQkJCXRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVFeGlzdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzTm90RXhjbHVkZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMuaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVJc0V4Y2x1ZGVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRHZW5lcmFsUHJvcGVydGllcygpLmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpID09IEJvb2xlYW4uVFJVRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzTm90U3BlY2lmaWVkKCkgewotCQlyZXR1cm4gISB0aGlzLmltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nRmlsZUlzU3BlY2lmaWVkKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIElkZW50aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIGNvbnZlcnRlciBkZWZpbml0aW9ucy4KLQkgKiBOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIGdyYW51bGFyIGNoYW5nZXMgdG8gdGhpcyBsaXN0LiAgVGhlcmUgaXMgb25seQotCSAqIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBlbnRpcmUgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJTX0NPTExFQ1RJT04gPSAiY29udmVydGVycyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZCB0aGUgY29udmVydGVyIGRlZmluaXRpb24gKGRlZmluZWQgZWxzZXdoZXJlKSB0byB0aGUgbGlzdCBvZiBjb252ZXJ0ZXJzCi0JICogZGVmaW5lZCB3aXRoaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgdXBkYXRpbmcgdGhlCi0JICogbG9jYWwgY29udmVydGVyIGRlZmluaXRpb24uCi0JICogTm8gY2hhbmdlIG5vdGlmaWNhdGlvbiBhY2NvbXBhbmllcyB0aGlzIGFjdGlvbiBzcGVjaWZpY2FsbHkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLmNvbnZlcnRlcnMuYWRkKGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCBjb252ZXJ0ZXJzIGRlZmluZWQgd2l0aGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCwKLQkgKiBpbmNsdWRlZCBkdXBsaWNhdGVseSBuYW1lZCBjb252ZXJ0ZXJzIGRlZmluaXRpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGFsbENvbnZlcnRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+KHRoaXMuY29udmVydGVycyk7Ci0JfQotCi0JcHVibGljIGludCBjb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVycy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgY29udmVydGVycyBkZWZpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZQotCSAqIHVuaXQsIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFVuaXF1ZUNvbnZlcnRlck5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmFsbE5vbk51bGxDb252ZXJ0ZXJOYW1lcygpLCB0aGlzLmNvbnZlcnRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBhbGxOb25OdWxsQ29udmVydGVyTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPih0aGlzLmFsbENvbnZlcnRlck5hbWVzKCksIE5vdE51bGxGaWx0ZXIuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBhbGxDb252ZXJ0ZXJOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyLCBTdHJpbmc+KHRoaXMuYWxsQ29udmVydGVycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSkgc3VwZXIuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKENPTlZFUlRFUlNfQ09MTEVDVElPTik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpIHsKLQkJc3VwZXIuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKHNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSk7Ci0JCQotCQlpZihzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUgPT0gU2hhcmVkQ2FjaGVNb2RlLk5PTkUpIHsKLQkJCXRoaXMuY2FjaGluZy5yZW1vdmVEZWZhdWx0Q2FjaGluZ1Byb3BlcnRpZXMoKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpIHsKLQkJcmV0dXJuIFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlTaGFyZWRDYWNoZU1vZGUgc2hhcmVkQ2FjaGVNb2RlID0gdGhpcy5nZXRTaGFyZWRDYWNoZU1vZGUoKTsKLQkJaWYgKHNoYXJlZENhY2hlTW9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlzd2l0Y2ggKHNoYXJlZENhY2hlTW9kZSkgewotCQkJY2FzZSBOT05FOgotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgQUxMOgotCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9wZXJ0aWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZih0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQlmb3IoUHJvcGVydHkgcHJvcGVydHk6IHRoaXMuZ2V0TGVnYWN5RW50aXR5Q2FjaGluZ1Byb3BlcnRpZXMoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0VOVElUWV9DQUNISU5HLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtwcm9wZXJ0eS5nZXROYW1lKCl9LAotCQkJCQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSwKLQkJCQkJCXByb3BlcnR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCWZvcihQcm9wZXJ0eSBwcm9wZXJ0eTogdGhpcy5nZXRMZWdhY3lEZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnRpZXMoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7cHJvcGVydHkuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCksCi0JCQkJCQlwcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCQl0aGlzLnZhbGlkYXRlRGVmYXVsdENhY2hpbmdQcm9wZXJ0eSh0aGlzLmdldENhY2hlVHlwZURlZmF1bHRQcm9wZXJ0eSgpLCBtZXNzYWdlcyk7Ci0JCQl0aGlzLnZhbGlkYXRlRGVmYXVsdENhY2hpbmdQcm9wZXJ0eSh0aGlzLmdldENhY2hlU2l6ZURlZmF1bHRQcm9wZXJ0eSgpLCBtZXNzYWdlcyk7Ci0JCQl0aGlzLnZhbGlkYXRlRGVmYXVsdENhY2hpbmdQcm9wZXJ0eSh0aGlzLmdldEZsdXNoQ2xlYXJDYWNoZVByb3BlcnR5KCksIG1lc3NhZ2VzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGVmYXVsdENhY2hpbmdQcm9wZXJ0eShQcm9wZXJ0eSBjYWNoaW5nUHJvcGVydHksIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCQotCQlpZih0aGlzLmdldFNoYXJlZENhY2hlTW9kZSgpID09IFNoYXJlZENhY2hlTW9kZS5OT05FKSB7Ci0JCQlpZihjYWNoaW5nUHJvcGVydHkgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfQ0FDSElOR19QUk9QRVJUWV9JR05PUkVELAotCQkJCQkJbmV3IFN0cmluZ1tdIHtjYWNoaW5nUHJvcGVydHkuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCksCi0JCQkJCQljYWNoaW5nUHJvcGVydHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxQcm9wZXJ0eT4gZ2V0TGVnYWN5RGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKCkgewotCQlBcnJheUxpc3Q8UHJvcGVydHk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8UHJvcGVydHk+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldERlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcygpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PFByb3BlcnR5PiBnZXRMZWdhY3lFbnRpdHlDYWNoaW5nUHJvcGVydGllcygpIHsKLQkJQXJyYXlMaXN0PFByb3BlcnR5PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5PigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHJlc3VsdCwgdGhpcy5nZXRTaGFyZWRDYWNoZVByb3BlcnRpZXMoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldEVudGl0eUNhY2hlVHlwZVByb3BlcnRpZXMoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocmVzdWx0LCB0aGlzLmdldEVudGl0eUNhY2hlU2l6ZVByb3BlcnRpZXMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eSBnZXRDYWNoZVR5cGVEZWZhdWx0UHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5IGdldENhY2hlU2l6ZURlZmF1bHRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHkgZ2V0Rmx1c2hDbGVhckNhY2hlUHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIFNoYXJlZCBDYWNoZSBQcm9wZXJ0aWVzLCBpbmNsdWRpbmcgRW50aXR5IGFuZCBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldFNoYXJlZENhY2hlUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgRW50aXR5IENhY2hlIFNpemUgUHJvcGVydGllcywgZXhjbHVkaW5nIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSBJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0RW50aXR5Q2FjaGVTaXplUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5UHJvcGVydGllc1dpdGhQcmVmaXgoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBFbnRpdHkgQ2FjaGUgVHlwZSBQcm9wZXJ0aWVzLCBleGNsdWRpbmcgZGVmYXVsdC4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5PiBnZXRFbnRpdHlDYWNoZVR5cGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIERlc2NyaXB0b3IgQ3VzdG9taXplciBQcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHk+IGdldERlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5UHJvcGVydGllc1dpdGhQcmVmaXgoQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIEVudGl0eSBQcm9wZXJ0aWVzIHdpdGggdGhlIGdpdmVuIHByZWZpeCwKLQkgKiBleGNsdWRpbmcgRW50aXR5IHdoaWNoIG5hbWUgZXF1YWxzICJkZWZhdWx0Ii4KLQkgKi8KLQlwcml2YXRlIEl0ZXJhYmxlPFByb3BlcnR5PiBnZXRFbnRpdHlQcm9wZXJ0aWVzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JICAgcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxQcm9wZXJ0eT4oCi0JCSAgIAkJCQlDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5wcm9wZXJ0aWVzV2l0aE5hbWVQcmVmaXgocHJlZml4KSkpIHsKLQkgICAgICBAT3ZlcnJpZGUKLQkgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoUHJvcGVydHkgbmV4dCkgewotCQkJCXJldHVybiAhIG5leHQuZ2V0TmFtZSgpLmVuZHNXaXRoKCJkZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkgICAgICB9Ci0JICAgfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc1JlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3VzdG9taXphdGlvbi5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmxvZ2dpbmcuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3VzdG9taXphdGlvbi5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5sb2dnaW5nLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmN1c3RvbWl6YXRpb24uY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5sb2dnaW5nLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMjE0MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBleHRlbmRzIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17CQotCi0JUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZExvZ2dpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkYjNlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotLyoqCi0gKiAgQ2FjaGVUeXBlCi0gKi8KLXB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0Jc29mdF93ZWFrLCAKLQloYXJkX3dlYWssIAotCXdlYWssCi0Jc29mdCwKLQlmdWxsLAotCW5vbmU7IAotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTCA9ICJGdWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJEX1dFQUsgPSAiSGFyZFdlYWsiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTk9ORSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09GVCA9ICJTb2Z0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT0ZUX1dFQUsgPSAiU29mdFdlYWsiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQUsgPSAiV2VhayI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyNmNiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBDYWNoaW5nCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGluZyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQlDYWNoZVR5cGUgZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKTsKLQlDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCXZvaWQgc2V0Q2FjaGVUeXBlRGVmYXVsdChDYWNoZVR5cGUgY2FjaGVUeXBlRGVmYXVsdCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZID0gImNhY2hlVHlwZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQgPSAiZWNsaXBzZWxpbmsuY2FjaGUudHlwZS5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIERFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxUID0gQ2FjaGVUeXBlLnNvZnRfd2VhazsKLQotCUludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZURlZmF1bHQoKTsKLQlJbnRlZ2VyIGdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQl2b2lkIHNldENhY2hlU2l6ZURlZmF1bHQoSW50ZWdlciBjYWNoZVNpemVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkgPSAiY2FjaGVTaXplRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaXplLmRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUID0gSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQlCb29sZWFuIGdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCXZvaWQgc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KEJvb2xlYW4gc2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSA9ICJzaGFyZWRDYWNoZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCA9ICJlY2xpcHNlbGluay5jYWNoZS5zaGFyZWQuZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVCA9IEJvb2xlYW4uVFJVRTsKLQotCi0JQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGUoKTsKLQlDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUpOwotCXZvaWQgc2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUsIENhY2hlVHlwZSBjYWNoZVR5cGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfUFJPUEVSVFkgPSAiY2FjaGVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSA9ICJlY2xpcHNlbGluay5jYWNoZS50eXBlLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIENhY2hlVHlwZSBERUZBVUxUX0NBQ0hFX1RZUEUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplKCk7Ci0JSW50ZWdlciBnZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSwgSW50ZWdlciBjYWNoZVNpemUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfUFJPUEVSVFkgPSAiY2FjaGVTaXplIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU0laRSA9ICJlY2xpcHNlbGluay5jYWNoZS5zaXplLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9DQUNIRV9TSVpFID0gSW50ZWdlci52YWx1ZU9mKDEwMCk7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRTaGFyZWRDYWNoZSgpOwotCUJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBCb29sZWFuIHNoYXJlZENhY2hlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfUFJPUEVSVFkgPSAic2hhcmVkQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgPSAiZWNsaXBzZWxpbmsuY2FjaGUuc2hhcmVkLiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TSEFSRURfQ0FDSEUgPSBCb29sZWFuLlRSVUU7Ci0KLQlGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdEZsdXNoQ2xlYXJDYWNoZSgpOwotCUZsdXNoQ2xlYXJDYWNoZSBnZXRGbHVzaENsZWFyQ2FjaGUoKTsKLQl2b2lkIHNldEZsdXNoQ2xlYXJDYWNoZShGbHVzaENsZWFyQ2FjaGUgbmV3Rmx1c2hDbGVhckNhY2hlKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSA9ICJmbHVzaENsZWFyQ2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19GTFVTSF9DTEVBUl9DQUNIRSA9ICJlY2xpcHNlbGluay5mbHVzaC1jbGVhci5jYWNoZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBERUZBVUxUX0ZMVVNIX0NMRUFSX0NBQ0hFID0gRmx1c2hDbGVhckNhY2hlLmRyb3BfaW52YWxpZGF0ZTsKLQotCXZvaWQgcmVtb3ZlRGVmYXVsdENhY2hpbmdQcm9wZXJ0aWVzKCk7Ci0KLQlMaXN0SXRlcmF0b3I8RW50aXR5PiBlbnRpdGllcygpOwotCUl0ZXJhdG9yPFN0cmluZz4gZW50aXR5TmFtZXMoKTsKLQlpbnQgZW50aXRpZXNTaXplKCk7Ci0JYm9vbGVhbiBlbnRpdHlFeGlzdHMoU3RyaW5nIGVudGl0eSk7Ci0JRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5KTsKLQl2b2lkIHJlbW92ZUVudGl0eShTdHJpbmcgZW50aXR5KTsKLQkJU3RyaW5nIEVOVElUSUVTX0xJU1QgPSAiZW50aXRpZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM4Yzk5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci0KLS8qKgotICogIEVudGl0eQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIENhY2hpbmcgcGFyZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9QUk9QRVJUWSA9IENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX1BST1BFUlRZID0gQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9QUk9QRVJUWSA9IENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZOwotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIENhY2hlVHlwZSBjYWNoZVR5cGU7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGNhY2hlU2l6ZTsKLQlwcml2YXRlIEJvb2xlYW4gY2FjaGVJc1NoYXJlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFbnRpdHkoQ2FjaGluZyBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMocGFyZW50KTsKLQkJdGhpcy5pbml0aWFsaXplKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEVudGl0eShDYWNoaW5nIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIG5hbWUpIHsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvcnMgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBFbnRpdHkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50aXR5IG90aGVyID0gKEVudGl0eSkgbzsKLQkJcmV0dXJuICgKLQkJCSh0aGlzLmNhY2hlVHlwZSA9PSBudWxsID8KLQkJCQlvdGhlci5jYWNoZVR5cGUgPT0gbnVsbCA6IHRoaXMuY2FjaGVUeXBlLmVxdWFscyhvdGhlci5jYWNoZVR5cGUpKSAmJgotCQkJKHRoaXMuY2FjaGVJc1NoYXJlZCA9PSBudWxsID8KLQkJCQlvdGhlci5jYWNoZUlzU2hhcmVkID09IG51bGwgOiB0aGlzLmNhY2hlSXNTaGFyZWQuZXF1YWxzKG90aGVyLmNhY2hlSXNTaGFyZWQpKSAmJgotCQkJKHRoaXMuY2FjaGVTaXplID09IG51bGwgPwotCQkJCW90aGVyLmNhY2hlU2l6ZSA9PSBudWxsIDogdGhpcy5jYWNoZVNpemUuZXF1YWxzKG90aGVyLmNhY2hlU2l6ZSkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMuY2FjaGVUeXBlID09IG51bGwpID8gMCA6IHRoaXMuY2FjaGVUeXBlLmhhc2hDb2RlKCk7Ci0JfQotCQotCSBAT3ZlcnJpZGUKLQkgcHVibGljIEVudGl0eSBjbG9uZSgpIHsKLQkJIHRyeSB7Ci0JCQkgcmV0dXJuIChFbnRpdHkpc3VwZXIuY2xvbmUoKTsKLQkJIH0KLQkJIGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCSB9Ci0JIH0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVR5cGUgPT0gbnVsbCkgJiYKLQkJCQkJKHRoaXMuY2FjaGVTaXplID09IG51bGwpICYmCi0JCQkJCSh0aGlzLmNhY2hlSXNTaGFyZWQgPT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVudGl0eU5hbWVJc1ZhbGlkKCkgewotCQlyZXR1cm4gISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSk7Ci0JfQotCi0JcHVibGljIENhY2hpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8vICoqKioqKioqKiogY2FjaGVUeXBlICoqKioqKioqKioKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldENhY2hlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlVHlwZShDYWNoZVR5cGUgY2FjaGVUeXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZTsKLQkJdGhpcy5jYWNoZVR5cGUgPSBjYWNoZVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9UWVBFX1BST1BFUlRZLCBvbGQsIGNhY2hlVHlwZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYWNoZVNpemUgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldENhY2hlU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZShJbnRlZ2VyIGNhY2hlU2l6ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplOwotCQl0aGlzLmNhY2hlU2l6ZSA9IGNhY2hlU2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZCwgY2FjaGVTaXplKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNhY2hlSXNTaGFyZWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGNhY2hlSXNTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlSXNTaGFyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGUoQm9vbGVhbiBpc1NoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuY2FjaGVJc1NoYXJlZDsKLQkJdGhpcy5jYWNoZUlzU2hhcmVkID0gaXNTaGFyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfUFJPUEVSVFksIG9sZCwgaXNTaGFyZWQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCJuYW1lOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJc2IuYXBwZW5kKCIsIGNhY2hlVHlwZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuY2FjaGVUeXBlKTsKLQkJc2IuYXBwZW5kKCIsIGNhY2hlU2l6ZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMuY2FjaGVTaXplKTsKLQkJc2IuYXBwZW5kKCIsIGNhY2hlSXNTaGFyZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmNhY2hlSXNTaGFyZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmYTU2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotLyoqCi0gKiAgRmx1c2hDbGVhckNhY2hlCi0gKi8KLXB1YmxpYyBlbnVtIEZsdXNoQ2xlYXJDYWNoZSB7Ci0JZHJvcCwKLQlkcm9wX2ludmFsaWRhdGUsCi0JbWVyZ2U7IAotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUCA9ICJEcm9wIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0lOVkFMSURBVEUgPSAiRHJvcEludmFsaWRhdGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFID0gIk1lcmdlIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzNGI3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQmF0Y2hXcml0aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi0vKioKLSAqICBCYXRjaFdyaXRpbmcKLSAqLwotcHVibGljIGVudW0gQmF0Y2hXcml0aW5nIHsKLQkJCW5vbmUsIAotCQkJamRiYywgCi0JCQlidWZmZXJlZCwgCi0JCQlvcmFjbGVfamRiYzsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJOb25lIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpEQkMgPSAiSkRCQyI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBCVUZGRVJFRCA9ICJCdWZmZXJlZCI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEVfSkRCQyA9ICJPcmFjbGUtSkRCQyI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjMWE1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgQ29ubmVjdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCk7Ci0JQm9vbGVhbiBnZXROYXRpdmVTcWwoKTsKLQl2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1NRTF9QUk9QRVJUWSA9ICJuYXRpdmVTcWwiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19OQVRJVkVfU1FMID0gImVjbGlwc2VsaW5rLmpkYmMubmF0aXZlLXNxbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9OQVRJVkVfU1FMID0gQm9vbGVhbi5GQUxTRTsKLQotCUJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCk7Ci0JQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpOwotCXZvaWQgc2V0QmF0Y2hXcml0aW5nKEJhdGNoV3JpdGluZyBuZXdCYXRjaFdyaXRpbmcpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIX1dSSVRJTkdfUFJPUEVSVFkgPSAiYmF0Y2hXcml0aW5nIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORyA9ICJlY2xpcHNlbGluay5qZGJjLmJhdGNoLXdyaXRpbmciOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgREVGQVVMVF9CQVRDSF9XUklUSU5HID0gQmF0Y2hXcml0aW5nLm5vbmU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRDYWNoZVN0YXRlbWVudHMoKTsKLQlCb29sZWFuIGdldENhY2hlU3RhdGVtZW50cygpOwotCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzKEJvb2xlYW4gbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZID0gImNhY2hlU3RhdGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMgPSAiZWNsaXBzZWxpbmsuamRiYy5jYWNoZS1zdGF0ZW1lbnRzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFMgPSBCb29sZWFuLkZBTFNFOwotCi0JSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCUludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCXZvaWQgc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZShJbnRlZ2VyIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSA9ICJjYWNoZVN0YXRlbWVudHNTaXplIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFID0gImVjbGlwc2VsaW5rLmpkYmMuY2FjaGUtc3RhdGVtZW50cy5zaXplIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSA9IEludGVnZXIudmFsdWVPZig1MCk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdERyaXZlcigpOwotCVN0cmluZyBnZXREcml2ZXIoKTsKLQl2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfUFJPUEVSVFkgPSAiZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRFJJVkVSID0gImVjbGlwc2VsaW5rLmpkYmMuZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRFJJVkVSID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXREZWZhdWx0VXJsKCk7Ci0JU3RyaW5nIGdldFVybCgpOwotCXZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9QUk9QRVJUWSA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19VUkwgPSAiZWNsaXBzZWxpbmsuamRiYy51cmwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9VUkwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldERlZmF1bHRVc2VyKCk7Ci0JU3RyaW5nIGdldFVzZXIoKTsKLQl2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUFJPUEVSVFkgPSAidXNlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1VTRVIgPSAiZWNsaXBzZWxpbmsuamRiYy51c2VyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUiA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCk7Ci0JU3RyaW5nIGdldFBhc3N3b3JkKCk7Ci0Jdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1BST1BFUlRZID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUEFTU1dPUkQgPSAiZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBU1NXT1JEID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCk7Ci0JQm9vbGVhbiBnZXRCaW5kUGFyYW1ldGVycygpOwotCXZvaWQgc2V0QmluZFBhcmFtZXRlcnMoQm9vbGVhbiBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9QQVJBTUVURVJTX1BST1BFUlRZID0gImJpbmRQYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTID0gImVjbGlwc2VsaW5rLmpkYmMuYmluZC1wYXJhbWV0ZXJzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0JJTkRfUEFSQU1FVEVSUyA9IEJvb2xlYW4uVFJVRTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCUJvb2xlYW4gZ2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoQm9vbGVhbiBuZXdSZWFkQ29ubmVjdGlvbnNTaGFyZWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc1NoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5zaGFyZWQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQgPSBCb29sZWFuLkZBTFNFOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQl2b2lkIHNldFJlYWRDb25uZWN0aW9uc01pbihJbnRlZ2VyIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkgPSAicmVhZENvbm5lY3Rpb25zTWluIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU4gPSAiZWNsaXBzZWxpbmsuamRiYy5yZWFkLWNvbm5lY3Rpb25zLm1pbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01JTiA9IEludGVnZXIudmFsdWVPZigyKTsKLQotCUludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpOwotCUludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0Jdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNYXgoSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZID0gInJlYWRDb25uZWN0aW9uc01heCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMucmVhZC1jb25uZWN0aW9ucy5tYXgiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVggPSBJbnRlZ2VyLnZhbHVlT2YoMik7Ci0KLQlJbnRlZ2VyIGdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWluKCk7Ci0JSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCk7Ci0Jdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWluKEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZID0gIndyaXRlQ29ubmVjdGlvbnNNaW4iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4gPSAiZWNsaXBzZWxpbmsuamRiYy53cml0ZS1jb25uZWN0aW9ucy5taW4iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCUludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCXZvaWQgc2V0V3JpdGVDb25uZWN0aW9uc01heChJbnRlZ2VyIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSA9ICJ3cml0ZUNvbm5lY3Rpb25zTWF4IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYID0gImVjbGlwc2VsaW5rLmpkYmMud3JpdGUtY29ubmVjdGlvbnMubWF4IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgSW50ZWdlciBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWCA9IEludGVnZXIudmFsdWVPZigxMCk7Ci0KLQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXREZWZhdWx0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpOwotCXZvaWQgc2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkgPSAiZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFID0gImVjbGlwc2VsaW5rLmpkYmMuZXhjbHVzaXZlLWNvbm5lY3Rpb24ubW9kZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIERFRkFVTFRfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSA9IEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLnRyYW5zYWN0aW9uYWw7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRMYXp5Q29ubmVjdGlvbigpOwotCUJvb2xlYW4gZ2V0TGF6eUNvbm5lY3Rpb24oKTsKLQl2b2lkIHNldExhenlDb25uZWN0aW9uKEJvb2xlYW4gbmV3TGF6eUNvbm5lY3Rpb24pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIExBWllfQ09OTkVDVElPTl9QUk9QRVJUWSA9ICJsYXp5Q29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTiA9ICJlY2xpcHNlbGluay5qZGJjLmV4Y2x1c2l2ZS1jb25uZWN0aW9uLmlzLWxhenkiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfTEFaWV9DT05ORUNUSU9OID0gQm9vbGVhbi5UUlVFOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGQ5M2JmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLS8qKgotICogIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlCi0gKi8KLXB1YmxpYyBlbnVtIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIHsKLQlhbHdheXMsCi0JaXNvbGF0ZWQsCi0JdHJhbnNhY3Rpb25hbDsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQUxXQVlTID0gIkFsd2F5cyI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJU09MQVRFRCA9ICJJc29sYXRlZCI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTkFMID0gIlRyYW5zYWN0aW9uYWwiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0N1c3RvbWl6YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxNDA0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIEN1c3RvbWl6YXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBDdXN0b21pemF0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocm93RXhjZXB0aW9ucygpOwotCUJvb2xlYW4gZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0Jdm9pZCBzZXRUaHJvd0V4Y2VwdGlvbnMoQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkgPSAidGhyb3dFeGNlcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyA9ICJlY2xpcHNlbGluay5vcm0udGhyb3cuZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9USFJPV19FWENFUFRJT05TID0gQm9vbGVhbi5UUlVFOwotCQotCVdlYXZpbmcgZ2V0RGVmYXVsdFdlYXZpbmcoKTsKLQlXZWF2aW5nIGdldFdlYXZpbmcoKTsKLQl2b2lkIHNldFdlYXZpbmcoV2VhdmluZyBuZXdXZWF2aW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX1BST1BFUlRZID0gIndlYXZpbmciOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HID0gImVjbGlwc2VsaW5rLndlYXZpbmciOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBXZWF2aW5nIERFRkFVTFRfV0VBVklORyA9IFdlYXZpbmcudHJ1ZV87Ci0gCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0xhenkoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdMYXp5KCk7Ci0Jdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0xBWllfUFJPUEVSVFkgPSAid2VhdmluZ0xhenkiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5sYXp5IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfTEFaWSA9IEJvb2xlYW4uVFJVRTsKLQkKLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdDaGFuZ2VUcmFja2luZygpOwotCXZvaWQgc2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKEJvb2xlYW4gbmV3V2VhdmluZ0NoYW5nZVRyYWNraW5nKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSA9ICJ3ZWF2aW5nQ2hhbmdlVHJhY2tpbmciOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORyA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmNoYW5nZXRyYWNraW5nIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HID0gQm9vbGVhbi5UUlVFOwotCi0JQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JQm9vbGVhbiBnZXRXZWF2aW5nRmV0Y2hHcm91cHMoKTsKLQl2b2lkIHNldFdlYXZpbmdGZXRjaEdyb3VwcyhCb29sZWFuIG5ld1dlYXZpbmdGZXRjaEdyb3Vwcyk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkgPSAid2VhdmluZ0ZldGNoR3JvdXBzIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5mZXRjaGdyb3VwcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0ZFVENIX0dST1VQUyA9IEJvb2xlYW4uVFJVRTsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdJbnRlcm5hbCgpOwotCUJvb2xlYW4gZ2V0V2VhdmluZ0ludGVybmFsKCk7Ci0Jdm9pZCBzZXRXZWF2aW5nSW50ZXJuYWwoQm9vbGVhbiBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFkgPSAid2VhdmluZ0ludGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTCA9ICJlY2xpcHNlbGluay53ZWF2aW5nLmludGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1dFQVZJTkdfSU5URVJOQUwgPSBCb29sZWFuLlRSVUU7Ci0KLQlCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRWFnZXIoKTsKLQlCb29sZWFuIGdldFdlYXZpbmdFYWdlcigpOwotCXZvaWQgc2V0V2VhdmluZ0VhZ2VyKEJvb2xlYW4gbmV3V2VhdmluZ0VhZ2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0VBR0VSX1BST1BFUlRZID0gIndlYXZpbmdFYWdlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIgPSAiZWNsaXBzZWxpbmsud2VhdmluZy5lYWdlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9XRUFWSU5HX0VBR0VSID0gQm9vbGVhbi5GQUxTRTsKLQotCVN0cmluZyBnZXREZWZhdWx0RGVzY3JpcHRvckN1c3RvbWl6ZXIoKTsKLQlTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihTdHJpbmcgZW50aXR5TmFtZSk7Ci0Jdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgbmV3RGVzY3JpcHRvckN1c3RvbWl6ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSA9ICJkZXNjcmlwdG9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiA9ICJlY2xpcHNlbGluay5kZXNjcmlwdG9yLmN1c3RvbWl6ZXIuIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gbnVsbDsJLy8gbm8gZGVmYXVsdAotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gc2Vzc2lvbkN1c3RvbWl6ZXJzKCk7Ci0JaW50IHNlc3Npb25DdXN0b21pemVyc1NpemUoKTsKLQlib29sZWFuIHNlc3Npb25DdXN0b21pemVyRXhpc3RzKFN0cmluZyBzZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JU3RyaW5nIGFkZFNlc3Npb25DdXN0b21pemVyKFN0cmluZyBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0Jdm9pZCByZW1vdmVTZXNzaW9uQ3VzdG9taXplcihTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9MSVNUID0gInNlc3Npb25DdXN0b21pemVycyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFkgPSAic2Vzc2lvbkN1c3RvbWl6ZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi5jdXN0b21pemVyIjsgLy8kTk9OLU5MUy0xJAotCi0JTGlzdEl0ZXJhdG9yPEVudGl0eT4gZW50aXRpZXMoKTsKLQlJdGVyYXRvcjxTdHJpbmc+IGVudGl0eU5hbWVzKCk7Ci0JaW50IGVudGl0aWVzU2l6ZSgpOwotCWJvb2xlYW4gZW50aXR5RXhpc3RzKFN0cmluZyBlbnRpdHkpOwotCUVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0Jdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVNfTElTVCA9ICJlbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRQcm9maWxlcigpOwotCVN0cmluZyBnZXRQcm9maWxlcigpOwotCXZvaWQgc2V0UHJvZmlsZXIoU3RyaW5nIG5ld1Byb2ZpbGVyKTsKLQl2b2lkIHNldFByb2ZpbGVyKFByb2ZpbGVyIG5ld1Byb2ZpbGVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFUl9QUk9QRVJUWSA9ICJwcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1BST0ZJTEVSID0gImVjbGlwc2VsaW5rLnByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJPRklMRVIgPSAKLQkJCUFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoUHJvZmlsZXIubm9fcHJvZmlsZXIpOwotCQlTdHJpbmcgRUNMSVBTRUxJTktfU0VTU0lPTl9QUk9GSUxFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnNlc3Npb25zLlNlc3Npb25Qcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JQm9vbGVhbiBnZXREZWZhdWx0VmFsaWRhdGlvbk9ubHkoKTsKLQlCb29sZWFuIGdldFZhbGlkYXRpb25Pbmx5KCk7Ci0Jdm9pZCBzZXRWYWxpZGF0aW9uT25seShCb29sZWFuIG5ld1ZhbGlkYXRpb25Pbmx5KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX09OTFlfUFJPUEVSVFkgPSAidmFsaWRhdGlvbk9ubHkiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19WQUxJREFUSU9OX09OTFkgPSAiZWNsaXBzZWxpbmsudmFsaWRhdGlvbi1vbmx5IjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1ZBTElEQVRJT05fT05MWSA9IEJvb2xlYW4uVFJVRTsKLQotCVN0cmluZyBnZXREZWZhdWx0RXhjZXB0aW9uSGFuZGxlcigpOwotCVN0cmluZyBnZXRFeGNlcHRpb25IYW5kbGVyKCk7Ci0Jdm9pZCBzZXRFeGNlcHRpb25IYW5kbGVyKFN0cmluZyBuZXdFeGNlcHRpb25IYW5kbGVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSA9ICJleGNlcHRpb25IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIgPSAiZWNsaXBzZWxpbmsuZXhjZXB0aW9uLWhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWENFUFRJT05fSEFORExFUiA9IG51bGw7CS8vIG5vIGRlZmF1bHQKLQotCQlTdHJpbmcgRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5leGNlcHRpb25zLkV4Y2VwdGlvbkhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlCb29sZWFuIGdldERlZmF1bHRWYWxpZGF0ZVNjaGVtYSgpOwotCUJvb2xlYW4gZ2V0VmFsaWRhdGVTY2hlbWEoKTsKLQl2b2lkIHNldFZhbGlkYXRlU2NoZW1hKEJvb2xlYW4gbmV3VmFsaWRhdGVTY2hlbWEpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSA9ICJ2YWxpZGF0ZVNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQSA9ICJlY2xpcHNlbGluay5vcm0udmFsaWRhdGUuc2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1ZBTElEQVRFX1NDSEVNQSA9IEJvb2xlYW4uRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NzQyNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiAgRW50aXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBwYXJlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkgPSBDdXN0b21pemF0aW9uLkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWTsKLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRW50aXR5KEN1c3RvbWl6YXRpb24gcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQl0aGlzKHBhcmVudCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eShDdXN0b21pemF0aW9uIHBhcmVudCkgewotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIG5hbWUpIHsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvcnMgKioqKioqKioqKgotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBFbnRpdHkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJRW50aXR5IGN1c3RvbWl6ZXIgPSAoRW50aXR5KSBvOwotCQlyZXR1cm4gKAotCQkJKHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbCA/Ci0JCQkJY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplciA9PSBudWxsIDogCi0JCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplci5lcXVhbHMoY3VzdG9taXplci5kZXNjcmlwdG9yQ3VzdG9taXplcikpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyID09IG51bGwpID8gMCA6IHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIuaGFzaENvZGUoKTsKLQl9Ci0JCi0JIEBPdmVycmlkZQotCSBwdWJsaWMgRW50aXR5IGNsb25lKCkgewotCQkgdHJ5IHsKLQkJCSByZXR1cm4gKEVudGl0eSlzdXBlci5jbG9uZSgpOwotCQkgfQotCQkgY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJIH0KLQkgfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZW50aXR5TmFtZUlzVmFsaWQoKSB7Ci0JCXJldHVybiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvbiBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlci9zZXR0ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3JDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yQ3VzdG9taXplcihTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXI7Ci0JCXRoaXMuZGVzY3JpcHRvckN1c3RvbWl6ZXIgPSBkZXNjcmlwdG9yQ3VzdG9taXplcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdG9yQ3VzdG9taXplcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIm5hbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlzYi5hcHBlbmQoIiwgZGVzY3JpcHRvckN1c3RvbWl6ZXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUHJvZmlsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9Qcm9maWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWIzMGQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9Qcm9maWxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLS8qKgotICogIFByb2ZpbGVyCi0gKi8KLXB1YmxpYyBlbnVtIFByb2ZpbGVyIHsKLQlwZXJmb3JtYW5jZV9wcm9maWxlciwgCi0JcXVlcnlfbW9uaXRvciwKLQlub19wcm9maWxlcjsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkZPUk1BTkNFX1BST0ZJTEVSID0gIlBlcmZvcm1hbmNlUHJvZmlsZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTU9OSVRPUiA9ICJRdWVyeU1vbml0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fUFJPRklMRVIgPSAiTm9Qcm9maWxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEVjbGlwc2VMaW5rIHByb2ZpbGVyIGNsYXNzIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSRk9STUFOQ0VfUFJPRklMRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5wcm9maWxlci5QZXJmb3JtYW5jZVByb2ZpbGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX01PTklUT1JfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5wcm9maWxlci5RdWVyeU1vbml0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFByb2ZpbGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9maWxlciBnZXRQcm9maWxlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBQcm9maWxlciBwcm9maWxlciA6IFByb2ZpbGVyLnZhbHVlcygpKSB7Ci0JCQlpZihwcm9maWxlci50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiBwcm9maWxlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvZmlsZXJDbGFzc05hbWUoU3RyaW5nIHByb2ZpbGVyVmFsdWUpIHsKLQkJaWYgKHByb2ZpbGVyVmFsdWUgPT0gUEVSRk9STUFOQ0VfUFJPRklMRVIpIHsKLQkJCXJldHVybiBQRVJGT1JNQU5DRV9QUk9GSUxFUl9DTEFTU19OQU1FOwotCQl9Ci0JCWlmIChwcm9maWxlclZhbHVlID09IFFVRVJZX01PTklUT1IpIHsKLQkJCXJldHVybiBRVUVSWV9NT05JVE9SX0NMQVNTX05BTUU7Ci0JCX0KLQkJcmV0dXJuIHByb2ZpbGVyVmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2Q2MmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi0vKioKLSAqICBXZWF2aW5nCi0gKi8KLXB1YmxpYyBlbnVtIFdlYXZpbmcgewotCXRydWVfLAotCWZhbHNlXywgCi0Jc3RhdGljXzsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUVfID0gInRydWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTFNFXyA9ICJmYWxzZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVElDXyA9ICJzdGF0aWMiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjZGJjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiAgR2VuZXJhbFByb3BlcnRpZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmFsUHJvcGVydGllcyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsKLQotCUJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCUJvb2xlYW4gZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0Jdm9pZCBzZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oQm9vbGVhbiBuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZID0gImV4Y2x1ZGVFY2xpcHNlbGlua09ybSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNID0gImVjbGlwc2VsaW5rLmV4Y2x1ZGUtZWNsaXBzZWxpbmstb3JtIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNID0gQm9vbGVhbi5GQUxTRTsKLQkJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OWE3MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotLyoqCi0gKiBMb2dnZXIKLSAqLwotcHVibGljIGVudW0gTG9nZ2VyIHsKLQkJCWRlZmF1bHRfbG9nZ2VyLCAKLQkJCWphdmFfbG9nZ2VyLCAKLQkJCXNlcnZlcl9sb2dnZXI7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVIgPSAiRGVmYXVsdExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUiA9ICJKYXZhTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHRVIgPSAiU2VydmVyTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEVjbGlwc2VMaW5rIGxvZ2dlciBjbGFzcyBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubG9nZ2luZy5EZWZhdWx0U2Vzc2lvbkxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX0xPR0dFUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmxvZ2dpbmcuSmF2YUxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfTE9HR0VSX0NMQVNTX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uc2VydmVyLlNlcnZlckxvZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExvZ2dlciB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaXRlcmFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9nZ2VyIGdldExvZ2dlckZvcihTdHJpbmcgbGl0ZXJhbCkgewotCQkKLQkJZm9yKCBMb2dnZXIgbG9nZ2VyIDogTG9nZ2VyLnZhbHVlcygpKSB7Ci0JCQlpZihsb2dnZXIudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKLQkJCQlyZXR1cm4gbG9nZ2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMb2dnZXJDbGFzc05hbWUoU3RyaW5nIGxvZ2dlclZhbHVlKSB7Ci0JCWlmIChsb2dnZXJWYWx1ZSA9PSBERUZBVUxUX0xPR0dFUikgewotCQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUU7Ci0JCX0KLQkJaWYgKGxvZ2dlclZhbHVlID09IEpBVkFfTE9HR0VSKSB7Ci0JCQlyZXR1cm4gSkFWQV9MT0dHRVJfQ0xBU1NfTkFNRTsKLQkJfQotCQlpZiAobG9nZ2VyVmFsdWUgPT0gU0VSVkVSX0xPR0dFUikgewotCQkJcmV0dXJuIFNFUlZFUl9MT0dHRVJfQ0xBU1NfTkFNRTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyVmFsdWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWM0YjM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogTG9nZ2luZwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvZ2dpbmcgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpOwotCUxvZ2dpbmdMZXZlbCBnZXRMZXZlbCgpOwotCXZvaWQgc2V0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMRVZFTF9QUk9QRVJUWSA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0xFVkVMID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgREVGQVVMVF9MRVZFTCA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRpbWVzdGFtcCgpOwotCUJvb2xlYW4gZ2V0VGltZXN0YW1wKCk7Ci0Jdm9pZCBzZXRUaW1lc3RhbXAoQm9vbGVhbiB0aW1lc3RhbXApOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9QUk9QRVJUWSA9ICJ0aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USU1FU1RBTVAgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVElNRVNUQU1QID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpOwotCUJvb2xlYW4gZ2V0VGhyZWFkKCk7Ci0Jdm9pZCBzZXRUaHJlYWQoQm9vbGVhbiB0aHJlYWQpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9QUk9QRVJUWSA9ICJ0aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19USFJFQUQgPSAiZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVEhSRUFEID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdFNlc3Npb24oKTsKLQlCb29sZWFuIGdldFNlc3Npb24oKTsKLQl2b2lkIHNldFNlc3Npb24oQm9vbGVhbiBzZXNzaW9uKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX1BST1BFUlRZID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVNTSU9OID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuc2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OID0gQm9vbGVhbi5UUlVFOwotCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2VwdGlvbnMoKTsKLQlCb29sZWFuIGdldEV4Y2VwdGlvbnMoKTsKLQl2b2lkIHNldEV4Y2VwdGlvbnMoQm9vbGVhbiBleGNlcHRpb25zKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05TX1BST1BFUlRZID0gImV4Y2VwdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19FWENFUFRJT05TID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9FWENFUFRJT05TID0gQm9vbGVhbi5GQUxTRTsKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQlTdHJpbmcgZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbik7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkgPSAibG9nRmlsZUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5maWxlIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HX0ZJTEVfTE9DQVRJT04gPSBudWxsOwkJLy8gTm8gRGVmYXVsdAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpOwotCVN0cmluZyBnZXRMb2dnZXIoKTsKLQl2b2lkIHNldExvZ2dlcihTdHJpbmcgbmV3TG9nZ2VyKTsKLQl2b2lkIHNldExvZ2dlcihMb2dnZXIgbmV3TG9nZ2VyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfUFJPUEVSVFkgPSAibG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfTE9HR0VSID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTE9HR0VSID0gCi0JCQlBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKExvZ2dlci5kZWZhdWx0X2xvZ2dlcik7Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19MT0dHRVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5sb2dnaW5nLlNlc3Npb25Mb2ciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZDkwYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotLyoqCi0gKiAgTG9nZ2luZ0xldmVsCi0gKi8KLXB1YmxpYyBlbnVtIExvZ2dpbmdMZXZlbCB7Ci0JCQlvZmYsIAotCQkJc2V2ZXJlLCAKLQkJCXdhcm5pbmcsIAotCQkJaW5mbywgCi0JCQljb25maWcsIAotCQkJZmluZSwgCi0JCQlmaW5lciwKLQkJCWZpbmVzdCwKLQkJCWFsbDsKLQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRiA9ICJPRkYiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVkVSRSA9ICJTRVZFUkUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5JTkcgPSAiV0FSTklORyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTyA9ICJJTkZPIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUcgPSAiQ09ORklHIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FID0gIkZJTkUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTkVSID0gIkZJTkVSIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSU5FU1QgPSAiRklORVNUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiQUxMIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTc2ZjdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBTZXNzaW9uIE9wdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcHRpb25zIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCVN0cmluZyBnZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQlTdHJpbmcgZ2V0U2Vzc2lvbk5hbWUoKTsKLQl2b2lkIHNldFNlc3Npb25OYW1lKFN0cmluZyBuZXdTZXNzaW9uTmFtZSk7IAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9QUk9QRVJUWSA9ICJzZXNzaW9uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSA9ICJlY2xpcHNlbGluay5zZXNzaW9uLW5hbWUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OX05BTUUgPSAiIjsJLy8gbm8gZGVmYXVsdCAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCk7Ci0JU3RyaW5nIGdldFNlc3Npb25zWG1sKCk7Ci0Jdm9pZCBzZXRTZXNzaW9uc1htbChTdHJpbmcgbmV3U2Vzc2lvbnNYbWwpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9QUk9QRVJUWSA9ICJzZXNzaW9uc1htbCI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCA9ICJlY2xpcHNlbGluay5zZXNzaW9ucy14bWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TRVNTSU9OU19YTUwgPSAiIjsJLy8gbm8gZGVmYXVsdCAvLyROT04tTkxTLTEkCi0JCQotCUJvb2xlYW4gZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCUJvb2xlYW4gZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0Jdm9pZCBzZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoQm9vbGVhbiBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkgPSAiaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzeSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi5pbmNsdWRlLmRlc2NyaXB0b3IucXVlcmllcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEJvb2xlYW4gREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTID0gQm9vbGVhbi5UUlVFOwotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCk7Ci0JU3RyaW5nIGdldFRhcmdldERhdGFiYXNlKCk7Ci0Jdm9pZCBzZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCXZvaWQgc2V0VGFyZ2V0RGF0YWJhc2UoVGFyZ2V0RGF0YWJhc2UgbmV3VGFyZ2V0RGF0YWJhc2UpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSA9ICJ0YXJnZXREYXRhYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSA9ICJlY2xpcHNlbGluay50YXJnZXQtZGF0YWJhc2UiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9UQVJHRVRfREFUQUJBU0UgPSAKLQkJCUFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVGFyZ2V0RGF0YWJhc2UuYXV0byk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpOwotCVN0cmluZyBnZXRUYXJnZXRTZXJ2ZXIoKTsKLQl2b2lkIHNldFRhcmdldFNlcnZlcihTdHJpbmcgbmV3VGFyZ2V0U2VydmVyKTsKLQl2b2lkIHNldFRhcmdldFNlcnZlcihUYXJnZXRTZXJ2ZXIgbmV3VGFyZ2V0U2VydmVyKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VSVkVSX1BST1BFUlRZID0gInRhcmdldFNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIgPSAiZWNsaXBzZWxpbmsudGFyZ2V0LXNlcnZlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBUkdFVF9TRVJWRVIgPSAKLQkJCUFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVGFyZ2V0U2VydmVyLm5vbmUpOwotCi0JU3RyaW5nIGdldERlZmF1bHRFdmVudExpc3RlbmVyKCk7Ci0JU3RyaW5nIGdldEV2ZW50TGlzdGVuZXIoKTsKLQl2b2lkIHNldEV2ZW50TGlzdGVuZXIoU3RyaW5nIG5ld0V2ZW50TGlzdGVuZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFkgPSAiZXZlbnRMaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIgPSAiZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NFU1NJT05fRVZFTlRfTElTVEVORVIgPSBudWxsOwkvLyBubyBkZWZhdWx0Ci0JCVN0cmluZyBFQ0xJUFNFTElOS19FVkVOVF9MSVNURU5FUl9DTEFTU19OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JQm9vbGVhbiBnZXREZWZhdWx0VGVtcG9yYWxNdXRhYmxlKCk7Ci0JQm9vbGVhbiBnZXRUZW1wb3JhbE11dGFibGUoKTsKLQl2b2lkIHNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuIHRlbXBvcmFsTXV0YWJsZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSA9ICJ0ZW1wb3JhbE11dGFibGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFID0gImVjbGlwc2VsaW5rLnRlbXBvcmFsLm11dGFibGUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBCb29sZWFuIERFRkFVTFRfVEVNUE9SQUxfTVVUQUJMRSA9IEJvb2xlYW4uRkFMU0U7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI0MTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXREYXRhYmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLS8qKgotICogIFRhcmdldERhdGFiYXNlCi0gKi8KLXB1YmxpYyBlbnVtIFRhcmdldERhdGFiYXNlIHsKLQkJCWF0dHVuaXR5LAotCQkJYXV0bywKLQkJCWNsb3Vkc2NhcGUsCi0JCQlkYXRhYmFzZSwKLQkJCWRiMiwKLQkJCWRiMm1haW5mcmFtZSwKLQkJCWRiYXNlLAotCQkJZGVyYnksCi0JCQloc3FsLAotCQkJaW5mb3JtaXgsCi0JCQlqYXZhZGIsCi0JCQlteXNxbCwKLQkJCW9yYWNsZSwKLQkJCW9yYWNsZTExLAotCQkJb3JhY2xlMTAsCi0JCQlvcmFjbGU5LAotCQkJb3JhY2xlOCwKLQkJCXBvaW50YmFzZSwKLQkJCXBvc3RncmVzcWwsCi0JCQlzcWxhbnl3aGVyZSwKLQkJCXNxbHNlcnZlciwKLQkJCXN5YmFzZSwKLQkJCXRpbWVzdGVuOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRVTklUWSA9ICJBdHR1bml0eSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPID0gIkF1dG8iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPVURTQ0FQRSA9ICJDbG91ZHNjYXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gIkRhdGFiYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERCMiA9ICJEQjIiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREIyTUFJTkZSQU1FID0gIkRCMk1haW5mcmFtZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBEQkFTRSA9ICJEQmFzZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERVJCWSA9ICJEZXJieSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBIU1FMID0gIkhTUUwiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GT1JNSVggPSAiSW5mb3JtaXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQURCID0gIkphdmFEQiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBNWVNRTCA9ICJNeVNRTCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEUgPSAiT3JhY2xlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTExID0gIk9yYWNsZTExIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTEwID0gIk9yYWNsZTEwZyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEU5ID0gIk9yYWNsZTlpIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQUNMRTggPSAiT3JhY2xlOGkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9JTlRCQVNFID0gIlBvaW50QmFzZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NUR1JFU1FMID0gIlBvc3RncmVTUUwiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMQU5ZV0hFUkUgPSAiU1FMQW55d2hlcmUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMU0VSVkVSID0gIlNRTFNlcnZlciI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBTWUJBU0UgPSAiU3liYXNlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEVOID0gIlRpbWVzVGVuIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgVGFyZ2V0RGF0YWJhc2UgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGl0ZXJhbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRhcmdldERhdGFiYXNlIGdldFRhcmdldERhdGFiYXNlRm9yKFN0cmluZyBsaXRlcmFsKSB7Ci0JCQotCQlmb3IoIFRhcmdldERhdGFiYXNlIHRhcmdldERhdGFiYXNlIDogVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpIHsKLQkJCWlmKHRhcmdldERhdGFiYXNlLnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7Ci0JCQkJcmV0dXJuIHRhcmdldERhdGFiYXNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5NDhjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0U2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotLyoqCi0gKiAgVGFyZ2V0U2VydmVyCi0gKi8KLXB1YmxpYyBlbnVtIFRhcmdldFNlcnZlciB7Ci0JCQlub25lLAotCQkJb2M0aiwKLQkJCXN1bmFzOSwKLQkJCXdlYnNwaGVyZSwKLQkJCXdlYnNwaGVyZV82XzEsCi0JCQl3ZWJsb2dpYywKLQkJCXdlYmxvZ2ljXzksCi0JCQl3ZWJsb2dpY18xMCwKLQkJCWpib3NzOwotCi0JLy8gRWNsaXBzZUxpbmsgdmFsdWUgc3RyaW5nCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0M0SiA9ICJPQzRKIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFNVTkFTOSA9ICJTdW5BUzkiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCU1BIRVJFID0gIldlYlNwaGVyZSI7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBXRUJTUEhFUkVfNl8xID0gIldlYlNwaGVyZV82XzEiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCTE9HSUMgPSAiV2ViTG9naWMiOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCTE9HSUNfOSA9ICJXZWJMb2dpY185IjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQkxPR0lDXzEwID0gIldlYkxvZ2ljXzEwIjsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpCT1NTID0gIkpCb3NzIjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgVGFyZ2V0U2VydmVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpdGVyYWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYXJnZXRTZXJ2ZXIgZ2V0VGFyZ2V0U2VydmVyRm9yKFN0cmluZyBsaXRlcmFsKSB7Ci0JCQotCQlmb3IoIFRhcmdldFNlcnZlciB0YXJnZXRTZXJ2ZXIgOiBUYXJnZXRTZXJ2ZXIudmFsdWVzKCkpIHsKLQkJCWlmKHRhcmdldFNlcnZlci50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgewotCQkJCXJldHVybiB0YXJnZXRTZXJ2ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4MTM4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLS8qKgotICogIERkbEdlbmVyYXRpb25UeXBlCi0gKi8KLXB1YmxpYyBlbnVtIERkbEdlbmVyYXRpb25UeXBlIHsKLQlub25lLCAKLQljcmVhdGVfdGFibGVzLCAKLQlkcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCQotCS8vIEVjbGlwc2VMaW5rIHZhbHVlIHN0cmluZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAibm9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX1RBQkxFUyA9ICJjcmVhdGUtdGFibGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0FORF9DUkVBVEVfVEFCTEVTID0gImRyb3AtYW5kLWNyZWF0ZS10YWJsZXMiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vT3V0cHV0TW9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNmQyMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLS8qKgotICogIE91dHB1dE1vZGUKLSAqLwotcHVibGljIGVudW0gT3V0cHV0TW9kZSB7Ci0JYm90aCwgCi0Jc3FsX3NjcmlwdCwgCi0JZGF0YWJhc2U7Ci0KLQkvLyBFY2xpcHNlTGluayB2YWx1ZSBzdHJpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1RIID0gImJvdGgiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFCQVNFID0gImRhdGFiYXNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUxfU0NSSVBUID0gInNxbC1zY3JpcHQiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5NDFiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogIFNjaGVtYUdlbmVyYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFHZW5lcmF0aW9uIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCURkbEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpOwotCURkbEdlbmVyYXRpb25UeXBlIGdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0Jdm9pZCBzZXREZGxHZW5lcmF0aW9uVHlwZShEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZSk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSA9ICJkZGxHZW5lcmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUgPSAiZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEUgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JT3V0cHV0TW9kZSBnZXREZWZhdWx0T3V0cHV0TW9kZSgpOwotCU91dHB1dE1vZGUgZ2V0T3V0cHV0TW9kZSgpOwotCXZvaWQgc2V0T3V0cHV0TW9kZShPdXRwdXRNb2RlIG91dHB1dE1vZGUpOyAvLyBwdXQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9QUk9QRVJUWSA9ICJvdXRwdXRNb2RlIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSAiZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGUiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fT1VUUFVUX01PREUgPSBudWxsOwkJLy8gTm8gRGVmYXVsdAotCi0JU3RyaW5nIGdldERlZmF1bHRDcmVhdGVGaWxlTmFtZSgpOwotCVN0cmluZyBnZXRDcmVhdGVGaWxlTmFtZSgpOwotCXZvaWQgc2V0Q3JlYXRlRmlsZU5hbWUoU3RyaW5nIGNyZWF0ZUZpbGVOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZID0gImNyZWF0ZUZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBFY2xpcHNlTGluayBrZXkgc3RyaW5nCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5jcmVhdGUtZGRsLWpkYmMtZmlsZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSA9ICJjcmVhdGVEREwuamRiYyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdERyb3BGaWxlTmFtZSgpOwotCVN0cmluZyBnZXREcm9wRmlsZU5hbWUoKTsKLQl2b2lkIHNldERyb3BGaWxlTmFtZShTdHJpbmcgZHJvcEZpbGVOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSA9ICJkcm9wRmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSA9ICJlY2xpcHNlbGluay5kcm9wLWRkbC1qZGJjLWZpbGUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FID0gImRyb3BEREwuamRiYyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JU3RyaW5nIGdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQl2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIGFwcGxpY2F0aW9uTG9jYXRpb24pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZID0gImFwcGxpY2F0aW9uTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVjbGlwc2VMaW5rIGtleSBzdHJpbmcKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTiA9ICJlY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0FQUExJQ0FUSU9OX0xPQ0FUSU9OID0gbnVsbDsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMzEwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gREVGQVVMVF9QQVJNUyA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgVGV4dFJhbmdlIERFRkFVTFRfVEVYVF9SQU5HRSA9IFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOwotCQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAotCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCwgREVGQVVMVF9URVhUX1JBTkdFKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShzZXZlcml0eSwgbWVzc2FnZUlkLCBERUZBVUxUX1BBUk1TLCB0YXJnZXRPYmplY3QsIHRleHRSYW5nZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAotCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IEVjbGlwc2VMaW5rTWVzc2FnZShFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5CVU5ETEVfTkFNRSwgc2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCk7Ci0JCW1lc3NhZ2Uuc2V0TWFya2VySWQoSnB0SnBhQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCk7IC8vVE9ETyBkbyB3ZSBuZWVkIGFuICdFY2xpcHNlTGluayBKUEEnIHByb2JsZW0gbWFya2VyPwotCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKLQkJCS8vbG9nIGFuIGV4Y2VwdGlvbiBhbmQgdGhlbiBjb250aW51ZSB3aXRob3V0IHNldHRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24KLQkJCS8vQXQgbGVhc3QgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhbmQgd2lsbAotCQkJLy9iZSBhYmxlIHRvIHNlZSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpdGggdmFsaWQgdGV4dFJhbmdlcwotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2cobmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVsbCB0ZXh0IHJhbmdlIGZvciBtZXNzYWdlIElEOiAiICsgbWVzc2FnZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQodGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCQotCXByaXZhdGUgRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2luZyB0aGlzIGNsYXNzTG9hZGVyLgotCSAqIE90aGVyd2lzZSB0aGUgd3N0IHZhbGlkYXRpb24gbWVzc2FnZSBhdHRlbXB0cyB0byB1c2UgdGhlIENsYXNzTG9hZGVyCi0JICogb2YgSnBhVmFsaWRhdG9yIHdoaWNoIGlzIGluIHRoZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUgcGx1Z2luLgotCSAqIAotCSAqIEFub3RoZXIgd2F5IHdlIGNvdWxkIHBvdGVudGlhbGx5IHNvbHZlIHRoaXMgaXMgdG8gaGF2ZSBhIHNlcGFyYXRlCi0JICogRWNsaXNwZUxpbmtKcGFWYWxpZGF0b3IgYW5kIHNldCB1cCB0aGUgZXh0ZW5zaW9uIHBvaW50cyBzbyB0aGF0Ci0JICogaXQgb25seSBydW5zIGFnYWluc3QganBhUHJvamVjdHMgd2l0aCB0aGUgRWNsaXNwZUxpbmtQbGF0Zm9ybQotCSAqIHdoaWxlIEpwYVZhbGlkYXRvciBydW5zIGFnYWluc3QganBhUHJvamVjdHMgd2l0aCB0aGUgR2VuZXJpY1BsYXRmb3JtLgotCSAqIEkgYW0gdW5zdXJlIGlmIHRoaXMgaXMgcG9zc2libGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua01lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQkJcHVibGljIEVjbGlwc2VMaW5rTWVzc2FnZShTdHJpbmcgYUJ1bmRsZU5hbWUsIGludCBhU2V2ZXJpdHksIFN0cmluZyBhbklkLCBTdHJpbmdbXSBhUGFyYW1zLCBPYmplY3QgYVRhcmdldE9iamVjdCkgewotCQkJc3VwZXIoYUJ1bmRsZU5hbWUsIGFTZXZlcml0eSwgYW5JZCwgYVBhcmFtcywgYVRhcmdldE9iamVjdCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBzdXBlci5nZXRCdW5kbGUobG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVuZGxlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiMmIyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLS8qKgotICogUHJvdmlkZXMgYW5ub3RhdGlvbnMgZm9yIDEuMCBFY2xpcHNlTGluayBwbGF0Zm9ybQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgVFlQRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uW10gVFlQRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCS8vIG5vdGhpbmcgbmV3IGZvciBFY2xpcHNlTGluawotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgQVRUUklCVVRFX0FOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBVFRSSUJVVEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyA9IG5ldyBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCS8vIG5vIHBhY2thZ2UgYW5ub3RhdGlvbnMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjkzNjVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYUZhY3RvcnkKLQlleHRlbmRzIEFic3RyYWN0SnBhRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGlua0pwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwoY29uZmlnKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwganJwYSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nIGJ1aWxkSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbWJlZGRhYmxlIGJ1aWxkSmF2YUVtYmVkZGFibGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW1iZWRkYWJsZUFubm90YXRpb24gZW1iZWRkYWJsZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbChwYXJlbnQsIGVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW50aXR5SW1wbChwYXJlbnQsIGVudGl0eUFubm90YXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUlkTWFwcGluZyBidWlsZEphdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbChwYXJlbnQsIG1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFWZXJzaW9uTWFwcGluZyBidWlsZEphdmFWZXJzaW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9uZVRvTWFueU1hcHBpbmcgYnVpbGRKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU9uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYW55VG9NYW55TWFwcGluZyBidWlsZEphdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmcgYnVpbGRKYXZhTWFueVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rLXNwZWNpZmljIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGJ1aWxkSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OGMwOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtKAotCQkJaWQsCi0JCQlidWlsZEpwYVZlcnNpb24oKSwKLQkJCW5ldyBFY2xpcHNlTGlua0pwYUZhY3RvcnkoKSwgCi0JCQlidWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpLCAKLQkJCUVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMCwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk5POwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVjbGlwc2VMaW5rVmVyc2lvbiBleHRlbmRzIFNpbXBsZVZlcnNpb24gewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGVjbGlwc2VMaW5rVmVyc2lvbjsKLQotCQlwdWJsaWMgRWNsaXBzZUxpbmtWZXJzaW9uKFN0cmluZyBlY2xpcHNlTGlua1ZlcnNpb24sIFN0cmluZyBqcGFWZXJzaW9uKSB7Ci0JCQlzdXBlcihqcGFWZXJzaW9uKTsKLQkJCXRoaXMuZWNsaXBzZUxpbmtWZXJzaW9uID0gZWNsaXBzZUxpbmtWZXJzaW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rVmVyc2lvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIEVjbGlwc2VMaW5rIHZlcnNpb246ICIgKyB0aGlzLmdldFZlcnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NkZmY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphclJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTW9kZWxQcm92aWRlcnNUbyhBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChwcm92aWRlcnMsIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyk7Ci0JfQotCi0JLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTID0gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIEVjbGlwc2VMaW5rLXNwZWNpZmljIG1hcHBpbmdzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtKcGFQcm9qZWN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU0NDU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBFY2xpcHNlTGluay1zcGVjaWZpYyBKUEEgcHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUHJvamVjdEltcGwKLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYVByb2plY3QKLQkJaW1wbGVtZW50cyBFY2xpcHNlTGlua0pwYVByb2plY3QgewotCQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3RJbXBsKEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQlzdXBlcihjb25maWcpOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoSnBhWG1sUmVzb3VyY2UpIHRoaXMuZ2V0UmVzb3VyY2VNb2RlbCgKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCwKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTYyODgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0VjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImVjbGlwc2VsaW5rX2pwYV92YWxpZGF0aW9uIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYUElSWV9BTkRfRVhQSVJZX1RJTUVfT0ZfREFZX0JPVEhfU1BFQ0lGSUVEID0gIkNBQ0hFX0VYUElSWV9BTkRfRVhQSVJZX1RJTUVfT0ZfREFZX0JPVEhfU1BFQ0lGSUVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUiA9ICJDT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9EVVBMSUNBVEVfTkFNRSA9ICJDT05WRVJURVJfRFVQTElDQVRFX05BTUUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9OQU1FX1VOREVGSU5FRCA9ICJDT05WRVJURVJfTkFNRV9VTkRFRklORUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVEVSX0NMQVNTX0VYSVNUUyA9ICJDT05WRVJURVJfQ0xBU1NfRVhJU1RTIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfQ0xBU1NfREVGSU5FRCA9ICJDT05WRVJURVJfQ0xBU1NfREVGSU5FRCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX0NMQVNTX0lNUExFTUVOVFNfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gIkNVU1RPTUlaRVJfQ0xBU1NfSU1QTEVNRU5UU19ERVNDUklQVE9SX0NVU1RPTUlaRVIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX01BUFBJTkdfVU5SRVNPTFZFRF9DT05WRVJURVJfTkFNRSA9ICJJRF9NQVBQSU5HX1VOUkVTT0xWRURfQ09OVkVSVEVSX05BTUUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRSA9ICJNVUxUSVBMRV9PQkpFQ1RfVkFMVUVTX0ZPUl9EQVRBX1ZBTFVFIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1ZFUlNJT05fTUFQUElOR19UWVBFID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfREVTQ1JJUFRPUl9DVVNUT01JWkVSID0gIlBFUlNJU1RFTkNFX1VOSVRfTEVHQUNZX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkcgPSAiUEVSU0lTVEVOQ0VfVU5JVF9MRUdBQ1lfRU5USVRZX0NBQ0hJTkciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQgPSAiUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1BST1BFUlRZX0lHTk9SRUQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQVRUUklCVVRFX01BUFBJTkcgPSAiUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQVRUUklCVVRFX01BUFBJTkciOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUEVEX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBFRF9DTEFTUyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCA9ICJCQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfTUFQX01BUFBJTkdfREVQUkVDQVRFRCA9ICJCQVNJQ19NQVBfTUFQUElOR19ERVBSRUNBVEVEIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19NRU1CRVJfQ0xBU1NfTk9UX1NUQVRJQyA9ICJUWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTX05PVF9TVEFUSUMiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkOGVkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgb3JtLnhtbAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmdldFhtbFJlc291cmNlUHJvdmlkZXIoZmlsZSkuZ2V0WG1sUmVzb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGZmYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLQotLyoqCi0gKiBXZSBuZWVkIHRoaXMgY2xhc3MgYmVjYXVzZSB0aGUgRWNsaXBzZUxpbmsgMS4wIDE6bSBtYXBwaW5nIHN1cHBvcnRzIGEgam9pbgotICogY29sdW1uIHN0cmF0ZWd5IHdoaWxlIEpQQSBkaWQgbm90IHVudGlsIEpQQSAyLjAuIEFzIGEgcmVzdWx0LCB3ZSBuZWVkIGEgY2xhc3MKLSAqIHRoYXQgaW1wbGVtZW50cyBFY2xpcHNlTGluayAxLjAuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEdlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwKEphdmFPbmVUb01hbnlNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIHRydWUpOyAgLy8gdHJ1ZT1zdXBwb3J0cyBqb2luIGNvbHVtbiBzdHJhdGVneQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUaW1lT2ZEYXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUaW1lT2ZEYXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0Nzg1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFUaW1lT2ZEYXkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheQotewotCXByb3RlY3RlZCBmaW5hbCBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdG9kQW5ub3RhdGlvbjsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIGhvdXI7Ci0JcHJvdGVjdGVkIEludGVnZXIgbWludXRlOwotCXByb3RlY3RlZCBJbnRlZ2VyIHNlY29uZDsKLQlwcm90ZWN0ZWQgSW50ZWdlciBtaWxsaXNlY29uZDsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheShKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIHBhcmVudCwgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRvZEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50b2RBbm5vdGF0aW9uID0gdG9kQW5ub3RhdGlvbjsKLQkJdGhpcy5ob3VyID0gdG9kQW5ub3RhdGlvbi5nZXRIb3VyKCk7Ci0JCXRoaXMubWludXRlID0gdG9kQW5ub3RhdGlvbi5nZXRNaW51dGUoKTsKLQkJdGhpcy5zZWNvbmQgPSB0b2RBbm5vdGF0aW9uLmdldFNlY29uZCgpOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gdG9kQW5ub3RhdGlvbi5nZXRNaWxsaXNlY29uZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldEhvdXJfKHRoaXMudG9kQW5ub3RhdGlvbi5nZXRIb3VyKCkpOwotCQl0aGlzLnNldE1pbnV0ZV8odGhpcy50b2RBbm5vdGF0aW9uLmdldE1pbnV0ZSgpKTsKLQkJdGhpcy5zZXRTZWNvbmRfKHRoaXMudG9kQW5ub3RhdGlvbi5nZXRTZWNvbmQoKSk7Ci0JCXRoaXMuc2V0TWlsbGlzZWNvbmRfKHRoaXMudG9kQW5ub3RhdGlvbi5nZXRNaWxsaXNlY29uZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaG91ciAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgewotCQlyZXR1cm4gdGhpcy5ob3VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKSB7Ci0JCXRoaXMudG9kQW5ub3RhdGlvbi5zZXRIb3VyKGhvdXIpOwotCQl0aGlzLnNldEhvdXJfKGhvdXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEhvdXJfKEludGVnZXIgaG91cikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gaG91cjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgaG91cik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbnV0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRNaW51dGUoKSB7Ci0JCXJldHVybiB0aGlzLm1pbnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpIHsKLQkJdGhpcy50b2RBbm5vdGF0aW9uLnNldE1pbnV0ZShtaW51dGUpOwotCQl0aGlzLnNldE1pbnV0ZV8obWludXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNaW51dGVfKEludGVnZXIgbWludXRlKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5taW51dGU7Ci0JCXRoaXMubWludXRlID0gbWludXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGQsIG1pbnV0ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlY29uZCAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRTZWNvbmQoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBzZWNvbmQpIHsKLQkJdGhpcy50b2RBbm5vdGF0aW9uLnNldFNlY29uZChzZWNvbmQpOwotCQl0aGlzLnNldFNlY29uZF8oc2Vjb25kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gc2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGQsIHNlY29uZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbGxpc2Vjb25kICoqKioqKioqKioKLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKSB7Ci0JCXRoaXMudG9kQW5ub3RhdGlvbi5zZXRNaWxsaXNlY29uZChtaWxsaXNlY29uZCk7Ci0JCXRoaXMuc2V0TWlsbGlzZWNvbmRfKG1pbGxpc2Vjb25kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNaWxsaXNlY29uZF8oSW50ZWdlciBtaWxsaXNlY29uZCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGQsIG1pbGxpc2Vjb25kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldFRpbWVPZkRheUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnRvZEFubm90YXRpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRvZEFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ0M2VmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldFR5cGVOYW1lICE9IG51bGwpID8gdGFyZ2V0VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYxNzdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2YjQ2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQkKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldFR5cGVOYW1lICE9IG51bGwpID8gdGFyZ2V0VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5hZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JCXN1cGVyLmFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJU3RyaW5nIG1hcEtleVR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpOwotCQltYXBLZXlUeXBlTmFtZSA9IG1hcEtleVR5cGVOYW1lICE9IG51bGwgPyBtYXBLZXlUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCQl0eXBlQXJndW1lbnROYW1lcy5hZGQobWFwS2V5VHlwZU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDgwNmZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDFmNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdXRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogcHV0IHRoZSBFY2xpcHNlTGluayBjb252ZXJ0IGFkYXB0ZXIgZmlyc3QgLSB0aGlzIGlzIHRoZSBvcmRlciBFY2xpcHNlTGluayBzZWFyY2hlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4oCi0JCQkJSmF2YUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCksCi0JCQkJc3VwZXIuZ2V0Q29udmVydGVyQWRhcHRlcnMoKQotCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLm11dGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwMDI0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JLy8gdGhlIEVjbGlwc2VMaW5rIElkIGFuZCBWZXJzaW9uIG1hcHBpbmdzIGFsc28gc3VwcG9ydCB0aGVzZSBhbm5vdGF0aW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkKLQkpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTk2YTkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuTnVsbEphdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZywgSmF2YUNhY2hlYWJsZUhvbGRlcjJfMAotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBzcGVjaWZpZWRUeXBlOwotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNpemU7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkU2hhcmVkOwotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZERpc2FibGVIaXRzOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBleHBpcnk7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGlzdGVuY2VDaGVja2luZzsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBkZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsKEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSB0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gY2FjaGVBbm5vdGF0aW9uLmdldFNoYXJlZCgpOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSBjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IGNhY2hlQW5ub3RhdGlvbi5nZXREaXNhYmxlSGl0cygpOwotCi0JCXRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSA9IEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQl0aGlzLmV4cGlyeSA9IGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKTsKLQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0KLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZWNBbm5vdGF0aW9uID0gdGhpcy5nZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKTsKLQkJdGhpcy5leGlzdGVuY2VDaGVja2luZyA9IChlY0Fubm90YXRpb24gIT0gbnVsbCk7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKGVjQW5ub3RhdGlvbik7Ci0KLQkJdGhpcy5jYWNoZWFibGUgPSB0aGlzLmJ1aWxkQ2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyhFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNpemVfKGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZF8oY2FjaGVBbm5vdGF0aW9uLmdldFNoYXJlZCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoXyhjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKGNhY2hlQW5ub3RhdGlvbi5nZXREaXNhYmxlSGl0cygpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKSk7Ci0KLQkJdGhpcy5zZXRFeHBpcnlfKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7Ci0JCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheShjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGVjQW5ub3RhdGlvbiA9IHRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuc2V0RXhpc3RlbmNlQ2hlY2tpbmdfKGVjQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZShlY0Fubm90YXRpb24pKTsKLQotCQl0aGlzLmNhY2hlYWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnVwZGF0ZSgpOwotCQl9Ci0JCXRoaXMuc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUodGhpcy5idWlsZERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQl0aGlzLmNhY2hlYWJsZS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFR5cGUgOiB0aGlzLmdldERlZmF1bHRUeXBlKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZSB0eXBlKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0VHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0eXBlKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVUeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZVR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVUeXBlIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaXplICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNpemUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNpemUuaW50VmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0U2l6ZShzaXplKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplXyhzaXplKTsKLQotCQlpZiAoc2l6ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNpemVfKEludGVnZXIgc2l6ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2l6ZTsKLQkJdGhpcy5zcGVjaWZpZWRTaXplID0gc2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NJWkU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2hhcmVkLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNoYXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWRfKHNoYXJlZCk7Ci0KLQkJaWYgKChzaGFyZWQgIT0gbnVsbCkgJiYgISBzaGFyZWQuYm9vbGVhblZhbHVlKCkpIHsgIC8vIEJvb2xlYW4uRkFMU0UKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCXRoaXMuc2V0RXhwaXJ5KG51bGwpOwotCQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlJZk5lY2Vzc2FyeSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2hhcmVkXyhCb29sZWFuIHNoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IHNoYXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIG9sZCwgc2hhcmVkKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRTaGFyZWQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NIQVJFRDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWx3YXlzIHJlZnJlc2ggKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5zZXRBbHdheXNSZWZyZXNoKGFsd2F5c1JlZnJlc2gpOwotCQl0aGlzLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKGFsd2F5c1JlZnJlc2gpOwotCi0JCWlmIChhbHdheXNSZWZyZXNoICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaF8oQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoOwotCQl0aGlzLnNwZWNpZmllZEFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FMV0FZU19SRUZSRVNIX1BST1BFUlRZLCBvbGQsIGFsd2F5c1JlZnJlc2gpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSB7Ci0JCXJldHVybiBERUZBVUxUX0FMV0FZU19SRUZSRVNIOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZyZXNoIG9ubHkgaWYgbmV3ZXIgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlci5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhyZWZyZXNoT25seUlmTmV3ZXIpOwotCi0JCWlmIChyZWZyZXNoT25seUlmTmV3ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKEJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyID0gcmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNhYmxlIGhpdHMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cy5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldERpc2FibGVIaXRzKGRpc2FibGVIaXRzKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0c18oZGlzYWJsZUhpdHMpOwotCi0JCWlmIChkaXNhYmxlSGl0cyAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzXyhCb29sZWFuIGRpc2FibGVIaXRzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0czsKLQkJdGhpcy5zcGVjaWZpZWREaXNhYmxlSGl0cyA9IGRpc2FibGVIaXRzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkLCBkaXNhYmxlSGl0cyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiBERUZBVUxUX0RJU0FCTEVfSElUUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlIDogdGhpcy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgdHlwZSkgewotCQl0aGlzLmdldENhY2hlQW5ub3RhdGlvbigpLnNldENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbCh0eXBlKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8odHlwZSk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7Ci0JCXRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuc2V0RXhwaXJ5KGV4cGlyeSk7Ci0JCXRoaXMuc2V0RXhwaXJ5XyhleHBpcnkpOwotCi0JCWlmIChleHBpcnkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlJZk5lY2Vzc2FyeSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlfKEludGVnZXIgZXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gZXhwaXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGQsIGV4cGlyeSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4cGlyeSB0aW1lIG9mIGRheSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXkgZ2V0RXhwaXJ5VGltZU9mRGF5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5IGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeSB0aW1lIG9mIGRheSBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuZXhwaXJ5VGltZU9mRGF5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXlBbm5vdGF0aW9uID0gdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5IHRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkodGltZU9mRGF5QW5ub3RhdGlvbik7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRpbWVPZkRheSk7Ci0KLQkJdGhpcy5zZXRFeHBpcnkobnVsbCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCi0JCXJldHVybiB0aW1lT2ZEYXk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCkgewotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXhwaXJ5IHRpbWUgb2YgZGF5IGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXlJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlRXhwaXJ5VGltZU9mRGF5XygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5XygpIHsKLQkJdGhpcy5nZXRDYWNoZUFubm90YXRpb24oKS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rSmF2YVRpbWVPZkRheSB0aW1lT2ZEYXkpIHsKLQkJRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5IG9sZCA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRpbWVPZkRheTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkLCB0aW1lT2ZEYXkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNFeHBpcnlUaW1lT2ZEYXkoRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheUFubm90YXRpb24pIHsKLQkJaWYgKHRpbWVPZkRheUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgJiYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5LmdldFRpbWVPZkRheUFubm90YXRpb24oKSA9PSB0aW1lT2ZEYXlBbm5vdGF0aW9uKSkgewotCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkodGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSh0aW1lT2ZEYXlBbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5IGJ1aWxkRXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiAodGltZU9mRGF5QW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBuZXcgRWNsaXBzZUxpbmtKYXZhVGltZU9mRGF5KHRoaXMsIHRpbWVPZkRheUFubm90YXRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGlzdGVuY2UgY2hlY2tpbmcgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNFeGlzdGVuY2VDaGVja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoYm9vbGVhbiBleGlzdGVuY2VDaGVja2luZykgewotCQlpZiAoZXhpc3RlbmNlQ2hlY2tpbmcgIT0gdGhpcy5leGlzdGVuY2VDaGVja2luZykgewotCQkJaWYgKGV4aXN0ZW5jZUNoZWNraW5nKSB7Ci0JCQkJdGhpcy5hZGRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5yZW1vdmVFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKTsKLQkJCQl0aGlzLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCQl9Ci0JCQl0aGlzLnNldEV4aXN0ZW5jZUNoZWNraW5nXyhleGlzdGVuY2VDaGVja2luZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeGlzdGVuY2VDaGVja2luZ18oYm9vbGVhbiBleGlzdGVuY2VDaGVja2luZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCXRoaXMuZXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYSVNURU5DRV9DSEVDS0lOR19QUk9QRVJUWSwgb2xkLCBleGlzdGVuY2VDaGVja2luZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4aXN0ZW5jZSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgOiB0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0eXBlLCB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUpKSB7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJCX0KLQkJCXRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodHlwZSkpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlXyh0eXBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGVfKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBidWlsZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZWNBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiAoZWNBbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoZWNBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlOwotCQl0aGlzLmRlZmF1bHRFeGlzdGVuY2VUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBidWlsZERlZmF1bHRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5leGlzdGVuY2VDaGVja2luZyA/IEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSA6IERFRkFVTFRfRVhJU1RFTkNFX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hlYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlDYWNoZWFibGVIb2xkZXIyXzAgc3VwZXJDYWNoZWFibGVIb2xkZXIgPSB0aGlzLmdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUodGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpKTsKLQkJcmV0dXJuIChzdXBlckNhY2hlYWJsZUhvbGRlciAhPSBudWxsKSA/Ci0JCQkJc3VwZXJDYWNoZWFibGVIb2xkZXIuZ2V0Q2FjaGVhYmxlKCkuaXNDYWNoZWFibGUoKSA6Ci0JCQkJKChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVHlwZU1hcHBpbmcgc3VwZXJNYXBwaW5nID0gc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCXJldHVybiAoc3VwZXJNYXBwaW5nIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSA/Ci0JCQkJKENhY2hlYWJsZUhvbGRlcjJfMCkgc3VwZXJNYXBwaW5nIDoKLQkJCQl0aGlzLmdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUoc3VwZXJQZXJzaXN0ZW50VHlwZSk7ICAvLyByZWN1cnNlCi0JfQotCi0JcHJvdGVjdGVkIEphdmFDYWNoZWFibGUyXzAgYnVpbGRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFDYWNoZWFibGUodGhpcykgOgotCQkJCW5ldyBOdWxsSmF2YUNhY2hlYWJsZTJfMCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gZ2V0Q2FjaGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbih0aGlzLmdldENhY2hlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDYWNoZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGlzdGVuY2UgY2hlY2tpbmcgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gYWRkRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5hZGRBbm5vdGF0aW9uKHRoaXMuZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZUV4cGlyeShtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVFeHBpcnkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICgodGhpcy5leHBpcnkgIT0gbnVsbCkgJiYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ0FDSEVfRVhQSVJZX0FORF9FWFBJUllfVElNRV9PRl9EQVlfQk9USF9TUEVDSUZJRUQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0Q2FjaGVBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZGRlYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHNwZWNpZmllZFR5cGU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyhKYXZhVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKiAgCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFR5cGUgOiB0aGlzLmdldERlZmF1bHRUeXBlKCk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0eXBlLCB0aGlzLnNwZWNpZmllZFR5cGUpKSB7Ci0JCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucmVtb3ZlQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSB0aGlzLmFkZENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwodHlwZSkpOwotCQkJfQotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlXyh0eXBlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGJ1aWxkU3BlY2lmaWVkVHlwZSgpIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IERFRkFVTFRfVFlQRSA6IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgdHJhY2tpbmcgYW5ub3RhdGlvbiAqKioqKioqKioqICAKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBhZGRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKiogIAotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKiogIAotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbigpOwotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTU4NWNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCi17Ci0JcHJpdmF0ZSBmaW5hbCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50LCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gPSBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0RGF0YVZhbHVlKCk7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmdldE9iamVjdFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGF0YVZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0RGF0YVZhbHVlKCkpOwotCQl0aGlzLnNldE9iamVjdFZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5zZXREYXRhVmFsdWUodmFsdWUpOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5zZXRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuc2V0T2JqZWN0VmFsdWVfKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGdldENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5nZXREYXRhVmFsdWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmdldE9iamVjdFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVEYXRhVmFsdWVzVW5pcXVlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURhdGFWYWx1ZXNVbmlxdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUhhc2hCYWc8U3RyaW5nPiBkYXRhVmFsdWVzID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKS5nZXREYXRhVmFsdWVzKCksIHRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpLmdldERhdGFWYWx1ZXNTaXplKCkpOwotCQlpZiAoZGF0YVZhbHVlcy5jb3VudCh0aGlzLmRhdGFWYWx1ZSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmRhdGFWYWx1ZX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE3OWM1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVBc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFDb252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydAotewotCXByaXZhdGUgZmluYWwgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0QW5ub3RhdGlvbjsKLQotCXByaXZhdGUgU3RyaW5nIHNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdENvbnZlcnRlck5hbWU7Ci0KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBjb252ZXJ0ZXI7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXJbXSBDT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpCi0JfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyPiBDT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlcj4oQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnQoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udmVydEFubm90YXRpb24gPSBjb252ZXJ0QW5ub3RhdGlvbjsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8odGhpcy5jb252ZXJ0QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0Q29udmVydGVyTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdENvbnZlcnRlck5hbWUoKSk7Ci0JCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnZlcnRlci51cGRhdGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lIDogdGhpcy5kZWZhdWx0Q29udmVydGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmNvbnZlcnRBbm5vdGF0aW9uLnNldFZhbHVlKG5hbWUpOwotCQl0aGlzLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENvbnZlcnRlck5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENvbnZlcnRlck5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENvbnZlcnRlck5hbWU7Ci0JCXRoaXMuZGVmYXVsdENvbnZlcnRlck5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NPTlZFUlRFUl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKG51bGwpOwotCQkJCXRoaXMucmV0YWluQ29udmVydGVyQW5ub3RhdGlvbihudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5jb252ZXJ0ZXIgPT0gbnVsbCkgfHwgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSkgewotCQkJCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIgPSB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQkJdGhpcy5yZXRhaW5Db252ZXJ0ZXJBbm5vdGF0aW9uKGNvbnZlcnRlckFkYXB0ZXIpOwotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhjb252ZXJ0ZXJBZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCksIHRoaXMpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcl8oSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGNvbnZlcnRlcikgewotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBidWlsZENvbnZlcnRlcigpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGphdmFDb252ZXJ0ZXIgPSBhZGFwdGVyLmJ1aWxkQ29udmVydGVyKHJlc291cmNlQXR0cmlidXRlLCB0aGlzKTsKLQkJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBhbGwgdGhlIGNvbnZlcnRlciBhbm5vdGF0aW9ucyA8ZW0+ZXhjZXB0PC9lbT4gZm9yIHRoZSBhbm5vdGF0aW9uCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuIElmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCByZW1vdmUgPGVtPmFsbDwvZW0+IHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmV0YWluQ29udmVydGVyQW5ub3RhdGlvbihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyICE9IGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJCQlhZGFwdGVyLnJlbW92ZUNvbnZlcnRlckFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnRlcigpIHsKLQkJQXNzb2NpYXRpb248SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXIsIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uPiBhc3NvYyA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgPSBhc3NvYy5nZXRLZXkoKTsKLQkJCUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3NvYy5nZXRWYWx1ZSgpOwotCQkJaWYgKCh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IEVjbGlwc2VMaW5rIGNvbnZlcnRlciBhbm5vdGF0aW9uIHdlIGZpbmQgYWxvbmcgd2l0aCBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIGFkYXB0ZXIuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8KLQkgKiBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyLCBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbj4gZ2V0RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJZm9yIChKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZUFzc29jaWF0aW9uPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyLCBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbj4oYWRhcHRlciwgYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnRlciBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlmb3IgKEphdmFFY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjb252ZXJ0ZXIgdHlwZTogIiArIGNvbnZlcnRlclR5cGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBDT05WRVJURVJfQURBUFRFUlM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLmNvbnZlcnRWYWx1ZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmVzdWx0ID0gdGhpcy5qYXZhQ2FuZGlkYXRlQ29udmVydGVyTmFtZXMoZmlsdGVyKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udmVydFZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0QW5ub3RhdGlvbi52YWx1ZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBqYXZhQ2FuZGlkYXRlQ29udmVydGVyTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5jYW5kaWRhdGVDb252ZXJ0ZXJOYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjYW5kaWRhdGVDb252ZXJ0ZXJOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY29udmVydGVyTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBjb252ZXJ0ZXJOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQoKS5nZXRVbmlxdWVDb252ZXJ0ZXJOYW1lcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCXRoaXMudmFsaWRhdGVDb252ZXJ0VmFsdWUobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDb252ZXJ0VmFsdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBjb252ZXJ0ZXJOYW1lID0gdGhpcy5nZXRDb252ZXJ0ZXJOYW1lKCk7Ci0JCWlmIChjb252ZXJ0ZXJOYW1lID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlcnMgPSB0aGlzLmdldEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KCkuYWxsQ29udmVydGVycygpOyBjb252ZXJ0ZXJzLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoY29udmVydGVyTmFtZS5lcXVhbHMoY29udmVydGVycy5uZXh0KCkuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoUkVTRVJWRURfQ09OVkVSVEVSX05BTUVTLCBjb252ZXJ0ZXJOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5JRF9NQVBQSU5HX1VOUkVTT0xWRURfQ09OVkVSVEVSX05BTUUsCi0JCQkJCQluZXcgU3RyaW5nW10ge2NvbnZlcnRlck5hbWUsIHRoaXMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMuZ2V0UGFyZW50KCksCi0JCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCSk7CQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydEFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlleHRlbmRzIEphdmFDb252ZXJ0ZXIuQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5jbGFzczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0KLQkJcHVibGljIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uLCBKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0KHBhcmVudCwgKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGNvbnZlcnRlckFubm90YXRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDc3MTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjxBIGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQSBjb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEEgY29udmVydGVyQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24gPSBjb252ZXJ0ZXJBbm5vdGF0aW9uOwotCQl0aGlzLm5hbWUgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFkZENvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJdGhpcy5zZXROYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQSBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnLic7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCS8vIGphdmEgaXMgYXQgdGhlIGJhc2Ugb2YgdGhlIHRyZWUKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGR1cGxpY2F0ZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXJldHVybiAodGhpcyAhPSBjb252ZXJ0ZXIpICYmCi0JCQkJISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkgJiYKLQkJCQl0aGlzLm5hbWUuZXF1YWxzKGNvbnZlcnRlci5nZXROYW1lKCkpICYmCi0JCQkJISB0aGlzLm92ZXJyaWRlcyhjb252ZXJ0ZXIpICYmCi0JCQkJISBjb252ZXJ0ZXIub3ZlcnJpZGVzKHRoaXMpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYSBjbGllbnQgdG8gaW50ZXJhY3Qgd2l0aCB2YXJpb3VzCi0JICogRWNsaXBzZUxpbmsgSmF2YSBjb252ZXJ0ZXJzIHZpYSB0aGUgc2FtZSBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXIKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgY29udmVydGVyIGhhbmRsZWQgYnkgdGhlIGFkYXB0ZXIuCi0JCSAqLwotCQlDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKTsKLQotCQkvKioKLQkJICogQnVpbGQgYSBjb252ZXJ0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEphdmEgcmVzb3VyY2UKLQkJICogcGVyc2lzdGVudCBtZW1iZXIgaWYgdGhlIG1lbWJlciBpcyBtb2RpZmllZCBieSB0aGUgYWRhcHRlcidzCi0JCSAqIGNvbnZlcnRlciBhbm5vdGF0aW9uLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKiBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgYSBjb252ZXJ0ZXIgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUKLQkJICogY29udmVydGVyJ3MgcGFyZW50LgotCQkgKi8KLQkJSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8gZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbj4gYnVpbGRDb252ZXJ0ZXIoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyLCBKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgY29udmVydGVyIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSmF2YQotCQkgKiByZXNvdXJjZSBwZXJzaXN0ZW50IG1lbWJlci4KLQkJICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhZGFwdGVyJ3MgY29udmVydGVyIGFubm90YXRpb24gaXMKLQkJICogbWlzc2luZy4gCi0JCSAqIFRoZSByZXR1cm5lZCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiBpcyBjb21wYXJlZCB0byB0aGUgcGFyZW50J3MKLQkJICogY29udmVydGVyJ3MgY29udmVydGVyIGFubm90YXRpb24gd2hpbGUgdGhlIGNvbnRleHQgbW9kZWwgaXMgc3luY2hyb25pemVkCi0JCSAqIHdpdGggdGhlIHJlc291cmNlIG1vZGVsLiBJZiBpdCBoYXMgY2hhbmdlZCwgdGhlIHBhcmVudCB3aWxsIGJ1aWxkCi0JCSAqIGEgbmV3IGNvbnZlcnRlciAodmlhIHRoZSBhZGFwdGVyKS4KLQkJICogCi0JCSAqIEBzZWUgI2J1aWxkQ29udmVydGVyKEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uLCBKYXZhSnBhQ29udGV4dE5vZGUpCi0JCSAqLwotCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcik7Ci0KLQkJLyoqCi0JCSAqIEJ1aWxkIGEgY29udmVydGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIGFubm90YXRpb24uCi0JCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZQotCQkgKiByZXNvdXJjZSBtb2RlbCAoYW5kIHRoZSByZXNvdXJjZSBtb2RlbCBoYXMgY2hhbmdlZCkuCi0JCSAqIAotCQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpCi0JCSAqLwotCQlKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8PyBleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uPiBidWlsZENvbnZlcnRlcihFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uLCBKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KTsKLQotCQkvKioKLQkJICogQnVpbGQgYSBuZXcgY29udmVydGVyIGFuZCwgaWYgbmVjZXNzYXJ5LCBpdHMgY29ycmVzcG9uZGluZyBjb252ZXJ0ZXIKLQkJICogYW5ub3RhdGlvbi4KLQkJICovCi0JCUphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+IGJ1aWxkTmV3Q29udmVydGVyKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciwgSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgYWRhcHRlcidzIGNvbnZlcnRlciBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZAotCQkgKiBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgbWVtYmVyLgotCQkgKi8KLQkJdm9pZCByZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgamF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdEFkYXB0ZXIKLQkJaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlcgotCXsKLQkJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+IGJ1aWxkQ29udmVydGVyKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgbWVtYmVyLCBKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKG1lbWJlcik7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCBwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiAoRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24pIG1lbWJlci5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0KLQkJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+IGJ1aWxkTmV3Q29udmVydGVyKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgbWVtYmVyLCBKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmJ1aWxkQ29udmVydGVyQW5ub3RhdGlvbklmTmVjZXNzYXJ5KG1lbWJlciksIHBhcmVudCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gYnVpbGRDb252ZXJ0ZXJBbm5vdGF0aW9uSWZOZWNlc3NhcnkoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBtZW1iZXIpIHsKLQkJCS8vIHRoZSBhbm5vdGF0aW9uIG1heSBhbHJlYWR5IGJlIHByZXNlbnQsIGFmdGVyIHdlIHJlbW92ZSB0aGUgb3RoZXIgY29udmVydGVyIGFubm90YXRpb25zCi0JCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKG1lbWJlcik7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZENvbnZlcnRlckFubm90YXRpb24obWVtYmVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBidWlsZENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBtZW1iZXIpIHsKLQkJCXJldHVybiAoRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24pIG1lbWJlci5hZGRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgbWVtYmVyKSB7Ci0JCQltZW1iZXIucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZSh0aGlzLmdldEFubm90YXRpb25OYW1lKCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpewotCQlyZXR1cm4gZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVDb252ZXJ0ZXJOYW1lcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb252ZXJ0ZXJOYW1lcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9OQU1FX1VOREVGSU5FRCwgCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkJKSk7Ci0JCX0gZWxzZSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVwb3J0ZWROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJZm9yIChMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdsb2JhbENvbnZlcnRlcnMgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdAkoKS5hbGxDb252ZXJ0ZXJzKCk7IGdsb2JhbENvbnZlcnRlcnMuaGFzTmV4dCgpOyApIHsKLQkJCQlpZiAoIHRoaXMuZHVwbGljYXRlcyggZ2xvYmFsQ29udmVydGVycy5uZXh0KCkpICAmJiAhcmVwb3J0ZWROYW1lcy5jb250YWlucyhuYW1lKSl7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7bmFtZX0sCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkJKSk7Ci0JCQkJCXJlcG9ydGVkTmFtZXMuYWRkKG5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzBmMmQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyCi17Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b21Db252ZXJ0ZXI7Ci0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbChKYXZhVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY3VzdG9tQ29udmVydGVyID0gdGhpcy5idWlsZEN1c3RvbUNvbnZlcnRlcigpOwotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IHRoaXMuYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJdGhpcy50eXBlQ29udmVydGVyID0gdGhpcy5idWlsZFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jQ3VzdG9tQ29udmVydGVyKCk7Ci0JCXRoaXMuc3luY09iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJdGhpcy5zeW5jU3RydWN0Q29udmVydGVyKCk7Ci0JCXRoaXMuc3luY1R5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlpZiAodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5jdXN0b21Db252ZXJ0ZXIudXBkYXRlKCk7Ci0JCX0KLQkJaWYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIudXBkYXRlKCk7Ci0JCX0KLQkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyICE9IG51bGwpIHsKLQkJCXRoaXMuc3RydWN0Q29udmVydGVyLnVwZGF0ZSgpOwotCQl9Ci0JCWlmICh0aGlzLnR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy50eXBlQ29udmVydGVyLnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBnZXRDdXN0b21Db252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImN1c3RvbSBjb252ZXJ0ZXIgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmN1c3RvbUNvbnZlcnRlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5idWlsZE5ld0NvbnZlcnRlcih0aGlzLmdldEN1c3RvbUNvbnZlcnRlckFkYXB0ZXIoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tQ29udmVydGVyXyhjb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMuY3VzdG9tQ29udmVydGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImN1c3RvbSBjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJBZGFwdGVyKCkucmVtb3ZlQ29udmVydGVyQW5ub3RhdGlvbih0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tQ29udmVydGVyXyhudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21Db252ZXJ0ZXJfKEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9sZCA9IHRoaXMuY3VzdG9tQ29udmVydGVyOwotCQl0aGlzLmN1c3RvbUNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9DT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmdldEN1c3RvbUNvbnZlcnRlckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0N1c3RvbUNvbnZlcnRlcigpIHsKLQkJRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q3VzdG9tQ29udmVydGVyQWRhcHRlcigpLmdldENvbnZlcnRlckFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Q3VzdG9tQ29udmVydGVyXyhudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgJiYgKHRoaXMuY3VzdG9tQ29udmVydGVyLmdldENvbnZlcnRlckFubm90YXRpb24oKSA9PSBhbm5vdGF0aW9uKSkgewotCQkJCXRoaXMuY3VzdG9tQ29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIodGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJBZGFwdGVyKCksIGFubm90YXRpb24pOwotCQkJCXRoaXMuc2V0Q3VzdG9tQ29udmVydGVyXyhjb252ZXJ0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5BZGFwdGVyIGdldEN1c3RvbUNvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBhZGRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlpZiAodGhpcy5vYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9iamVjdCB0eXBlIGNvbnZlcnRlciBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGROZXdDb252ZXJ0ZXIodGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVyQWRhcHRlcigpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlQ29udmVydGVyXyhjb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCWlmICh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigib2JqZWN0IHR5cGUgY29udmVydGVyIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlckFkYXB0ZXIoKS5yZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlQ29udmVydGVyXyhudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyXyhKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9sZCA9IHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVyQWRhcHRlcigpLmdldENvbnZlcnRlckFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldE9iamVjdFR5cGVDb252ZXJ0ZXJfKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgJiYgKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgPT0gYW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIodGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVyQWRhcHRlcigpLCBhbm5vdGF0aW9uKTsKLQkJCQl0aGlzLnNldE9iamVjdFR5cGVDb252ZXJ0ZXJfKGNvbnZlcnRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5BZGFwdGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cnVjdCBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN0cnVjdCBjb252ZXJ0ZXIgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLnN0cnVjdENvbnZlcnRlcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5idWlsZE5ld0NvbnZlcnRlcih0aGlzLmdldFN0cnVjdENvbnZlcnRlckFkYXB0ZXIoKSk7Ci0JCXRoaXMuc2V0U3RydWN0Q29udmVydGVyXyhjb252ZXJ0ZXIpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cnVjdENvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInN0cnVjdCBjb252ZXJ0ZXIgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJBZGFwdGVyKCkucmVtb3ZlQ29udmVydGVyQW5ub3RhdGlvbih0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSk7Ci0JCXRoaXMuc2V0U3RydWN0Q29udmVydGVyXyhudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXJfKEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9sZCA9IHRoaXMuc3RydWN0Q29udmVydGVyOwotCQl0aGlzLnN0cnVjdENvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGJ1aWxkU3RydWN0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmdldFN0cnVjdENvbnZlcnRlckFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1N0cnVjdENvbnZlcnRlcigpIHsKLQkJRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RydWN0Q29udmVydGVyQWRhcHRlcigpLmdldENvbnZlcnRlckFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0U3RydWN0Q29udmVydGVyXyhudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5zdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkgJiYgKHRoaXMuc3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckFubm90YXRpb24oKSA9PSBhbm5vdGF0aW9uKSkgewotCQkJCXRoaXMuc3RydWN0Q29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIodGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJBZGFwdGVyKCksIGFubm90YXRpb24pOwotCQkJCXRoaXMuc2V0U3RydWN0Q29udmVydGVyXyhjb252ZXJ0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5BZGFwdGVyIGdldFN0cnVjdENvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCkgewotCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInR5cGUgY29udmVydGVyIGFscmVhZHkgZXhpc3RzOiAiICsgdGhpcy50eXBlQ29udmVydGVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5idWlsZE5ld0NvbnZlcnRlcih0aGlzLmdldFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkpOwotCQl0aGlzLnNldFR5cGVDb252ZXJ0ZXJfKGNvbnZlcnRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcigpIHsKLQkJaWYgKHRoaXMudHlwZUNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0eXBlIGNvbnZlcnRlciBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmdldFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkucmVtb3ZlQ29udmVydGVyQW5ub3RhdGlvbih0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSk7Ci0JCXRoaXMuc2V0VHlwZUNvbnZlcnRlcl8obnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZUNvbnZlcnRlcl8oSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvbGQgPSB0aGlzLnR5cGVDb252ZXJ0ZXI7Ci0JCXRoaXMudHlwZUNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENvbnZlcnRlcih0aGlzLmdldFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNUeXBlQ29udmVydGVyKCkgewotCQlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRUeXBlQ29udmVydGVyQWRhcHRlcigpLmdldENvbnZlcnRlckFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy50eXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldFR5cGVDb252ZXJ0ZXJfKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0aGlzLnR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgJiYgKHRoaXMudHlwZUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgPT0gYW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLnR5cGVDb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQlKYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIodGhpcy5nZXRUeXBlQ29udmVydGVyQWRhcHRlcigpLCBhbm5vdGF0aW9uKTsKLQkJCQl0aGlzLnNldFR5cGVDb252ZXJ0ZXJfKGNvbnZlcnRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5BZGFwdGVyIGdldFR5cGVDb252ZXJ0ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIDxDIGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+PiBDIGJ1aWxkQ29udmVydGVyKEMuQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXJldHVybiAoQykgYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgdGhpcyk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIDxDIGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8+PiBDIGJ1aWxkQ29udmVydGVyKEMuQWRhcHRlciBhZGFwdGVyLCBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiAoQykgYWRhcHRlci5idWlsZENvbnZlcnRlcihjb252ZXJ0ZXJBbm5vdGF0aW9uLCB0aGlzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgPEMgZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4+IEMgYnVpbGROZXdDb252ZXJ0ZXIoQy5BZGFwdGVyIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIChDKSBhZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlpZiAodGhpcy5jdXN0b21Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5jdXN0b21Db252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQlpZiAodGhpcy5vYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpIHsKLQkJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCWlmICh0aGlzLnR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy50eXBlQ29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJaWYgKHRoaXMuc3RydWN0Q29udmVydGVyICE9IG51bGwpIHsKLQkJCXRoaXMuc3RydWN0Q29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGM3ZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyCi0JZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBjb252ZXJ0ZXJBbm5vdGF0aW9uKTsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlckNsYXNzKGNvbnZlcnRlckNsYXNzKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18oY29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5IHF1YWxpZmllZCBjb252ZXJ0ZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0NPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKHRoaXMuY29udmVydGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJLy8gdGhlIGFubm90YXRpb24gd2lsbCBoYXZlIGEgY29tcGlsZSBlcnJvciBpZiBpdHMgY29udmVydGVyIGNsYXNzIGlzIG1pc3NpbmcKLQkJCXRoaXMudmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQkvL0Fubm90YXRpb24gaXRzZWxmIHdpbGwgaGF2ZSBjb21waWxlIGVycm9yIGlmIGNvbnZlcnRlciBjbGFzcyBub3QgZGVmaW5lZAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5jb252ZXJ0ZXJDbGFzcykpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0RFRklORUQsCi0JCQkJCXRoaXMsCi0JCQkJCWdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsJCQkKLQkJfQotCQllbHNlIGlmICggISB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKEVDTElQU0VMSU5LX0NPTlZFUlRFUl9DTEFTU19OQU1FLCBhc3RSb290KSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUiwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmNvbnZlcnRlckNsYXNzfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8gZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbj4gYnVpbGRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiwgSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIocGFyZW50LCAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBjb252ZXJ0ZXJBbm5vdGF0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWYxZGYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBzcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyKEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyA6IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoU3RyaW5nIGN1c3RvbWl6ZXJDbGFzcykgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQoY3VzdG9taXplckNsYXNzLCB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcykpIHsKLQkJCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb24oKTsKLQkJCWlmIChjdXN0b21pemVyQ2xhc3MgPT0gbnVsbCkgewotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJdGhpcy5yZW1vdmVDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCQlhbm5vdGF0aW9uID0gdGhpcy5hZGRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKGN1c3RvbWl6ZXJDbGFzcyk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhjdXN0b21pemVyQ2xhc3MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyhTdHJpbmcgY3VzdG9taXplckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSBjdXN0b21pemVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ1VTVE9NSVpFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjdXN0b21pemVyQ2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gbm8gZGVmYXVsdCBmb3IgSmF2YQotCX0KLQotCi0JLy8gKioqKioqKioqKiBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcyhTdHJpbmcgY3VzdG9taXplckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzID0gY3VzdG9taXplckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY3VzdG9taXplckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBnZXRDdXN0b21pemVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGFkZEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ3VzdG9taXplckFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDdXN0b21pemVyQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRDdXN0b21pemVyQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJy4nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDdXN0b21pemVyQW5ub3RhdGlvbigpOwotCQlpZiAoKGFubm90YXRpb24gIT0gbnVsbCkgJiYgISBhbm5vdGF0aW9uLmN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUUsIGFzdFJvb3QpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ1VTVE9NSVpFUl9DTEFTU19JTVBMRU1FTlRTX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEN1c3RvbWl6ZXJDbGFzcygpfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRDdXN0b21pemVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb24oKS5nZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q3VzdG9taXplckFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkNTBiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIEphdmEgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbWJlZGRhYmxlCi0JaW1wbGVtZW50cyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW1iZWRkYWJsZUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBtYXBwaW5nQW5ub3RhdGlvbik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyID0gdGhpcy5idWlsZENvbnZlcnRlckNvbnRhaW5lcigpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nID0gdGhpcy5idWlsZENoYW5nZVRyYWNraW5nKCk7Ci0JCXRoaXMuY3VzdG9taXplciA9IHRoaXMuYnVpbGRDdXN0b21pemVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudXBkYXRlKCk7Ci0JCXRoaXMuY3VzdG9taXplci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGdldENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHRyYWNraW5nICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9taXplciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg4ZWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIEphdmEgZW50aXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbnRpdHkKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua0VudGl0eQotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGNvbnZlcnRlckNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlJbXBsKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEVudGl0eUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBtYXBwaW5nQW5ub3RhdGlvbik7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMucmVhZE9ubHkgPSB0aGlzLmJ1aWxkUmVhZE9ubHkoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWFkT25seS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkLW9ubHkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1JlYWRPbmx5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgdHJhY2tpbmcgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNoYW5nZVRyYWNraW5nOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzY3JpbWluYXRvciBjb2x1bW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkgewotCQlyZXR1cm4gc3VwZXIuYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkgJiYgISB0aGlzLmNsYXNzRXh0cmFjdG9ySXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0V4dHJhY3RvcklzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzc0V4dHJhY3RvckFubm90YXRpb24oKSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSBnZXRDbGFzc0V4dHJhY3RvckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEpIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiAoKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuZ2V0Q2FjaGluZygpKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jYWNoaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucmVhZE9ubHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcywgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U3YzVmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSWRNYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0lkTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubXV0YWJsZSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm11dGFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubXV0YWJsZS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwdXQgdGhlIEVjbGlwc2VMaW5rIGNvbnZlcnQgYWRhcHRlciBmaXJzdCAtIHRoaXMgaXMgdGhlIG9yZGVyIEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPihKYXZhRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKSwgc3VwZXIuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5tdXRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMmIyNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YUlkTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWQotCSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhY2M2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2gKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaAotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2goSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlLCB0aGlzLnZhbHVlKSkgewotCQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb24oKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZUpvaW5GZXRjaEFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQkJYW5ub3RhdGlvbiA9IHRoaXMuYWRkSm9pbkZldGNoQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKHZhbHVlKSk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBidWlsZFZhbHVlKCkgewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKb2luRmV0Y2hUeXBlIGFubm90YXRpb25WYWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uVmFsdWUgIT0gbnVsbCkgPwotCQkJCUVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoYW5ub3RhdGlvblZhbHVlKSA6Ci0JCQkJdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsgLy8gQEpvaW5GZXRjaCBpcyBlcXVpdmFsZW50IHRvIEBKb2luRmV0Y2goSm9pbkZldGNoLklOTkVSKQotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxVRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBmZXRjaCBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gYWRkSm9pbkZldGNoQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUpvaW5GZXRjaEFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9pbkZldGNoQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEpvaW5GZXRjaEFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYWU5MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0JCi0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0MTkyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSwKLQkJRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWQotCSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM2M2Y2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzQwOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkKLQkpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NThiMzY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogSmF2YSBtYXBwZWQgc3VwZXJjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MKLQlpbXBsZW1lbnRzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MsIEphdmFDYWNoZWFibGVIb2xkZXIyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBtYXBwaW5nQW5ub3RhdGlvbik7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMucmVhZE9ubHkgPSB0aGlzLmJ1aWxkUmVhZE9ubHkoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWFkT25seS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldENhY2hpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRDYWNoaW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkLW9ubHkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1JlYWRPbmx5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZENvbnZlcnRlckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2UgdHJhY2tpbmcgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNoYW5nZVRyYWNraW5nOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICgoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRDYWNoaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRDYWNoaW5nKCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNhY2hpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5yZWFkT25seS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY3VzdG9taXplci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRQcmltYXJ5S2V5VmFsaWRhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcih0aGlzLCB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua011dGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwOTg4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNdXRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlCi17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTXV0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TXV0YWJsZTsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua011dGFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkTXV0YWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNdXRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTXV0YWJsZV8odGhpcy5idWlsZFNwZWNpZmllZE11dGFibGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0TXV0YWJsZSh0aGlzLmJ1aWxkRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNNdXRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTXV0YWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTXV0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdE11dGFibGU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTXV0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4gbXV0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobXV0YWJsZSwgdGhpcy5zcGVjaWZpZWRNdXRhYmxlKSkgewotCQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNdXRhYmxlQW5ub3RhdGlvbigpOwotCQkJaWYgKG11dGFibGUgPT0gbnVsbCkgewotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJdGhpcy5yZW1vdmVNdXRhYmxlQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCQlhbm5vdGF0aW9uID0gdGhpcy5hZGRNdXRhYmxlQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlCb29sZWFuIGFubm90YXRpb25WYWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJCQlib29sZWFuIGFubm90YXRpb25Cb29sZWFuVmFsdWUgPSAoYW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gdHJ1ZSA6IGFubm90YXRpb25WYWx1ZS5ib29sZWFuVmFsdWUoKTsKLQkJCQlpZiAoYW5ub3RhdGlvbkJvb2xlYW5WYWx1ZSAhPSBtdXRhYmxlLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWFubm90YXRpb24uc2V0VmFsdWUobXV0YWJsZSk7Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLnNldFNwZWNpZmllZE11dGFibGVfKG11dGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZV8oQm9vbGVhbiBtdXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBtdXRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbXV0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRNdXRhYmxlKCkgewotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE11dGFibGVBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQE11dGFibGUgaXMgZXF1aXZhbGVudCB0byBATXV0YWJsZSh0cnVlKQotCQlCb29sZWFuIGFubm90YXRpb25WYWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBhbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE11dGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE11dGFibGUoYm9vbGVhbiBtdXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQkJdGhpcy5kZWZhdWx0TXV0YWJsZSA9IG11dGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbXV0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0TXV0YWJsZSgpIHsKLQkJSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhQXR0cmlidXRlLnR5cGVJc0RhdGVPckNhbGVuZGFyKCkpIHsKLQkJCUJvb2xlYW4gcHVUZW1wb3JhbE11dGFibGUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJCXJldHVybiAocHVUZW1wb3JhbE11dGFibGUgPT0gbnVsbCkgPyBmYWxzZSA6IHB1VGVtcG9yYWxNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQXR0cmlidXRlLnR5cGVJc1NlcmlhbGl6YWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gZ2V0TXV0YWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0TXV0YWJsZUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIGFkZE11dGFibGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldE11dGFibGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNdXRhYmxlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMuZ2V0TXV0YWJsZUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TXV0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSkgdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gdGhpcy5nZXRNdXRhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG11dGFibGVBbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IG11dGFibGVBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5NDVmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRDb250YWluZXJUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YVR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0RBVEFfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZERhdGFUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZE9iamVjdFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMgPSBuZXcgVmVjdG9yPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4oKTsKLQlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25WYWx1ZUNvbnRhaW5lckFkYXB0ZXIgY29udmVyc2lvblZhbHVlQ29udGFpbmVyQWRhcHRlciA9IG5ldyBDb252ZXJzaW9uVmFsdWVDb250YWluZXJBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGNvbnZlcnRlckFubm90YXRpb24pOwotCQl0aGlzLmRhdGFUeXBlID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVyc2lvblZhbHVlcygpOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQkJdGhpcy5zeW5jQ29udmVyc2lvblZhbHVlcygpOwotCQl0aGlzLnNldERlZmF1bHRPYmplY3RWYWx1ZV8odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUodGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKSk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRDb252ZXJzaW9uVmFsdWVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCXRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZShkYXRhVHlwZSk7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmdWxseSBxdWFsaWZpZWQgZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9EQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0T2JqZWN0VHlwZShvYmplY3RUeXBlKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyhvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5IHF1YWxpZmllZCBvYmplY3QgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9PQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBvYmplY3RUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZXMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBnZXRDb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KHRoaXMuY29udmVyc2lvblZhbHVlcyk7Ci0JfQotCi0JcHVibGljIGludCBjb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuYWRkQ29udmVyc2lvblZhbHVlXyhpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQl0aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuaW5kZXhPZihjb252ZXJzaW9uVmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5yZW1vdmVDb252ZXJzaW9uVmFsdWUoaW5kZXgpOwotCQl0aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb252ZXJzaW9uVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCWZvciAoSXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBzdHJlYW0gPSB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXRoaXMuY29udmVyc2lvblZhbHVlcy5hZGQodGhpcy5idWlsZENvbnZlcnNpb25WYWx1ZShzdHJlYW0ubmV4dCgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGJ1aWxkQ29udmVyc2lvblZhbHVlKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlKHRoaXMsIGNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVyc2lvblZhbHVlcygpIHsKLQkJQ29udGV4dENvbnRhaW5lclRvb2xzLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwodGhpcy5jb252ZXJzaW9uVmFsdWVDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBnZXRDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlXyhpbnQgaW5kZXgsIEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlXyhpbnQgaW5kZXgsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKSB7Ci0JCUphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKGNvbnZlcnNpb25WYWx1ZUFubm90YXRpb24pOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnNpb25WYWx1ZSwgdGhpcy5jb252ZXJzaW9uVmFsdWVzLCBDT05WRVJTSU9OX1ZBTFVFU19MSVNUKTsKLQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWVfKEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWVfKHRoaXMuY29udmVyc2lvblZhbHVlcy5pbmRleE9mKGNvbnZlcnNpb25WYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlcnNpb24gdmFsdWUgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIENvbnRleHRDb250YWluZXJUb29scy5BZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIudGhpcy5nZXRDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuZ2V0Q29udmVyc2lvblZhbHVlQW5ub3RhdGlvbnMoKTsKLQkJfQotCQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgSmF2YUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGVsZW1lbnQpIHsKLQkJCUphdmFFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIudGhpcy5tb3ZlQ29udmVyc2lvblZhbHVlXyhpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuYWRkQ29udmVyc2lvblZhbHVlXyhpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgZWxlbWVudCkgewotCQkJSmF2YUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci50aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB2YWx1ZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RGF0YVZhbHVlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPih0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERhdGFWYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG9iamVjdCB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERlZmF1bHRPYmplY3RWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9iamVjdFZhbHVlXyh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJZm9yIChKYXZhRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlIDogdGhpcy5nZXRDb252ZXJzaW9uVmFsdWVzKCkpIHsKLQkJCWNvbnZlcnNpb25WYWx1ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPD8gZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbj4gYnVpbGRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiwgSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKHBhcmVudCwgKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGNvbnZlcnRlckFubm90YXRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjczZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duZWQ7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG93bmVkICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBmZXRjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5wcml2YXRlT3duZWQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzg0MTcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FCi0JfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZSgKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZCi0JKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIHRhcmdldEVudGl0eSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHRhcmdldEVudGl0eSAhPSBudWxsKQotCQkJCSYmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0YXJnZXRFbnRpdHkpICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMzcyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBKYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnByaXZhdGVPd25lZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkZldGNoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnByaXZhdGVPd25lZC51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGdldFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5GZXRjaC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnByaXZhdGVPd25lZC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE3MzAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FCi0JfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZSgKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZLAotCQlFQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZCi0JKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIHRhcmdldEVudGl0eSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U2luZ2xlUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQkJcmV0dXJuICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkKLQkJCQkmJiAocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkodGFyZ2V0RW50aXR5KSAhPSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YmI0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEpIHsKLQkJc3VwZXIocGFyZW50LCBqcnBhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIGtleSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRLZXlJc0ludmFsaWQoa2V5KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBtYXBwaW5nOiAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbihrZXkpOwotCX0KLQotCS8qKgotCSAqIEVjbGlwc2VMaW5rIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyBhbiBhdHRyaWJ1dGUgd2l0aCBhIGRlZmF1bHQgMToxCi0JICogbWFwcGluZyB0byBhIHNwZWNpZmllZCBtYXBwaW5nIG9mIElEOyBiZWNhdXNlIHRoZSByZXN1bHRpbmcgSUQgYW5ub3RhdGlvbgotCSAqIGluZGljYXRlcyBhIHByaW1hcnkga2V5IGRlcml2ZWQgZnJvbSB0aGUgMToxIG1hcHBpbmcsIDxlbT5ub3Q8L2VtPiBhbiBJRAotCSAqIG1hcHBpbmcuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkS2V5SXNJbnZhbGlkKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKGtleSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSAmJgotCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXREZWZhdWx0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZgotCSAqIDxjb2RlPmphdmEudXRpbC5EYXRlPC9jb2RlPiBvciA8Y29kZT5qYXZhLnV0aWwuQ2FsZW5kYXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHR5cGVJc0RhdGVPckNhbGVuZGFyKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKERBVEVfVFlQRV9OQU1FKQotCQkJCXx8IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc1N1YlR5cGVPZihDQUxFTkRBUl9UWVBFX05BTUUpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRFX1RZUEVfTkFNRSA9IGphdmEudXRpbC5EYXRlLmNsYXNzLmdldE5hbWUoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxFTkRBUl9UWVBFX05BTUUgPSBqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzU2VyaWFsaXphYmxlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzVmFyaWFibGVQcmltaXRpdmUoKQotCQkJCXx8IHRoaXMucmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLnR5cGVJc1N1YlR5cGVPZihTRVJJQUxJWkFCTEVfVFlQRV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS50eXBlSXNJbnRlcmZhY2UoKQotCQkJCSYmIHRoaXMuaW50ZXJmYWNlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoZ2V0VHlwZU5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW50ZXJmYWNlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5pbnRlcmZhY2VJc0ludmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKGludGVyZmFjZU5hbWUpOwotCX0KLQotCS8vIFRPRE8gd2UgY291bGQgcHJvYmFibHkgYWRkIG1vcmUgaW50ZXJmYWNlcyB0byB0aGlzIGxpc3QuLi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnRlcmZhY2VJc0ludmFsaWRGb3JWYXJpYWJsZU9uZVRvT25lKFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCXJldHVybiAoaW50ZXJmYWNlTmFtZSA9PSBudWxsKSB8fAotCQkJCXRoaXMudHlwZUlzQ29udGFpbmVyKGludGVyZmFjZU5hbWUpIHx8Ci0JCQkJaW50ZXJmYWNlTmFtZS5lcXVhbHMoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmluZGlyZWN0aW9uLlZhbHVlSG9sZGVySW50ZXJmYWNlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQXR0aWJ1dGVWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IodGhpcywgdGhpcywgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzdmMWQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtQcml2YXRlT3duZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1ByaXZhdGVPd25lZAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcHJpdmF0ZU93bmVkOwotCi0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRQcml2YXRlT3duZWRfKHRoaXMuYnVpbGRQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBwcml2YXRlT3duZWQpIHsKLQkJaWYgKHByaXZhdGVPd25lZCAhPSB0aGlzLnByaXZhdGVPd25lZCkgewotCQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFByaXZhdGVPd25lZEFubm90YXRpb24oKTsKLQkJCWlmIChwcml2YXRlT3duZWQpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuYWRkUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZVByaXZhdGVPd25lZEFubm90YXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0UHJpdmF0ZU93bmVkXyhwcml2YXRlT3duZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJpdmF0ZU93bmVkXyhib29sZWFuIHByaXZhdGVPd25lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHJpdmF0ZU93bmVkOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IHByaXZhdGVPd25lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSVZBVEVfT1dORURfUFJPUEVSVFksIG9sZCwgcHJpdmF0ZU93bmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpdmF0ZU93bmVkQW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgb3duZWQgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGdldFByaXZhdGVPd25lZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIGFkZFByaXZhdGVPd25lZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcml2YXRlT3duZWRBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByaXZhdGVPd25lZEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRQcml2YXRlT3duZWRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQwNzUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rUmVhZE9ubHkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5Ci17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVhZE9ubHk7ICAvLyBUUlVFIG9yIG51bGwKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1JlYWRPbmx5KEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRSZWFkT25seSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZFJlYWRPbmx5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlYWQtb25seSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRSZWFkT25seSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuIHJlYWRPbmx5KSB7Ci0JCXJlYWRPbmx5ID0gKHJlYWRPbmx5ID09IG51bGwpID8gbnVsbCA6IHJlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpID8gcmVhZE9ubHkgOiBudWxsOwotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQocmVhZE9ubHksIHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkpKSB7Ci0JCQlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRSZWFkT25seUFubm90YXRpb24oKTsKLQkJCWlmIChyZWFkT25seSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCQl0aGlzLmFkZFJlYWRPbmx5QW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCQl0aGlzLnJlbW92ZVJlYWRPbmx5QW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWFkT25seV8ocmVhZE9ubHkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVhZE9ubHlfKEJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OwotCQl0aGlzLnNwZWNpZmllZFJlYWRPbmx5ID0gcmVhZE9ubHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZLCBvbGQsIHJlYWRPbmx5KTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRSZWFkT25seSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFJlYWRPbmx5QW5ub3RhdGlvbigpID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4uVFJVRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRSZWFkT25seSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9PTkxZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkLW9ubHkgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gZ2V0UmVhZE9ubHlBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0UmVhZE9ubHlBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWFkT25seUFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlYWRPbmx5QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldFJlYWRPbmx5QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkT25seUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0UmVhZE9ubHlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDQyMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcgotCWV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyCi17Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0KLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBjb252ZXJ0ZXJBbm5vdGF0aW9uKTsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0Q29udmVydGVyQ2xhc3NfKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcyk7Ci0JCXRoaXMuc2V0Q29udmVydGVyQ2xhc3NfKGNvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgY29udmVydGVyQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmNvbnZlcnRlckNsYXNzICE9IG51bGwpIHsKLQkJCS8vIHRoZSBhbm5vdGF0aW9uIHdpbGwgaGF2ZSBhIGNvbXBpbGUgZXJyb3IgaWYgaXRzIGNvbnZlcnRlciBjbGFzcyBpcyBtaXNzaW5nCi0JCQl2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbnZlcnRlckNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNvbnZlcnRlckNsYXNzKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfREVGSU5FRCwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwkJCQotCQl9Ci0JCQotCQllbHNlIGlmICghY29udmVydGVyQ2xhc3NFeGlzdHMoamF2YVByb2plY3QpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09OVkVSVEVSX0NMQVNTX0VYSVNUUywKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmNvbnZlcnRlckNsYXNzfSwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwkJCQotCQl9IAotCQllbHNlIGlmICghY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKGphdmFQcm9qZWN0LCBFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfSU1QTEVNRU5UU19DT05WRVJURVIsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5jb252ZXJ0ZXJDbGFzc30sCi0JCQkJCXRoaXMsCi0JCQkJCWdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29udmVydGVyQ2xhc3NFeGlzdHMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXJldHVybiAodGhpcy5jb252ZXJ0ZXJDbGFzcyAhPSBudWxsKSAmJgotCQkJCShKRFRUb29scy5maW5kVHlwZShqYXZhUHJvamVjdCwgdGhpcy5jb252ZXJ0ZXJDbGFzcykgIT0gbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRlckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jb252ZXJ0ZXJDbGFzcyAhPSBudWxsKSAmJgotCQkJCUpEVFRvb2xzLnR5cGVOYW1lZEltcGxlbWVudHNJbnRlcmZhY2VOYW1lZChqYXZhUHJvamVjdCwgdGhpcy5jb252ZXJ0ZXJDbGFzcywgaW50ZXJmYWNlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlleHRlbmRzIEFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBBZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCXByaXZhdGUgQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0KLQkJcHVibGljIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24+IGJ1aWxkQ29udmVydGVyKEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKHBhcmVudCwgKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JCX0KLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGE0ZDY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbj4gCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotewotCQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODBlZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MTE3NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotCWV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZERhdGFUeXBlOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBvYmplY3RUeXBlOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX09CSkVDVF9UWVBFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JCXRoaXMuZGF0YVR5cGUgPSB0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKTsKLQkJdGhpcy5vYmplY3RUeXBlID0gdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE9iamVjdFR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXREYXRhVHlwZV8odGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKHRoaXMuY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSh0aGlzLmNvbnZlcnRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUodGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aGlzLmNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoZGF0YVR5cGUpOwotCQl0aGlzLnNldERhdGFUeXBlXyhkYXRhVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGF0YVR5cGVfKFN0cmluZyBkYXRhVHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVHlwZTsKLQkJdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZnVsbHkgcXVhbGlmaWVkIGRhdGEgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkRGF0YVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGRhdGFUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJdGhpcy5jb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE9iamVjdFR5cGUob2JqZWN0VHlwZSk7Ci0JCXRoaXMuc2V0T2JqZWN0VHlwZV8ob2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmdWxseSBxdWFsaWZpZWQgb2JqZWN0IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSA9IG9iamVjdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXI8PyBleHRlbmRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uPiBidWlsZENvbnZlcnRlcihFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uLCBKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIocGFyZW50LCAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgY29udmVydGVyQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVjOGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nCi17Ci0JCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOWQ0ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rSnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSBwZXJzaXN0ZW50QXR0cmlidXRlKS50eXBlSXNWYWxpZEZvclZhcmlhYmxlT25lVG9PbmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg4NTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgSmF2YUVjbGlwc2VMaW5rTXV0YWJsZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdXRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogcHV0IHRoZSBFY2xpcHNlTGluayBjb252ZXJ0IGFkYXB0ZXIgZmlyc3QgLSB0aGlzIGlzIHRoZSBvcmRlciBFY2xpcHNlTGluayBzZWFyY2hlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4oSmF2YUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCksIHN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubXV0YWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKFZFUlNJT05fTUFQUElOR19TVVBQT1JURURfVFlQRVMsIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1ZFUlNJT05fTUFQUElOR19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNjY2ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWQotCSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjY5ZTMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFRZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogT3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZTsgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgSmF2YS4KLQkgKiBAc2VlIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1Qcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJT3JtRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8qKgotCSAqIE9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmU7IGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIEphdmEuCi0JICogQHNlZSBFY2xpcHNlTGlua0pwYVBsYXRmb3JtUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjIzMzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYbWxCYXNpY0NvbGxlY3Rpb24+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY0NvbGxlY3Rpb25zKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSByZXNvdXJjZUF0dHJpYnV0ZXMpLmdldEJhc2ljQ29sbGVjdGlvbnMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMjM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAoKFBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCVN0cmluZyB0YXJnZXRUeXBlTmFtZSA9IG51bGw7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRhcmdldFR5cGVOYW1lID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3YmYzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbEJhc2ljTWFwPiAKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgcmVzb3VyY2VBdHRyaWJ1dGVzKS5nZXRCYXNpY01hcHMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHJlc291cmNlQXR0cmlidXRlcykuZ2V0QmFzaWNNYXBzKCkucmVtb3ZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDI3OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gKChQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgdGFyZ2V0VHlwZU5hbWUgPSBudWxsOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmIChqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQl0YXJnZXRUeXBlTmFtZSA9IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gKHRhcmdldFR5cGVOYW1lICE9IG51bGwpID8gdGFyZ2V0VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5hZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JCXN1cGVyLmFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJU3RyaW5nIG1hcEtleVR5cGVOYW1lID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJbWFwS2V5VHlwZU5hbWUgPSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKCk7Ci0JCX0KLQkJbWFwS2V5VHlwZU5hbWUgPSBtYXBLZXlUeXBlTmFtZSAhPSBudWxsID8gbWFwS2V5VHlwZU5hbWUgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKG1hcEtleVR5cGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjMTk3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0RW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbAotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlNYXBwaW5ncwotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzSW1wbChPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCAoWG1sRW50aXR5TWFwcGluZ3MpIHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJc3VwZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwMGFhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIFdlIG5lZWQgdGhpcyBjbGFzcyBiZWNhdXNlIHRoZSBFY2xpcHNlTGluayAxLjAgMTptIG1hcHBpbmcgc3VwcG9ydHMgYSBqb2luCi0gKiBjb2x1bW4gc3RyYXRlZ3kgd2hpbGUgSlBBIGRpZCBub3QgdW50aWwgSlBBIDIuMC4gQXMgYSByZXN1bHQsIHdlIG5lZWQgYSBjbGFzcwotICogdGhhdCBpbXBsZW1lbnRzIEVjbGlwc2VMaW5rIDEuMC4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBHZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcChPcm1PbmVUb01hbnlNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIHRydWUpOyAgLy8gdHJ1ZT1zdXBwb3J0cyBqb2luIGNvbHVtbiBzdHJhdGVneQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRpbWVPZkRheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTc5ZTVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVGltZU9mRGF5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGltZU9mRGF5Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbFRpbWVPZkRheSB4bWxUaW1lT2ZEYXk7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBob3VyOwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbnV0ZTsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzZWNvbmQ7Ci0JcHJvdGVjdGVkIEludGVnZXIgbWlsbGlzZWNvbmQ7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVRpbWVPZkRheShPcm1FY2xpcHNlTGlua0NhY2hpbmcgcGFyZW50LCBYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sVGltZU9mRGF5ID0geG1sVGltZU9mRGF5OwotCQl0aGlzLmhvdXIgPSB4bWxUaW1lT2ZEYXkuZ2V0SG91cigpOwotCQl0aGlzLm1pbnV0ZSA9IHhtbFRpbWVPZkRheS5nZXRNaW51dGUoKTsKLQkJdGhpcy5zZWNvbmQgPSB4bWxUaW1lT2ZEYXkuZ2V0U2Vjb25kKCk7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSB4bWxUaW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRIb3VyXyh0aGlzLnhtbFRpbWVPZkRheS5nZXRIb3VyKCkpOwotCQl0aGlzLnNldE1pbnV0ZV8odGhpcy54bWxUaW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQl0aGlzLnNldFNlY29uZF8odGhpcy54bWxUaW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyh0aGlzLnhtbFRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaG91ciAqKioqKioqKioqCi0KLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkgewotCQlyZXR1cm4gdGhpcy5ob3VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKSB7Ci0JCXRoaXMuc2V0SG91cl8oaG91cik7Ci0JCXRoaXMueG1sVGltZU9mRGF5LnNldEhvdXIoaG91cik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SG91cl8oSW50ZWdlciBob3VyKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5ob3VyOwotCQl0aGlzLmhvdXIgPSBob3VyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkLCBob3VyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWludXRlICoqKioqKioqKioKLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMubWludXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1pbnV0ZShJbnRlZ2VyIG1pbnV0ZSkgewotCQl0aGlzLnNldE1pbnV0ZV8obWludXRlKTsKLQkJdGhpcy54bWxUaW1lT2ZEYXkuc2V0TWludXRlKG1pbnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWludXRlXyhJbnRlZ2VyIG1pbnV0ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubWludXRlOwotCQl0aGlzLm1pbnV0ZSA9IG1pbnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTlVURV9QUk9QRVJUWSwgb2xkLCBtaW51dGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWNvbmQgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgc2Vjb25kKSB7Ci0JCXRoaXMuc2V0U2Vjb25kXyhzZWNvbmQpOwotCQl0aGlzLnhtbFRpbWVPZkRheS5zZXRTZWNvbmQoc2Vjb25kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gc2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGQsIHNlY29uZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbGxpc2Vjb25kICoqKioqKioqKioKLQotCXB1YmxpYyBJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5taWxsaXNlY29uZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKSB7Ci0JCXRoaXMuc2V0TWlsbGlzZWNvbmRfKG1pbGxpc2Vjb25kKTsKLQkJdGhpcy54bWxUaW1lT2ZEYXkuc2V0TWlsbGlzZWNvbmQobWlsbGlzZWNvbmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1pbGxpc2Vjb25kXyhJbnRlZ2VyIG1pbGxpc2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5taWxsaXNlY29uZDsKLQkJdGhpcy5taWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlMTElTRUNPTkRfUFJPUEVSVFksIG9sZCwgbWlsbGlzZWNvbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBYbWxUaW1lT2ZEYXkgZ2V0WG1sVGltZU9mRGF5KCkgewotCQlyZXR1cm4gdGhpcy54bWxUaW1lT2ZEYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxUaW1lT2ZEYXkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTliOTBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17CQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluay1zcGVjaWZpYyBPUk0gQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGJ1aWxkRW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NJbXBsKHBhcmVudCwgKFhtbEVudGl0eU1hcHBpbmdzKSB4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbWJlZGRhYmxlIGJ1aWxkT3JtRW1iZWRkYWJsZShPcm1QZXJzaXN0ZW50VHlwZSB0eXBlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbCh0eXBlLCAoWG1sRW1iZWRkYWJsZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRW50aXR5IGJ1aWxkT3JtRW50aXR5KE9ybVBlcnNpc3RlbnRUeXBlIHR5cGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRW50aXR5SW1wbCh0eXBlLCAoWG1sRW50aXR5KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtTWFwcGVkU3VwZXJjbGFzcyBidWlsZE9ybU1hcHBlZFN1cGVyY2xhc3MoT3JtUGVyc2lzdGVudFR5cGUgdHlwZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwodHlwZSwgKFhtbE1hcHBlZFN1cGVyY2xhc3MpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcgYnVpbGRPcm1CYXNpY01hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcocGFyZW50LCAoWG1sQmFzaWMpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1JZE1hcHBpbmcgYnVpbGRPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcocGFyZW50LCAoWG1sSWQpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9NYW55TWFwcGluZyBidWlsZE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyhwYXJlbnQsIChYbWxNYW55VG9NYW55KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZyBidWlsZE9ybU1hbnlUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxNYW55VG9PbmUpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nIGJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZyBidWlsZE9ybU9uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxPbmVUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nIGJ1aWxkT3JtVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKHBhcmVudCwgKFhtbFZlcnNpb24pIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyBidWlsZE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWNDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFRyYW5zZm9ybWF0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWYXJpYWJsZU9uZVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNjYyMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTI4MDRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMjQxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKLQkJCQlmYWN0b3J5LCAKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljQ29sbGVjdGlvbigpLCAKLQkJCQlYbWxCYXNpY0NvbGxlY3Rpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nKHBhcmVudCwgKFhtbEJhc2ljQ29sbGVjdGlvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2ODUyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTMwZTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19NQVBfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY01hcCgpLCAKLQkJCQlYbWxCYXNpY01hcC5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeSkgZmFjdG9yeSkuCi0JCQkJYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZyhwYXJlbnQsIChYbWxCYXNpY01hcCkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzODQ0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1CYXNpY01hcHBpbmc8WG1sQmFzaWM+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua011dGFibGUgbXV0YWJsZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpYyB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMubXV0YWJsZSA9IG5ldyBPcm1FY2xpcHNlTGlua011dGFibGUodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubXV0YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tdXRhYmxlLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua011dGFibGUgZ2V0TXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubXV0YWJsZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIHB1dCB0aGUgRWNsaXBzZUxpbmsgY29udmVydCBhZGFwdGVyIGZpcnN0IC0gdGhpcyBpcyB0aGUgb3JkZXIgRWNsaXBzZUxpbmsgc2VhcmNoZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPigKLQkJCQlPcm1FY2xpcHNlTGlua0NvbnZlcnQuQWRhcHRlci5pbnN0YW5jZSgpLAotCQkJCXN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkKLQkJCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyBtdXRhYmxlIHZhbGlkYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ODIxZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uTnVsbE9ybUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXk7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1FY2xpcHNlTGlua0NhY2hpbmcsIE9ybUNhY2hlYWJsZUhvbGRlcjJfMAotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBzcGVjaWZpZWRUeXBlOwotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBkZWZhdWx0VHlwZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFNpemU7Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0U2l6ZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFNoYXJlZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0U2hhcmVkOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0QWx3YXlzUmVmcmVzaDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkRGlzYWJsZUhpdHM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdERpc2FibGVIaXRzOwotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHNwZWNpZmllZENvb3JkaW5hdGlvblR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGRlZmF1bHRDb29yZGluYXRpb25UeXBlOwotCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5OwotCXByb3RlY3RlZCBFY2xpcHNlTGlua09ybVRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBkZWZhdWx0RXhpc3RlbmNlVHlwZTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1DYWNoZWFibGUyXzAgY2FjaGVhYmxlOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nSW1wbChPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVHlwZSgpOwotCQl0aGlzLnNwZWNpZmllZFNpemUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2l6ZSgpOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTaGFyZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gdGhpcy5idWlsZFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzYWJsZUhpdHMoKTsKLQotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpOwotCi0JCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQotCQl0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpOwotCi0JCXRoaXMuY2FjaGVhYmxlID0gdGhpcy5idWlsZENhY2hlYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2l6ZV8odGhpcy5idWlsZFNwZWNpZmllZFNpemUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2hhcmVkKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKHRoaXMuYnVpbGRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcl8odGhpcy5idWlsZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0c18odGhpcy5idWlsZFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJdGhpcy5zZXRFeHBpcnlfKHRoaXMuYnVpbGRFeHBpcnkoKSk7Ci0JCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheSgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJdGhpcy5jYWNoZWFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJYm9vbGVhbiB4bWxDYWNoZU5vdFNwZWNpZmllZCA9ICh0aGlzLmdldFhtbENhY2hlKCkgPT0gbnVsbCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNhY2hpbmcgPSB0aGlzLmdldEphdmFDYWNoaW5nRm9yRGVmYXVsdHMoKTsKLQkJYm9vbGVhbiBqYXZhQ2FjaGVTcGVjaWZpZWQgPSAoamF2YUNhY2hpbmcgIT0gbnVsbCk7Ci0JCWJvb2xlYW4gdXNlSmF2YVZhbHVlID0gKHhtbENhY2hlTm90U3BlY2lmaWVkICYmIGphdmFDYWNoZVNwZWNpZmllZCk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0VHlwZSh1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5nZXRUeXBlKCkgOiBERUZBVUxUX1RZUEUpOwotCQl0aGlzLnNldERlZmF1bHRTaXplKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmdldFNpemUoKSA6IERFRkFVTFRfU0laRSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNoYXJlZCh1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5pc1NoYXJlZCgpIDogREVGQVVMVF9TSEFSRUQpOwotCQl0aGlzLnNldERlZmF1bHRBbHdheXNSZWZyZXNoKHVzZUphdmFWYWx1ZSA/IGphdmFDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpIDogREVGQVVMVF9BTFdBWVNfUkVGUkVTSCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcih1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpIDogREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVIpOwotCQl0aGlzLnNldERlZmF1bHREaXNhYmxlSGl0cyh1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5pc0Rpc2FibGVIaXRzKCkgOiBERUZBVUxUX0RJU0FCTEVfSElUUyk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSh1c2VKYXZhVmFsdWUgPyBqYXZhQ2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkgOiBERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFKTsKLQotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJdGhpcy5leHBpcnlUaW1lT2ZEYXkudXBkYXRlKCk7Ci0JCX0KLQotCQkvLyBleGlzdGVuY2UgY2hlY2tpbmcgaXMgaXRzIG93biB4bWwgYXR0cmlidXRlLCBpdCBpcyBub3QgcGFydCBvZiB0aGUgY2FjaGUgeG1sIGVsZW1lbnQKLQkJdGhpcy5zZXREZWZhdWx0RXhpc3RlbmNlVHlwZShqYXZhQ2FjaGVTcGVjaWZpZWQgPyBqYXZhQ2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkgOiBERUZBVUxUX0VYSVNURU5DRV9UWVBFKTsKLQotCQl0aGlzLmNhY2hlYWJsZS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFR5cGUgOiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRUeXBlLCB0eXBlKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFR5cGVfKHR5cGUpOwotCQkJeG1sQ2FjaGUuc2V0VHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS50b09ybVJlc291cmNlTW9kZWwodHlwZSkpOwotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZUlmVW5zZXQoKTsKLQkJfQotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NhY2hlVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh4bWxDYWNoZS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NhY2hlVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2l6ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTaXplLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRTaXplOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyIHNpemUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2l6ZSwgc2l6ZSkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplXyhzaXplKTsKLQkJCXhtbENhY2hlLnNldFNpemUoc2l6ZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCQl9Ci0KLQkJaWYgKHNpemUgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFNpemU7Ci0JCXRoaXMuc3BlY2lmaWVkU2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZFNpemUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2l6ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2l6ZShpbnQgc2l6ZSkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0U2l6ZTsKLQkJdGhpcy5kZWZhdWx0U2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNoYXJlZCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNoYXJlZCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2hhcmVkLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0U2hhcmVkOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRTaGFyZWQsIHNoYXJlZCkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWRfKHNoYXJlZCk7Ci0JCQl4bWxDYWNoZS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAoKHNoYXJlZCAhPSBudWxsKSAmJiAhIHNoYXJlZC5ib29sZWFuVmFsdWUoKSkgeyAgLy8gQm9vbGVhbi5GQUxTRQotCQkJdGhpcy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQkJdGhpcy5zZXRFeHBpcnkobnVsbCk7Ci0JCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheUlmTmVjZXNzYXJ5KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRfKEJvb2xlYW4gc2hhcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRTaGFyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkU2hhcmVkID0gc2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwgb2xkLCBzaGFyZWQpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkU2hhcmVkKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXRTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRTaGFyZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTaGFyZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNoYXJlZChib29sZWFuIHNoYXJlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdFNoYXJlZDsKLQkJdGhpcy5kZWZhdWx0U2hhcmVkID0gc2hhcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TSEFSRURfUFJPUEVSVFksIG9sZCwgc2hhcmVkKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWx3YXlzIHJlZnJlc2ggKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdEFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoLCBhbHdheXNSZWZyZXNoKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKGFsd2F5c1JlZnJlc2gpOwotCQkJeG1sQ2FjaGUuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAoYWx3YXlzUmVmcmVzaCAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2hfKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5zcGVjaWZpZWRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBhbHdheXNSZWZyZXNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldEFsd2F5c1JlZnJlc2goKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWx3YXlzUmVmcmVzaChib29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoOwotCQl0aGlzLmRlZmF1bHRBbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlciAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIsIHJlZnJlc2hPbmx5SWZOZXdlcikpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXJfKHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JCQl4bWxDYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAocmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZCwgcmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlKCk7Ci0JCXJldHVybiAoeG1sQ2FjaGUgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuZGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZLCBvbGQsIHJlZnJlc2hPbmx5SWZOZXdlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2FibGUgaGl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkRGlzYWJsZUhpdHMsIGRpc2FibGVIaXRzKSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZERpc2FibGVIaXRzXyhkaXNhYmxlSGl0cyk7Ci0JCQl4bWxDYWNoZS5zZXREaXNhYmxlSGl0cyhkaXNhYmxlSGl0cyk7Ci0JCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCQl9Ci0KLQkJaWYgKGRpc2FibGVIaXRzICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHNfKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzOwotCQl0aGlzLnNwZWNpZmllZERpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGRpc2FibGVIaXRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZERpc2FibGVIaXRzKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXREaXNhYmxlSGl0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2FibGVIaXRzKGJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHREaXNhYmxlSGl0czsKLQkJdGhpcy5kZWZhdWx0RGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQUJMRV9ISVRTX1BST1BFUlRZLCBvbGQsIGRpc2FibGVIaXRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29vcmRpbmF0aW9uIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlIDogdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSwgdHlwZSkpIHsKLQkJCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlXyh0eXBlKTsKLQkJCXhtbENhY2hlLnNldENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCk7Ci0JCX0KLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGVfKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHhtbENhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIG9sZD0gdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZTsKLQkJdGhpcy5kZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPT1JESU5BVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgKioqKioqKioqKgotCi0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgZXhwaXJ5KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmV4cGlyeSwgZXhwaXJ5KSkgewotCQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSB0aGlzLmdldFhtbENhY2hlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldEV4cGlyeV8oZXhwaXJ5KTsKLQkJCXhtbENhY2hlLnNldEV4cGlyeShleHBpcnkpOwotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZUlmVW5zZXQoKTsKLQkJfQotCi0JCWlmIChleHBpcnkgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlJZk5lY2Vzc2FyeSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFeHBpcnlfKEludGVnZXIgZXhwaXJ5KSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5leHBpcnk7Ci0JCXRoaXMuZXhwaXJ5ID0gZXhwaXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1BST1BFUlRZLCBvbGQsIGV4cGlyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRFeHBpcnkoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZSgpOwotCQlyZXR1cm4gKHhtbENhY2hlID09IG51bGwpID8gbnVsbCA6IHhtbENhY2hlLmdldEV4cGlyeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHBpcnkgdGltZSBvZiBkYXkgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5IGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheSBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBpcnkgdGltZSBvZiBkYXkgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmV4cGlyeVRpbWVPZkRheSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVhtbENhY2hlIHhtbENhY2hlID0gdGhpcy5nZXRYbWxDYWNoZUZvclVwZGF0ZSgpOwotCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gdGhpcy5idWlsZFhtbFRpbWVPZkRheSgpOwotCQlFY2xpcHNlTGlua09ybVRpbWVPZkRheSB0aW1lT2ZEYXkgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KHhtbFRpbWVPZkRheSk7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRpbWVPZkRheSk7Ci0JCXhtbENhY2hlLnNldEV4cGlyeVRpbWVPZkRheSh4bWxUaW1lT2ZEYXkpOwotCi0JCXRoaXMuc2V0RXhwaXJ5KG51bGwpOwotCQl0aGlzLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQotCQlyZXR1cm4gdGltZU9mRGF5OwotCX0KLQotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkgYnVpbGRYbWxUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImV4cGlyeSB0aW1lIG9mIGRheSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXlfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5SWZOZWNlc3NhcnkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheV8oKSB7Ci0JCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQl0aGlzLmdldFhtbENhY2hlKCkuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCQl0aGlzLnJlbW92ZVhtbENhY2hlSWZVbnNldCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua09ybVRpbWVPZkRheSB0aW1lT2ZEYXkpIHsKLQkJRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGltZU9mRGF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGQsIHRpbWVPZkRheSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0V4cGlyeVRpbWVPZkRheSgpIHsKLQkJWG1sVGltZU9mRGF5IHhtbFRpbWVPZkRheSA9IHRoaXMuZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWlmICh4bWxUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgJiYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5LmdldFhtbFRpbWVPZkRheSgpID09IHhtbFRpbWVPZkRheSkpIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0RXhwaXJ5VGltZU9mRGF5KHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoeG1sVGltZU9mRGF5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KHRoaXMuZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUaW1lT2ZEYXkgZ2V0WG1sRXhwaXJ5VGltZU9mRGF5KCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkgYnVpbGRFeHBpcnlUaW1lT2ZEYXkoWG1sVGltZU9mRGF5IHhtbFRpbWVPZkRheSkgewotCQlyZXR1cm4gKHhtbFRpbWVPZkRheSA9PSBudWxsKSA/IG51bGwgOiBuZXcgRWNsaXBzZUxpbmtPcm1UaW1lT2ZEYXkodGhpcywgeG1sVGltZU9mRGF5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhpc3RlbmNlIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA6IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRFeGlzdGVuY2VUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZV8odHlwZSkpIHsKLQkJCXRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5zZXRFeGlzdGVuY2VDaGVja2luZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHR5cGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGVfKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB0eXBlKSB7Ci0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRXhpc3RlbmNlVHlwZSA9IHR5cGU7Ci0JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VYSVNURU5DRV9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgYnVpbGRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgewotCQlYbWxDYWNoZUhvbGRlciB4bWxDYWNoZUhvbGRlciA9IHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKTsKLQkJcmV0dXJuICh4bWxDYWNoZUhvbGRlciA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sQ2FjaGVIb2xkZXIuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIHR5cGUpIHsKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGU7Ci0JCXRoaXMuZGVmYXVsdEV4aXN0ZW5jZVR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9FWElTVEVOQ0VfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGVhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhY2hlYWJsZTJfMCBidWlsZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1DYWNoZWFibGUodGhpcykgOgotCQkJCW5ldyBOdWxsT3JtQ2FjaGVhYmxlMl8wKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCWlmICggISB0aGlzLmdldFR5cGVNYXBwaW5nKCkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCWlmICgoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpICYmIChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQ2FjaGVhYmxlSG9sZGVyMl8wKSkgewotCQkJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCkuaXNDYWNoZWFibGUoKTsKLQkJCX0KLQkJfQotCQlDYWNoZWFibGVIb2xkZXIyXzAgc3VwZXJDYWNoZWFibGVIb2xkZXIgPSB0aGlzLmdldENhY2hlYWJsZVN1cGVyUGVyc2lzdGVudFR5cGUodGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkpOwotCQlyZXR1cm4gKHN1cGVyQ2FjaGVhYmxlSG9sZGVyICE9IG51bGwpID8KLQkJCQlzdXBlckNhY2hlYWJsZUhvbGRlci5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpIDoKLQkJCQkoKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gcGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUeXBlTWFwcGluZyBzdXBlck1hcHBpbmcgPSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIChzdXBlck1hcHBpbmcgaW5zdGFuY2VvZiBDYWNoZWFibGVIb2xkZXIyXzApID8KLQkJCQkoQ2FjaGVhYmxlSG9sZGVyMl8wKSBzdXBlck1hcHBpbmcgOgotCQkJCXRoaXMuZ2V0Q2FjaGVhYmxlU3VwZXJQZXJzaXN0ZW50VHlwZShzdXBlclBlcnNpc3RlbnRUeXBlKTsgIC8vIHJlY3Vyc2UKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWE1MIGNhY2hlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBYTUwgY2FjaGUgZG9lcyBub3QgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBYbWxDYWNoZSBnZXRYbWxDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5nZXRDYWNoZSgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBYTUwgY2FjaGUgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFhtbENhY2hlIGdldFhtbENhY2hlRm9yVXBkYXRlKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSAhPSBudWxsKSA/IHhtbENhY2hlIDogdGhpcy5idWlsZFhtbENhY2hlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENhY2hlIGJ1aWxkWG1sQ2FjaGUoKSB7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpOwotCQl0aGlzLmdldFhtbENhY2hlSG9sZGVyKCkuc2V0Q2FjaGUoeG1sQ2FjaGUpOwotCQlyZXR1cm4geG1sQ2FjaGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2FjaGVJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxDYWNoZSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVYbWxDYWNoZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2FjaGUoKSB7Ci0JCXRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKS5zZXRDYWNoZShudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBYbWxDYWNoZWFibGVfMl8wIGdldFhtbENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIChYbWxDYWNoZWFibGVfMl8wKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENhY2hlSG9sZGVyIGdldFhtbENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gKFhtbENhY2hlSG9sZGVyKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGdldEphdmFDYWNoaW5nRm9yRGVmYXVsdHMoKSB7Ci0JCUphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBqYXZhVHlwZU1hcHBpbmcgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YVR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IGphdmFUeXBlTWFwcGluZy5nZXRDYWNoaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IHRoaXMuZ2V0WG1sQ2FjaGUoKTsKLQkJcmV0dXJuICh4bWxDYWNoZSA9PSBudWxsKSA/IG51bGwgOiB4bWxDYWNoZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDcxZDAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgc3BlY2lmaWVkVHlwZTsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZGVmYXVsdFR5cGU7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0VHlwZSh0aGlzLmJ1aWxkRGVmYXVsdFR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUeXBlIDogdGhpcy5kZWZhdWx0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkVHlwZSAhPSB0eXBlKSB7Ci0JCQlYbWxDaGFuZ2VUcmFja2luZyB4bWxDaGFuZ2VUcmFja2luZyA9IHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8odHlwZSk7Ci0JCQl4bWxDaGFuZ2VUcmFja2luZy5zZXRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh0eXBlKSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENoYW5nZVRyYWNraW5nSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlYbWxDaGFuZ2VUcmFja2luZyB4bWxDaGFuZ2VUcmFja2luZyA9IHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKTsKLQkJcmV0dXJuICh4bWxDaGFuZ2VUcmFja2luZyA9PSBudWxsKSA/IG51bGwgOiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh4bWxDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdHlwZSkgewotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRUeXBlOwotCQl0aGlzLmRlZmF1bHRUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGREZWZhdWx0VHlwZSgpIHsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBqYXZhQ2hhbmdlVHJhY2tpbmcgPSB0aGlzLmdldEphdmFDaGFuZ2VUcmFja2luZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUNoYW5nZVRyYWNraW5nICE9IG51bGwpID8gamF2YUNoYW5nZVRyYWNraW5nLmdldFR5cGUoKSA6IERFRkFVTFRfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIGN1c3RvbWl6ZXIgY2xhc3MgcmVmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBYTUwgY2hhbmdlIHRyYWNraW5nIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgWE1MIGNoYW5nZSB0cmFja2luZyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0WG1sQ2hhbmdlVHJhY2tpbmdGb3JVcGRhdGUoKSB7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpOwotCQlyZXR1cm4gKHhtbENoYW5nZVRyYWNraW5nICE9IG51bGwpID8geG1sQ2hhbmdlVHJhY2tpbmcgOiB0aGlzLmJ1aWxkWG1sQ2hhbmdlVHJhY2tpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmcgYnVpbGRYbWxDaGFuZ2VUcmFja2luZygpIHsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgeG1sQ2hhbmdlVHJhY2tpbmcgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCXRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKS5zZXRDaGFuZ2VUcmFja2luZyh4bWxDaGFuZ2VUcmFja2luZyk7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDaGFuZ2VUcmFja2luZ0lmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLmdldFhtbENoYW5nZVRyYWNraW5nKCkuaXNVbnNldCgpKSB7Ci0JCQl0aGlzLnJlbW92ZVhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDaGFuZ2VUcmFja2luZygpIHsKLQkJdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFR5cGVNYXBwaW5nIGdldFhtbFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gKFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgZ2V0SmF2YUNoYW5nZVRyYWNraW5nRm9yRGVmYXVsdHMoKSB7Ci0JCUVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGphdmFUeXBlTWFwcGluZyA9IHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhVHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogamF2YVR5cGVNYXBwaW5nLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ODY5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlCi17Ci0JcHJpdmF0ZSBmaW5hbCBYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGF0YVZhbHVlOwotCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VmFsdWU7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZShPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgcGFyZW50LCBYbWxDb252ZXJzaW9uVmFsdWUgeG1sQ29udmVyc2lvblZhbHVlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sQ29udmVyc2lvblZhbHVlID0geG1sQ29udmVyc2lvblZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IHhtbENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IHhtbENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy54bWxDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQl0aGlzLnNldE9iamVjdFZhbHVlXyh0aGlzLnhtbENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5zZXREYXRhVmFsdWVfKHZhbHVlKTsKLQkJdGhpcy54bWxDb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb2JqZWN0IHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnNldE9iamVjdFZhbHVlXyh2YWx1ZSk7Ci0JCXRoaXMueG1sQ29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ29udmVyc2lvblZhbHVlIGdldFhtbENvbnZlcnNpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVyc2lvblZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlRGF0YVZhbHVlc1VuaXF1ZShtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEYXRhVmFsdWVzVW5pcXVlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUhhc2hCYWc8U3RyaW5nPiBkYXRhVmFsdWVzID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKS5nZXREYXRhVmFsdWVzKCksIHRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpLmdldERhdGFWYWx1ZXNTaXplKCkpOwotCQlpZiAoZGF0YVZhbHVlcy5jb3VudCh0aGlzLmRhdGFWYWx1ZSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTVVMVElQTEVfT0JKRUNUX1ZBTFVFU19GT1JfREFUQV9WQUxVRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmRhdGFWYWx1ZX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0RGF0YVZhbHVlVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJzaW9uVmFsdWUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMmRmYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnQKLQlleHRlbmRzIEFic3RyYWN0T3JtQ29udmVydGVyCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnQKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q29udmVydGVyTmFtZTsKLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBjb252ZXJ0ZXI7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlcltdIENPTlZFUlRFUl9BREFQVEVSX0FSUkFZID0gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXJbXSB7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpCi0JfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXI+IENPTlZFUlRFUl9BREFQVEVSUyA9IG5ldyBBcnJheUl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXI+KENPTlZFUlRFUl9BREFQVEVSX0FSUkFZKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnQoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gdGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKS5nZXRDb252ZXJ0KCk7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkuZ2V0Q29udmVydCgpKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0Q29udmVydGVyTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdENvbnZlcnRlck5hbWUoKSk7Ci0JCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnZlcnRlci51cGRhdGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lIDogdGhpcy5kZWZhdWx0Q29udmVydGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWVfKG5hbWUpOwotCQl0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLnNldENvbnZlcnQobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ29udmVydGVyTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DT05WRVJURVJfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb252ZXJ0ZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q29udmVydGVyTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q29udmVydGVyTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q29udmVydGVyTmFtZTsKLQkJdGhpcy5kZWZhdWx0Q29udmVydGVyTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q29udmVydGVyTmFtZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ09OVkVSVEVSX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAoY29udmVydGVyVHlwZSA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhudWxsKTsKLQkJCQl0aGlzLnJlbW92ZVhtbENvbnZlcnRlcnMoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5jb252ZXJ0ZXIgPT0gbnVsbCkgfHwgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSkgewotCQkJCS8vIG5vdGU6IHdlIG1heSBhbHNvIHJlbW92ZSB0aGUgWE1MIGNvbnZlcnRlciB3ZSB3YW50OwotCQkJCS8vIGJ1dCBpZiB3ZSBsZWF2ZSBpdCwgdGhlIHJlc3VsdGluZyBzeW5jIHdpbGwgc2NyZXcgdGhpbmdzIHVwLi4uCi0JCQkJdGhpcy5yZW1vdmVYbWxDb252ZXJ0ZXJzKCk7Ci0JCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhjb252ZXJ0ZXJBZGFwdGVyLmJ1aWxkQ29udmVydGVyKHRoaXMpKTsKLQkJCQljb252ZXJ0ZXJBZGFwdGVyLmFkZFhtbENvbnZlcnRlcih0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLCB0aGlzLmNvbnZlcnRlci5nZXRYbWxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJfKE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8+IGNvbnZlcnRlcikgewotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDb252ZXJ0ZXJzKCkgewotCQlYbWxDb252ZXJ0aWJsZU1hcHBpbmcgeG1sTWFwcGluZyA9IHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCk7Ci0JCWZvciAoT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlhZGFwdGVyLnJlbW92ZVhtbENvbnZlcnRlcih4bWxNYXBwaW5nKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/PiBidWlsZENvbnZlcnRlcigpIHsKLQkJWG1sQ29udmVydGlibGVNYXBwaW5nIHhtbE1hcHBpbmcgPSB0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpOwotCQlmb3IgKE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8Pz4gb3JtQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih4bWxNYXBwaW5nLCB0aGlzKTsKLQkJCWlmIChvcm1Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBvcm1Db252ZXJ0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnRlcigpIHsKLQkJQXNzb2NpYXRpb248T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciwgWG1sTmFtZWRDb252ZXJ0ZXI+IGFzc29jID0gdGhpcy5nZXRYbWxDb252ZXJ0ZXIoKTsKLQkJaWYgKGFzc29jID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyID0gYXNzb2MuZ2V0S2V5KCk7Ci0JCQlYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSBhc3NvYy5nZXRWYWx1ZSgpOwotCQkJaWYgKCh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0WG1sQ29udmVydGVyKCkgPT0geG1sQ29udmVydGVyKSkgewotCQkJCXRoaXMuY29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIoeG1sQ29udmVydGVyLCB0aGlzKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IFhNTCBjb252ZXJ0ZXIgd2UgZmluZCBhbG9uZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0JICogYWRhcHRlci4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBjb252ZXJ0ZXJzIGluIHRoZSBYTUwuCi0JICovCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXIsIFhtbE5hbWVkQ29udmVydGVyPiBnZXRYbWxDb252ZXJ0ZXIoKSB7Ci0JCVhtbENvbnZlcnRpYmxlTWFwcGluZyB4bWxNYXBwaW5nID0gdGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKTsKLQkJZm9yIChPcm1FY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCVhtbE5hbWVkQ29udmVydGVyIHhtbENvbnZlcnRlciA9IGFkYXB0ZXIuZ2V0WG1sQ29udmVydGVyKHhtbE1hcHBpbmcpOwotCQkJaWYgKHhtbENvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxPcm1FY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyLCBYbWxOYW1lZENvbnZlcnRlcj4oYWRhcHRlciwgeG1sQ29udmVydGVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyLkFkYXB0ZXIgZ2V0Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChPcm1FY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBjb252ZXJ0ZXIgdHlwZTogIiArIGNvbnZlcnRlclR5cGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxPcm1FY2xpcHNlTGlua0NvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIENPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sQ29udmVydGlibGVNYXBwaW5nIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpIHsKLQkJLy8gY2FzdCB0byBFY2xpcHNlTGluayB0eXBlCi0JCXJldHVybiAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBzdXBlci5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVydC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNwZWNpZmllZENvbnZlcnRlck5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLnNldENvbnZlcnQodGhpcy5zcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY29udmVydGVyICE9IG51bGwpID8KLQkJCQl0aGlzLmNvbnZlcnRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSA/Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiAodGhpcy5jb252ZXJ0ZXIgIT0gbnVsbCkgPwotCQkJCXRoaXMuY29udmVydGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmICh0aGlzLmNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCXRoaXMudmFsaWRhdGVDb252ZXJ0VmFsdWUobWVzc2FnZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDb252ZXJ0VmFsdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJU3RyaW5nIGNvbnZlcnRlck5hbWUgPSB0aGlzLmdldENvbnZlcnRlck5hbWUoKTsKLQkJaWYgKGNvbnZlcnRlck5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnRlcj4gY29udmVydGVycyA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWxsQ29udmVydGVycygpOyBjb252ZXJ0ZXJzLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoY29udmVydGVyTmFtZS5lcXVhbHMoY29udmVydGVycy5uZXh0KCkuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKFJFU0VSVkVEX0NPTlZFUlRFUl9OQU1FUywgY29udmVydGVyTmFtZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9DT05WRVJURVJfTkFNRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7Y29udmVydGVyTmFtZSwgdGhpcy5nZXRQYXJlbnQoKS5nZXROYW1lKCl9LAotCQkJCQkJdGhpcy5nZXRQYXJlbnQoKSwKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkpOwkKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKS5nZXRDb252ZXJ0VGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWltcGxlbWVudHMgT3JtQ29udmVydGVyLkFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCVhtbENvbnZlcnRpYmxlTWFwcGluZyB4bWxNYXBwaW5nID0gKFhtbENvbnZlcnRpYmxlTWFwcGluZykgcGFyZW50LmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJCXJldHVybiAoeG1sTWFwcGluZy5nZXRDb252ZXJ0KCkgPT0gbnVsbCkgPyBudWxsIDogbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydChwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBY3RpdmUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJcmV0dXJuICgoWG1sQ29udmVydGlibGVNYXBwaW5nKSB4bWxNYXBwaW5nKS5nZXRDb252ZXJ0KCkgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPcm1Db252ZXJ0ZXIgYnVpbGROZXdDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydChwYXJlbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXJYbWxWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCQkoKFhtbENvbnZlcnRpYmxlTWFwcGluZykgeG1sTWFwcGluZykuc2V0Q29udmVydChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM2NjljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFggZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcj4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFggeG1sQ29udmVydGVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYIHhtbENvbnZlcnRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbENvbnZlcnRlciA9IHhtbENvbnZlcnRlcjsKLQkJdGhpcy5uYW1lID0geG1sQ29udmVydGVyLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLnhtbENvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuYWRkQ29udmVydGVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFggZ2V0WG1sQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSB0aGlzLmdldE1hcHBpbmdGaWxlUm9vdCgpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnJCc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlQ29udmVydGVyTmFtZXMobWVzc2FnZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udmVydGVyTmFtZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpewotCQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5hbWUpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksIAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9OQU1FX1VOREVGSU5FRCwgCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkJKSk7Ci0JCQl9IGVsc2UgewotCQkJCUxpc3Q8U3RyaW5nPiByZXBvcnRlZE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJZm9yIChMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdsb2JhbENvbnZlcnRlcnMgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmFsbENvbnZlcnRlcnMoKTsgZ2xvYmFsQ29udmVydGVycy5oYXNOZXh0KCk7ICkgewotCQkJCQlpZiAoIHRoaXMuZHVwbGljYXRlcyhnbG9iYWxDb252ZXJ0ZXJzLm5leHQoKSkgJiYgIXJlcG9ydGVkTmFtZXMuY29udGFpbnMobmFtZSkJKXsKLQkJCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9EVVBMSUNBVEVfTkFNRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7bmFtZX0sCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkJCQkpCi0JCQkJCQkpOwotCQkJCQkJcmVwb3J0ZWROYW1lcy5hZGQobmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXMoRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIHRoaXMgaXNuJ3QgaWRlYWwsIGJ1dCBpdCB3aWxsIGhhdmUgdG8gZG8gdW50aWwgd2UgaGF2ZSBmdXJ0aGVyIGFkb3B0ZXIgaW5wdXQKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMoY29udmVydGVyLmdldE5hbWUoKSkgJiYKLQkJCQkoY29udmVydGVyIGluc3RhbmNlb2YgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkdXBsaWNhdGVzKEVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlyZXR1cm4gKHRoaXMgIT0gY29udmVydGVyKSAmJgotCQkJCSEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLm5hbWUpICYmCi0JCQkJdGhpcy5uYW1lLmVxdWFscyhjb252ZXJ0ZXIuZ2V0TmFtZSgpKSAmJgotCQkJCSEgdGhpcy5vdmVycmlkZXMoY29udmVydGVyKSAmJgotCQkJCSEgY29udmVydGVyLm92ZXJyaWRlcyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYSBjbGllbnQgdG8gaW50ZXJhY3Qgd2l0aCB2YXJpb3VzCi0JICogRWNsaXBzZUxpbmsgPGNvZGU+b3JtLnhtbDwvY29kZT4gY29udmVydGVycyB2aWEgdGhlIHNhbWUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0eXBlIG9mIGNvbnZlcnRlciBoYW5kbGVkIGJ5IHRoZSBhZGFwdGVyLgotCQkgKi8KLQkJQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIEJ1aWxkIGEgY29udmVydGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBYTUwgY29udmVydGVyCi0JCSAqIGNvbnRhaW5lciBpZiB0aGUgY29udGFpbmVyIGhvbGRzIHRoZSBhZGFwdGVyJ3MgWE1MIGNvbnZlcnRlci4gUmV0dXJuCi0JCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkJICogVGhpcyBpcyB1c2VkIHRvIGJ1aWxkIGEgY29udmVydGVyIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgdGhlCi0JCSAqIGNvbnZlcnRlcidzIHBhcmVudC4KLQkJICovCi0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8gZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sQ29udGV4dE5vZGUgcGFyZW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgWE1MIGNvbnZlcnRlciBmb3IgdGhlIHNwZWNpZmllZCBYTUwgY29udmVydGVyCi0JCSAqIGNvbnRhaW5lci4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250YWluZXIgZG9lcyBub3QgaG9sZAotCQkgKiB0aGUgYWRhcHRlcidzIFhNTCBjb252ZXJ0ZXIuCi0JCSAqIFRoZSByZXR1cm5lZCBYTUwgY29udmVydGVyIGlzIGNvbXBhcmVkIHRvIHRoZSBwYXJlbnQncwotCQkgKiBjb252ZXJ0ZXIncyBYTUwgY29udmVydGVyIHdoaWxlIHRoZSBjb250ZXh0IG1vZGVsIGlzIHN5bmNocm9uaXplZAotCQkgKiB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbC4gSWYgaXQgaGFzIGNoYW5nZWQsIHRoZSBwYXJlbnQgd2lsbCBidWlsZAotCQkgKiBhIG5ldyBjb252ZXJ0ZXIgKHZpYSB0aGUgYWRhcHRlcikuCi0JCSAqIAotCQkgKiBAc2VlICNidWlsZENvbnZlcnRlcihYbWxOYW1lZENvbnZlcnRlciwgWG1sQ29udGV4dE5vZGUpCi0JCSAqLwotCQlYbWxOYW1lZENvbnZlcnRlciBnZXRYbWxDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lcik7Ci0KLQkJLyoqCi0JCSAqIEJ1aWxkIGEgY29udmVydGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgWE1MIGNvbnZlcnRlci4KLQkJICogVGhpcyBpcyB1c2VkIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaXMgc3luY2hyb25pemVkIHdpdGggdGhlCi0JCSAqIHJlc291cmNlIG1vZGVsIChhbmQgdGhlIHJlc291cmNlIG1vZGVsIGhhcyBjaGFuZ2VkKS4KLQkJICogCi0JCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIpCi0JCSAqLwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVyKFhtbE5hbWVkQ29udmVydGVyIHhtbENvbnZlcnRlciwgWG1sQ29udGV4dE5vZGUgcGFyZW50KTsKLQotCQkvKioKLQkJICogQnVpbGQgYSBuZXcgY29udmVydGVyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBYTUwgY29udmVydGVyLgotCQkgKiBUaGUgWE1MIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBYTUwgY29udmVydGVyIGNvbnRhaW5lciBvbmNlCi0JCSAqIHRoZSBjb250ZXh0IGNvbnZlcnRlciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbC4KLQkJICogCi0JCSAqIEBzZWUgI2FkZFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIsIFhtbE5hbWVkQ29udmVydGVyKQotCQkgKi8KLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8PyBleHRlbmRzIFhtbE5hbWVkQ29udmVydGVyPiBidWlsZENvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIGFkYXB0ZXIncyBYTUwgY29udmVydGVyIGZyb20gdGhlIHNwZWNpZmllZCBYTUwgY29udmVydGVyCi0JCSAqIGNvbnRhaW5lci4KLQkJICovCi0JCXZvaWQgcmVtb3ZlWG1sQ29udmVydGVyKFhtbENvbnZlcnRlckhvbGRlciB4bWxDb252ZXJ0ZXJDb250YWluZXIpOwotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBYTUwgY29udmVydGVyIHRvIHRoZSBzcGVjaWZpZWQgWE1MIGNvbnZlcnRlcgotCQkgKiBjb250YWluZXIuCi0JCSAqLwotCQl2b2lkIGFkZFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIgeG1sQ29udmVydGVyQ29udGFpbmVyLCBYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RBZGFwdGVyCi0JCWltcGxlbWVudHMgQWRhcHRlcgotCXsKLQkJcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPD8gZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSB0aGlzLmdldFhtbENvbnZlcnRlcih4bWxDb252ZXJ0ZXJDb250YWluZXIpOwotCQkJcmV0dXJuICh4bWxDb252ZXJ0ZXIgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbnZlcnRlcih4bWxDb252ZXJ0ZXIsIHBhcmVudCk7Ci0JCX0KLQotCQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8PyBleHRlbmRzIFhtbE5hbWVkQ29udmVydGVyPiBidWlsZENvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQ29udmVydGVyKHRoaXMuYnVpbGRYbWxDb252ZXJ0ZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBYbWxOYW1lZENvbnZlcnRlciBidWlsZFhtbENvbnZlcnRlcigpOwotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIgeG1sQ29udmVydGVyQ29udGFpbmVyKSB7Ci0JCQl0aGlzLnNldFhtbENvbnZlcnRlcih4bWxDb252ZXJ0ZXJDb250YWluZXIsIG51bGwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkWG1sQ29udmVydGVyKFhtbENvbnZlcnRlckhvbGRlciB4bWxDb252ZXJ0ZXJDb250YWluZXIsIFhtbE5hbWVkQ29udmVydGVyIHhtbENvbnZlcnRlcikgewotCQkJdGhpcy5zZXRYbWxDb252ZXJ0ZXIoeG1sQ29udmVydGVyQ29udGFpbmVyLCB4bWxDb252ZXJ0ZXIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0WG1sQ29udmVydGVyKFhtbENvbnZlcnRlckhvbGRlciB4bWxDb252ZXJ0ZXJDb250YWluZXIsIFhtbE5hbWVkQ29udmVydGVyIHhtbENvbnZlcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDbGFzc0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JiZTIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyPFggZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcj4KLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFg+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRlckNsYXNzOwotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGNvbnZlcnRlclBlcnNpc3RlbnRUeXBlOwotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNsYXNzQ29udmVydGVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWCB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgbmV3Q29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZENvbnZlcnRlckNsYXNzID0gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IG5ld0NvbnZlcnRlckNsYXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkQ29udmVydGVyQ2xhc3MsIG5ld0NvbnZlcnRlckNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKHRoaXMuY29udmVydGVyQ2xhc3MpOwotCX0KLQotCS8vICoqKioqKioqKioqKioqKiogcmVzb3VyY2UgaW50ZXJhY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSgpIHsKLQkJdGhpcy5jb252ZXJ0ZXJQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdmFsaWRhdGVDb252ZXJ0ZXJDbGFzcyhtZXNzYWdlcyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29udmVydGVyQ2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNvbnZlcnRlckNsYXNzKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfREVGSU5FRCwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7CQkJCi0JCX0KLQkJZWxzZSBpZiAoIWNvbnZlcnRlckNsYXNzRXhpc3RzKGphdmFQcm9qZWN0KSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5DT05WRVJURVJfQ0xBU1NfRVhJU1RTLAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuY29udmVydGVyQ2xhc3N9LAotCQkJCQl0aGlzLAotCQkJCQlnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsJCQkKLQkJfSAKLQkJZWxzZSBpZiAoIWNvbnZlcnRlckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShqYXZhUHJvamVjdCwgRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTlZFUlRFUl9DTEFTU19JTVBMRU1FTlRTX0NPTlZFUlRFUiwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmNvbnZlcnRlckNsYXNzfSwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7CQkJCi0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRlckNsYXNzRXhpc3RzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAoSkRUVG9vbHMuZmluZFR5cGUoamF2YVByb2plY3QsIHRoaXMuY29udmVydGVyQ2xhc3MpICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJU3RyaW5nIGdsb2JhbFBhY2thZ2UgPSB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnbG9iYWxQYWNrYWdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBKRFRUb29scy5maW5kVHlwZShqYXZhUHJvamVjdCwgZ2xvYmFsUGFja2FnZSArICcuJyArIHRoaXMuY29udmVydGVyQ2xhc3MpICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnRlckNsYXNzSW1wbGVtZW50c0ludGVyZmFjZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBpbnRlcmZhY2VOYW1lKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlckNsYXNzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoSkRUVG9vbHMudHlwZU5hbWVkSW1wbGVtZW50c0ludGVyZmFjZU5hbWVkKGphdmFQcm9qZWN0LCB0aGlzLmNvbnZlcnRlckNsYXNzLCBpbnRlcmZhY2VOYW1lKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIGdsb2JhbFBhY2thZ2UgPSB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnbG9iYWxQYWNrYWdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBKRFRUb29scy50eXBlTmFtZWRJbXBsZW1lbnRzSW50ZXJmYWNlTmFtZWQoamF2YVByb2plY3QsIGdsb2JhbFBhY2thZ2UgKyAnLicgKyB0aGlzLmNvbnZlcnRlckNsYXNzLCBpbnRlcmZhY2VOYW1lKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpOwotCQotCS8vKioqKioqKioqKioqKioqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKTsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGNvbnZlcnRlclR5cGUgPSB0aGlzLmdldENvbnZlcnRlckphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXJldHVybiAoY29udmVydGVyVHlwZSAhPSBudWxsKSAmJiBjb252ZXJ0ZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgY29udmVydGVyVHlwZSA9IHRoaXMuZ2V0Q29udmVydGVySmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChjb252ZXJ0ZXJUeXBlICE9IG51bGwpICYmIGNvbnZlcnRlclR5cGUuaXNJbihwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTEwNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRDb250YWluZXJUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBYbWxDb252ZXJ0ZXJzSG9sZGVyIHhtbENvbnZlcnRlcnNIb2xkZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBjdXN0b21Db252ZXJ0ZXJzID0gbmV3IFZlY3RvcjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4oKTsKLQlwcm90ZWN0ZWQgZmluYWwgQ3VzdG9tQ29udmVydGVyQ29udGFpbmVyQWRhcHRlciBjdXN0b21Db252ZXJ0ZXJDb250YWluZXJBZGFwdGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IFZlY3RvcjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KCk7Ci0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyIG9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVycyA9IG5ldyBWZWN0b3I8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KCk7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cnVjdENvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIgc3RydWN0Q29udmVydGVyQ29udGFpbmVyQWRhcHRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVycyA9IG5ldyBWZWN0b3I8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPigpOwotCXByb3RlY3RlZCBmaW5hbCBUeXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlciB0eXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlcjsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbChYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbENvbnZlcnRlcnNIb2xkZXIgeG1sQ29udmVydGVyc0hvbGRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIgPSB4bWxDb252ZXJ0ZXJzSG9sZGVyOwotCi0JCXRoaXMuY3VzdG9tQ29udmVydGVyQ29udGFpbmVyQWRhcHRlciA9IHRoaXMuYnVpbGRDdXN0b21Db252ZXJ0ZXJDb250YWluZXJBZGFwdGVyKCk7Ci0JCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIgPSB0aGlzLmJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyID0gdGhpcy5idWlsZFN0cnVjdENvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIoKTsKLQkJdGhpcy50eXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlcigpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5pbml0aWFsaXplT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJdGhpcy5pbml0aWFsaXplU3RydWN0Q29udmVydGVycygpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlQ29udmVydGVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCXRoaXMuc3luY09iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCXRoaXMuc3luY1N0cnVjdENvbnZlcnRlcnMoKTsKLQkJdGhpcy5zeW5jVHlwZUNvbnZlcnRlcnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0Q3VzdG9tQ29udmVydGVycygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0U3RydWN0Q29udmVydGVycygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFR5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gY29udmVydGVycyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBjdXN0b21Db252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBnZXRDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4odGhpcy5jdXN0b21Db252ZXJ0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGN1c3RvbUNvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21Db252ZXJ0ZXJzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5hZGRDdXN0b21Db252ZXJ0ZXIodGhpcy5jdXN0b21Db252ZXJ0ZXJzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGFkZEN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJWG1sQ29udmVydGVyIHhtbENvbnZlcnRlciA9IHRoaXMuYnVpbGRYbWxDdXN0b21Db252ZXJ0ZXIoKTsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5hZGRDdXN0b21Db252ZXJ0ZXJfKGluZGV4LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIuZ2V0Q29udmVydGVycygpLmFkZChpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGJ1aWxkWG1sQ3VzdG9tQ29udmVydGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXIoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMucmVtb3ZlQ3VzdG9tQ29udmVydGVyKHRoaXMuY3VzdG9tQ29udmVydGVycy5pbmRleE9mKGNvbnZlcnRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcihpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVDdXN0b21Db252ZXJ0ZXJfKGluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJzSG9sZGVyLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUN1c3RvbUNvbnZlcnRlcl8oaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmN1c3RvbUNvbnZlcnRlcnMsIENVU1RPTV9DT05WRVJURVJTX0xJU1QpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuY3VzdG9tQ29udmVydGVycywgQ1VTVE9NX0NPTlZFUlRFUlNfTElTVCk7Ci0JCXRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRDb252ZXJ0ZXJzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgOiB0aGlzLmdldFhtbEN1c3RvbUNvbnZlcnRlcnMoKSkgewotCQkJdGhpcy5jdXN0b21Db252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tQ29udmVydGVyKHhtbENvbnZlcnRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGJ1aWxkQ3VzdG9tQ29udmVydGVyKFhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcih0aGlzLCB4bWxDb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDdXN0b21Db252ZXJ0ZXJzKCkgewotCQlDb250ZXh0Q29udGFpbmVyVG9vbHMuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCh0aGlzLmN1c3RvbUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxYbWxDb252ZXJ0ZXI+IGdldFhtbEN1c3RvbUNvbnZlcnRlcnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxYbWxDb252ZXJ0ZXI+KHRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRDb252ZXJ0ZXJzKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVDdXN0b21Db252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5jdXN0b21Db252ZXJ0ZXJzLCBDVVNUT01fQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYWRkQ3VzdG9tQ29udmVydGVyXyhpbnQgaW5kZXgsIFhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5idWlsZEN1c3RvbUNvbnZlcnRlcih4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5jdXN0b21Db252ZXJ0ZXJzLCBDVVNUT01fQ09OVkVSVEVSU19MSVNUKTsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDdXN0b21Db252ZXJ0ZXJfKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLnJlbW92ZUN1c3RvbUNvbnZlcnRlcl8odGhpcy5jdXN0b21Db252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIgYnVpbGRDdXN0b21Db252ZXJ0ZXJDb250YWluZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBjdXN0b20gY29udmVydGVyIGNvbnRhaW5lciBhZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEN1c3RvbUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBDb250ZXh0Q29udGFpbmVyVG9vbHMuQWRhcHRlcjxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgWG1sQ29udmVydGVyPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuZ2V0Q3VzdG9tQ29udmVydGVycygpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxYbWxDb252ZXJ0ZXI+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuZ2V0WG1sQ3VzdG9tQ29udmVydGVycygpOwotCQl9Ci0JCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgZWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMubW92ZUN1c3RvbUNvbnZlcnRlcl8oaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENvbnRleHRFbGVtZW50KGludCBpbmRleCwgWG1sQ29udmVydGVyIHJlc291cmNlRWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYWRkQ3VzdG9tQ29udmVydGVyXyhpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBlbGVtZW50KSB7Ci0JCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5yZW1vdmVDdXN0b21Db252ZXJ0ZXJfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9iamVjdCB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgb2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlQ29udmVydGVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBhZGRPYmplY3RUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5hZGRPYmplY3RUeXBlQ29udmVydGVyKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyID0gdGhpcy5idWlsZFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcl8oaW5kZXgsIHhtbENvbnZlcnRlcik7Ci0JCXRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKGluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJzSG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPYmplY3RUeXBlQ29udmVydGVyXyhpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMsIE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMsIE9CSkVDVF9UWVBFX0NPTlZFUlRFUlNfTElTVCk7Ci0JCXRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCWZvciAoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIgOiB0aGlzLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCXRoaXMub2JqZWN0VHlwZUNvbnZlcnRlcnMuYWRkKHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHhtbENvbnZlcnRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIodGhpcywgeG1sQ29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVycygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KHRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIGNvbnZlcnRlciwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVycywgT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGFkZE9iamVjdFR5cGVDb252ZXJ0ZXJfKGludCBpbmRleCwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRPYmplY3RUeXBlQ29udmVydGVyKHhtbENvbnZlcnRlcik7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVydGVyLCB0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLCBPQkpFQ1RfVFlQRV9DT05WRVJURVJTX0xJU1QpOwotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyXyh0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJzLmluZGV4T2YoY29udmVydGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdFR5cGVDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBvYmplY3QgdHlwZSBjb252ZXJ0ZXIgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgT2JqZWN0VHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBDb250ZXh0Q29udGFpbmVyVG9vbHMuQWRhcHRlcjxPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmFibGU8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVycygpOwotCQl9Ci0JCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldFJlc291cmNlRWxlbWVudChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxDb252ZXJ0ZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJfKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lckltcGwudGhpcy5hZGRPYmplY3RUeXBlQ29udmVydGVyXyhpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgZWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcl8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RydWN0IGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVycygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KHRoaXMuc3RydWN0Q29udmVydGVycyk7Ci0JfQotCi0JcHVibGljIGludCBzdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RydWN0Q29udmVydGVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3RydWN0Q29udmVydGVyKHRoaXMuc3RydWN0Q29udmVydGVycy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBhZGRTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciB4bWxDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYWRkU3RydWN0Q29udmVydGVyXyhpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJzSG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoaW5kZXgsIHhtbENvbnZlcnRlcik7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBidWlsZFhtbFN0cnVjdENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLnJlbW92ZVN0cnVjdENvbnZlcnRlcih0aGlzLnN0cnVjdENvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlU3RydWN0Q29udmVydGVyXyhpbmRleCk7Ci0JCXRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5zdHJ1Y3RDb252ZXJ0ZXJzLCBTVFJVQ1RfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3RydWN0Q29udmVydGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnN0cnVjdENvbnZlcnRlcnMsIFNUUlVDVF9DT05WRVJURVJTX0xJU1QpOwotCQl0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU3RydWN0Q29udmVydGVycygpIHsKLQkJZm9yIChYbWxTdHJ1Y3RDb252ZXJ0ZXIgeG1sQ29udmVydGVyIDogdGhpcy5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJzKCkpIHsKLQkJCXRoaXMuc3RydWN0Q29udmVydGVycy5hZGQodGhpcy5idWlsZFN0cnVjdENvbnZlcnRlcih4bWxDb252ZXJ0ZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIodGhpcywgeG1sQ29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3RydWN0Q29udmVydGVycygpIHsKLQkJQ29udGV4dENvbnRhaW5lclRvb2xzLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8WG1sU3RydWN0Q29udmVydGVyPiBnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8WG1sU3RydWN0Q29udmVydGVyPih0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlU3RydWN0Q29udmVydGVyXyhpbnQgaW5kZXgsIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCBjb252ZXJ0ZXIsIHRoaXMuc3RydWN0Q29udmVydGVycywgU1RSVUNUX0NPTlZFUlRFUlNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGFkZFN0cnVjdENvbnZlcnRlcl8oaW50IGluZGV4LCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRTdHJ1Y3RDb252ZXJ0ZXIoeG1sQ29udmVydGVyKTsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBjb252ZXJ0ZXIsIHRoaXMuc3RydWN0Q29udmVydGVycywgU1RSVUNUX0NPTlZFUlRFUlNfTElTVCk7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RydWN0Q29udmVydGVyXyhPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKHRoaXMuc3RydWN0Q29udmVydGVycy5pbmRleE9mKGNvbnZlcnRlcikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyIGJ1aWxkU3RydWN0Q29udmVydGVyQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogc3RydWN0IGNvbnZlcnRlciBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTdHJ1Y3RDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgQ29udGV4dENvbnRhaW5lclRvb2xzLkFkYXB0ZXI8T3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIFhtbFN0cnVjdENvbnZlcnRlcj4KLQl7Ci0JCXB1YmxpYyBJdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmdldFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmFibGU8WG1sU3RydWN0Q29udmVydGVyPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmdldFhtbFN0cnVjdENvbnZlcnRlcnMoKTsKLQkJfQotCQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFJlc291cmNlRWxlbWVudChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbnZlcnRlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGVsZW1lbnQpIHsKLQkJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLm1vdmVTdHJ1Y3RDb252ZXJ0ZXJfKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmFkZFN0cnVjdENvbnZlcnRlcl8oaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgZWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMucmVtb3ZlU3RydWN0Q29udmVydGVyXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIGNvbnZlcnRlcnMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYXRvcjxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMudHlwZUNvbnZlcnRlcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgdHlwZUNvbnZlcnRlcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy50eXBlQ29udmVydGVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBhZGRUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5hZGRUeXBlQ29udmVydGVyKHRoaXMudHlwZUNvbnZlcnRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyID0gdGhpcy5idWlsZFhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYWRkVHlwZUNvbnZlcnRlcl8oaW5kZXgsIHhtbENvbnZlcnRlcik7Ci0JCXRoaXMueG1sQ29udmVydGVyc0hvbGRlci5nZXRUeXBlQ29udmVydGVycygpLmFkZChpbmRleCwgeG1sQ29udmVydGVyKTsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciBidWlsZFhtbFR5cGVDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJdGhpcy5yZW1vdmVUeXBlQ29udmVydGVyKHRoaXMudHlwZUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZVR5cGVDb252ZXJ0ZXJfKGluZGV4KTsKLQkJdGhpcy54bWxDb252ZXJ0ZXJzSG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlQ29udmVydGVyXyhpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudHlwZUNvbnZlcnRlcnMsIFRZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVHlwZUNvbnZlcnRlcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy50eXBlQ29udmVydGVycywgVFlQRV9DT05WRVJURVJTX0xJU1QpOwotCQl0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb252ZXJ0ZXJzKCkgewotCQlmb3IgKFhtbFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyIDogdGhpcy5nZXRYbWxUeXBlQ29udmVydGVycygpKSB7Ci0JCQl0aGlzLnR5cGVDb252ZXJ0ZXJzLmFkZCh0aGlzLmJ1aWxkVHlwZUNvbnZlcnRlcih4bWxDb252ZXJ0ZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgYnVpbGRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKHRoaXMsIHhtbENvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1R5cGVDb252ZXJ0ZXJzKCkgewotCQlDb250ZXh0Q29udGFpbmVyVG9vbHMuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCh0aGlzLnR5cGVDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0WG1sVHlwZUNvbnZlcnRlcnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxYbWxUeXBlQ29udmVydGVyPih0aGlzLnhtbENvbnZlcnRlcnNIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVR5cGVDb252ZXJ0ZXJfKGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCBjb252ZXJ0ZXIsIHRoaXMudHlwZUNvbnZlcnRlcnMsIFRZUEVfQ09OVkVSVEVSU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGFkZFR5cGVDb252ZXJ0ZXJfKGludCBpbmRleCwgWG1sVHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuYnVpbGRUeXBlQ29udmVydGVyKHhtbENvbnZlcnRlcik7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVydGVyLCB0aGlzLnR5cGVDb252ZXJ0ZXJzLCBUWVBFX0NPTlZFUlRFUlNfTElTVCk7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVHlwZUNvbnZlcnRlcl8oT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlcikgewotCQl0aGlzLnJlbW92ZVR5cGVDb252ZXJ0ZXJfKHRoaXMudHlwZUNvbnZlcnRlcnMuaW5kZXhPZihjb252ZXJ0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZUNvbnZlcnRlckNvbnRhaW5lckFkYXB0ZXIgYnVpbGRUeXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUeXBlQ29udmVydGVyQ29udGFpbmVyQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIHR5cGUgY29udmVydGVyIGNvbnRhaW5lciBhZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFR5cGVDb252ZXJ0ZXJDb250YWluZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgQ29udGV4dENvbnRhaW5lclRvb2xzLkFkYXB0ZXI8T3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBYbWxUeXBlQ29udmVydGVyPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLmdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFhtbFR5cGVDb252ZXJ0ZXI+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuZ2V0WG1sVHlwZUNvbnZlcnRlcnMoKTsKLQkJfQotCQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVydGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGVsZW1lbnQpIHsKLQkJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLm1vdmVUeXBlQ29udmVydGVyXyhpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBYbWxUeXBlQ29udmVydGVyIHJlc291cmNlRWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsLnRoaXMuYWRkVHlwZUNvbnZlcnRlcl8oaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGVsZW1lbnQpIHsKLQkJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbC50aGlzLnJlbW92ZVR5cGVDb252ZXJ0ZXJfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQl0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJdGhpcy5jcmVhdGVSZW5hbWVUeXBlQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlUmVuYW1lU3RydWN0Q29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlUmVuYW1lQ3VzdG9tQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRPYmplY3RUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiB0eXBlQ29udmVydGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVN0cnVjdENvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVDdXN0b21Db252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oZ2V0Q3VzdG9tQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY3VzdG9tQ29udmVydGVyKSB7Ci0JCQkJCXJldHVybiBjdXN0b21Db252ZXJ0ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlTW92ZU9iamVjdFR5cGVDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVNb3ZlVHlwZUNvbnZlcnRlckVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZU1vdmVTdHJ1Y3RDb252ZXJ0ZXJFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJdGhpcy5jcmVhdGVNb3ZlQ3VzdG9tQ29udmVydGVyRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlT2JqZWN0VHlwZUNvbnZlcnRlckVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVTdHJ1Y3RDb252ZXJ0ZXJFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFN0cnVjdENvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlQ3VzdG9tQ29udmVydGVyRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRDdXN0b21Db252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b21Db252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIGN1c3RvbUNvbnZlcnRlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVPYmplY3RUeXBlQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVR5cGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCXRoaXMuY3JlYXRlU3RydWN0Q29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZUN1c3RvbUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJSZW5hbWVQYWNrYWdlRWRpdHMoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVUeXBlQ29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRUeXBlQ29udmVydGVycygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlU3RydWN0Q29udmVydGVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFN0cnVjdENvbnZlcnRlcnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcikgewotCQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbUNvbnZlcnRlclJlbmFtZVBhY2thZ2VFZGl0cyhmaW5hbCBJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRDdXN0b21Db252ZXJ0ZXJzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjdXN0b21Db252ZXJ0ZXIpIHsKLQkJCQkJcmV0dXJuIGN1c3RvbUNvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl2YWxpZGF0ZUN1c3RvbUNvbnZlcnRlcnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdmFsaWRhdGVPYmplY3RUeXBlQ29udmVydGVycyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl2YWxpZGF0ZVN0cnVjdENvbnZlcnRlcnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdmFsaWRhdGVUeXBlQ29udmVydGVycyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVDdXN0b21Db252ZXJ0ZXJzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgOiB0aGlzLmdldEN1c3RvbUNvbnZlcnRlcnMoKSkgewotCQkJY29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVPYmplY3RUeXBlQ29udmVydGVycyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA6IHRoaXMuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkgewotCQkJY29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3RydWN0Q29udmVydGVycyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyIDogdGhpcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkpIHsKLQkJCWNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVHlwZUNvbnZlcnRlcnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlmb3IgKE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgOiB0aGlzLmdldFR5cGVDb252ZXJ0ZXJzKCkpIHsKLQkJCWNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXJzSG9sZGVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyZWI5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXI8WG1sQ29udmVydGVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIKLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0geG1sQ29udmVydGVyLmdldENsYXNzTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyh0aGlzLnhtbENvbnZlcnRlci5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18oY29udmVydGVyQ2xhc3MpOwotCQl0aGlzLnhtbENvbnZlcnRlci5zZXRDbGFzc05hbWUoY29udmVydGVyQ2xhc3MpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0WG1sQ29udmVydGVyKFhtbENvbnZlcnRlckhvbGRlciB4bWxDb252ZXJ0ZXJDb250YWluZXIpIHsKLQkJCXJldHVybiB4bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0Q29udmVydGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoWG1sTmFtZWRDb252ZXJ0ZXIgeG1sQ29udmVydGVyLCBYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIocGFyZW50LCAoWG1sQ29udmVydGVyKSB4bWxDb252ZXJ0ZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgYnVpbGRYbWxDb252ZXJ0ZXIoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRYbWxDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sTmFtZWRDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCQl4bWxDb252ZXJ0ZXJDb250YWluZXIuc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpIHhtbENvbnZlcnRlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJiYzIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDdXN0b21pemVyQ2xhc3M7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIoRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzXyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcyh0aGlzLmJ1aWxkRGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9taXplciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzIDogdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDdXN0b21pemVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzLCBjdXN0b21pemVyQ2xhc3MpKSB7Ci0JCQlYbWxDbGFzc1JlZmVyZW5jZSB4bWxDbGFzc1JlZiA9IHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzc18oY3VzdG9taXplckNsYXNzKTsKLQkJCXhtbENsYXNzUmVmLnNldENsYXNzTmFtZShjdXN0b21pemVyQ2xhc3MpOwotCQkJdGhpcy5yZW1vdmVYbWxDdXN0b21pemVyQ2xhc3NSZWZJZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3NfKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ3VzdG9taXplckNsYXNzOwotCQl0aGlzLnNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyA9IGN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGN1c3RvbWl6ZXJDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sQ2xhc3NSZWYgPSB0aGlzLmdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpOwotCQlyZXR1cm4gKHhtbENsYXNzUmVmID09IG51bGwpID8gbnVsbCA6IHhtbENsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEN1c3RvbWl6ZXJDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKFN0cmluZyBjdXN0b21pemVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdEN1c3RvbWl6ZXJDbGFzczsKLQkJdGhpcy5kZWZhdWx0Q3VzdG9taXplckNsYXNzID0gY3VzdG9taXplckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DVVNUT01JWkVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIGN1c3RvbWl6ZXJDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSB7Ci0JCUphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgamF2YUN1c3RvbWl6ZXIgPSB0aGlzLmdldEphdmFDdXN0b21pemVyRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhQ3VzdG9taXplciA9PSBudWxsKSA/IG51bGwgOiBqYXZhQ3VzdG9taXplci5nZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB4bWwgY3VzdG9taXplciBjbGFzcyByZWYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIFhNTCBjbGFzcyByZWYgZG9lcyBub3QgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBnZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKS5nZXRDdXN0b21pemVyKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCBjbGFzcyByZWYgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZkZvclVwZGF0ZSgpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sQ2xhc3NSZWYgPSB0aGlzLmdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpOwotCQlyZXR1cm4gKHhtbENsYXNzUmVmICE9IG51bGwpID8geG1sQ2xhc3NSZWYgOiB0aGlzLmJ1aWxkWG1sQ3VzdG9taXplckNsYXNzUmVmKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGJ1aWxkWG1sQ3VzdG9taXplckNsYXNzUmVmKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSByZWYgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpOwotCQl0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKS5zZXRDdXN0b21pemVyKHJlZik7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ3VzdG9taXplckNsYXNzUmVmSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCkuaXNVbnNldCgpKSB7Ci0JCQl0aGlzLnJlbW92ZVhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ3VzdG9taXplckNsYXNzUmVmKCkgewotCQl0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKS5zZXRDdXN0b21pemVyKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRSZXNvdXJjZUN1c3RvbWl6ZXJQZXJzaXN0ZW50VHlwZSgpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgY3VzdG9taXplckNsYXNzUmVmID0gdGhpcy5nZXRYbWxDdXN0b21pemVyQ2xhc3NSZWYoKTsKLQkJaWYgKGN1c3RvbWl6ZXJDbGFzc1JlZiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBjbGFzc05hbWUgPSBjdXN0b21pemVyQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFR5cGVNYXBwaW5nIGdldFhtbFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEN1c3RvbWl6ZXJIb2xkZXIgZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpIHsKLQkJcmV0dXJuIChYbWxDdXN0b21pemVySG9sZGVyKSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0SmF2YUN1c3RvbWl6ZXJGb3JEZWZhdWx0cygpIHsKLQkJRWNsaXBzZUxpbmtKYXZhVHlwZU1hcHBpbmcgamF2YVR5cGVNYXBwaW5nID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFUeXBlTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiAoSmF2YUVjbGlwc2VMaW5rQ3VzdG9taXplcikgamF2YVR5cGVNYXBwaW5nLmdldEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBjdXN0b21pemVyVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDdXN0b21pemVyUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChjdXN0b21pemVyVHlwZSAhPSBudWxsKSAmJiBjdXN0b21pemVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBjdXN0b21pemVyVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDdXN0b21pemVyUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChjdXN0b21pemVyVHlwZSAhPSBudWxsKSAmJiBjdXN0b21pemVyVHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q3VzdG9taXplckNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEN1c3RvbWl6ZXJDbGFzc1JlZigpLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSB4bWxDbGFzc1JlZiA9IHRoaXMuZ2V0WG1sQ3VzdG9taXplckNsYXNzUmVmKCk7Ci0JCXJldHVybiAoeG1sQ2xhc3NSZWYgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWRhZDY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVtYmVkZGFibGU8WG1sRW1iZWRkYWJsZT4KLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUltcGwoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHhtbEVtYmVkZGFibGUpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxFbWJlZGRhYmxlKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNoYW5nZVRyYWNraW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jdXN0b21pemVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBnZXRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRDb252ZXJ0ZXJDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXJJbXBsKHRoaXMsIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSB0cmFja2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIHRoaXMuY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRDaGFuZ2VUcmFja2luZygpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b21pemVyICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgZ2V0SmF2YVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIHN1cGVyLmdldEphdmFUeXBlTWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIHN1cGVyLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1ByaW1hcnlLZXlDb2x1bW5zKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmN1c3RvbWl6ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKHRoaXMsIGdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NDJlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGluawotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXR5IHR5cGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUVudGl0eTxYbWxFbnRpdHk+Ci0JaW1wbGVtZW50cyBPcm1FY2xpcHNlTGlua0VudGl0eQotewotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY2hhbmdlVHJhY2tpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmc7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgY29udmVydGVyQ29udGFpbmVyOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbnRpdHlJbXBsKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW50aXR5IHhtbEVudGl0eSkgewotCQlzdXBlcihwYXJlbnQsIHhtbEVudGl0eSk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMucmVhZE9ubHkgPSB0aGlzLmJ1aWxkUmVhZE9ubHkoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWFkT25seS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkQ2FjaGluZygpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkIG9ubHkgKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCB0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHRyYWNraW5nICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIHN1cGVyLmdldEphdmFUeXBlTWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleSgpICE9IG51bGwpCi0JCQkJfHwgdGhpcy51c2VzSmF2YVByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0phdmFQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUVudGl0eSAhPSBudWxsKSAmJiBqYXZhRW50aXR5LnVzZXNQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpICYmICEgdGhpcy5jbGFzc0V4dHJhY3RvcklzVXNlZCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzRXh0cmFjdG9ySXNVc2VkKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0WG1sQ2xhc3NFeHRyYWN0b3IoKSAhPSBudWxsKSB8fCAodGhpcy5nZXRDbGFzc0V4dHJhY3RvckFubm90YXRpb24oKSAhPSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0WG1sQ2xhc3NFeHRyYWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0Q2xhc3NFeHRyYWN0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEgZ2V0Q2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uKCkgewotCQlpZiAodGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpICE9IG51bGwpIHsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKTsKLQkJCXJldHVybiAoRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEpIGpycHQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5BTk5PVEFUSU9OX05BTUUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYWNoZWFibGVIb2xkZXIoKS5nZXRDYWNoZWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYWNoZWFibGVIb2xkZXIoKS5jYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhY2hlYWJsZUhvbGRlcjJfMCBnZXRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiAoT3JtQ2FjaGVhYmxlSG9sZGVyMl8wKSB0aGlzLmNhY2hpbmc7Ci0JfQotCi0JcHVibGljIFhtbENhY2hlYWJsZV8yXzAgZ2V0WG1sQ2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIGNsYXNzRXh0cmFjdG9yQ2xhc3NSZWYgPSB0aGlzLmdldFhtbENsYXNzRXh0cmFjdG9yKCk7Ci0JCWlmIChjbGFzc0V4dHJhY3RvckNsYXNzUmVmID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNsYXNzRXh0cmFjdG9yQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzRXh0cmFjdG9ySXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGNsYXNzRXh0cmFjdG9yVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VDbGFzc0V4dHJhY3RvclBlcnNpc3RlbnRUeXBlKCk7Ci0JCXJldHVybiAoY2xhc3NFeHRyYWN0b3JUeXBlICE9IG51bGwpICYmIGNsYXNzRXh0cmFjdG9yVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc0V4dHJhY3RvcklzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgY2xhc3NFeHRyYWN0b3JUeXBlID0gdGhpcy5nZXRSZXNvdXJjZUNsYXNzRXh0cmFjdG9yUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChjbGFzc0V4dHJhY3RvclR5cGUgIT0gbnVsbCkgJiYgY2xhc3NFeHRyYWN0b3JUeXBlLmlzSW4ocGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIGdldE1hcHBpbmdGaWxlUm9vdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDbGFzc0V4dHJhY3RvclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDbGFzc0V4dHJhY3RvclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzRXh0cmFjdG9ySXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5nZXRYbWxDbGFzc0V4dHJhY3RvcigpLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVDbGFzc0V4dHJhY3Rvck1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXIuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ2xhc3NFeHRyYWN0b3JNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzRXh0cmFjdG9ySXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5nZXRYbWxDbGFzc0V4dHJhY3RvcigpLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUNvbnZlcnRlckhvbGRlclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlQ2xhc3NFeHRyYWN0b3JSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNsYXNzRXh0cmFjdG9yUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jbGFzc0V4dHJhY3RvcklzSW4ob3JpZ2luYWxQYWNrYWdlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5nZXRYbWxDbGFzc0V4dHJhY3RvcigpLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yKHRoaXMsIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFR5cGVNYXBwaW5nVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcywgZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNDA3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUlkTWFwcGluZzxYbWxJZD4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSWRNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlOwotCQotCQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sSWQgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgT3JtRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tdXRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm11dGFibGUudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG11dGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rTXV0YWJsZSBnZXRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5tdXRhYmxlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogcHV0IHRoZSBFY2xpcHNlTGluayBjb252ZXJ0IGFkYXB0ZXIgZmlyc3QgLSB0aGlzIGlzIHRoZSBvcmRlciBFY2xpcHNlTGluayBzZWFyY2hlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+KE9ybUVjbGlwc2VMaW5rQ29udmVydC5BZGFwdGVyLmluc3RhbmNlKCksIHN1cGVyLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gbXV0YWJsZSB2YWxpZGF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rSm9pbkZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMGU5YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0pvaW5GZXRjaAotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaChPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJdGhpcy5nZXRYbWxKb2luRmV0Y2goKS5zZXRKb2luRmV0Y2goRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbCh2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy5nZXRYbWxKb2luRmV0Y2goKS5nZXRKb2luRmV0Y2goKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaCBnZXRYbWxKb2luRmV0Y2goKSB7Ci0JCXJldHVybiAoWG1sSm9pbkZldGNoKSB0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEpvaW5GZXRjaCgpLmdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU5OWM2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzxYbWxNYW55VG9NYW55PgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE1hbnlUb01hbnkgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIFRPRE8gam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxYzA4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc8WG1sTWFueVRvT25lPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvT25lIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkZldGNoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBmZXRjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIC0gam9pbiBmZXRjaCB2YWxpZGF0aW9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNiOGIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBlZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3M8WG1sTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcywgT3JtQ2FjaGVhYmxlSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjaGFuZ2VUcmFja2luZzsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZzsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBjb252ZXJ0ZXJDb250YWluZXI7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NJbXBsKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sTWFwcGVkU3VwZXJjbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuYnVpbGRDYWNoaW5nKCk7Ci0JCXRoaXMucmVhZE9ubHkgPSB0aGlzLmJ1aWxkUmVhZE9ubHkoKTsKLQkJdGhpcy5jb252ZXJ0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCk7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcgPSB0aGlzLmJ1aWxkQ2hhbmdlVHJhY2tpbmcoKTsKLQkJdGhpcy5jdXN0b21pemVyID0gdGhpcy5idWlsZEN1c3RvbWl6ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWFkT25seS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY3VzdG9taXplci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jYWNoaW5nLnVwZGF0ZSgpOwotCQl0aGlzLnJlYWRPbmx5LnVwZGF0ZSgpOwotCQl0aGlzLmNvbnZlcnRlckNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5jaGFuZ2VUcmFja2luZy51cGRhdGUoKTsKLQkJdGhpcy5jdXN0b21pemVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NhY2hpbmcgZ2V0Q2FjaGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkQ2FjaGluZygpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NhY2hpbmdJbXBsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWFkIG9ubHkgKioqKioqKioqKgotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkgZ2V0UmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRPbmx5OwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtSZWFkT25seSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgZ2V0Q29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkQ29udmVydGVyQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVySW1wbCh0aGlzLCB0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHRyYWNraW5nICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gdGhpcy5jaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBidWlsZENoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbWl6ZXIgKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0N1c3RvbWl6ZXIgYnVpbGRDdXN0b21pemVyKCkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQ3VzdG9taXplcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgc3VwZXIuZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgc3VwZXIuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRYbWxUeXBlTWFwcGluZygpLmdldFByaW1hcnlLZXkoKSAhPSBudWxsKQotCQkJCXx8IHRoaXMudXNlc0phdmFQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVzZXNKYXZhUHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YU1hcHBlZFN1cGVyY2xhc3MgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YU1hcHBlZFN1cGVyY2xhc3MgIT0gbnVsbCkgJiYgamF2YU1hcHBlZFN1cGVyY2xhc3MudXNlc1ByaW1hcnlLZXlDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIE9ybUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENhY2hlYWJsZUhvbGRlcigpLmdldENhY2hlYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENhY2hlYWJsZUhvbGRlcigpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIChPcm1DYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwdWJsaWMgWG1sQ2FjaGVhYmxlXzJfMCBnZXRYbWxDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlQ29udmVydGVySG9sZGVyUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZUN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDdXN0b21pemVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUNvbnZlcnRlckhvbGRlck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ29udGFpbmVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6ZXIuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVDb252ZXJ0ZXJIb2xkZXJSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlckNvbnRhaW5lci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2FjaGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlYWRPbmx5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY2hhbmdlVHJhY2tpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jdXN0b21pemVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFR5cGVNYXBwaW5nVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcih0aGlzLCB0aGlzLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua011dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg1YmQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rTXV0YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua011dGFibGUKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXV0YWJsZQotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE11dGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE11dGFibGU7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua011dGFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRNdXRhYmxlID0gdGhpcy5idWlsZFNwZWNpZmllZE11dGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNdXRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRNdXRhYmxlKHRoaXMuYnVpbGREZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNdXRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0TXV0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbiBtdXRhYmxlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTXV0YWJsZV8obXV0YWJsZSk7Ci0JCXRoaXMuZ2V0WG1sTXV0YWJsZSgpLnNldE11dGFibGUobXV0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTXV0YWJsZV8oQm9vbGVhbiBtdXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRNdXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZE11dGFibGUgPSBtdXRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbXV0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRNdXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxNdXRhYmxlKCkuZ2V0TXV0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNdXRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNdXRhYmxlKGJvb2xlYW4gbXV0YWJsZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdE11dGFibGU7Ci0JCXRoaXMuZGVmYXVsdE11dGFibGUgPSBtdXRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NVVRBQkxFX1BST1BFUlRZLCBvbGQsIG11dGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE11dGFibGUoKSB7Ci0JCUphdmFFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChqYXZhQXR0cmlidXRlLnR5cGVJc0RhdGVPckNhbGVuZGFyKCkpIHsKLQkJCUJvb2xlYW4gcHVUZW1wb3JhbE11dGFibGUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJCXJldHVybiAocHVUZW1wb3JhbE11dGFibGUgPT0gbnVsbCkgPyBmYWxzZSA6IHB1VGVtcG9yYWxNdXRhYmxlLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhQXR0cmlidXRlLnR5cGVJc1NlcmlhbGl6YWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sTXV0YWJsZSBnZXRYbWxNdXRhYmxlKCkgewotCQlyZXR1cm4gKFhtbE11dGFibGUpIHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChKYXZhRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE11dGFibGUoKS5nZXRNdXRhYmxlVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmZGZmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQ29udGV4dENvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyPFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIKLXsKLQlwcml2YXRlIFN0cmluZyBkYXRhVHlwZTsKLQotCXByaXZhdGUgU3RyaW5nIG9iamVjdFR5cGU7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlcyA9IG5ldyBWZWN0b3I8T3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBDb252ZXJzaW9uVmFsdWVDb250YWluZXJBZGFwdGVyIGNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lckFkYXB0ZXIgPSBuZXcgQ29udmVyc2lvblZhbHVlQ29udGFpbmVyQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLmRhdGFUeXBlID0geG1sQ29udmVydGVyLmdldERhdGFUeXBlKCk7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IHhtbENvbnZlcnRlci5nZXRPYmplY3RUeXBlKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSB4bWxDb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKHRoaXMueG1sQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKHRoaXMueG1sQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCXRoaXMuc3luY0NvbnZlcnNpb25WYWx1ZXMoKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWVfKHRoaXMueG1sQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBkYXRhVHlwZSkgewotCQl0aGlzLnNldERhdGFUeXBlXyhkYXRhVHlwZSk7Ci0JCXRoaXMueG1sQ29udmVydGVyLnNldERhdGFUeXBlKGRhdGFUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREYXRhVHlwZV8oU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGFUeXBlOwotCQl0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRBX1RZUEVfUFJPUEVSVFksIG9sZCwgZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRhdGFUeXBlSXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0Zvcih0aGlzLmdldERhdGFUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRhdGFUeXBlSXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNJbih0aGlzLmdldERhdGFUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgcGFja2FnZUZyYWdtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyhvYmplY3RUeXBlKTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2JqZWN0VHlwZUlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNGb3IodGhpcy5nZXRPYmplY3RUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG9iamVjdFR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0luKHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldE9iamVjdFR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uIHZhbHVlcyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBnZXRDb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgYWRkQ29udmVyc2lvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5hZGRDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJWG1sQ29udmVyc2lvblZhbHVlIHhtbENvbnZlcnNpb25WYWx1ZSA9IHRoaXMuYnVpbGRYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlID0gdGhpcy5hZGRDb252ZXJzaW9uVmFsdWVfKGluZGV4LCB4bWxDb252ZXJzaW9uVmFsdWUpOwotCQl0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuYWRkKGluZGV4LCB4bWxDb252ZXJzaW9uVmFsdWUpOwotCQlyZXR1cm4gY29udmVyc2lvblZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBYbWxDb252ZXJzaW9uVmFsdWUgYnVpbGRYbWxDb252ZXJzaW9uVmFsdWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnNpb25WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWUodGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW5kZXgpOwotCQl0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWVfKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5jb252ZXJzaW9uVmFsdWVzLCBDT05WRVJTSU9OX1ZBTFVFU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29udmVyc2lvblZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCQl0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCkgewotCQlmb3IgKFhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUgOiB0aGlzLmdldFhtbENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZCh0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKHhtbENvbnZlcnNpb25WYWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGJ1aWxkQ29udmVyc2lvblZhbHVlKFhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSh0aGlzLCB4bWxDb252ZXJzaW9uVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb252ZXJzaW9uVmFsdWVzKCkgewotCQlDb250ZXh0Q29udGFpbmVyVG9vbHMuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCh0aGlzLmNvbnZlcnNpb25WYWx1ZUNvbnRhaW5lckFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxYbWxDb252ZXJzaW9uVmFsdWU+IGdldFhtbENvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxYbWxDb252ZXJzaW9uVmFsdWU+KHRoaXMueG1sQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW50IGluZGV4LCBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBhZGRDb252ZXJzaW9uVmFsdWVfKGludCBpbmRleCwgWG1sQ29udmVyc2lvblZhbHVlIHhtbENvbnZlcnNpb25WYWx1ZSkgewotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKHhtbENvbnZlcnNpb25WYWx1ZSk7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgY29udmVyc2lvblZhbHVlLCB0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIENPTlZFUlNJT05fVkFMVUVTX0xJU1QpOwotCQlyZXR1cm4gY29udmVyc2lvblZhbHVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udmVyc2lvblZhbHVlKSB7Ci0JCXRoaXMucmVtb3ZlQ29udmVyc2lvblZhbHVlXyh0aGlzLmNvbnZlcnNpb25WYWx1ZXMuaW5kZXhPZihjb252ZXJzaW9uVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZXJzaW9uIHZhbHVlIGNvbnRhaW5lciBhZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvbnZlcnNpb25WYWx1ZUNvbnRhaW5lckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBDb250ZXh0Q29udGFpbmVyVG9vbHMuQWRhcHRlcjxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgWG1sQ29udmVyc2lvblZhbHVlPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxYbWxDb252ZXJzaW9uVmFsdWU+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuZ2V0WG1sQ29udmVyc2lvblZhbHVlcygpOwotCQl9Ci0JCXB1YmxpYyBYbWxDb252ZXJzaW9uVmFsdWUgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgT3JtRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgZWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMubW92ZUNvbnZlcnNpb25WYWx1ZV8oaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENvbnRleHRFbGVtZW50KGludCBpbmRleCwgWG1sQ29udmVyc2lvblZhbHVlIHJlc291cmNlRWxlbWVudCkgewotCQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLnRoaXMuYWRkQ29udmVyc2lvblZhbHVlXyhpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBlbGVtZW50KSB7Ci0JCQlPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIudGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdmFsdWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldERhdGFWYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPih0aGlzLmdldENvbnZlcnNpb25WYWx1ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShPcm1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGF0YVZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnNldERlZmF1bHRPYmplY3RWYWx1ZV8odmFsdWUpOwotCQl0aGlzLnhtbENvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVJc0ZvcihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgJiYgcGVyc2lzdGVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyh0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUlzSW4oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgJiYgcGVyc2lzdGVudFR5cGUuaXNJbihwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlTW92ZURhdGFUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZU1vdmVPYmplY3RUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVEYXRhVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZU9iamVjdFR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGVJc0luKG9yaWdpbmFsUGFja2FnZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlSXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlmb3IgKE9ybUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA6IHRoaXMuZ2V0Q29udmVyc2lvblZhbHVlcygpKSB7Ci0JCQljb252ZXJzaW9uVmFsdWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlleHRlbmRzIEFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBBZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCXByaXZhdGUgQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIgeG1sQ29udmVydGVyQ29udGFpbmVyKSB7Ci0JCQlyZXR1cm4geG1sQ29udmVydGVyQ29udGFpbmVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcjw/IGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVyKFhtbE5hbWVkQ29udmVydGVyIHhtbENvbnZlcnRlciwgWG1sQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcihwYXJlbnQsIChYbWxPYmplY3RUeXBlQ29udmVydGVyKSB4bWxDb252ZXJ0ZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyIGJ1aWxkWG1sQ29udmVydGVyKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIgeG1sQ29udmVydGVyQ29udGFpbmVyLCBYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJCXhtbENvbnZlcnRlckNvbnRhaW5lci5zZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKSB4bWxDb252ZXJ0ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5YzlkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc8WG1sT25lVG9NYW55PgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0KLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvTWFueSB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gbmV3IE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKHRoaXMpOwotCQl0aGlzLmpvaW5GZXRjaCA9IG5ldyBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5wcml2YXRlT3duZWQudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG93bmVkICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBnZXRQcml2YXRlT3duZWQoKSB7Ci0JCXJldHVybiB0aGlzLnByaXZhdGVPd25lZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBmZXRjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKb2luRmV0Y2ggZ2V0Sm9pbkZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5qb2luRmV0Y2g7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIHByaXZhdGUgb3duZWQsIGpvaW4gZmV0Y2ggdmFsaWRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmExMjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzxYbWxPbmVUb09uZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25lZDsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1FY2xpcHNlTGlua0pvaW5GZXRjaCBqb2luRmV0Y2g7Ci0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9PbmUgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLnByaXZhdGVPd25lZCA9IG5ldyBPcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZCh0aGlzKTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2godGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkLnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5GZXRjaC51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBvd25lZCAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgZ2V0UHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5wcml2YXRlT3duZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyAtIHByaXZhdGUgb3duZWQsIGpvaW4gZmV0Y2ggdmFsaWRhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTU3ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3I7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUKLQlleHRlbmRzIFNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogRWNsaXBzZUxpbmsgMS4wIGRvZXMgbm90IHN1cHBvcnQgYSBzcGVjaWZpZWQgYWNjZXNzIGZvciBhdHRyaWJ1dGVzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQSBzcGVjaWZpZWQgYWNjZXNzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgMS4wOiAiICsgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZEF0dGlidXRlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcih0aGlzLCBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ByaXZhdGVPd25lZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTA3MjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZAotewotCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZDsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gdGhpcy5idWlsZFByaXZhdGVPd25lZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFByaXZhdGVPd25lZF8odGhpcy5idWlsZFByaXZhdGVPd25lZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBvd25lZCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaXZhdGVPd25lZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJpdmF0ZU93bmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHByaXZhdGVPd25lZCkgewotCQl0aGlzLnNldFByaXZhdGVPd25lZF8ocHJpdmF0ZU93bmVkKTsKLQkJdGhpcy5nZXRYbWxQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQocHJpdmF0ZU93bmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcml2YXRlT3duZWRfKGJvb2xlYW4gcHJpdmF0ZU93bmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5wcml2YXRlT3duZWQ7Ci0JCXRoaXMucHJpdmF0ZU93bmVkID0gcHJpdmF0ZU93bmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJVkFURV9PV05FRF9QUk9QRVJUWSwgb2xkLCBwcml2YXRlT3duZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQcml2YXRlT3duZWQgZ2V0WG1sUHJpdmF0ZU93bmVkKCkgewotCQlyZXR1cm4gKFhtbFByaXZhdGVPd25lZCkgdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxQcml2YXRlT3duZWQoKS5nZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1JlYWRPbmx5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTU5MjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtSZWFkT25seS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTm9uRW1iZWRkYWJsZVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5OwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtSZWFkT25seQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seQotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlYWRPbmx5OwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRSZWFkT25seTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rUmVhZE9ubHkoT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVhZE9ubHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWFkT25seV8odGhpcy5idWlsZFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlYWRPbmx5KHRoaXMuYnVpbGREZWZhdWx0UmVhZE9ubHkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlYWQtb25seSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVhZE9ubHkgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlYWRPbmx5LmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0UmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlYWRPbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWFkT25seV8ocmVhZE9ubHkpOwotCQl0aGlzLmdldFhtbFJlYWRPbmx5KCkuc2V0UmVhZE9ubHkocmVhZE9ubHkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlYWRPbmx5XyhCb29sZWFuIHJlYWRPbmx5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRSZWFkT25seTsKLQkJdGhpcy5zcGVjaWZpZWRSZWFkT25seSA9IHJlYWRPbmx5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFQURfT05MWV9QUk9QRVJUWSwgb2xkLCByZWFkT25seSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sUmVhZE9ubHkoKS5nZXRSZWFkT25seSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlYWRPbmx5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVhZE9ubHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRSZWFkT25seTsKLQkJdGhpcy5kZWZhdWx0UmVhZE9ubHkgPSByZWFkT25seTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVBRF9PTkxZX1BST1BFUlRZLCBvbGQsIHJlYWRPbmx5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRSZWFkT25seSgpIHsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSBqYXZhUmVhZE9ubHkgPSB0aGlzLmdldEphdmFSZWFkT25seUZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YVJlYWRPbmx5ICE9IG51bGwpID8gamF2YVJlYWRPbmx5LmlzUmVhZE9ubHkoKSA6IERFRkFVTFRfUkVBRF9PTkxZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFR5cGVNYXBwaW5nIGdldFhtbFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFJlYWRPbmx5IGdldFhtbFJlYWRPbmx5KCkgewotCQlyZXR1cm4gKFhtbFJlYWRPbmx5KSB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua05vbkVtYmVkZGFibGVUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGdldEphdmFSZWFkT25seUZvckRlZmF1bHRzKCkgewotCQlKYXZhRWNsaXBzZUxpbmtOb25FbWJlZGRhYmxlVHlwZU1hcHBpbmcgamF2YVR5cGVNYXBwaW5nID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFUeXBlTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBqYXZhVHlwZU1hcHBpbmcuZ2V0UmVhZE9ubHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFJlYWRPbmx5KCkuZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMGIwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIKLQlleHRlbmRzIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ2xhc3NDb252ZXJ0ZXI8WG1sU3RydWN0Q29udmVydGVyPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIKLXsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFN0cnVjdENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0geG1sQ29udmVydGVyLmdldENvbnZlcnRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyh0aGlzLnhtbENvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJDbGFzc18oY29udmVydGVyQ2xhc3MpOwotCQl0aGlzLnhtbENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3MpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlckNsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzOwotCQl9Ci0KLQkJcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRYbWxDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lcikgewotCQkJcmV0dXJuIHhtbENvbnZlcnRlckNvbnRhaW5lci5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBidWlsZENvbnZlcnRlcihYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIsIFhtbENvbnRleHROb2RlIHBhcmVudCkgewotCQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcihwYXJlbnQsIChYbWxTdHJ1Y3RDb252ZXJ0ZXIpIHhtbENvbnZlcnRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBidWlsZFhtbENvbnZlcnRlcigpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFhtbENvbnZlcnRlcihYbWxDb252ZXJ0ZXJIb2xkZXIgeG1sQ29udmVydGVyQ29udGFpbmVyLCBYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIpIHsKLQkJCXhtbENvbnZlcnRlckNvbnRhaW5lci5zZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlcikgeG1sQ29udmVydGVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNlZDg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFRyYW5zZm9ybWF0aW9uPiAKLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxUcmFuc2Zvcm1hdGlvbiB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDg1OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMpIHsKLQkJKChBdHRyaWJ1dGVzKSB4bWxBdHRyaWJ1dGVzKS5nZXRUcmFuc2Zvcm1hdGlvbnMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM5M2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHJhbnNmb3JtYXRpb24oKSwgCi0JCQkJWG1sVHJhbnNmb3JtYXRpb24uY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLgotCQkJCWJ1aWxkT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmcocGFyZW50LCAoWG1sVHJhbnNmb3JtYXRpb24pIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5MDE0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotCWV4dGVuZHMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXI8WG1sVHlwZUNvbnZlcnRlcj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcgotewotCXByaXZhdGUgU3RyaW5nIGRhdGFUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgb2JqZWN0VHlwZTsKLQotCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFR5cGVDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sQ29udmVydGVyKTsKLQkJdGhpcy5kYXRhVHlwZSA9IHhtbENvbnZlcnRlci5nZXREYXRhVHlwZSgpOwotCQl0aGlzLm9iamVjdFR5cGUgPSB4bWxDb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldERhdGFUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyh0aGlzLnhtbENvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCXRoaXMuc2V0RGF0YVR5cGVfKGRhdGFUeXBlKTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBkYXRhVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzRm9yKHRoaXMuZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YVR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0luKHRoaXMuZ2V0RGF0YVR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLCBwYWNrYWdlRnJhZ21lbnQpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBnZXREYXRhVHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0aGlzLmRhdGFUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb2JqZWN0IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGUoU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJdGhpcy5zZXRPYmplY3RUeXBlXyhvYmplY3RUeXBlKTsKLQkJdGhpcy54bWxDb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShvYmplY3RUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPYmplY3RUeXBlXyhTdHJpbmcgb2JqZWN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5vYmplY3RUeXBlOwotCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1RZUEVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb2JqZWN0VHlwZUlzRm9yKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNGb3IodGhpcy5nZXRPYmplY3RUeXBlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoKSwgdHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG9iamVjdFR5cGVJc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0luKHRoaXMuZ2V0T2JqZWN0VHlwZUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCksIHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGdldE9iamVjdFR5cGVKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUodGhpcy5vYmplY3RUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlSXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVEYXRhVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGVJc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbENvbnZlcnRlci5jcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZU1vdmVEYXRhVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVNb3ZlT2JqZWN0VHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlRGF0YVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxDb252ZXJ0ZXIuY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVPYmplY3RUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29udmVydGVyLmNyZWF0ZVJlbmFtZU9iamVjdFR5cGVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVEYXRhVHlwZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlSXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZURhdGFUeXBlUGFja2FnZUVkaXQobmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUlzSW4ob3JpZ2luYWxQYWNrYWdlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQobmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUlzRm9yKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGUsIFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0eXBlSXNJbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlLCBJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5pc0luKHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzOwotCQl9Ci0KLQkJcHVibGljIFhtbFR5cGVDb252ZXJ0ZXIgZ2V0WG1sQ29udmVydGVyKFhtbENvbnZlcnRlckhvbGRlciB4bWxDb252ZXJ0ZXJDb250YWluZXIpIHsKLQkJCXJldHVybiB4bWxDb252ZXJ0ZXJDb250YWluZXIuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihYbWxOYW1lZENvbnZlcnRlciB4bWxDb252ZXJ0ZXIsIFhtbENvbnRleHROb2RlIHBhcmVudCkgewotCQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIocGFyZW50LCAoWG1sVHlwZUNvbnZlcnRlcikgeG1sQ29udmVydGVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciBidWlsZFhtbENvbnZlcnRlcigpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRYbWxDb252ZXJ0ZXIoWG1sQ29udmVydGVySG9sZGVyIHhtbENvbnZlcnRlckNvbnRhaW5lciwgWG1sTmFtZWRDb252ZXJ0ZXIgeG1sQ29udmVydGVyKSB7Ci0JCQl4bWxDb252ZXJ0ZXJDb250YWluZXIuc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlcikgeG1sQ29udmVydGVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3MzUxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFhtbFZhcmlhYmxlT25lVG9PbmU+IAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZwotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWYXJpYWJsZU9uZVRvT25lIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuVkFSSUFCTEVfT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDY1OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQkoKEF0dHJpYnV0ZXMpIHhtbEF0dHJpYnV0ZXMpLmdldFZhcmlhYmxlT25lVG9PbmVzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCSgoQXR0cmlidXRlcykgeG1sQXR0cmlidXRlcykuZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA4ZWI3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpLCAKLQkJCQlYbWxWYXJpYWJsZU9uZVRvT25lLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKEVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5KSBmYWN0b3J5KS4KLQkJCQlidWlsZE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmcocGFyZW50LCAoWG1sVmFyaWFibGVPbmVUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWI0ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5EZWZhdWx0RWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZzxYbWxWZXJzaW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZwotewkKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGU7Ci0JCi0JCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZlcnNpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLm11dGFibGUgPSBuZXcgT3JtRWNsaXBzZUxpbmtNdXRhYmxlKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm11dGFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubXV0YWJsZS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbXV0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlIGdldE11dGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm11dGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwdXQgdGhlIEVjbGlwc2VMaW5rIGNvbnZlcnQgYWRhcHRlciBmaXJzdCAtIHRoaXMgaXMgdGhlIG9yZGVyIEVjbGlwc2VMaW5rIHNlYXJjaGVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4oT3JtRWNsaXBzZUxpbmtDb252ZXJ0LkFkYXB0ZXIuaW5zdGFuY2UoKSwgc3VwZXIuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyBtdXRhYmxlIHZhbGlkYXRpb24KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoIUFycmF5VG9vbHMuY29udGFpbnMoVkVSU0lPTl9NQVBQSU5HX1NVUFBPUlRFRF9UWVBFUywgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtKYXJGaWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxY2M1YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0phckZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0SmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmFyRmlsZVJlZiAKLQlleHRlbmRzIEFic3RyYWN0SmFyRmlsZVJlZgotewotCXB1YmxpYyBFY2xpcHNlTGlua0phckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYXRoW10gYnVpbGRSdW50aW1lSmFyRmlsZVBhdGhXZWIoSVBhdGggcm9vdCwgSVBhdGggamFyRmlsZVBhdGgpIHsKLQkJSVBhdGhbXSBnZW5lcmljUGF0aCA9IHN1cGVyLmJ1aWxkUnVudGltZUphckZpbGVQYXRoV2ViKHJvb3QsIGphckZpbGVQYXRoKTsKLQkJcmV0dXJuIEFycmF5VG9vbHMucmVtb3ZlTGFzdChnZW5lcmljUGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjMDkzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLSAqIAotICogTGlzdGVucyB0byB0aGUgcHJvcGVydHlMaXN0QWRhcHRlcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqIENvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoU3RyaW5nIGtleVByZWZpeCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChrZXlQcmVmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZW50aXR5TmFtZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuIElmIHRoZSBwcm9wZXJ0eSBuYW1lCi0JICogaGFzIG5vIHN1ZmZpeCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RFbnRpdHlOYW1lT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCXJldHVybiBleHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogRXh0cmFjdHMgdGhlIGVudGl0eU5hbWUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuIElmIHRoZSBzdHJpbmcKLQkgKiBoYXMgbm8gc3VmZml4LCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdEVudGl0eU5hbWVPZihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWludCBpbmRleCA9IHByb3BlcnR5TmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjBhMjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uRWNsaXBzZUxpbmtDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuRWNsaXBzZUxpbmtPcHRpb25zOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JCWltcGxlbWVudHMgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXJGaWxlUmVmKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24ocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRMb2dnaW5nKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0xvZ2dpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MjIxMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5OGI0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5GbHVzaENsZWFyQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rQ2FjaGluZyBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgQ2FjaGluZyBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBDYWNoaW5nCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIENhY2hlVHlwZSBjYWNoZVR5cGVEZWZhdWx0OwotCXByaXZhdGUgSW50ZWdlciBjYWNoZVNpemVEZWZhdWx0OwotCXByaXZhdGUgQm9vbGVhbiBzaGFyZWRDYWNoZURlZmF1bHQ7Ci0JcHJpdmF0ZSBGbHVzaENsZWFyQ2FjaGUgZmx1c2hDbGVhckNhY2hlOwotCi0JcHJpdmF0ZSBMaXN0PEVudGl0eT4gZW50aXRpZXM7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJdGhpcy5lbnRpdGllcyA9IG5ldyBBcnJheUxpc3Q8RW50aXR5PigpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgQ2FjaGVUeXBlLnZhbHVlcygpKTsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUsIEZsdXNoQ2xlYXJDYWNoZS52YWx1ZXMoKSk7Ci0JCQotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVR5cGVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpOwotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVNpemVQcm9wZXJ0aWVzID0gCi0JCQl0aGlzLmdldFByb3BlcnRpZXNTZXRXaXRoUHJlZml4KEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpOwotCQlTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBzaGFyZWRDYWNoZVByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0aWVzQ2FjaGVUeXBlKGNhY2hlVHlwZVByb3BlcnRpZXMpOwotCQl0aGlzLmluaXRpYWxpemVFbnRpdGllc0NhY2hlU2l6ZShjYWNoZVNpemVQcm9wZXJ0aWVzKTsKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNTaGFyZWRDYWNoZShzaGFyZWRDYWNoZVByb3BlcnRpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNDYWNoZVR5cGUoU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gY2FjaGVUeXBlUHJvcGVydGllcykgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBjYWNoZVR5cGVQcm9wZXJ0eSA6IGNhY2hlVHlwZVByb3BlcnRpZXMpIHsKLQkJCXRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoY2FjaGVUeXBlUHJvcGVydHkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVFbnRpdGllc0NhY2hlU2l6ZShTZXQ8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBjYWNoZVNpemVQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlU2l6ZVByb3BlcnR5IDogY2FjaGVTaXplUHJvcGVydGllcykgewotCQkJdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihjYWNoZVNpemVQcm9wZXJ0eSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudGl0aWVzU2hhcmVkQ2FjaGUoU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gc2hhcmVkQ2FjaGVQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHNoYXJlZENhY2hlUHJvcGVydHkgOiBzaGFyZWRDYWNoZVByb3BlcnRpZXMpIHsKLQkJCXRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihzaGFyZWRDYWNoZVByb3BlcnR5KTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCkpIHsKLQkJCXRoaXMuY2FjaGVTaXplRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfU0laRSkpIHsKLQkJCXRoaXMuY2FjaGVTaXplQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQl0aGlzLnNoYXJlZENhY2hlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFKSkgewotCQkJdGhpcy5mbHVzaENsZWFyQ2FjaGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUKSkgewotCQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpKSB7Ci0JCQl0aGlzLmNhY2hlVHlwZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSkgewotCQkJdGhpcy5jYWNoZVNpemVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKSkgewotCQkJdGhpcy5zaGFyZWRDYWNoZUNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFKSkgewotCQkJdGhpcy5mbHVzaENsZWFyQ2FjaGVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXk7Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSk7Ci0JCQotCQkvLyBEb24ndCBuZWVkIHRvIGluaXRpYWxpemUgcHJvcGVydHlOYW1lcyBmb3I6IAotCQkvLyBjYWNoZVR5cGUsIHNoYXJlZENhY2hlLCBjYWNoZVNpemUKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdXNlZCBmb3IgaWRlbnRpZnlpbmcgdGhlIGdpdmVuIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKSB7Ci0JCWJvb2xlYW4gaXNQcm9wZXJ0eSA9IHN1cGVyLml0ZW1Jc1Byb3BlcnR5KGl0ZW0pOwotCQkKLQkJaWYgKCAhIGlzUHJvcGVydHkgJiYgaXRlbS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJCWlmIChpdGVtLmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1RZUEUpIHx8IAotCQkJCQkJaXRlbS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19DQUNIRV9TSVpFKSB8fCAKLQkJCQkJCWl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbgotCSAqIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlJZE9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSkpIHsKLQkJCQlyZXR1cm4gQ0FDSEVfVFlQRV9QUk9QRVJUWTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5LmdldE5hbWUoKS5zdGFydHNXaXRoKEVDTElQU0VMSU5LX0NBQ0hFX1NJWkUpKSB7Ci0JCQkJcmV0dXJuIENBQ0hFX1NJWkVfUFJPUEVSVFk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eS5nZXROYW1lKCkuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUpKSB7Ci0JCQkJcmV0dXJuIFNIQVJFRF9DQUNIRV9QUk9QRVJUWTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5OiAiICsgcHJvcGVydHkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEVudGl0eSBhZGRFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJEdXBsaWNhdGUgZW50aXR5OiAiICsgZW50aXR5TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlFbnRpdHkgbmV3RW50aXR5ID0gdGhpcy5idWlsZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KG5ld0VudGl0eSwgdGhpcy5lbnRpdGllcywgRU5USVRJRVNfTElTVCk7Ci0JCXJldHVybiBuZXdFbnRpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRW50aXR5KFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmICggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpOwotCQl0aGlzLmNsZWFyRW50aXR5KGVudGl0eSk7Ci0JCXRoaXMucmVtb3ZlRW50aXR5KGVudGl0eSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlT2YoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXJldHVybiAoZW50aXR5ID09IG51bGwpID8gbnVsbCA6IGVudGl0eS5nZXRDYWNoZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSwgQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZSkgewotCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBuZXdDYWNoZVR5cGUpOwotCQl0aGlzLnB1dEVudW1WYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9UWVBFLCBlbnRpdHlOYW1lLCBuZXdDYWNoZVR5cGUsIGZhbHNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlVHlwZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5TmFtZSk7Ci0JCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZW50aXR5TmFtZSkpIHsKLQkJCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlVHlwZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsgCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfVFlQRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ2FjaGVUeXBlIGdldERlZmF1bHRDYWNoZVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5jYWNoZVR5cGVEZWZhdWx0ID09IG51bGwpID8gREVGQVVMVF9DQUNIRV9UWVBFIDogdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldENhY2hlU2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBJbnRlZ2VyIG5ld0NhY2hlU2l6ZSkgewotCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihlbnRpdHlOYW1lLCBuZXdDYWNoZVNpemUpOwotCQl0aGlzLnB1dEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19DQUNIRV9TSVpFICsgZW50aXR5TmFtZSwgbmV3Q2FjaGVTaXplKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NJWkVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhY2hlU2l6ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5TmFtZSk7Ci0JCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZW50aXR5TmFtZSkpIHsKLQkJCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIHN0cmluZ1ZhbHVlKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TSVpFX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNhY2hlU2l6ZURlZmF1bHQgPT0gbnVsbCkgPyBERUZBVUxUX0NBQ0hFX1NJWkUgOiB0aGlzLmNhY2hlU2l6ZURlZmF1bHQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkQ2FjaGVPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmNhY2hlSXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBCb29sZWFuIG5ld1NoYXJlZENhY2hlKSB7Ci0JCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgbmV3U2hhcmVkQ2FjaGUpOwotCQl0aGlzLnB1dEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUsIGVudGl0eU5hbWUsIG5ld1NoYXJlZENhY2hlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNoYXJlZENhY2hlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJRW50aXR5IG9sZCA9IHRoaXMuc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBzdHJpbmdWYWx1ZSk7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0hBUkVEX0NBQ0hFX1BST1BFUlRZLCBvbGQsIHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCkgewotCQlyZXR1cm4gKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0ID09IG51bGwpID8gREVGQVVMVF9TSEFSRURfQ0FDSEUgOiB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKioqKgotCXB1YmxpYyBDYWNoZVR5cGUgZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVUeXBlRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVR5cGVEZWZhdWx0KENhY2hlVHlwZSBuZXdDYWNoZVR5cGVEZWZhdWx0KSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLmNhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdCA9IG5ld0NhY2hlVHlwZURlZmF1bHQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVUeXBlRGVmYXVsdENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUNhY2hlVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBDYWNoZVR5cGUudmFsdWVzKCkpOwotCQlDYWNoZVR5cGUgb2xkID0gdGhpcy5jYWNoZVR5cGVEZWZhdWx0OwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIENhY2hlVHlwZSBnZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVNpemVEZWZhdWx0KEludGVnZXIgbmV3Q2FjaGVTaXplRGVmYXVsdCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5jYWNoZVNpemVEZWZhdWx0ID0gbmV3Q2FjaGVTaXplRGVmYXVsdDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU2l6ZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVNpemVEZWZhdWx0Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmNhY2hlU2l6ZURlZmF1bHQ7Ci0JCXRoaXMuY2FjaGVTaXplRGVmYXVsdCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU0laRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQ0FDSEVfU0laRV9ERUZBVUxUOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWRDYWNoZURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWRDYWNoZURlZmF1bHQoQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSBuZXdTaGFyZWRDYWNoZURlZmF1bHQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdDsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgewotCQlyZXR1cm4gREVGQVVMVF9TSEFSRURfQ0FDSEVfREVGQVVMVDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEZsdXNoQ2xlYXJDYWNoZSAqKioqKioqKioqCi0JCi0JcHVibGljIEZsdXNoQ2xlYXJDYWNoZSBnZXRGbHVzaENsZWFyQ2FjaGUoKSB7Ci0JCXJldHVybiB0aGlzLmZsdXNoQ2xlYXJDYWNoZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Rmx1c2hDbGVhckNhY2hlKEZsdXNoQ2xlYXJDYWNoZSBuZXdGbHVzaENsZWFyQ2FjaGUpIHsKLQkJRmx1c2hDbGVhckNhY2hlIG9sZCA9IHRoaXMuZmx1c2hDbGVhckNhY2hlOwotCQl0aGlzLmZsdXNoQ2xlYXJDYWNoZSA9IG5ld0ZsdXNoQ2xlYXJDYWNoZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgbmV3Rmx1c2hDbGVhckNhY2hlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBvbGQsIG5ld0ZsdXNoQ2xlYXJDYWNoZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZsdXNoQ2xlYXJDYWNoZUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUZsdXNoQ2xlYXJDYWNoZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBGbHVzaENsZWFyQ2FjaGUudmFsdWVzKCkpOwotCQlGbHVzaENsZWFyQ2FjaGUgb2xkID0gdGhpcy5mbHVzaENsZWFyQ2FjaGU7Ci0JCXRoaXMuZmx1c2hDbGVhckNhY2hlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTFVTSF9DTEVBUl9DQUNIRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBGbHVzaENsZWFyQ2FjaGUgZ2V0RGVmYXVsdEZsdXNoQ2xlYXJDYWNoZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRkxVU0hfQ0xFQVJfQ0FDSEU7Ci0JfQotCi0JLy8gKioqKioqIEVudGl0eSBDYWNoZVR5cGUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCSBpZigoICEgdGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpICYmIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nVmFsdWUpKSB7Ci0JCQkJLy90aGlzIGlzIGEgcHJvcGVydHkgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQsIHdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIGl0IHVudGlsIHRoZSB2YWx1ZSBpcyBzZXQKLQkJCQkgcmV0dXJuIG51bGw7Ci0JCQkgfQotCQlDYWNoZVR5cGUgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgQ2FjaGVUeXBlLnZhbHVlcygpKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlDYWNoZVR5cGVPZihTdHJpbmcgZW50aXR5TmFtZSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSkgewotCQlFbnRpdHkgZW50aXR5ID0gKHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSA/Ci0JCQkJCQl0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpIDoKLQkJCQkJCXRoaXMuYWRkRW50aXR5KGVudGl0eU5hbWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHksIGNhY2hlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlVHlwZU9mKEVudGl0eSBlbnRpdHksIENhY2hlVHlwZSBjYWNoZVR5cGUpIHsKLQkJaWYoZW50aXR5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFbnRpdHkgb2xkID0gZW50aXR5LmNsb25lKCk7Ci0JCWVudGl0eS5zZXRDYWNoZVR5cGUoY2FjaGVUeXBlKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW50aXR5Q2FjaGVUeXBlT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGNhY2hlVHlwZVByb3BlcnR5KSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKGNhY2hlVHlwZVByb3BlcnR5KTsKLQkJdGhpcy5zZXRFbnRpdHlDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCBjYWNoZVR5cGVQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvLyAqKioqKiogRW50aXR5IENhY2hlIHNpemUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlDYWNoZVNpemVPZihTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCSBpZigoICEgdGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpICYmIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoc3RyaW5nVmFsdWUpKSB7Ci0JCQkJLy90aGlzIGlzIGEgcHJvcGVydHkgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgYWRkZWQsIHdlIGRvbid0IG5lZWQgdG8gZGVhbCB3aXRoIGl0IHVudGlsIHRoZSB2YWx1ZSBpcyBzZXQKLQkJCQkgcmV0dXJuIG51bGw7Ci0JCQkgfQotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQlyZXR1cm4gdGhpcy5zZXRFbnRpdHlDYWNoZVNpemVPZihlbnRpdHlOYW1lLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eUNhY2hlU2l6ZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBJbnRlZ2VyIHNpemUpIHsKLQkJRW50aXR5IGVudGl0eSA9ICh0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgPwotCQkJCQkJdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSA6Ci0JCQkJCQl0aGlzLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIHRoaXMuc2V0RW50aXR5Q2FjaGVTaXplT2YoZW50aXR5LCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgRW50aXR5Ci0JICovCi0JcHJpdmF0ZSBFbnRpdHkgc2V0RW50aXR5Q2FjaGVTaXplT2YoRW50aXR5IGVudGl0eSwgSW50ZWdlciBzaXplKSB7Ci0JCWlmKGVudGl0eSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRW50aXR5IG9sZCA9IGVudGl0eS5jbG9uZSgpOwotCQllbnRpdHkuc2V0Q2FjaGVTaXplKHNpemUpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnRpdHlDYWNoZVNpemVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgY2FjaGVTaXplUHJvcGVydHkpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoY2FjaGVTaXplUHJvcGVydHkpOwotCQl0aGlzLnNldEVudGl0eUNhY2hlU2l6ZU9mKGVudGl0eU5hbWUsIGNhY2hlU2l6ZVByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKiBFbnRpdHkgU2hhcmVkQ2FjaGUgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJIGlmKCggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHJpbmdWYWx1ZSkpIHsKLQkJCQkvL3RoaXMgaXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggaXQgdW50aWwgdGhlIHZhbHVlIGlzIHNldAotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlTaGFyZWRDYWNoZU9mKFN0cmluZyBlbnRpdHlOYW1lLCBCb29sZWFuIHNoYXJlZENhY2hlKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpID8KLQkJCQkJCXRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkgOgotCQkJCQkJdGhpcy5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eVNoYXJlZENhY2hlT2YoZW50aXR5LCBzaGFyZWRDYWNoZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eVNoYXJlZENhY2hlT2YoRW50aXR5IGVudGl0eSwgQm9vbGVhbiBzaGFyZWRDYWNoZSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUVudGl0eSBvbGQgPSBlbnRpdHkuY2xvbmUoKTsKLQkJZW50aXR5LnNldFNoYXJlZENhY2hlKHNoYXJlZENhY2hlKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RW50aXR5U2hhcmVkQ2FjaGVPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgc2hhcmVkQ2FjaGVQcm9wZXJ0eSkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZXh0cmFjdEVudGl0eU5hbWVPZihzaGFyZWRDYWNoZVByb3BlcnR5KTsKLQkJdGhpcy5zZXRFbnRpdHlTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIHNoYXJlZENhY2hlUHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogU2V0IGFsbCBFbnRpdHkgcHJvcGVydGllcyB0byBkZWZhdWx0LgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhckVudGl0eShFbnRpdHkgZW50aXR5KSB7Ci0JCWlmKGVudGl0eS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZW50aXR5TmFtZSA9IGVudGl0eS5nZXROYW1lKCk7Ci0JCXRoaXMuc2V0Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgbnVsbCk7Ci0JCXRoaXMuc2V0Q2FjaGVTaXplT2YoZW50aXR5TmFtZSwgbnVsbCk7Ci0JCXRoaXMuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFbnRpdHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKi8KLQlwcml2YXRlIEVudGl0eSBnZXRFbnRpdHlOYW1lZChTdHJpbmcgbmFtZSkgewotCQlmb3IoRW50aXR5IGVudGl0eTogdGhpcy5lbnRpdGllcykgewotCQkJaWYoZW50aXR5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZW50aXR5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRW50aXR5IGJ1aWxkRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgRW50aXR5KHRoaXMsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoZW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgRW50aXR5IGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgbmFtZSkgewotCQlmb3IoRW50aXR5IGVudGl0eTogdGhpcy5lbnRpdGllcykgewotCQkJaWYoZW50aXR5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBjYWNoZVR5cGVEZWZhdWx0LCBjYWNoZVNpemVEZWZhdWx0LCBmbHVzaENsZWFyQ2FjaGUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEZWZhdWx0Q2FjaGluZ1Byb3BlcnRpZXMoKSB7Ci0JCXRoaXMuc2V0Q2FjaGVUeXBlRGVmYXVsdChudWxsKTsKLQkJdGhpcy5zZXRDYWNoZVNpemVEZWZhdWx0KG51bGwpOwotCQl0aGlzLnNldEZsdXNoQ2xlYXJDYWNoZShudWxsKTsKLQl9Ci0KLQkvLyAqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEVudGl0eT4gZW50aXRpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW50aXR5Pih0aGlzLmVudGl0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBlbnRpdHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVudGl0eSwgU3RyaW5nPih0aGlzLmVudGl0aWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRW50aXR5IGVudGl0eSkgewotCQkJCXJldHVybiBlbnRpdHkuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgZW50aXRpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdGllcy5zaXplKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0VjbGlwc2VMaW5rQ29ubmVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTEyZTU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbiBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgQ29ubmVjdGlvbgotewotCQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCYXRjaFdyaXRpbmcgYmF0Y2hXcml0aW5nOwotCXByaXZhdGUgQm9vbGVhbiBuYXRpdmVTcWw7Ci0JcHJpdmF0ZSBCb29sZWFuIGNhY2hlU3RhdGVtZW50czsKLQlwcml2YXRlIEludGVnZXIgY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRyaXZlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVybDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQlwcml2YXRlIEJvb2xlYW4gYmluZFBhcmFtZXRlcnM7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQlwcml2YXRlIEludGVnZXIgcmVhZENvbm5lY3Rpb25zTWluOwotCXByaXZhdGUgSW50ZWdlciByZWFkQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNaW47Ci0JcHJpdmF0ZSBJbnRlZ2VyIHdyaXRlQ29ubmVjdGlvbnNNYXg7Ci0JcHJpdmF0ZSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBleGNsdXNpdmVDb25uZWN0aW9uTW9kZTsKLQlwcml2YXRlIEJvb2xlYW4gbGF6eUNvbm5lY3Rpb247Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmluaXRpYWxpemVEYXRhYmFzZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzKCk7Ci0JCQotCQl0aGlzLmJhdGNoV3JpdGluZyA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORywgQmF0Y2hXcml0aW5nLnZhbHVlcygpKTsKLQkJdGhpcy5uYXRpdmVTcWwgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX05BVElWRV9TUUwpOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50cyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUyk7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZSA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKTsKLQkJdGhpcy5iaW5kUGFyYW1ldGVycyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWQgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKTsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKTsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4pOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCk7Ci0JCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREUsIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLnZhbHVlcygpKTsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfTEFaWV9DT05ORUNUSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURhdGFiYXNlQ29ubmVjdGlvblByb3BlcnRpZXMoKSB7Ci0JCXRoaXMuZHJpdmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VSTCk7Ci0JCXRoaXMudXNlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19VU0VSKTsKLQkJdGhpcy5wYXNzd29yZCA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19QQVNTV09SRCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX05BVElWRV9TUUwpKSB7Ci0JCQl0aGlzLm5hdGl2ZVNxbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RSSVZFUikpIHsKLQkJCXRoaXMuZHJpdmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVVNFUikpIHsKLQkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUEFTU1dPUkQpKSB7Ci0JCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCkpIHsKLQkJCXRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkUpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCkpIHsKLQkJCXJlYWRDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01pbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSkpIHsKLQkJCXRoaXMuZXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTikpIHsKLQkJCXRoaXMubGF6eUNvbm5lY3Rpb25DaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19OQVRJVkVfU1FMKSkgewotCQkJdGhpcy5uYXRpdmVTcWxDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORykpIHsKLQkJCXRoaXMuYmF0Y2hXcml0aW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFMpKSB7Ci0JCQl0aGlzLmNhY2hlU3RhdGVtZW50c0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUklWRVIpKSB7Ci0JCQl0aGlzLmRyaXZlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgewotCQkJdGhpcy5wYXNzd29yZENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlMpKSB7Ci0JCQl0aGlzLmJpbmRQYXJhbWV0ZXJzQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEKSkgewotCQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNTaGFyZWRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UU19TSVpFKSkgewotCQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWluQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTikpIHsKLQkJCXdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYKSkgewotCQkJd3JpdGVDb25uZWN0aW9uc01heENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFKSkgewotCQkJdGhpcy5leGNsdXNpdmVDb25uZWN0aW9uTW9kZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT04pKSB7Ci0JCQl0aGlzLmxhenlDb25uZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQl0aGlzLmFkZERhdGFiYXNlQ29ubmVjdGlvblByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX05BVElWRV9TUUwsCi0JCQlOQVRJVkVfU1FMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19CQVRDSF9XUklUSU5HLAotCQkJQkFUQ0hfV1JJVElOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ0FDSEVfU1RBVEVNRU5UUywKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTLAotCQkJQklORF9QQVJBTUVURVJTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRCwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01JTiwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWCwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NSU4sCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01BWCwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTiwKLQkJCUxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19EUklWRVIsCi0JCQlEUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1VSTCwKLQkJCVVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVVNFUiwKLQkJCVVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1BBU1NXT1JELAotCQkJUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQotCS8qKgotICAgICAqIERvZXMgYWxsIHByZS10cmVhdG1lbnQgaW4gdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBwcm9wZXJ0eSBpcyBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVTZXRQcm9wZXJ0eSgpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldE5hdGl2ZVNxbCgpIHsKLQkJcmV0dXJuIHRoaXMubmF0aXZlU3FsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hdGl2ZVNxbChCb29sZWFuIG5ld05hdGl2ZVNxbCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubmF0aXZlU3FsOwotCQl0aGlzLm5hdGl2ZVNxbCA9IG5ld05hdGl2ZVNxbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShOQVRJVkVfU1FMX1BST1BFUlRZLCBuZXdOYXRpdmVTcWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFUSVZFX1NRTF9QUk9QRVJUWSwgb2xkLCBuZXdOYXRpdmVTcWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbmF0aXZlU3FsQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5uYXRpdmVTcWw7Ci0JCXRoaXMubmF0aXZlU3FsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQVRJVkVfU1FMX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TmF0aXZlU3FsKCkgewotCQlyZXR1cm4gREVGQVVMVF9OQVRJVkVfU1FMOwotCX0KLQotCS8vICoqKioqKioqKiogQmF0Y2hXcml0aW5nICoqKioqKioqKioKLQkKLQlwdWJsaWMgQmF0Y2hXcml0aW5nIGdldEJhdGNoV3JpdGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYmF0Y2hXcml0aW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCYXRjaFdyaXRpbmcoQmF0Y2hXcml0aW5nIG5ld0JhdGNoV3JpdGluZykgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3QmF0Y2hXcml0aW5nOwotCQl0aGlzLnB1dFByb3BlcnR5KEJBVENIX1dSSVRJTkdfUFJPUEVSVFksIG5ld0JhdGNoV3JpdGluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld0JhdGNoV3JpdGluZyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhdGNoV3JpdGluZ0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJhdGNoV3JpdGluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBCYXRjaFdyaXRpbmcudmFsdWVzKCkpOwotCQlCYXRjaFdyaXRpbmcgb2xkID0gdGhpcy5iYXRjaFdyaXRpbmc7Ci0JCXRoaXMuYmF0Y2hXcml0aW5nID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCQVRDSF9XUklUSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0QmF0Y2hXcml0aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9CQVRDSF9XUklUSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRDYWNoZVN0YXRlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHMoQm9vbGVhbiBuZXdDYWNoZVN0YXRlbWVudHMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNhY2hlU3RhdGVtZW50czsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHMgPSBuZXdDYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFksIG9sZCwgbmV3Q2FjaGVTdGF0ZW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FjaGVTdGF0ZW1lbnRzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHM7Ci0JCXRoaXMuY2FjaGVTdGF0ZW1lbnRzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0Q2FjaGVTdGF0ZW1lbnRzKCkgewotCQlyZXR1cm4gREVGQVVMVF9DQUNIRV9TVEFURU1FTlRTOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZVN0YXRlbWVudHNTaXplKEludGVnZXIgbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuY2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplID0gbmV3Q2FjaGVTdGF0ZW1lbnRzU2l6ZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBvbGQsIG5ld0NhY2hlU3RhdGVtZW50c1NpemUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN0YXRlbWVudHNTaXplQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5jYWNoZVN0YXRlbWVudHNTaXplOwotCQl0aGlzLmNhY2hlU3RhdGVtZW50c1NpemUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRyaXZlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlTdHJpbmcgb2xkID0gdGhpcy5kcml2ZXI7Ci0JCXRoaXMuZHJpdmVyID0gbmV3RHJpdmVyOwotCQl0aGlzLnB1dFByb3BlcnR5KERSSVZFUl9QUk9QRVJUWSwgbmV3RHJpdmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdEcml2ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRyaXZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9EUklWRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVUkwgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXJsKCkgewotCQlyZXR1cm4gdGhpcy51cmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXJsOwotCQl0aGlzLnVybCA9IG5ld1VybDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVUkxfUFJPUEVSVFksIG5ld1VybCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cmxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVJMOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRVc2VyKCkgewotCQlyZXR1cm4gdGhpcy51c2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXNlcjsKLQkJdGhpcy51c2VyID0gbmV3VXNlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShVU0VSX1BST1BFUlRZLCBuZXdVc2VyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVTRVJfUFJPUEVSVFksIG9sZCwgbmV3VXNlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXNlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVNFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFBhc3N3b3JkICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wYXNzd29yZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgbmV3UGFzc3dvcmQpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdQYXNzd29yZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShQQVNTV09SRF9QUk9QRVJUWSwgbmV3UGFzc3dvcmQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFTU1dPUkRfUFJPUEVSVFksIG9sZCwgbmV3UGFzc3dvcmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhc3N3b3JkQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBU1NXT1JEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUEFTU1dPUkQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0QmluZFBhcmFtZXRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJpbmRQYXJhbWV0ZXJzKEJvb2xlYW4gbmV3QmluZFBhcmFtZXRlcnMpIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmJpbmRQYXJhbWV0ZXJzOwotCQl0aGlzLmJpbmRQYXJhbWV0ZXJzID0gbmV3QmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMucHV0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBuZXdCaW5kUGFyYW1ldGVycyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChCSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFksIG9sZCwgbmV3QmluZFBhcmFtZXRlcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBiaW5kUGFyYW1ldGVyc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuYmluZFBhcmFtZXRlcnM7Ci0JCXRoaXMuYmluZFBhcmFtZXRlcnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEJpbmRQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gREVGQVVMVF9CSU5EX1BBUkFNRVRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlYWRDb25uZWN0aW9uc1NoYXJlZChCb29sZWFuIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgbmV3UmVhZENvbm5lY3Rpb25zU2hhcmVkKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1BST1BFUlRZLCBvbGQsIG5ld1JlYWRDb25uZWN0aW9uc1NoYXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRDb25uZWN0aW9uc1NoYXJlZENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVhZENvbm5lY3Rpb25zU2hhcmVkOwotCQl0aGlzLnJlYWRDb25uZWN0aW9uc1NoYXJlZCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB7Ci0JCXJldHVybiB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWFkQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pIHsKLQkJdGhpcy5wcmVTZXRQcm9wZXJ0eSgpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdSZWFkQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMucHV0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG5ld1JlYWRDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgb2xkLCBuZXdSZWFkQ29ubmVjdGlvbnNNaW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnJlYWRDb25uZWN0aW9uc01pbjsKLQkJdGhpcy5yZWFkQ29ubmVjdGlvbnNNaW4gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gREVGQVVMVF9SRUFEX0NPTk5FQ1RJT05TX01JTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFJlYWRDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCkgewotCQlyZXR1cm4gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVhZENvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3UmVhZENvbm5lY3Rpb25zTWF4KSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3UmVhZENvbm5lY3Rpb25zTWF4OwotCQl0aGlzLnB1dFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBuZXdSZWFkQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG9sZCwgbmV3UmVhZENvbm5lY3Rpb25zTWF4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZENvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy5yZWFkQ29ubmVjdGlvbnNNYXg7Ci0JCXRoaXMucmVhZENvbm5lY3Rpb25zTWF4ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfUkVBRF9DT05ORUNUSU9OU19NQVg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluICoqKioqKioqKioKLQlwdWJsaWMgSW50ZWdlciBnZXRXcml0ZUNvbm5lY3Rpb25zTWluKCkgewotCQlyZXR1cm4gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdyaXRlQ29ubmVjdGlvbnNNaW4oSW50ZWdlciBuZXdXcml0ZUNvbm5lY3Rpb25zTWluKSB7Ci0JCXRoaXMucHJlU2V0UHJvcGVydHkoKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW4gPSBuZXdXcml0ZUNvbm5lY3Rpb25zTWluOwotCQl0aGlzLnB1dFByb3BlcnR5KFdSSVRFX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIG9sZCwgbmV3V3JpdGVDb25uZWN0aW9uc01pbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29ubmVjdGlvbnNNaW5DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLndyaXRlQ29ubmVjdGlvbnNNaW47Ci0JCXRoaXMud3JpdGVDb25uZWN0aW9uc01pbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXREZWZhdWx0V3JpdGVDb25uZWN0aW9uc01pbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OTkVDVElPTlNfTUlOOwotCX0KLQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01heCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpIHsKLQkJcmV0dXJuIHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcml0ZUNvbm5lY3Rpb25zTWF4KEludGVnZXIgbmV3V3JpdGVDb25uZWN0aW9uc01heCkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMud3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4ID0gbmV3V3JpdGVDb25uZWN0aW9uc01heDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBvbGQsIG5ld1dyaXRlQ29ubmVjdGlvbnNNYXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbm5lY3Rpb25zTWF4Q2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJSW50ZWdlciBuZXdWYWx1ZSA9IGdldEludGVnZXJWYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUludGVnZXIgb2xkID0gdGhpcy53cml0ZUNvbm5lY3Rpb25zTWF4OwotCQl0aGlzLndyaXRlQ29ubmVjdGlvbnNNYXggPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dSSVRFX0NPTk5FQ1RJT05TX01BWDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlICoqKioqKioqKioKLQkKLQlwdWJsaWMgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSkgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci0JCXRoaXMucHV0UHJvcGVydHkoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgbmV3RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgb2xkLCBuZXdFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgbmV3VmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUudmFsdWVzKCkpOwotCQlFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBvbGQgPSB0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotCQl0aGlzLmV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlIGdldERlZmF1bHRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhenlDb25uZWN0aW9uICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRMYXp5Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF6eUNvbm5lY3Rpb24oQm9vbGVhbiBuZXdMYXp5Q29ubmVjdGlvbikgewotCQl0aGlzLnByZVNldFByb3BlcnR5KCk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMubGF6eUNvbm5lY3Rpb247Ci0JCXRoaXMubGF6eUNvbm5lY3Rpb24gPSBuZXdMYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFksIG5ld0xhenlDb25uZWN0aW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExBWllfQ09OTkVDVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdMYXp5Q29ubmVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhenlDb25uZWN0aW9uQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5sYXp5Q29ubmVjdGlvbjsKLQkJdGhpcy5sYXp5Q29ubmVjdGlvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0TGF6eUNvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX0xBWllfQ09OTkVDVElPTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3OGZmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5Qcm9maWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBDdXN0b21pemF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIEJvb2xlYW4gdGhyb3dFeGNlcHRpb25zOwotCXByaXZhdGUgV2VhdmluZyB3ZWF2aW5nOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nTGF6eTsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0NoYW5nZVRyYWNraW5nOwotCXByaXZhdGUgQm9vbGVhbiB3ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JcHJpdmF0ZSBCb29sZWFuIHdlYXZpbmdJbnRlcm5hbDsKLQlwcml2YXRlIEJvb2xlYW4gd2VhdmluZ0VhZ2VyOwotCXByaXZhdGUgQm9vbGVhbiB2YWxpZGF0aW9uT25seTsKLQlwcml2YXRlIEJvb2xlYW4gdmFsaWRhdGVTY2hlbWE7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc2Vzc2lvbkN1c3RvbWl6ZXJzOwotCXByaXZhdGUgU3RyaW5nIHByb2ZpbGVyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIFByb2ZpbGVyIG9yIGN1c3RvbSBjbGFzcwotCXByaXZhdGUgU3RyaW5nIGV4Y2VwdGlvbkhhbmRsZXI7Ci0KLQlwcml2YXRlIExpc3Q8RW50aXR5PiBlbnRpdGllczsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmVudGl0aWVzID0gbmV3IEFycmF5TGlzdDxFbnRpdHk+KCk7Ci0KLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMpOwotCQl0aGlzLndlYXZpbmcgPSAKLQkJCXRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1dFQVZJTkcsIFdlYXZpbmcudmFsdWVzKCkpOwotCQl0aGlzLndlYXZpbmdMYXp5ID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlkpOwotCQl0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkcpOwotCQl0aGlzLndlYXZpbmdGZXRjaEdyb3VwcyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19GRVRDSF9HUk9VUFMpOwotCQl0aGlzLndlYXZpbmdJbnRlcm5hbCA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTCk7Ci0JCXRoaXMud2VhdmluZ0VhZ2VyID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSKTsKLQkJdGhpcy52YWxpZGF0aW9uT25seSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZKTsKLQkJdGhpcy52YWxpZGF0ZVNjaGVtYSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVkFMSURBVEVfU0NIRU1BKTsKLQkJdGhpcy5pbml0aWFsaXplU2Vzc2lvbkN1c3RvbWl6ZXJzRnJvbVBlcnNpc3RlbmNlVW5pdCgpOwotCi0JCVNldDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnRpZXMgPSAKLQkJCXRoaXMuZ2V0UHJvcGVydGllc1NldFdpdGhQcmVmaXgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKTsKLQkJdGhpcy5pbml0aWFsaXplRW50aXRpZXNDdXN0b21pemVyQ2xhc3MocHJvcGVydGllcyk7Ci0JCQotCQl0aGlzLnByb2ZpbGVyID0gdGhpcy5nZXRQcm9maWxlclByb3BlcnR5VmFsdWUoKTsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlc3Npb25DdXN0b21pemVyc0Zyb21QZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzID0gdGhpcy5idWlsZFNlc3Npb25DdXN0b21pemVycygpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbkN1c3RvbWl6ZXJzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jb252ZXJ0VG9WYWx1ZXModGhpcy5nZXRQcm9wZXJ0aWVzU2V0V2l0aFByZWZpeChFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb1ZhbHVlcyhJdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgU3RyaW5nPihwcm9wZXJ0aWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQkJCXJldHVybiBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW50aXRpZXNDdXN0b21pemVyQ2xhc3MoU2V0PFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0aWVzKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkgOiBkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnRpZXMpIHsKLQkJCXRoaXMuc2V0RW50aXR5RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihkZXNjcmlwdG9yQ3VzdG9taXplclByb3BlcnR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIFByb2ZpbGVyIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvZmlsZXJQcm9wZXJ0eVZhbHVlKCkgewotCi0JCVN0cmluZyB2YWx1ZSA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfUFJPRklMRVIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CS8vIG5vIHByb3BlcnR5IGZvdW5kCi0JCX0KLQkJUHJvZmlsZXIgc3RhbmRhcmRQcm9maWxlciA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1BST0ZJTEVSLCBQcm9maWxlci52YWx1ZXMoKSk7Ci0JCXJldHVybiAoc3RhbmRhcmRQcm9maWxlciA9PSBudWxsKSA/IHZhbHVlIDogZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHN0YW5kYXJkUHJvZmlsZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKSkgewotCQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkcpKSB7Ci0JCQl0aGlzLndlYXZpbmdDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfTEFaWSkpIHsKLQkJCXRoaXMud2VhdmluZ0xhenlDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HKSkgewotCQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmdDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKSkgewotCQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHNDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwpKSB7Ci0JCQl0aGlzLndlYXZpbmdJbnRlcm5hbENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUikpIHsKLQkJCXRoaXMud2VhdmluZ0VhZ2VyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19WQUxJREFUSU9OX09OTFkpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Pbmx5Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUEpKSB7Ci0JCQl0aGlzLnZhbGlkYXRlU2NoZW1hQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSB7Ci0JCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0NoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIpKSB7Ci0JCQl0aGlzLmRlc2NyaXB0b3JDdXN0b21pemVyQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST0ZJTEVSKSkgewotCQkJdGhpcy5wcm9maWxlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpKSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbkhhbmRsZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUykpIHsKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkcpKSB7Ci0JCQl0aGlzLndlYXZpbmdDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19MQVpZKSkgewotCQkJdGhpcy53ZWF2aW5nTGF6eUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORykpIHsKLQkJCXRoaXMud2VhdmluZ0NoYW5nZVRyYWNraW5nQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTKSkgewotCQkJdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHNDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTCkpIHsKLQkJCXRoaXMud2VhdmluZ0ludGVybmFsQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZJTkdfRUFHRVIpKSB7Ci0JCQl0aGlzLndlYXZpbmdFYWdlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19WQUxJREFUSU9OX09OTFkpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Pbmx5Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQSkpIHsKLQkJCXRoaXMudmFsaWRhdGVTY2hlbWFDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJdGhpcy5kZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST0ZJTEVSKSkgewotCQkJdGhpcy5wcm9maWxlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUikpIHsKLQkJCXRoaXMuZXhjZXB0aW9uSGFuZGxlckNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJCi0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUywKLQkJCVRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkcsCi0JCQlXRUFWSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0xBWlksCi0JCQlXRUFWSU5HX0xBWllfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1dFQVZJTkdfSU5URVJOQUwsCi0JCQlXRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSLAotCQkJV0VBVklOR19FQUdFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZLAotCQkJVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUEsCi0JCQlWQUxJREFURV9TQ0hFTUFfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fQ1VTVE9NSVpFUiwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUFJPRklMRVIsCi0JCQlQUk9GSUxFUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIsCi0JCQlFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSk7Ci0KLQkJLy8gRG9uJ3QgbmVlZCB0byBpbml0aWFsaXplIHByb3BlcnR5TmFtZXMgZm9yOiAKLQkJLy8gZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGl0ZW0pIHsKLQkJYm9vbGVhbiBpc1Byb3BlcnR5ID0gc3VwZXIuaXRlbUlzUHJvcGVydHkoaXRlbSk7Ci0JCQotCQlpZiAoICEgaXNQcm9wZXJ0eSAmJiBpdGVtLmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGl0ZW0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIGlzUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uIG9mIHRoZSBnaXZlbgotCSAqIHByb3BlcnR5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgcHJvcGVydHlJZE9mKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSKSkgewotCQkJCXJldHVybiBERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9wZXJ0eTogIiArIHByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgRW50aXR5IGFkZEVudGl0eShTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkR1cGxpY2F0ZSBlbnRpdHk6ICIgKyBlbnRpdHlOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUVudGl0eSBuZXdFbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KGVudGl0eU5hbWUpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QobmV3RW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQkJcmV0dXJuIG5ld0VudGl0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRpdHkoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuZW50aXR5RXhpc3RzKGVudGl0eU5hbWUpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSk7Ci0JCXRoaXMuY2xlYXJFbnRpdHkoZW50aXR5KTsKLQkJdGhpcy5yZW1vdmVFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy50aHJvd0V4Y2VwdGlvbnM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRocm93RXhjZXB0aW9ucyhCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGhyb3dFeGNlcHRpb25zOwotCQl0aGlzLnRocm93RXhjZXB0aW9ucyA9IG5ld1Rocm93RXhjZXB0aW9uczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSwgb2xkLCBuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJvd0V4Y2VwdGlvbnNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocm93RXhjZXB0aW9uczsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gREVGQVVMVF9USFJPV19FWENFUFRJT05TOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0xhenkgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdMYXp5KCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nTGF6eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nTGF6eShCb29sZWFuIG5ld1dlYXZpbmdMYXp5KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nTGF6eTsKLQkJdGhpcy53ZWF2aW5nTGF6eSA9IG5ld1dlYXZpbmdMYXp5OwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfTEFaWV9QUk9QRVJUWSwgbmV3V2VhdmluZ0xhenkpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19MQVpZX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmdMYXp5KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0xhenlDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdMYXp5OwotCQl0aGlzLndlYXZpbmdMYXp5ID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0xBWllfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nTGF6eSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19MQVpZOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0NoYW5nZVRyYWNraW5nICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKSB7Ci0JCXJldHVybiB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoQm9vbGVhbiBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmc7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIG5ld1dlYXZpbmdDaGFuZ2VUcmFja2luZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nQ2hhbmdlVHJhY2tpbmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nQ2hhbmdlVHJhY2tpbmdDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdDaGFuZ2VUcmFja2luZzsKLQkJdGhpcy53ZWF2aW5nQ2hhbmdlVHJhY2tpbmcgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HX0NIQU5HRV9UUkFDS0lORzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdGZXRjaEdyb3VwcyAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCkgewotCQlyZXR1cm4gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZ0ZldGNoR3JvdXBzKEJvb2xlYW4gbmV3V2VhdmluZ0ZldGNoR3JvdXBzKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gbmV3V2VhdmluZ0ZldGNoR3JvdXBzOwotCQl0aGlzLnB1dFByb3BlcnR5KFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBuZXdXZWF2aW5nRmV0Y2hHcm91cHMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFksIG9sZCwgbmV3V2VhdmluZ0ZldGNoR3JvdXBzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2VhdmluZ0ZldGNoR3JvdXBzQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy53ZWF2aW5nRmV0Y2hHcm91cHM7Ci0JCXRoaXMud2VhdmluZ0ZldGNoR3JvdXBzID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFdlYXZpbmdGZXRjaEdyb3VwcygpIHsKLQkJcmV0dXJuIERFRkFVTFRfV0VBVklOR19GRVRDSF9HUk9VUFM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nSW50ZXJuYWwgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdJbnRlcm5hbCgpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0ludGVybmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdJbnRlcm5hbChCb29sZWFuIG5ld1dlYXZpbmdJbnRlcm5hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0ludGVybmFsOwotCQl0aGlzLndlYXZpbmdJbnRlcm5hbCA9IG5ld1dlYXZpbmdJbnRlcm5hbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nSW50ZXJuYWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nSW50ZXJuYWxDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdJbnRlcm5hbDsKLQkJdGhpcy53ZWF2aW5nSW50ZXJuYWwgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfSU5URVJOQUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nSW50ZXJuYWwoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfSU5URVJOQUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRWFnZXIgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFdlYXZpbmdFYWdlcigpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZ0VhZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFdlYXZpbmdFYWdlcihCb29sZWFuIG5ld1dlYXZpbmdFYWdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMud2VhdmluZ0VhZ2VyOwotCQl0aGlzLndlYXZpbmdFYWdlciA9IG5ld1dlYXZpbmdFYWdlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShXRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBuZXdXZWF2aW5nRWFnZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgb2xkLCBuZXdXZWF2aW5nRWFnZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nRWFnZXJDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLndlYXZpbmdFYWdlcjsKLQkJdGhpcy53ZWF2aW5nRWFnZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFdFQVZJTkdfRUFHRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRXZWF2aW5nRWFnZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1dFQVZJTkdfRUFHRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uT25seSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsaWRhdGlvbk9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Pbmx5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Pbmx5KEJvb2xlYW4gbmV3VmFsaWRhdGlvbk9ubHkpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRpb25Pbmx5OwotCQl0aGlzLnZhbGlkYXRpb25Pbmx5ID0gbmV3VmFsaWRhdGlvbk9ubHk7Ci0JCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBuZXdWYWxpZGF0aW9uT25seSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIG9sZCwgbmV3VmFsaWRhdGlvbk9ubHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uT25seUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsaWRhdGlvbk9ubHk7Ci0JCXRoaXMudmFsaWRhdGlvbk9ubHkgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRJT05fT05MWV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRpb25Pbmx5KCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxJREFUSU9OX09OTFk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0ZVNjaGVtYSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsaWRhdGVTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRlU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRlU2NoZW1hKEJvb2xlYW4gbmV3VmFsaWRhdGVTY2hlbWEpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbGlkYXRlU2NoZW1hOwotCQl0aGlzLnZhbGlkYXRlU2NoZW1hID0gbmV3VmFsaWRhdGVTY2hlbWE7Ci0JCXRoaXMucHV0UHJvcGVydHkoVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZLCBuZXdWYWxpZGF0ZVNjaGVtYSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxJREFURV9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgbmV3VmFsaWRhdGVTY2hlbWEpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVNjaGVtYUNoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsaWRhdGVTY2hlbWE7Ci0JCXRoaXMudmFsaWRhdGVTY2hlbWEgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFZhbGlkYXRlU2NoZW1hKCkgewotCQlyZXR1cm4gREVGQVVMVF9WQUxJREFURV9TQ0hFTUE7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uQ3VzdG9taXplcnMgKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBzZXNzaW9uQ3VzdG9taXplcnMoKXsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzKTsKLQl9Ci0JCi0JcHVibGljIGludCBzZXNzaW9uQ3VzdG9taXplcnNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnNlc3Npb25DdXN0b21pemVycy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2Vzc2lvbkN1c3RvbWl6ZXJFeGlzdHMoU3RyaW5nIHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSB7Ci0KLQkJZm9yIChTdHJpbmcgc2Vzc2lvbkN1c3RvbWl6ZXIgOiB0aGlzLnNlc3Npb25DdXN0b21pemVycykgewotCQkJaWYoc2Vzc2lvbkN1c3RvbWl6ZXIuZXF1YWxzKHNlc3Npb25DdXN0b21pemVyQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZFNlc3Npb25DdXN0b21pemVyKFN0cmluZyBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSl7Ci0KLQkJaWYoICEgdGhpcy5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSkpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSwgdGhpcy5zZXNzaW9uQ3VzdG9taXplcnMsIFNFU1NJT05fQ1VTVE9NSVpFUl9MSVNUKTsKLQkJCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9DVVNUT01JWkVSX1BST1BFUlRZLCBuZXdTZXNzaW9uQ3VzdG9taXplckNsYXNzTmFtZSwgdHJ1ZSk7Ci0JCQlyZXR1cm4gbmV3U2Vzc2lvbkN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlc3Npb25DdXN0b21pemVyKFN0cmluZyBjbGFzc05hbWUpewotCQlpZiAodGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoY2xhc3NOYW1lLCB0aGlzLnNlc3Npb25DdXN0b21pemVycywgU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5KFNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSwgY2xhc3NOYW1lKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlZCgpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodGhpcy5idWlsZFNlc3Npb25DdXN0b21pemVycygpLCB0aGlzLnNlc3Npb25DdXN0b21pemVycywgU0VTU0lPTl9DVVNUT01JWkVSX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZyAqKioqKioqKioqCi0JCi0JcHVibGljIFdlYXZpbmcgZ2V0V2VhdmluZygpIHsKLQkJcmV0dXJuIHRoaXMud2VhdmluZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0V2VhdmluZyhXZWF2aW5nIG5ld1dlYXZpbmcpIHsKLQkJV2VhdmluZyBvbGQgPSB0aGlzLndlYXZpbmc7Ci0JCXRoaXMud2VhdmluZyA9IG5ld1dlYXZpbmc7Ci0JCXRoaXMucHV0UHJvcGVydHkoV0VBVklOR19QUk9QRVJUWSwgbmV3V2VhdmluZyk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChXRUFWSU5HX1BST1BFUlRZLCBvbGQsIG5ld1dlYXZpbmcpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3ZWF2aW5nQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJV2VhdmluZyBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBXZWF2aW5nLnZhbHVlcygpKTsKLQkJV2VhdmluZyBvbGQgPSB0aGlzLndlYXZpbmc7Ci0JCXRoaXMud2VhdmluZyA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoV0VBVklOR19QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBXZWF2aW5nIGdldERlZmF1bHRXZWF2aW5nKCkgewotCQlyZXR1cm4gREVGQVVMVF9XRUFWSU5HOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjZXB0aW9uSGFuZGxlciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRFeGNlcHRpb25IYW5kbGVyKCkgewotCQlyZXR1cm4gdGhpcy5leGNlcHRpb25IYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbkhhbmRsZXIoU3RyaW5nIG5ld0V4Y2VwdGlvbkhhbmRsZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXhjZXB0aW9uSGFuZGxlcjsKLQkJdGhpcy5leGNlcHRpb25IYW5kbGVyID0gbmV3RXhjZXB0aW9uSGFuZGxlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgbmV3RXhjZXB0aW9uSGFuZGxlcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgb2xkLCBuZXdFeGNlcHRpb25IYW5kbGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjZXB0aW9uSGFuZGxlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmV4Y2VwdGlvbkhhbmRsZXI7Ci0JCXRoaXMuZXhjZXB0aW9uSGFuZGxlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX0VYQ0VQVElPTl9IQU5ETEVSOwotCX0KLQotCS8vICoqKioqKioqKiogRGVzY3JpcHRvckN1c3RvbWl6ZXIgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldERlc2NyaXB0b3JDdXN0b21pemVyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBuZXdEZXNjcmlwdG9yQ3VzdG9taXplcikgewotCQlFbnRpdHkgb2xkID0gdGhpcy5zZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyKTsKLQkJdGhpcy5wdXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVIsIGVudGl0eU5hbWUsIG5ld0Rlc2NyaXB0b3JDdXN0b21pemVyLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksIG9sZCwgdGhpcy5nZXRFbnRpdHlOYW1lZChlbnRpdHlOYW1lKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkZXNjcmlwdG9yQ3VzdG9taXplckNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5leHRyYWN0RW50aXR5TmFtZU9mKHByb3BlcnR5TmFtZSk7Ci0JCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZW50aXR5TmFtZSkpIHsKLQkJCUVudGl0eSBvbGQgPSB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgc3RyaW5nVmFsdWUpOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwgb2xkLCB0aGlzLmdldEVudGl0eU5hbWVkKGVudGl0eU5hbWUpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREZXNjcmlwdG9yQ3VzdG9taXplcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfREVTQ1JJUFRPUl9DVVNUT01JWkVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKFN0cmluZyBlbnRpdHlOYW1lLCBTdHJpbmcgZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUpIHsKLQkJIGlmKCggISB0aGlzLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgJiYgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkpIHsKLQkJCQkvL3RoaXMgaXMgYSBwcm9wZXJ0eSB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBhZGRlZCwgd2UgZG9uJ3QgbmVlZCB0byBkZWFsIHdpdGggaXQgdW50aWwgdGhlIHZhbHVlIGlzIHNldAotCQkJCSByZXR1cm4gbnVsbDsKLQkJCSB9Ci0JCUVudGl0eSBlbnRpdHkgPSAodGhpcy5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpID8KLQkJCQkJCXRoaXMuZ2V0RW50aXR5TmFtZWQoZW50aXR5TmFtZSkgOgotCQkJCQkJdGhpcy5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LCBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9sZCBFbnRpdHkKLQkgKi8KLQlwcml2YXRlIEVudGl0eSBzZXRFbnRpdHlEZXNjcmlwdG9yQ3VzdG9taXplck9mKEVudGl0eSBlbnRpdHksIFN0cmluZyBkZXNjcmlwdG9yQ3VzdG9taXplckNsYXNzTmFtZSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUVudGl0eSBvbGQgPSBlbnRpdHkuY2xvbmUoKTsKLQkJZW50aXR5LnNldERlc2NyaXB0b3JDdXN0b21pemVyKGRlc2NyaXB0b3JDdXN0b21pemVyQ2xhc3NOYW1lKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHVwZGF0ZSB0aGUgZGVzY3JpcHRvckN1c3RvbWl6ZXJDbGFzc05hbWUgaW4gZW50aXRpZXMuCi0JICogUmV0dXJucyB0aGUgb2xkIEVudGl0eQotCSAqLwotCXByaXZhdGUgRW50aXR5IHNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGRlc2NyaXB0b3JDdXN0b21pemVyUHJvcGVydHkpIHsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSB0aGlzLmV4dHJhY3RFbnRpdHlOYW1lT2YoZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eSk7Ci0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZW50aXR5TmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0aGlzLnNldEVudGl0eURlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSwgZGVzY3JpcHRvckN1c3RvbWl6ZXJQcm9wZXJ0eS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFByb2ZpbGVyICoqKioqKioqKioKLQkvKioKLQkgKiBSZXR1cm5zIFByb2ZpbGVyIG9yIGN1c3RvbSBwcm9maWxlciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgUHJvZmlsZXIgZW51bSBvciBjdXN0b20gcHJvZmlsZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVyKCkgewotCQlyZXR1cm4gdGhpcy5wcm9maWxlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHByb2ZpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm9maWxlciAtIFByb2ZpbGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZmlsZXIoUHJvZmlsZXIgbmV3UHJvZmlsZXIpIHsKLQkJaWYoIG5ld1Byb2ZpbGVyID09IG51bGwpIHsKLQkJCXRoaXMuc2V0UHJvZmlsZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc2V0UHJvZmlsZXJfKGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihuZXdQcm9maWxlcikpOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgcHJvZmlsZXIgb3IgY3VzdG9tIHByb2ZpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQcm9maWxlciAtCi0JICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBwcm9maWxlciBsaXRlcmFsIG9yCi0JICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIHByb2ZpbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2ZpbGVyKFN0cmluZyBuZXdQcm9maWxlcikgewotCQlpZiggbmV3UHJvZmlsZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRQcm9maWxlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJUHJvZmlsZXIgcCA9IFByb2ZpbGVyLmdldFByb2ZpbGVyRm9yKG5ld1Byb2ZpbGVyKTsKLQkJaWYocCA9PSBudWxsKSB7CS8vIGN1c3RvbSBwcm9maWxlciBjbGFzcwotCQkJdGhpcy5zZXRQcm9maWxlcl8obmV3UHJvZmlsZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRQcm9maWxlcihwKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UHJvZmlsZXJfKFN0cmluZyBuZXdQcm9maWxlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wcm9maWxlcjsKLQkJdGhpcy5wcm9maWxlciA9IG5ld1Byb2ZpbGVyOwotCQl0aGlzLnB1dFByb3BlcnR5KFBST0ZJTEVSX1BST1BFUlRZLCBuZXdQcm9maWxlcik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9GSUxFUl9QUk9QRVJUWSwgb2xkLCBuZXdQcm9maWxlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2ZpbGVyQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucHJvZmlsZXI7Ci0JCXRoaXMucHJvZmlsZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST0ZJTEVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQcm9maWxlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfUFJPRklMRVI7Ci0JfQotCi0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgYWxsIEVudGl0eSBwcm9wZXJ0aWVzIHRvIGRlZmF1bHQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRW50aXR5KEVudGl0eSBlbnRpdHkpIHsKLQkJaWYoZW50aXR5LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gZW50aXR5LmdldE5hbWUoKTsKLQkJdGhpcy5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEVudGl0eSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqLwotCXByaXZhdGUgRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCWZvcihFbnRpdHkgZW50aXR5OiB0aGlzLmVudGl0aWVzKSB7Ci0JCQlpZihlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlbnRpdHk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnRpdHkodGhpcywgbmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlpZihlbnRpdHkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoZW50aXR5LCB0aGlzLmVudGl0aWVzLCBFTlRJVElFU19MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgRW50aXR5IGV4aXN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVudGl0eUV4aXN0cyhTdHJpbmcgbmFtZSkgewotCQlmb3IoRW50aXR5IGVudGl0eTogdGhpcy5lbnRpdGllcykgewotCQkJaWYoZW50aXR5LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKioqIGVudGl0aWVzIGxpc3QgKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFbnRpdHk+IGVudGl0aWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVudGl0eT4odGhpcy5lbnRpdGllcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gZW50aXR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxFbnRpdHksIFN0cmluZz4odGhpcy5lbnRpdGllcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEVudGl0eSBlbnRpdHkpIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgaW50IGVudGl0aWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXRpZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJdGhpcy5jcmVhdGVTZXNzaW9uQ3VzdG9taXplclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJSZW5hbWVUeXBlRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0aWVzTmFtZWQoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSKTsKLQkJcmV0dXJuIChwcm9wZXJ0eSAhPSBudWxsKSA/Ci0JCQkJcHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVFeGNlcHRpb25IYW5kbGVyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJNb3ZlVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnRpZXNOYW1lZChFQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVIpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXhjZXB0aW9uSGFuZGxlck1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpOwotCQlyZXR1cm4gKHByb3BlcnR5ICE9IG51bGwpID8KLQkJCQlwcm9wZXJ0eS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMuY3JlYXRlU2Vzc2lvbkN1c3RvbWl6ZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUV4Y2VwdGlvbkhhbmRsZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNlc3Npb25DdXN0b21pemVyUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PihnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0aWVzTmFtZWQoRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQkJCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXhjZXB0aW9uSGFuZGxlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVIpOwotCQlyZXR1cm4gKHByb3BlcnR5ICE9IG51bGwpID8KLQkJCQlwcm9wZXJ0eS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rR2VuZXJhbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5ZTMxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmdlbmVyYWwuR2VuZXJhbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0dlbmVyYWxQcm9wZXJ0aWVzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBHZW5lcmFsUHJvcGVydGllcwotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBCb29sZWFuIGV4Y2x1ZGVFY2xpcHNlbGlua09ybTsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtHZW5lcmFsUHJvcGVydGllcyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm0gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSkpIHsKLQkJCWV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKSkgewotCQkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChudWxsKTsJCQkKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gRWNsaXBzZUxpbmsgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgewotCQlyZXR1cm4gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIG9sZCwgbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZlN2IyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rTG9nZ2luZwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtMb2dnaW5nIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBMb2dnaW5nCi17Ci0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIExvZ2dpbmdMZXZlbCBsZXZlbDsKLQlwcml2YXRlIEJvb2xlYW4gdGltZXN0YW1wOwotCXByaXZhdGUgQm9vbGVhbiB0aHJlYWQ7Ci0JcHJpdmF0ZSBCb29sZWFuIHNlc3Npb247Ci0JcHJpdmF0ZSBCb29sZWFuIGV4Y2VwdGlvbnM7Ci0JcHJpdmF0ZSBTdHJpbmcgbG9nRmlsZUxvY2F0aW9uOwotCXByaXZhdGUgU3RyaW5nIGxvZ2dlcjsgLy8gc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlIHNpbmNlIHZhbHVlIGNhbiBiZSBMb2dnZXIgb3IgY3VzdG9tIGNsYXNzCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rTG9nZ2luZyhQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQkvLyBUT1JFVklFVyAtIGhhbmRsZSBpbmNvcnJlY3QgU3RyaW5nIGluIHBlcnNpc3RlbmNlLnhtbAotCQl0aGlzLmxldmVsID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MRVZFTCwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJdGhpcy50aW1lc3RhbXAgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JCXRoaXMudGhyZWFkID0gCi0JCQl0aGlzLmdldEJvb2xlYW5WYWx1ZShFQ0xJUFNFTElOS19USFJFQUQpOwotCQl0aGlzLnNlc3Npb24gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT04pOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0VYQ0VQVElPTlMpOwotCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbiA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTik7Ci0JCQotCQl0aGlzLmxvZ2dlciA9IHRoaXMuZ2V0TG9nZ2VyUHJvdGVydHlWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIExvZ2dlciBwcm9wZXJ0eSBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvZ2dlclByb3RlcnR5VmFsdWUoKSB7Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19MT0dHRVIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7CS8vIG5vIHByb3BlcnR5IGZvdW5kCi0JCX0KLQkJTG9nZ2VyIHN0YW5kYXJkTG9nZ2VyID0gdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfTE9HR0VSLCBMb2dnZXIudmFsdWVzKCkpOwotCQlyZXR1cm4gKHN0YW5kYXJkTG9nZ2VyID09IG51bGwpID8gdmFsdWUgOiBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2Yoc3RhbmRhcmRMb2dnZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MRVZFTCkpIHsKLQkJCXRoaXMubGV2ZWxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RJTUVTVEFNUCkpIHsKLQkJCXRoaXMudGltZXN0YW1wQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19USFJFQUQpKSB7Ci0JCQl0aGlzLnRocmVhZENoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTikpIHsKLQkJCXRoaXMuc2Vzc2lvbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDRVBUSU9OUykpIHsKLQkJCXRoaXMuZXhjZXB0aW9uc0NoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTE9HX0ZJTEVfTE9DQVRJT04pKSB7Ci0JCQl0aGlzLmxvZ0ZpbGVMb2NhdGlvbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTE9HR0VSKSkgewotCQkJdGhpcy5sb2dnZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTEVWRUwpKSB7Ci0JCQl0aGlzLmxldmVsQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RJTUVTVEFNUCkpIHsKLQkJCXRoaXMudGltZXN0YW1wQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RIUkVBRCkpIHsKLQkJCXRoaXMudGhyZWFkQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT04pKSB7Ci0JCQl0aGlzLnNlc3Npb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRVhDRVBUSU9OUykpIHsKLQkJCXRoaXMuZXhjZXB0aW9uc0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19MT0dfRklMRV9MT0NBVElPTikpIHsKLQkJCXRoaXMubG9nRmlsZUxvY2F0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0xPR0dFUikpIHsKLQkJCXRoaXMubG9nZ2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBFY2xpcHNlTGluayBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xFVkVMLAotCQkJTEVWRUxfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RJTUVTVEFNUCwKLQkJCVRJTUVTVEFNUF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEhSRUFELAotCQkJVEhSRUFEX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OLAotCQkJU0VTU0lPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRVhDRVBUSU9OUywKLQkJCUVYQ0VQVElPTlNfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OLAotCQkJTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0xPR0dFUiwKLQkJCUxPR0dFUl9QUk9QRVJUWSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMb2dnaW5nTGV2ZWwgKioqKioqKioqKgotCQotCXB1YmxpYyBMb2dnaW5nTGV2ZWwgZ2V0TGV2ZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxldmVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMZXZlbChMb2dnaW5nTGV2ZWwgbmV3TGV2ZWwpIHsKLQkJTG9nZ2luZ0xldmVsIG9sZCA9IHRoaXMubGV2ZWw7Ci0JCXRoaXMubGV2ZWwgPSBuZXdMZXZlbDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMRVZFTF9QUk9QRVJUWSwgbmV3TGV2ZWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVWRUxfUFJPUEVSVFksIG9sZCwgbmV3TGV2ZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsZXZlbENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUxvZ2dpbmdMZXZlbCBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCQlMb2dnaW5nTGV2ZWwgb2xkID0gdGhpcy5sZXZlbDsKLQkJdGhpcy5sZXZlbCA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVWRUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRMZXZlbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTEVWRUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaW1lc3RhbXAgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRoaXMudGltZXN0YW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChCb29sZWFuIG5ld1RpbWVzdGFtcCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGltZXN0YW1wOwotCQl0aGlzLnRpbWVzdGFtcCA9IG5ld1RpbWVzdGFtcDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUSU1FU1RBTVBfUFJPUEVSVFksIG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSU1FU1RBTVBfUFJPUEVSVFksIG9sZCwgbmV3VGltZXN0YW1wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGltZXN0YW1wQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy50aW1lc3RhbXA7Ci0JCXRoaXMudGltZXN0YW1wID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUSU1FU1RBTVBfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRUaW1lc3RhbXAoKSB7Ci0JCXJldHVybiBERUZBVUxUX1RJTUVTVEFNUDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRocmVhZCAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0VGhyZWFkKCkgewotCQlyZXR1cm4gdGhpcy50aHJlYWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGhyZWFkKEJvb2xlYW4gbmV3VGhyZWFkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy50aHJlYWQ7Ci0JCXRoaXMudGhyZWFkID0gbmV3VGhyZWFkOwotCQl0aGlzLnB1dFByb3BlcnR5KFRIUkVBRF9QUk9QRVJUWSwgbmV3VGhyZWFkKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUkVBRF9QUk9QRVJUWSwgb2xkLCBuZXdUaHJlYWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0aHJlYWRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRocmVhZDsKLQkJdGhpcy50aHJlYWQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRIUkVBRF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFRocmVhZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVEhSRUFEOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbiAqKioqKioqKioqCi0JcHVibGljIEJvb2xlYW4gZ2V0U2Vzc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXNzaW9uKEJvb2xlYW4gbmV3U2Vzc2lvbikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2Vzc2lvbjsKLQkJdGhpcy5zZXNzaW9uID0gbmV3U2Vzc2lvbjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX1BST1BFUlRZLCBuZXdTZXNzaW9uKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlc3Npb25DaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNlc3Npb247Ci0JCXRoaXMuc2Vzc2lvbiA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0RGVmYXVsdFNlc3Npb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT047Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25zICoqKioqKioqKioKLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNlcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5leGNlcHRpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbnMoQm9vbGVhbiBuZXdFeGNlcHRpb25zKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5leGNlcHRpb25zOwotCQl0aGlzLmV4Y2VwdGlvbnMgPSBuZXdFeGNlcHRpb25zOwotCQl0aGlzLnB1dFByb3BlcnR5KEVYQ0VQVElPTlNfUFJPUEVSVFksIG5ld0V4Y2VwdGlvbnMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhDRVBUSU9OU19QUk9QRVJUWSwgb2xkLCBuZXdFeGNlcHRpb25zKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjZXB0aW9uc0NoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUJvb2xlYW4gbmV3VmFsdWUgPSBnZXRCb29sZWFuVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlCb29sZWFuIG9sZCA9IHRoaXMuZXhjZXB0aW9uczsKLQkJdGhpcy5leGNlcHRpb25zID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWENFUFRJT05TX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0RXhjZXB0aW9ucygpIHsKLQkJcmV0dXJuIERFRkFVTFRfRVhDRVBUSU9OUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxvZ0ZpbGVMb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxvZ0ZpbGVMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2dGaWxlTG9jYXRpb24oU3RyaW5nIG5ld0xvZ0ZpbGVMb2NhdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dGaWxlTG9jYXRpb247Ci0JCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkobmV3TG9nRmlsZUxvY2F0aW9uKSkgPyAKLQkJCQkJCQkJCQluZXdMb2dGaWxlTG9jYXRpb24gOiAKLQkJCQkJCQkJCQl0aGlzLmdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgdGhpcy5sb2dGaWxlTG9jYXRpb24pOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFksIG9sZCwgdGhpcy5sb2dGaWxlTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dGaWxlTG9jYXRpb25DaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dGaWxlTG9jYXRpb247Ci0JCXRoaXMubG9nRmlsZUxvY2F0aW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TG9nRmlsZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0dfRklMRV9MT0NBVElPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ2dlciAqKioqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyBMb2dnZXIgb3IgY3VzdG9tIGxvZ2dlciBjbGFzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIEVjbGlwc2VMaW5rIHN0cmluZyB2YWx1ZSBmb3IgTG9nZ2VyIGVudW0gb3IgY3VzdG9tIGxvZ2dlciBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nZ2VyKCkgewotCQlyZXR1cm4gdGhpcy5sb2dnZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayBsb2dnZXIuCi0JICogCi0JICogQHBhcmFtIG5ld0xvZ2dlciAtIExvZ2dlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvZ2dlcihMb2dnZXIgbmV3TG9nZ2VyKSB7Ci0JCWlmKCBuZXdMb2dnZXIgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRMb2dnZXJfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc2V0TG9nZ2VyXyhnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3TG9nZ2VyKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayBsb2dnZXIgb3IgY3VzdG9tIGxvZ2dlci4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3TG9nZ2VyIC0KLQkgKiAgICAgICAgICAgIENhbiBiZSBhIEVjbGlwc2VMaW5rIGxvZ2dlciBsaXRlcmFsIG9yCi0JICogICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY3VzdG9tIGxvZ2dlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2dnZXIoU3RyaW5nIG5ld0xvZ2dlcikgewotCQlpZiggbmV3TG9nZ2VyID09IG51bGwpIHsKLQkJCXRoaXMuc2V0TG9nZ2VyXyhudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlMb2dnZXIgbCA9IExvZ2dlci5nZXRMb2dnZXJGb3IobmV3TG9nZ2VyKTsKLQkJaWYobCA9PSBudWxsKSB7CS8vIGN1c3RvbSBMb2dnZXIgY2xhc3MKLQkJCXRoaXMuc2V0TG9nZ2VyXyhuZXdMb2dnZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRMb2dnZXIobCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldExvZ2dlcl8oU3RyaW5nIG5ld0xvZ2dlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7Ci0JCXRoaXMubG9nZ2VyID0gbmV3TG9nZ2VyOwotCQl0aGlzLnB1dFByb3BlcnR5KExPR0dFUl9QUk9QRVJUWSwgbmV3TG9nZ2VyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPR0dFUl9QUk9QRVJUWSwgb2xkLCBuZXdMb2dnZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dnZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2dnZXI7Ci0JCXRoaXMubG9nZ2VyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0dHRVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExvZ2dlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfTE9HR0VSOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlTG9nZ2VyUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVMb2dnZXJSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQkvL1RPRE8gc2VlbXMgbGlrZSB3ZSBzaG91bGQgaGF2ZSB0aGUgUHJvcGVydHkgc3RvcmVkIGluIGEgU2Vzc2lvbkN1c3RvbWl6ZXIgb2JqZWN0IGluc3RlYWQgb2YgaGF2aW5nIHRvIGdvIAotCQkvL2ZpbmQgYWxsIG9mIHRoZSBQcm9wZXJ0aWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX0xPR0dFUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlTG9nZ2VyTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTG9nZ2VyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19MT0dHRVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVMb2dnZXJSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUxvZ2dlclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJLy9maW5kIGFsbCBvZiB0aGUgUHJvcGVydGllcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19MT0dHRVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRmYmZiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldFNlcnZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtPcHRpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09wdGlvbnMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLQlpbXBsZW1lbnRzIE9wdGlvbnMKLXsKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMgKioqKioqKioqKgotCXByaXZhdGUgU3RyaW5nIHNlc3Npb25OYW1lOwotCXByaXZhdGUgU3RyaW5nIHNlc3Npb25zWG1sOwotCXByaXZhdGUgQm9vbGVhbiBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0RGF0YWJhc2U7IC8vIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZSBzaW5jZSB2YWx1ZSBjYW4gYmUgVGFyZ2V0RGF0YWJhc2Ugb3IgY3VzdG9tIGNsYXNzCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2VydmVyOyAvLyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUgc2luY2UgdmFsdWUgY2FuIGJlIFRhcmdldFNlcnZlciBvciBjdXN0b20gY2xhc3MKLQlwcml2YXRlIFN0cmluZyBldmVudExpc3RlbmVyOwotCXByaXZhdGUgQm9vbGVhbiB0ZW1wb3JhbE11dGFibGU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vIFRPUkVWSUVXIC0gaGFuZGxlIGluY29ycmVjdCBTdHJpbmcgaW4gcGVyc2lzdGVuY2UueG1sCi0JCXRoaXMuc2Vzc2lvbk5hbWUgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FKTsKLQkJdGhpcy5zZXNzaW9uc1htbCA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUyk7Ci0JCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSB0aGlzLmdldFRhcmdldERhdGFiYXNlRnJvbVBlcnNpc3RlbmNlWG1sKCk7Ci0JCXRoaXMudGFyZ2V0U2VydmVyID0gdGhpcy5nZXRUYXJnZXRTZXJ2ZXJGcm9tUGVyc2lzdGVuY2VYbWwoKTsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOwotCQl0aGlzLnRlbXBvcmFsTXV0YWJsZSA9IAotCQkJdGhpcy5nZXRCb29sZWFuVmFsdWUoRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RGF0YWJhc2VGcm9tUGVyc2lzdGVuY2VYbWwoKSB7Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJVGFyZ2V0RGF0YWJhc2Ugc3RhbmRhcmRUYXJnZXREYXRhYmFzZSA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSwgVGFyZ2V0RGF0YWJhc2UudmFsdWVzKCkpOwotCQlyZXR1cm4gKHN0YW5kYXJkVGFyZ2V0RGF0YWJhc2UgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFRhcmdldERhdGFiYXNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRTZXJ2ZXJGcm9tUGVyc2lzdGVuY2VYbWwoKSB7Ci0KLQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19UQVJHRVRfU0VSVkVSKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVRhcmdldFNlcnZlciBzdGFuZGFyZFRhcmdldFNlcnZlciA9IHRoaXMuZ2V0RW51bVZhbHVlKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIsIFRhcmdldFNlcnZlci52YWx1ZXMoKSk7Ci0JCXJldHVybiAoc3RhbmRhcmRUYXJnZXRTZXJ2ZXIgPT0gbnVsbCkgPyB2YWx1ZSA6IGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihzdGFuZGFyZFRhcmdldFNlcnZlcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fTkFNRSkpIHsKLQkJCXRoaXMuc2Vzc2lvbk5hbWVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05TX1hNTCkpIHsKLQkJCXRoaXMuc2Vzc2lvbnNYbWxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSkpIHsKLQkJCXRoaXMudGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIpKSB7Ci0JCQl0aGlzLnRhcmdldFNlcnZlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFUykpIHsKLQkJCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKSkgewotCQkJdGhpcy5ldmVudExpc3RlbmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19URU1QT1JBTF9NVVRBQkxFKSkgewotCQkJdGhpcy50ZW1wb3JhbE11dGFibGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FKSkgewotCQkJdGhpcy5zZXNzaW9uTmFtZUNoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwpKSB7Ci0JCQl0aGlzLnNlc3Npb25zWG1sQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RBUkdFVF9EQVRBQkFTRSkpIHsKLQkJCXRoaXMudGFyZ2V0RGF0YWJhc2VDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfVEFSR0VUX1NFUlZFUikpIHsKLQkJCXRoaXMudGFyZ2V0U2VydmVyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMpKSB7Ci0JCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKSkgewotCQkJdGhpcy5ldmVudExpc3RlbmVyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEUpKSB7Ci0JCQl0aGlzLnRlbXBvcmFsTXV0YWJsZUNoYW5nZWQobnVsbCk7Ci0JCX0JCi0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FLAotCQkJU0VTU0lPTl9OQU1FX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OU19YTUwsCi0JCQlTRVNTSU9OU19YTUxfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMsCi0JCQlTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0UsCi0JCQlUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVIsCi0JCQlUQVJHRVRfU0VSVkVSX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVEVNUE9SQUxfTVVUQUJMRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTZXNzaW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbk5hbWUoU3RyaW5nIG5ld1Nlc3Npb25OYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOwotCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3U2Vzc2lvbk5hbWU7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBuZXdTZXNzaW9uTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXNzaW9uTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25OYW1lOwotCQl0aGlzLnNlc3Npb25OYW1lID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OX05BTUVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25OYW1lKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uc1htbCAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTZXNzaW9uc1htbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2Vzc2lvbnNYbWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vzc2lvbnNYbWwoU3RyaW5nIG5ld1Nlc3Npb25zWG1sKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOwotCQl0aGlzLnNlc3Npb25zWG1sID0gbmV3U2Vzc2lvbnNYbWw7Ci0JCXRoaXMucHV0UHJvcGVydHkoU0VTU0lPTlNfWE1MX1BST1BFUlRZLCBuZXdTZXNzaW9uc1htbCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OU19YTUxfUFJPUEVSVFksIG9sZCwgbmV3U2Vzc2lvbnNYbWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXNzaW9uc1htbENoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNlc3Npb25zWG1sOwotCQl0aGlzLnNlc3Npb25zWG1sID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVNTSU9OU19YTUxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNlc3Npb25zWG1sKCkgewotCQlyZXR1cm4gREVGQVVMVF9TRVNTSU9OU19YTUw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHsKLQkJcmV0dXJuIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyhCb29sZWFuIG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyA9IG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSwgb2xkLCBuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllczsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUYXJnZXREYXRhYmFzZSAqKioqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyBUYXJnZXREYXRhYmFzZSBvciBjdXN0b20gdGFyZ2V0RGF0YWJhc2UgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIFRhcmdldERhdGFiYXNlIGVudW0gb3IgY3VzdG9tIHRhcmdldERhdGFiYXNlIGNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0RGF0YWJhc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBFY2xpcHNlTGluayB0YXJnZXREYXRhYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0RGF0YWJhc2UgLSBUYXJnZXREYXRhYmFzZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldERhdGFiYXNlKFRhcmdldERhdGFiYXNlIG5ld1RhcmdldERhdGFiYXNlKSB7Ci0JCWlmKCBuZXdUYXJnZXREYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnNldFRhcmdldERhdGFiYXNlXyhnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3VGFyZ2V0RGF0YWJhc2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIEVjbGlwc2VMaW5rIHRhcmdldERhdGFiYXNlIG9yIGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGFyZ2V0RGF0YWJhc2UgLQotCSAqICAgICAgICAgICAgQ2FuIGJlIGEgRWNsaXBzZUxpbmsgVGFyZ2V0RGF0YWJhc2UgbGl0ZXJhbCBvcgotCSAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKLQkJaWYoIG5ld1RhcmdldERhdGFiYXNlID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VfKChTdHJpbmcpIG51bGwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVRhcmdldERhdGFiYXNlIGN1c3RvbVRhcmdldERhdGFiYXNlID0gVGFyZ2V0RGF0YWJhc2UuZ2V0VGFyZ2V0RGF0YWJhc2VGb3IobmV3VGFyZ2V0RGF0YWJhc2UpOwotCQlpZihjdXN0b21UYXJnZXREYXRhYmFzZSA9PSBudWxsKSB7CS8vIGN1c3RvbSBUYXJnZXREYXRhYmFzZSBjbGFzcwotCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZV8obmV3VGFyZ2V0RGF0YWJhc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRUYXJnZXREYXRhYmFzZShjdXN0b21UYXJnZXREYXRhYmFzZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlXyhTdHJpbmcgbmV3VGFyZ2V0RGF0YWJhc2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RGF0YWJhc2U7Ci0JCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSBuZXdUYXJnZXREYXRhYmFzZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUQVJHRVRfREFUQUJBU0VfUFJPUEVSVFksIG5ld1RhcmdldERhdGFiYXNlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgb2xkLCBuZXdUYXJnZXREYXRhYmFzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRhcmdldERhdGFiYXNlQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0RGF0YWJhc2U7Ci0JCXRoaXMudGFyZ2V0RGF0YWJhc2UgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfREFUQUJBU0U7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUYXJnZXRTZXJ2ZXIgKioqKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgVGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MuCi0JICogCi0JICogQHJldHVybiBFY2xpcHNlTGluayBzdHJpbmcgdmFsdWUgZm9yIFRhcmdldFNlcnZlciBlbnVtIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldFNlcnZlcigpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0U2VydmVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUYXJnZXRTZXJ2ZXIgLSBUYXJnZXRTZXJ2ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTZXJ2ZXIoVGFyZ2V0U2VydmVyIG5ld1RhcmdldFNlcnZlcikgewotCQlpZiggbmV3VGFyZ2V0U2VydmVyID09IG51bGwpIHsKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyXygoU3RyaW5nKSBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1RhcmdldFNlcnZlcikpOwotCX0KLQotCS8qKgotCSAqIFNldHMgRWNsaXBzZUxpbmsgdGFyZ2V0U2VydmVyIG9yIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JICogCi0JICogQHBhcmFtIG5ld1RhcmdldFNlcnZlciAtCi0JICogICAgICAgICAgICBDYW4gYmUgYSBFY2xpcHNlTGluayBUYXJnZXRTZXJ2ZXIgbGl0ZXJhbCBvcgotCSAqICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0U2VydmVyKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKLQkJaWYoIG5ld1RhcmdldFNlcnZlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFRhcmdldFNlcnZlcl8oKFN0cmluZykgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFyZ2V0U2VydmVyIGN1c3RvbVRhcmdldFNlcnZlciA9IFRhcmdldFNlcnZlci5nZXRUYXJnZXRTZXJ2ZXJGb3IobmV3VGFyZ2V0U2VydmVyKTsKLQkJaWYoY3VzdG9tVGFyZ2V0U2VydmVyID09IG51bGwpIHsJLy8gY3VzdG9tIFRhcmdldFNlcnZlciBjbGFzcwotCQkJdGhpcy5zZXRUYXJnZXRTZXJ2ZXJfKG5ld1RhcmdldFNlcnZlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFRhcmdldFNlcnZlcihjdXN0b21UYXJnZXRTZXJ2ZXIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJfKFN0cmluZyBuZXdUYXJnZXRTZXJ2ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0U2VydmVyOwotCQl0aGlzLnRhcmdldFNlcnZlciA9IG5ld1RhcmdldFNlcnZlcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBuZXdUYXJnZXRTZXJ2ZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgb2xkLCBuZXdUYXJnZXRTZXJ2ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0YXJnZXRTZXJ2ZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRTZXJ2ZXI7Ci0JCXRoaXMudGFyZ2V0U2VydmVyID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQVJHRVRfU0VSVkVSX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0U2VydmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9UQVJHRVRfU0VSVkVSOwotCX0KLQotCS8vICoqKioqKioqKiogRXZlbnRMaXN0ZW5lciAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRFdmVudExpc3RlbmVyKCkgewotCQlyZXR1cm4gdGhpcy5ldmVudExpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV2ZW50TGlzdGVuZXIoU3RyaW5nIG5ld0V2ZW50TGlzdGVuZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5ldmVudExpc3RlbmVyID0gbmV3RXZlbnRMaXN0ZW5lcjsKLQkJdGhpcy5wdXRQcm9wZXJ0eShTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZLCBuZXdFdmVudExpc3RlbmVyKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG9sZCwgbmV3RXZlbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV2ZW50TGlzdGVuZXJDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5ldmVudExpc3RlbmVyOwotCQl0aGlzLmV2ZW50TGlzdGVuZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFU1NJT05fRVZFTlRfTElTVEVORVJfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NFU1NJT05fRVZFTlRfTElTVEVORVI7Ci0JfQotCQotCS8vICoqKioqKioqKiogVGVtcG9yYWxNdXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBCb29sZWFuIGdldFRlbXBvcmFsTXV0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGVtcG9yYWxNdXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuIG5ld1RlbXBvcmFsTXV0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudGVtcG9yYWxNdXRhYmxlOwotCQl0aGlzLnRlbXBvcmFsTXV0YWJsZSA9IG5ld1RlbXBvcmFsTXV0YWJsZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShURU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBuZXdUZW1wb3JhbE11dGFibGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEVNUE9SQUxfTVVUQUJMRV9QUk9QRVJUWSwgb2xkLCBuZXdUZW1wb3JhbE11dGFibGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZW1wb3JhbE11dGFibGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlCb29sZWFuIG5ld1ZhbHVlID0gZ2V0Qm9vbGVhblZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnRlbXBvcmFsTXV0YWJsZTsKLQkJdGhpcy50ZW1wb3JhbE11dGFibGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXREZWZhdWx0VGVtcG9yYWxNdXRhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9URU1QT1JBTF9NVVRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRXZlbnRMaXN0ZW5lclJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXZlbnRMaXN0ZW5lclJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KEVDTElQU0VMSU5LX1NFU1NJT05fRVZFTlRfTElTVEVORVIpOwotCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHByb3BlcnR5LmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUV2ZW50TGlzdGVuZXJNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVFdmVudExpc3RlbmVyTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShFQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSKTsKLQkJaWYgKHByb3BlcnR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBwcm9wZXJ0eS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlRXZlbnRMaXN0ZW5lclJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlRXZlbnRMaXN0ZW5lclJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoRUNMSVBTRUxJTktfU0VTU0lPTl9FVkVOVF9MSVNURU5FUik7Ci0JCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MWJhYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbiBlbmNhcHN1bGF0ZXMgRWNsaXBzZUxpbmsgU2NoZW1hR2VuZXJhdGlvbgotICogcHJvcGVydGllcy4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdGlvbgotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBPdXRwdXRNb2RlIG91dHB1dE1vZGU7Ci0JcHJpdmF0ZSBEZGxHZW5lcmF0aW9uVHlwZSBkZGxHZW5lcmF0aW9uVHlwZTsKLQlwcml2YXRlIFN0cmluZyBjcmVhdGVGaWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBkcm9wRmlsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb25Mb2NhdGlvbjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IAotCQkJdGhpcy5nZXRFbnVtVmFsdWUoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsIE91dHB1dE1vZGUudmFsdWVzKCkpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSk7Ci0JCXRoaXMuZHJvcEZpbGVOYW1lID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKTsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IGtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5Ci0JICoga2V5OyB2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSwKLQkJCU9VVFBVVF9NT0RFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFLAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfQ1JFQVRFX0ZJTEVfTkFNRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FLAotCQkJRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0FQUExJQ0FUSU9OX0xPQ0FUSU9OLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSkpIHsKLQkJCXRoaXMub3V0cHV0TW9kZUNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSkpIHsKLQkJCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRSkpIHsKLQkJCXRoaXMuZHJvcEZpbGVOYW1lQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTikpIHsKLQkJCXRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbkNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFKSkgewotCQkJdGhpcy5vdXRwdXRNb2RlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUpKSB7Ci0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUUpKSB7Ci0JCQl0aGlzLmNyZWF0ZUZpbGVOYW1lQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RST1BfRklMRV9OQU1FKSkgewotCQkJdGhpcy5kcm9wRmlsZU5hbWVDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04pKSB7Ci0JCQl0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb25DaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBEZGxHZW5lcmF0aW9uVHlwZSAqKioqKioqKioqCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlIGdldERkbEdlbmVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZGxHZW5lcmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZGxHZW5lcmF0aW9uVHlwZShEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5UeXBlKSB7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdEZGxHZW5UeXBlOwotCQl0aGlzLnB1dFByb3BlcnR5KERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG5ld0RkbEdlblR5cGUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdEZGxHZW5UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGRsR2VuZXJhdGlvblR5cGVDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSk7Ci0JCURkbEdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuZGRsR2VuZXJhdGlvblR5cGU7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBEZGxHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RETF9HRU5FUkFUSU9OX1RZUEU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPdXRwdXRNb2RlICoqKioqKioqKioKLQlwdWJsaWMgT3V0cHV0TW9kZSBnZXRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5vdXRwdXRNb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE91dHB1dE1vZGUoT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlKSB7Ci0JCU91dHB1dE1vZGUgb2xkID0gdGhpcy5vdXRwdXRNb2RlOwotCQl0aGlzLm91dHB1dE1vZGUgPSBuZXdPdXRwdXRNb2RlOwotCQl0aGlzLnB1dFByb3BlcnR5KE9VVFBVVF9NT0RFX1BST1BFUlRZLCBuZXdPdXRwdXRNb2RlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9VVFBVVF9NT0RFX1BST1BFUlRZLCBvbGQsIG5ld091dHB1dE1vZGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvdXRwdXRNb2RlQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJT3V0cHV0TW9kZSBuZXdWYWx1ZSA9IGdldEVudW1WYWx1ZU9mKHN0cmluZ1ZhbHVlLCBPdXRwdXRNb2RlLnZhbHVlcygpKTsKLQkJT3V0cHV0TW9kZSBvbGQgPSB0aGlzLm91dHB1dE1vZGU7Ci0JCXRoaXMub3V0cHV0TW9kZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1VUUFVUX01PREVfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRNb2RlIGdldERlZmF1bHRPdXRwdXRNb2RlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGVGaWxlTmFtZShTdHJpbmcgbmV3Q3JlYXRlRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY3JlYXRlRmlsZU5hbWU7Ci0JCXRoaXMuY3JlYXRlRmlsZU5hbWUgPSBuZXdDcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBuZXdDcmVhdGVGaWxlTmFtZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0NyZWF0ZUZpbGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRmlsZU5hbWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jcmVhdGVGaWxlTmFtZTsKLQkJdGhpcy5jcmVhdGVGaWxlTmFtZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0NSRUFURV9GSUxFX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkcm9wRmlsZU5hbWUgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJvcEZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kcm9wRmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RHJvcEZpbGVOYW1lKFN0cmluZyBuZXdEcm9wRmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZHJvcEZpbGVOYW1lOwotCQl0aGlzLmRyb3BGaWxlTmFtZSA9IG5ld0Ryb3BGaWxlTmFtZTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShEUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSwgbmV3RHJvcEZpbGVOYW1lKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld0Ryb3BGaWxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BGaWxlTmFtZUNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyb3BGaWxlTmFtZTsKLQkJdGhpcy5kcm9wRmlsZU5hbWUgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERST1BfRklMRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcm9wRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX0RST1BfRklMRV9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogYXBwbGljYXRpb25Mb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uTG9jYXRpb24oU3RyaW5nIG5ld0FwcGxpY2F0aW9uTG9jYXRpb24pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkobmV3QXBwbGljYXRpb25Mb2NhdGlvbikpID8gCi0JCQkJCQkJCQkJCQluZXdBcHBsaWNhdGlvbkxvY2F0aW9uIDogCi0JCQkJCQkJCQkJCQl0aGlzLmdldERlZmF1bHRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCXRoaXMucHV0UHJvcGVydHkoQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFksIHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCB0aGlzLmFwcGxpY2F0aW9uTG9jYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBsaWNhdGlvbkxvY2F0aW9uQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuYXBwbGljYXRpb25Mb2NhdGlvbjsKLQkJdGhpcy5hcHBsaWNhdGlvbkxvY2F0aW9uID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQVBQTElDQVRJT05fTE9DQVRJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2RkbGdlbi9BYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTFhODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0Fic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmdlbi5BYnN0cmFjdEpwdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkRhbGkgRWNsaXBzZUxpbmsgVGFibGUgR2VuZXJhdGlvbiI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERETF9HRU5fUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4iOyAgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0NMQVNTID0gRERMX0dFTl9QQUNLQUdFX05BTUUgKyAiLk1haW4iOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19ERExfR0VOX0pBUl9QUkVGSVggPSBERExfR0VOX1BBQ0tBR0VfTkFNRSArICJfIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9DTEFTU1BBVEggPSAiQnVuZGxlLUNsYXNzUGF0aCI7CSAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OQU1FID0gImxvZ2luLnByb3BlcnRpZXMiOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOwkgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7CSAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSAiTk9ORSI7CSAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgcHVOYW1lOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKEphdmFDb3JlLmNyZWF0ZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSkpOwotCQl0aGlzLnB1TmFtZSA9IHB1TmFtZTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdW5jaENvbmZpZ05hbWUoKSB7Ci0JCXJldHVybiBMQVVOQ0hfQ09ORklHX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVHlwZSgpIHsKLQkJcmV0dXJuIEVDTElQU0VMSU5LX0RETF9HRU5fQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRCb290c3RyYXBKYXJQcmVmaXgoKSB7Ci0JCXJldHVybiBFQ0xJUFNFTElOS19ERExfR0VOX0pBUl9QUkVGSVg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByZUdlbmVyYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDIpOwotCQkvL2Rpc2Nvbm5lY3Qgc2luY2UgdGhlIHJ1bnRpbWUgcHJvdmlkZXIgd2lsbCBuZWVkIHRvIGNvbm5lY3QgdG8gZ2VuZXJhdGUgdGhlIHRhYmxlcwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLmRpc2Nvbm5lY3QoKTsKLQkJCXNtLndvcmtlZCgxKTsKLQkJfQotCQlzbS5zZXRXb3JrUmVtYWluaW5nKDEpOwotCQl0aGlzLnNhdmVMb2dpblByb3BlcnRpZXMoKTsKLQkJc20ud29ya2VkKDEpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3N0R2VuZXJhdGUoKSB7Ci0JCXN1cGVyLnBvc3RHZW5lcmF0ZSgpOwotCQl0aGlzLnJlY29ubmVjdCgpOwotCQl0aGlzLnZhbGlkYXRlUHJvamVjdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogU2V0dGluZyBMYXVuY2ggQ29uZmlndXJhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lmeVByb2dyYW1Bcmd1bWVudHMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0aGlzLmFwcGVuZFB1TmFtZUFyZ3VtZW50KHByb2dyYW1Bcmd1bWVudHMpOwotCQl0aGlzLmFwcGVuZFByb3BlcnRpZXNGaWxlQXJndW1lbnQocHJvZ3JhbUFyZ3VtZW50cyk7Ci0JCXRoaXMuYXBwZW5kRGVidWdBcmd1bWVudChwcm9ncmFtQXJndW1lbnRzKTsKLQkJCi0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9HUkFNX0FSR1VNRU5UUywgcHJvZ3JhbUFyZ3VtZW50cy50b1N0cmluZygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCS8vIERETF9HRU4gamFyCi0JCWNsYXNzcGF0aC5hZGQoZ2V0Qm9vdHN0cmFwSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gT3NnaSBCdW5kbGVzCi0JCWNsYXNzcGF0aC5hZGRBbGwodGhpcy5nZXRQZXJzaXN0ZW5jZU9zZ2lCdW5kbGVzTWVtZW50bygpKTsKLQkJLy8gSkRCQyBqYXIKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldEpkYmNKYXJDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvL3JlY29ubmVjdCBzaW5jZSB3ZSBkaXNjb25uZWN0ZWQgaW4gcHJlR2VuZXJhdGUoKTsKLQkvL2Vuc3VyZSB0aGUgcHJvamVjdCBpcyBmdWxseSB1cGRhdGVkIGJlZm9yZSB2YWxpZGF0aW5nIC0gYnVnIDI3NzIzNgotCXByb3RlY3RlZCB2b2lkIHJlY29ubmVjdCgpIHsKLQkJZ2V0SnBhUHJvamVjdCgpLnVwZGF0ZUFuZFdhaXQoKTsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCAhPSBudWxsKSB7Ci0JCQljcC5jb25uZWN0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByb2plY3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCVZhbGlkYXRlSm9iIGpvYiA9IG5ldyBWYWxpZGF0ZUpvYihwcm9qZWN0KTsKLQkJam9iLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZShwcm9qZWN0KSk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2xhc3NwYXRoRW50cnkgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJUnVudGltZUNsYXNzcGF0aEVudHJ5IGdldEpkYmNKYXJDbGFzc3BhdGhFbnRyeSgpIHsKLQkJcmV0dXJuIGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeSh0aGlzLmJ1aWxkSmRiY0phclBhdGgoKSk7Ci0JfQotCQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShTdHJpbmcgYnVuZGxlSWQpIHsKLQkJSVBhdGggcGVyc2lzdENsYXNzcGF0aCA9IHRoaXMuZ2V0QnVuZGxlQ2xhc3NwYXRoKGJ1bmRsZUlkKTsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBidW5kbGVFbnRyeSA9IGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShwZXJzaXN0Q2xhc3NwYXRoKTsKLQkJCi0JCXJldHVybiBidW5kbGVFbnRyeTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAgCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX0JJTkRfUEFSQU1FVEVSUywKLQkJCUZBTFNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTG9nZ2luZ1Byb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfTEVWRUwsCi0JCQlMb2dnaW5nTGV2ZWwuRklORSk7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUxvZ2dpbmcuRUNMSVBTRUxJTktfVElNRVNUQU1QLAotCQkJRkFMU0UpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RIUkVBRCwKLQkJCUZBTFNFKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19TRVNTSU9OLAotCQkJRkFMU0UpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX0VYQ0VQVElPTlMsCi0JCQlUUlVFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDdXN0b21pemF0aW9uUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLAotCQkJVFJVRSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHB1dFByb3BlcnR5KFByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXByb3BlcnRpZXMucHV0KGtleSwgKHZhbHVlID09IG51bGwpID8gIiIgOiB2YWx1ZSk7CSAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEFsbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMuYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZENvbm5lY3Rpb25Qb29saW5nUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZExvZ2dpbmdQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQl0aGlzLmJ1aWxkQ3VzdG9taXphdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCXRoaXMuYnVpbGRERExNb2RlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJdGhpcy5idWlsZFByb2plY3RMb2NhdGlvblByb3BlcnR5KHByb3BlcnRpZXMpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQcm9qZWN0TG9jYXRpb25Qcm9wZXJ0eShQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT04sCi0JCQl0aGlzLnByb2plY3RMb2NhdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZERETE1vZGVQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURkbEdlbmVyYXRpb25UeXBlLkRST1BfQU5EX0NSRUFURV9UQUJMRVMpOwotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsICAKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUsCi0JCQlPdXRwdXRNb2RlLkRBVEFCQVNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29ubmVjdGlvblBvb2xpbmdQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVELAotCQkJVFJVRSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzYXZlTG9naW5Qcm9wZXJ0aWVzKCkgewotCQlTdHJpbmcgcHJvcGVydGllc0ZpbGUgID0gdGhpcy5wcm9qZWN0TG9jYXRpb24gKyAiLyIgKyBQUk9QRVJUSUVTX0ZJTEVfTkFNRTsgCSAgLy8kTk9OLU5MUy0xJAotCi0JCVByb3BlcnRpZXMgZWxQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQl0aGlzLmJ1aWxkQWxsUHJvcGVydGllcyhlbFByb3BlcnRpZXMpOwotCQlGaWxlT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JICAgIHRyeSB7Ci0JICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkgJiYgISBmaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJjcmVhdGVOZXdGaWxlKCkgZmFpbGVkOiAiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCSAgICAgICAgZWxQcm9wZXJ0aWVzLnN0b3JlKHN0cmVhbSwgbnVsbCk7Ci0JICAgIH0KLQkgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICAgIAlTdHJpbmcgbWVzc2FnZSA9ICJFcnJvciBzYXZpbmc6ICIgKyBwcm9wZXJ0aWVzRmlsZTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSwgZSk7Ci0JCX0KLQkgICAgZmluYWxseSB7Ci0JICAgIAl0aGlzLmNsb3NlU3RyZWFtKHN0cmVhbSk7Ci0JICAgIH0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNsb3NlU3RyZWFtKE91dHB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0gICAgCQl0cnkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLSAgICAJfQkJCi0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdmFsaWRhdGlvbiBhZnRlciB0YWJsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGVKb2IgZXh0ZW5kcyBKb2IgCi0JewkKLQkJcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQkKLQkJCi0JCXB1YmxpYyBWYWxpZGF0ZUpvYihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzdXBlcihKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfSk9CKTsKLQkJCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS52YWxpZGF0ZSgKLQkJCQkJbmV3IElQcm9qZWN0W10ge3RoaXMucHJvamVjdH0sIHRydWUsIGZhbHNlLCBtb25pdG9yKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJc3RhdHVzID0gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSVBhdGggYnVpbGRKZGJjSmFyUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBQYXRoKHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Ecml2ZXJKYXJMaXN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRKcGFQcm9qZWN0Q29ubmVjdGlvbkRyaXZlckphckxpc3QoKSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlyZXR1cm4gKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJKYXJMaXN0KCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyAqKioqKioqKioqIE1haW4gYXJndW1lbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBhcHBlbmRQdU5hbWVBcmd1bWVudChTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKCIgLXB1IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMucHVOYW1lKTsKLQkJc2IuYXBwZW5kKCJcIiIpOwkgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFByb3BlcnRpZXNGaWxlQXJndW1lbnQoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZCgiIC1wIFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMucHJvamVjdExvY2F0aW9uKS5hcHBlbmQoIi8iKS5hcHBlbmQoUFJPUEVSVElFU19GSUxFX05BTUUpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCQotCQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBCdW5kbGVzICoqKioqKioqKgotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGVyc2lzdGVuY2VPc2dpQnVuZGxlc01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJaWYgKGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSkgewotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KEpBVkFYX1BFUlNJU1RFTkNFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQkJcmVzdWx0LmFkZCh0aGlzLmdldEJ1bmRsZUNsYXNzcGF0aEVudHJ5KE9SR19FQ0xJUFNFX1BFUlNJU1RFTkNFX0FOVExSX0JVTkRMRSkuZ2V0TWVtZW50bygpKTsKLQkJCXJlc3VsdC5hZGQodGhpcy5nZXRCdW5kbGVDbGFzc3BhdGhFbnRyeShPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgSVBhdGggZ2V0QnVuZGxlQ2xhc3NwYXRoKFN0cmluZyBwbHVnaW5JRCkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihwbHVnaW5JRCArICIgY2Fubm90IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBQbGF0Zm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3NQYXRoKGJ1bmRsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRDbGFzc1BhdGgoQnVuZGxlIGJ1bmRsZSkgewotCQlTdHJpbmcgcGF0aCA9IGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KEJVTkRMRV9DTEFTU1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlwYXRoID0gIi4iOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcihCVU5ETEVfQ0xBU1NQQVRILCBwYXRoKTsKLQkJfQotCQljYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIGJ1bmRsZSBoZWFkZXI6ICIgKyBidW5kbGUsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKLQkJCQlNYW5pZmVzdEVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoIi4iLmVxdWFscyh2YWx1ZSkpIHsJICAvLyROT04tTkxTLTEkCi0JCQkJCXZhbHVlID0gIi8iOwkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlVUkwgdXJsID0gYnVuZGxlLmdldEVudHJ5KHZhbHVlKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCVVSTCByZXNvbHZlZFVSTCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCQkJCVN0cmluZyBmaWxlc3RyaW5nID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHJlc29sdmVkVVJMKS5nZXRGaWxlKCk7Ci0JCSAgICAgICAgICAgICAgICBpZiAoZmlsZXN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJICAgICAgICAgICAgICAgIAlmaWxlc3RyaW5nID0gZmlsZXN0cmluZy5zdWJzdHJpbmcoZmlsZXN0cmluZy5pbmRleE9mKCc6JykgKyAxKTsKLQkJICAgICAgICAgICAgICAgIH0KLQkJICAgICAgICAgICAgICAgIGlmIChmaWxlc3RyaW5nLmVuZHNXaXRoKCIhLyIpKSB7CQkvLyROT04tTkxTLTEkCi0JCSAgICAgICAgICAgICAgICAJZmlsZXN0cmluZyA9IGZpbGVzdHJpbmcuc3Vic3RyaW5nKDAsIGZpbGVzdHJpbmcubGFzdEluZGV4T2YoJyEnKSk7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlc3RyaW5nKTsKLQkJCQkJCVN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkJCQkJcmV0dXJuIG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIGxvY2F0aW5nIGJ1bmRsZTogIiArIGJ1bmRsZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGphdmF4UGVyc2lzdGVuY2VCdW5kbGVFeGlzdHMoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUoSkFWQVhfUEVSU0lTVEVOQ0VfQlVORExFKSAhPSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBWF9QRVJTSVNURU5DRV9CVU5ETEUgPSAiamF2YXgucGVyc2lzdGVuY2UiOwkJCQkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9DT1JFX0JVTkRMRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9BU01fQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfUEVSU0lTVEVOQ0VfQU5UTFJfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9QRVJTSVNURU5DRV9KUEFfQlVORExFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSI7CS8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk1YzdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rRExMR2VuZXJhdG9yIGxhdW5jaGVzIHRoZSBFY2xpcHNlTGluayBEREwgZ2VuZXJhdG9yIGluIGEgc2VwYXJhdGUgVk0uCi0gKiAgRm9yIHRoaXMgaXQgd2lsbCBjcmVhdGUgYSBKYXZhIENvbmZpZ3VyYXRpb24gbmFtZWQgIkRhbGkgRWNsaXBzZUxpbmsgVGFibGUgR2VuZXJhdGlvbiIgCi0gKiAgaW4gdGhlIHRhcmdldCB3b3Jrc3BhY2UgKG5vdGU6IHRoZSBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBhdCBlYWNoIHJ1bikuCi0gKiAgSXQgd2lsbCB0aGFuIGxhdW5jaCB0aGUgY29uZmlndXJhdGlvbiBjcmVhdGVkIHdpdGggdGhlIGxvZ2luIGluZm9ybWF0aW9uIGZyb20gCi0gKiAgdGhlIGN1cnJlbnQgRGFsaSBwcm9qZWN0LCBhbmQgcGFzc2VzIGl0IHRvIEVjbGlwc2VMaW5rLgotICogIAotICogIFByZS1yZXEgaW4gUERFIGVudmlyb25tZW50OgotICogIAlvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLmphciBpbiBFQ0xJUFNFX0hPTUUvcGx1Z2lucwotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtERExHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwdU5hbWUgPT0gbnVsbCB8fCBwdU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFY2xpcHNlTGlua0RETEdlbmVyYXRvcihwdU5hbWUsIHByb2plY3QpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHB1TmFtZSwganBhUHJvamVjdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJc3VwZXIuYnVpbGRDb25uZWN0aW9uUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLCAKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VUkwsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVIsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUNvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzMDJlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92LkpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwubGlidmFsLkFic3RyYWN0T3NnaUJ1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0T3NnaUJ1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcganBhQ29uZmlnIAotCQkJCT0gKEpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlNYXA8U3RyaW5nLCBWZXJzaW9uUmFuZ2VbXT4gYnVuZGxlVmVyc2lvblJhbmdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+KCk7Ci0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gPSBqcGFDb25maWcuZ2V0SnBhUGxhdGZvcm0oKTsKLQkJaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzAuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8xLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMi5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMiwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjIsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbnRsciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8yXzAuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjAsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8xLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbmV3IFZlcnNpb25SYW5nZVtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIil9KTsgLy8kTk9OLU5MUy0xJAotCQkJYnVuZGxlVmVyc2lvblJhbmdlcy5wdXQoCi0JCQkJCSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEiLCAvLyROT04tTkxTLTEkCi0JCQkJCW5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpfSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KAotCQkJCQkib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dCgKLQkJCQkJIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFudGxyIiwgLy8kTk9OLU5MUy0xJAotCQkJCQluZXcgVmVyc2lvblJhbmdlW10ge25ldyBWZXJzaW9uUmFuZ2UoIlsyLjEsIDMuMCkiKX0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHZhbGlkYXRlKGpwYUNvbmZpZywgYnVuZGxlVmVyc2lvblJhbmdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua1VzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNGZmMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VjbGlwc2VMaW5rVXNlckxpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FY2xpcHNlTGlua0xpYlZhbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotLyoqCi0gKiBMaWJyYXJ5IHZhbGlkYXRvciBmb3IgRWNsaXBzZUxpbmsgdXNlciBsaWJyYXJpZXMuCi0gKiAKLSAqIEluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgZWNsaXBzZWxpbmsuamFyIGlzIHByZXNlbnQgaW4gdGhlIHVzZXIgbGlicmFyeSwgdGhlIHZlcnNpb24KLSAqIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gc3RhbmRhcmQgRWNsaXBzZUxpbmsgbGlicmFyaWVzIHdpbGwgYmUgZXhhbWluZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gKiB1bmlvbiBvZiBjYWxjdWxhdGVkIHZlcnNpb24gcmFuZ2VzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtVc2VyTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyAKLQkJCQk9IChKcGFVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0ganBhQ29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCVNldDxWZXJzaW9uUmFuZ2U+IHZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaFNldDxWZXJzaW9uUmFuZ2U+KCk7Ci0JCQotCQlpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMi5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMS4yLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMC5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4wLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMS5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4xLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXJldHVybiBFY2xpcHNlTGlua0xpYlZhbFV0aWwudmFsaWRhdGUoanBhQ29uZmlnLnJlc29sdmUoKSwgdmVyc2lvblJhbmdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwMGI1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0VjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMi5FY2xpcHNlTGluazFfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JZXh0ZW5kcyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotewotCS8qKgotCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElEYXRhTW9kZWxPcGVyYXRpb24gZ2V0RGVmYXVsdE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihnZXREYXRhTW9kZWwoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmVyc2lvbigpIHsKLQkJaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0cnkgewotCQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoCi0JCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkuZ2V0VmVyc2lvbigpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkvLyBlY2xpcHNlbGluayBjb250ZW50IG5vdCBzdXBwb3J0ZWQgZm9yIHByb2plY3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbikgewotCQlyZXR1cm4gZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTikKLQkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsxXzIuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEVjbGlwc2VMaW5rMl8wLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhFY2xpcHNlTGluazJfMS5TQ0hFTUFfVkVSU0lPTikKLQkJCQl8fCBmaWxlVmVyc2lvbi5lcXVhbHMoRWNsaXBzZUxpbmsyXzIuU0NIRU1BX1ZFUlNJT04pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihTdHJpbmcgZmlsZVZlcnNpb24sIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHsKLQkJLy8gYXNzdW1lIHRoYXQgcGxhdGZvcm0gaGFzIGJlZW4gcG9saWNlZCBmb3IgZmFjZXQgdmVyc2lvbiBhbHJlYWR5Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZFBsYXRmb3JtSWQoU3RyaW5nIGlkKSB7Ci0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKGlkKTsKLQkJaWYgKHBsYXRmb3JtID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gRWNsaXBzZUxpbmtQbGF0Zm9ybS5HUk9VUC5lcXVhbHMocGxhdGZvcm0uZ2V0R3JvdXAoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU3M2EzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24oSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJc3VwZXIoZGF0YU1vZGVsKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlci5nZXRYbWxSZXNvdXJjZVByb3ZpZGVyKGZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTM2NjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljQ29sbGVjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NDQ1NzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNNYXAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmU0ZjIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVjNjY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2hhbmdlVHJhY2tpbmcKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjhiZDdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJlMDU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIChNZW1iZXIpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhhYTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DdXN0b21pemVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYwODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuRXhpc3RlbmNlQ2hlY2tpbmcKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlMTBkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NTE1MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5NdXRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgKEF0dHJpYnV0ZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhNjA2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcikgcGFyZW50LCAoTWVtYmVyKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg1NmMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSAKLQkJCT0gbmV3IEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZTgyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpdmF0ZU93bmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjIyNzQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZE9ubHkKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKSBwYXJlbnQsIChUeXBlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlYjE5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDExNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgKE1lbWJlcikgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RiMmQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxM2ViYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIpIHBhcmVudCwgKE1lbWJlcikgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyKSBwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMTkyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCAoQXR0cmlidXRlKSBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24oKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzNiNTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuV3JpdGVUcmFuc2Zvcm1lcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKSBwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigoSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSkgcGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNDU2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZTwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFR5cGUodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2l6ZQotCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCWlmIChzaXplICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFNpemUoc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2hhcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0U2hhcmVkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpIHsKLQkJaWYgKHNoYXJlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRTaGFyZWQoc2hhcmVkKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuIGFsd2F5c1JlZnJlc2gpIHsKLQkJaWYgKGFsd2F5c1JlZnJlc2ggIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0QWx3YXlzUmVmcmVzaChhbHdheXNSZWZyZXNoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QWx3YXlzUmVmcmVzaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiByZWZyZXNoIG9ubHkgaWYgbmV3ZXIKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlpZiAocmVmcmVzaE9ubHlJZk5ld2VyICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihyZWZyZXNoT25seUlmTmV3ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogZGlzYWJsZSBoaXRzCi0JcHVibGljIEJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpIHsKLQkJaWYgKGRpc2FibGVIaXRzICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldERpc2FibGVIaXRzKGRpc2FibGVIaXRzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGlzYWJsZXNIaXRzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGNvb3JkaW5hdGlvbiB0eXBlCi0JcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmIChjb29yZGluYXRpb25UeXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldENvb3JkaW5hdGlvblR5cGUoY29vcmRpbmF0aW9uVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogZXhwaXJ5Ci0JcHVibGljIEludGVnZXIgZ2V0RXhwaXJ5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKLQkJaWYgKGV4cGlyeSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRFeHBpcnkoZXhwaXJ5KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFkZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbigpLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWQxOWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGU7Ci0KLS8qKgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEpvaW5GZXRjaFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg3ODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotewkKLQlwcm90ZWN0ZWQgTnVsbEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JLy8gKioqKiogZmV0Y2gKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCWlmIChmZXRjaCAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRGZXRjaChmZXRjaCk7Ci0JCX0JCQkJCi0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKG9wdGlvbmFsICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQkJfQkJCQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwODc2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQ29sdW1uQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24oRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gZ2V0V3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgdGhpcy5wYXJlbnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2x1bW5Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkuYWRkQ29sdW1uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWFlOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIGRhdGFUeXBlOwotCVN0cmluZyBvYmplY3RUeXBlOwotCi0KLQlCaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5idWlsZERhdGFUeXBlKCk7Ci0JCXRoaXMub2JqZWN0VHlwZSA9IHRoaXMuYnVpbGRPYmplY3RUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREYXRhVHlwZV8odGhpcy5idWlsZERhdGFUeXBlKCkpOwotCQl0aGlzLnNldE9iamVjdFR5cGVfKHRoaXMuYnVpbGRPYmplY3RUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBkYXRhIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREYXRhVHlwZShTdHJpbmcgZGF0YVR5cGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERhdGFUeXBlXyhTdHJpbmcgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVFlQRV9QUk9QRVJUWSwgb2xkLCBkYXRhVHlwZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVHlwZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldERhdGFUeXBlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogb2JqZWN0IHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZShTdHJpbmcgb2JqZWN0VHlwZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T2JqZWN0VHlwZV8oU3RyaW5nIG9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gb2JqZWN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9UWVBFX1BST1BFUlRZLCBvbGQsIG9iamVjdFR5cGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RUeXBlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4NjM3Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MzlkOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uCi17Ci0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTc1OWE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBDYWNoZVR5cGUgdHlwZTsKLQlwcml2YXRlIEludGVnZXIgc2l6ZTsKLQlwcml2YXRlIEJvb2xlYW4gc2hhcmVkOwotCXByaXZhdGUgSW50ZWdlciBleHBpcnk7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OwotCXByaXZhdGUgQm9vbGVhbiBhbHdheXNSZWZyZXNoOwotCXByaXZhdGUgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOwotCXByaXZhdGUgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQkJdGhpcy5zaXplID0gdGhpcy5idWlsZFNpemUoKTsKLQkJdGhpcy5zaGFyZWQgPSB0aGlzLmJ1aWxkU2hhcmVkKCk7Ci0JCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gdGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKTsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSB0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSB0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gdGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vIFRPRE8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFR5cGVfKHRoaXMuYnVpbGRUeXBlKCkpOwotCQl0aGlzLnNldFNpemVfKHRoaXMuYnVpbGRTaXplKCkpOwotCQl0aGlzLnNldFNoYXJlZF8odGhpcy5idWlsZFNoYXJlZCgpKTsKLQkJdGhpcy5zZXRFeHBpcnlfKHRoaXMuYnVpbGRFeHBpcnkoKSk7Ci0JCXRoaXMudXBkYXRlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRoaXMuc2V0QWx3YXlzUmVmcmVzaF8odGhpcy5idWlsZEFsd2F5c1JlZnJlc2goKSk7Ci0JCXRoaXMuc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyh0aGlzLmJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQl0aGlzLnNldERpc2FibGVIaXRzXyh0aGlzLmJ1aWxkRGlzYWJsZUhpdHMoKSk7Ci0JCXRoaXMuc2V0Q29vcmRpbmF0aW9uVHlwZV8odGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVfKENhY2hlVHlwZSB0eXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZSgpIHsKLQkJcmV0dXJuIENhY2hlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNpemU7Ci0JCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTSVpFX1BST1BFUlRZLCBvbGQsIHNpemUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNpemUoKSB7Ci0JCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fU0laRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHNoYXJlZAotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2hhcmVkXyhCb29sZWFuIHNoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkOwotCQl0aGlzLnNoYXJlZCA9IHNoYXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9QUk9QRVJUWSwgb2xkLCBzaGFyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFNoYXJlZCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19TSEFSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGV4cGlyeQotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4cGlyeShJbnRlZ2VyIGV4cGlyeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5XyhJbnRlZ2VyIGV4cGlyeSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuZXhwaXJ5OwotCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9QUk9QRVJUWSwgb2xkLCBleHBpcnkpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZEV4cGlyeSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGV4cGlyeSB0aW1lIG9mIGRheQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZ2V0RXhwaXJ5VGltZU9mRGF5KCkgewotCQlyZXR1cm4gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCUlBbm5vdGF0aW9uIGpkdFRpbWVPZkRheSA9IHRoaXMuZ2V0SmR0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXJldHVybiAoamR0VGltZU9mRGF5ID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRUaW1lT2ZEYXkoamR0VGltZU9mRGF5KTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZFRpbWVPZkRheShJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgamR0VGltZU9mRGF5KTsKLQl9Ci0KLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldEpkdEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIChJQW5ub3RhdGlvbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBleHBpcnlUaW1lT2ZEYXkpIHsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIG9sZCA9IHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IGV4cGlyeVRpbWVPZkRheTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSwgb2xkLCBleHBpcnlUaW1lT2ZEYXkpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRXhwaXJ5VGltZU9mRGF5KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLS8vCQlJQW5ub3RhdGlvbiBqZHRUaW1lT2ZEYXkgPSB0aGlzLmdldEpkdEV4cGlyeVRpbWVPZkRheSgpOwotLy8JCWlmIChqZHRUaW1lT2ZEYXkgPT0gbnVsbCkgewotLy8JCQl0aGlzLnNldEV4cGlyeVRpbWVPZkRheShudWxsKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotLy8JCQkJdGhpcy5zZXRFeHBpcnlUaW1lT2ZEYXkodGhpcy5idWlsZFRpbWVPZkRheShqZHRUaW1lT2ZEYXkpKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LnVwZGF0ZShqZHRUaW1lT2ZEYXkpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGltZU9mRGF5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QWx3YXlzUmVmcmVzaF8oQm9vbGVhbiBhbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5hbHdheXNSZWZyZXNoOwotCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSBhbHdheXNSZWZyZXNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19BTFdBWVNfUkVGUkVTSCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBbHdheXNSZWZyZXNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlZnJlc2ggb25seSBpZiBuZXdlcgotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyXyhCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcikgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyOwotCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9QUk9QRVJUWSwgb2xkLCByZWZyZXNoT25seUlmTmV3ZXIpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlcigpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmcmVzaE9ubHlJZk5ld2VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGRpc2FibGUgaGl0cwotCXB1YmxpYyBCb29sZWFuIGdldERpc2FibGVIaXRzKCkgewotCQlyZXR1cm4gdGhpcy5kaXNhYmxlSGl0czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXNhYmxlSGl0cyhCb29sZWFuIGRpc2FibGVIaXRzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNhYmxlSGl0c18oQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuZGlzYWJsZUhpdHM7Ci0JCXRoaXMuZGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0FCTEVfSElUU19QUk9QRVJUWSwgb2xkLCBkaXNhYmxlSGl0cyk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkRGlzYWJsZUhpdHMoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fRElTQUJMRV9ISVRTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlXyhDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSkgewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBjb29yZGluYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoKSB7Ci0JCXJldHVybiBDYWNoZUNvb3JkaW5hdGlvblR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5ZWNiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2hhbmdlVHJhY2tpbmcKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbgotewotCXByaXZhdGUgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vIFRPRE8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSkgewotCQlDaGFuZ2VUcmFja2luZ1R5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlVHJhY2tpbmdUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBDaGFuZ2VUcmFja2luZ1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDMzYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQotICovCi1maW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQlwcml2YXRlIFN0cmluZyBvYmplY3RWYWx1ZTsKLQotCi0JQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGF0YVZhbHVlID0gdGhpcy5idWlsZERhdGFWYWx1ZSgpOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERhdGFWYWx1ZV8odGhpcy5idWlsZERhdGFWYWx1ZSgpKTsKLQkJdGhpcy5zZXRPYmplY3RWYWx1ZV8odGhpcy5idWlsZE9iamVjdFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRhdGEgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREYXRhVmFsdWVfKFN0cmluZyBkYXRhVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEFfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGF0YVZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogb2JqZWN0IHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPYmplY3RWYWx1ZV8oU3RyaW5nIG9iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm9iamVjdFZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIG9sZCwgb2JqZWN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkT2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjMTA3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSVF9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk1YmY4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBjb252ZXJ0ZXJDbGFzczsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gdGhpcy5idWlsZENvbnZlcnRlckNsYXNzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldENvbnZlcnRlckNsYXNzXyh0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb252ZXJ0ZXIgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlckNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbnZlcnRlckNsYXNzXyhTdHJpbmcgY29udmVydGVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXJDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DT05WRVJURVJfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjYTNkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDdXN0b21pemVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQkKLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVJfX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OWU4ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VDaGVja2luZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBFeGlzdGVuY2VUeXBlIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhFeGlzdGVuY2VUeXBlIHZhbHVlKSB7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgRXhpc3RlbmNlVHlwZSBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gRXhpc3RlbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lOR19fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmQ5Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGU7Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByaXZhdGUgSm9pbkZldGNoVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeUpvaW5GZXRjaEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEpvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJSm9pbkZldGNoVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBKb2luRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM2MjllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KLXsKLQlwcml2YXRlIEJvb2xlYW4gdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTXV0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5NVVRBQkxFX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2ZTczNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBuYW1lOwotCi0JQmluYXJ5RWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXROYW1lRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk3ZDg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZTsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXM7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0T2JqZWN0VmFsdWVfKHRoaXMuYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCXRoaXMudXBkYXRlQ29udmVyc2lvblZhbHVlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RGF0YVR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRPYmplY3RUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotCS8vICoqKioqKioqKiogT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGVmYXVsdCBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgZGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWVfKFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE9iamVjdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZSA9IGRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGVmYXVsdE9iamVjdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGNvbnZlcnNpb24gdmFsdWVzCi0JcHVibGljIExpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGNvbnZlcnNpb25WYWx1ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPih0aGlzLmNvbnZlcnNpb25WYWx1ZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29udmVyc2lvblZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2ZDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWVzLmluZGV4T2YoY29udmVyc2lvblZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gYnVpbGRDb252ZXJzaW9uVmFsdWVzKCkgewotCQlPYmplY3RbXSBqZHRDb252ZXJzaW9uVmFsdWVzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyk7Ci0JCVZlY3RvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPihqZHRDb252ZXJzaW9uVmFsdWVzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdENvbnZlcnNpb25WYWx1ZSA6IGpkdENvbnZlcnNpb25WYWx1ZXMpIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdENvbnZlcnNpb25WYWx1ZSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb252ZXJzaW9uVmFsdWVzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzOGQyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaW1hcnlLZXkKLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Q0ZWEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBjZDEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlJlYWRPbmx5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY3ZGU3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX1RSQU5TRk9STUVSX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjJmOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb252ZXJ0ZXIKLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihTdHJpbmcgY29udmVydGVyKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb252ZXJ0ZXJfKFN0cmluZyBjb252ZXJ0ZXIpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29udmVydGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udmVydGVyKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZGVmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRpbWVPZkRheQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLXsKLQlwcml2YXRlIEludGVnZXIgaG91cjsKLQlwcml2YXRlIEludGVnZXIgbWludXRlOwotCXByaXZhdGUgSW50ZWdlciBzZWNvbmQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbGxpc2Vjb25kOwotCi0KLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuaG91ciA9IHRoaXMuYnVpbGRIb3VyKCk7Ci0JCXRoaXMubWludXRlID0gdGhpcy5idWlsZE1pbnV0ZSgpOwotCQl0aGlzLnNlY29uZCA9IHRoaXMuYnVpbGRTZWNvbmQoKTsKLQkJdGhpcy5taWxsaXNlY29uZCA9IHRoaXMuYnVpbGRNaWxsaXNlY29uZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRIb3VyXyh0aGlzLmJ1aWxkSG91cigpKTsKLQkJdGhpcy5zZXRNaW51dGVfKHRoaXMuYnVpbGRNaW51dGUoKSk7Ci0JCXRoaXMuc2V0U2Vjb25kXyh0aGlzLmJ1aWxkU2Vjb25kKCkpOwotCQl0aGlzLnNldE1pbGxpc2Vjb25kXyh0aGlzLmJ1aWxkTWlsbGlzZWNvbmQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRpbWVPZkRheUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogaG91cgotCXB1YmxpYyBJbnRlZ2VyIGdldEhvdXIoKSB7Ci0JCXJldHVybiB0aGlzLmhvdXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SG91cihJbnRlZ2VyIGhvdXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhvdXJfKEludGVnZXIgaG91cikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuaG91cjsKLQkJdGhpcy5ob3VyID0gaG91cjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhPVVJfUFJPUEVSVFksIG9sZCwgaG91cik7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkSG91cigpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZX19IT1VSKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEhvdXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogbWludXRlCi0JcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgewotCQlyZXR1cm4gdGhpcy5taW51dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbmV3TWludXRlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNaW51dGVfKEludGVnZXIgbmV3TWludXRlKSB7Ci0JCUludGVnZXIgb2xkTWludXRlID0gdGhpcy5taW51dGU7Ci0JCXRoaXMubWludXRlID0gbmV3TWludXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGRNaW51dGUsIG5ld01pbnV0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTWludXRlKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTlVURSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogc2Vjb25kCi0JcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWNvbmRfKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkU2Vjb25kID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gbmV3U2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGRTZWNvbmQsIG5ld1NlY29uZCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2Vjb25kKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX1NFQ09ORCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogbWlsbGlzZWNvbmQKLQlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWlsbGlzZWNvbmRfKEludGVnZXIgbmV3TWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgbmV3TWlsbGlzZWNvbmQpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbGxpc2Vjb25kKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTExJU0VDT05EKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NWIzYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotewotCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOwotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQotCi0JcHVibGljIEJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goKTsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGZXRjaF8odGhpcy5idWlsZEZldGNoKCkpOwotCQl0aGlzLnNldE9wdGlvbmFsXyh0aGlzLmJ1aWxkT3B0aW9uYWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fRkVUQ0gpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX09QVElPTkFMKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOWE4ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5RWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdHJhbnNmb3JtZXJDbGFzczsKLQlwcml2YXRlIFN0cmluZyBtZXRob2Q7Ci0KLQotCUJpbmFyeUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzcyA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCXRoaXMubWV0aG9kID0gdGhpcy5idWlsZE1ldGhvZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VHJhbnNmb3JtZXJDbGFzc18odGhpcy5idWlsZFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCXRoaXMuc2V0TWV0aG9kXyh0aGlzLmJ1aWxkTWV0aG9kKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdHJhbnNmb3JtZXIgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXJDbGFzcyhTdHJpbmcgdHJhbnNmb3JtZXJDbGFzcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHJhbnNmb3JtZXJDbGFzc18oU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHJhbnNmb3JtZXJDbGFzczsKLQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzID0gdHJhbnNmb3JtZXJDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TRk9STUVSX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRyYW5zZm9ybWVyQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHJhbnNmb3JtZXJDbGFzcygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUcmFuc2Zvcm1lckNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIG1ldGhvZAotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1ldGhvZF8oU3RyaW5nIG1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5tZXRob2Q7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVUSE9EX1BST1BFUlRZLCBvbGQsIG1ldGhvZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRNZXRob2QoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0MTdkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDA3YThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlZhcmlhYmxlT25lVG9PbmUKLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOGNhM2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW47Ci0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5Bbm5vdGF0aW9uIG51bGxDb2x1bW47Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCQl0aGlzLm51bGxDb2x1bW4gPSB0aGlzLmJ1aWxkTnVsbENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVDb2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5VHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29sdW1uCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogdGhpcy5udWxsQ29sdW1uOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oKSB7Ci0JCUlBbm5vdGF0aW9uIGpkdENvbHVtbiA9IHRoaXMuZ2V0SmR0Q29sdW1uKCk7Ci0JCXJldHVybiAoamR0Q29sdW1uID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRDb2x1bW4oamR0Q29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGROdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gbmV3IE51bGxFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJDb2x1bW5Bbm5vdGF0aW9uKHRoaXMpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZENvbHVtbihJQW5ub3RhdGlvbiBqZHRDb2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlDb2x1bW5Bbm5vdGF0aW9uKHRoaXMsIGpkdENvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSBJQW5ub3RhdGlvbiBnZXRKZHRDb2x1bW4oKSB7Ci0JCXJldHVybiAoSUFubm90YXRpb24pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX0NPTFVNTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbHVtbihDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlDb2x1bW5Bbm5vdGF0aW9uIG9sZCA9IHRoaXMuY29sdW1uOwotCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW4pOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLS8vCQlJQW5ub3RhdGlvbiBqZHRDb2x1bW4gPSB0aGlzLmdldEpkdENvbHVtbigpOwotLy8JCWlmIChqZHRDb2x1bW4gPT0gbnVsbCkgewotLy8JCQl0aGlzLnNldENvbHVtbihudWxsKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotLy8JCQkJdGhpcy5zZXRDb2x1bW4odGhpcy5idWlsZENvbHVtbihqZHRDb2x1bW4pKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCXRoaXMuY29sdW1uLnVwZGF0ZShqZHRDb2x1bW4pOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjZjZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHlwZUNvbnZlcnRlcgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYXRhVHlwZUFkYXB0ZXI7Ci0JU3RyaW5nIGRhdGFUeXBlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlTdHJpbmcgZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlib29sZWFuIGZxRGF0YVR5cGVTdGFsZSA9IHRydWU7Ci0KLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VHlwZUFkYXB0ZXI7Ci0JU3RyaW5nIG9iamVjdFR5cGU7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbiNmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqLwotCVN0cmluZyBmdWxseVF1YWxpZmllZE9iamVjdFR5cGU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JYm9vbGVhbiBmcU9iamVjdFR5cGVTdGFsZSA9IHRydWU7Ci0KLQotCVNvdXJjZUJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhKTsKLQkJdGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcih0aGlzLmdldERhdGFUeXBlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMuZGF0YVR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGF0YVR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCi0JCXRoaXMub2JqZWN0VHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcih0aGlzLmdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5vYmplY3RUeXBlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLm9iamVjdFR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQkgLy8gZmFsc2UgPSBkbyBub3QgcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZGFhLCBlbGVtZW50TmFtZSwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmRhdGFUeXBlID0gdGhpcy5idWlsZERhdGFUeXBlKGFzdFJvb3QpOwotCQl0aGlzLm9iamVjdFR5cGUgPSB0aGlzLmJ1aWxkT2JqZWN0VHlwZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNEYXRhVHlwZSh0aGlzLmJ1aWxkRGF0YVR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNPYmplY3RUeXBlKHRoaXMuYnVpbGRPYmplY3RUeXBlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuZGF0YVR5cGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5vYmplY3RUeXBlID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYXNlVHlwZUNvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGF0YSB0eXBlCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRhdGFUeXBlLCBkYXRhVHlwZSkpIHsKLQkJCXRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsKLQkJCXRoaXMuZnFEYXRhVHlwZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMuZGF0YVR5cGVBZGFwdGVyLnNldFZhbHVlKGRhdGFUeXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGF0YVR5cGUoU3RyaW5nIGFzdERhdGFUeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRhdGFUeXBlLCBhc3REYXRhVHlwZSkpIHsKLQkJCXRoaXMuc3luY0RhdGFUeXBlXyhhc3REYXRhVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0RhdGFUeXBlXyhTdHJpbmcgYXN0RGF0YVR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0YVR5cGU7Ci0JCXRoaXMuZGF0YVR5cGUgPSBhc3REYXRhVHlwZTsKLQkJdGhpcy5mcURhdGFUeXBlU3RhbGUgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9UWVBFX1BST1BFUlRZLCBvbGQsIGFzdERhdGFUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERhdGFUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhdGFUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5kYXRhVHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldERhdGFUeXBlRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBkYXRhIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCWlmICh0aGlzLmZxRGF0YVR5cGVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZERhdGFUeXBlID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKTsKLQkJCXRoaXMuZnFEYXRhVHlwZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWREYXRhVHlwZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5kYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWREYXRhVHlwZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkRGF0YVR5cGVfKCkgewotCQlyZXR1cm4gQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmRhdGFUeXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYnVpbGRBU1RSb290KCkpKTsKLQl9Ci0KLQkvLyAqKioqKiBvYmplY3QgdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9iamVjdFR5cGUsIG9iamVjdFR5cGUpKSB7Ci0JCQl0aGlzLm9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQkJdGhpcy5mcU9iamVjdFR5cGVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLm9iamVjdFR5cGVBZGFwdGVyLnNldFZhbHVlKG9iamVjdFR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPYmplY3RUeXBlKFN0cmluZyBhc3RPYmplY3RUeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9iamVjdFR5cGUsIGFzdE9iamVjdFR5cGUpKSB7Ci0JCQl0aGlzLnN5bmNPYmplY3RUeXBlXyhhc3RPYmplY3RUeXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jT2JqZWN0VHlwZV8oU3RyaW5nIGFzdE9iamVjdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VHlwZTsKLQkJdGhpcy5vYmplY3RUeXBlID0gYXN0T2JqZWN0VHlwZTsKLQkJdGhpcy5mcU9iamVjdFR5cGVTdGFsZSA9IHRydWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPQkpFQ1RfVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RPYmplY3RUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE9iamVjdFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub2JqZWN0VHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5vYmplY3RUeXBlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgb2JqZWN0IHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJaWYgKHRoaXMuZnFPYmplY3RUeXBlU3RhbGUpIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRPYmplY3RUeXBlID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpOwotCQkJdGhpcy5mcU9iamVjdFR5cGVTdGFsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLm9iamVjdFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkT2JqZWN0VHlwZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMub2JqZWN0VHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0NWZjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkJhc2ljQ29sbGVjdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4YjZjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljTWFwQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5CYXNpY01hcAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQkKLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTYyY2Q5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRZUEVfQURBUFRFUiA9IGJ1aWxkVHlwZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVBZGFwdGVyOwotCXByaXZhdGUgQ2FjaGVUeXBlIHR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBTSVpFX0FEQVBURVIgPSBidWlsZFNpemVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2l6ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNpemU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBTSEFSRURfQURBUFRFUiA9IGJ1aWxkU2hhcmVkQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHNoYXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHNoYXJlZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IEFMV0FZU19SRUZSRVNIX0FEQVBURVIgPSBidWlsZEFsd2F5c1JlZnJlc2hBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWx3YXlzUmVmcmVzaEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGFsd2F5c1JlZnJlc2g7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfQURBUFRFUiA9IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IERJU0FCTEVfSElUU19BREFQVEVSID0gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkaXNhYmxlSGl0c0FkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGRpc2FibGVIaXRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDT09SRElOQVRJT05fVFlQRV9BREFQVEVSID0gYnVpbGRDb29yZGluYXRpb25UeXBlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEVYUElSWV9BREFQVEVSID0gYnVpbGRFeHBpcnlBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZXhwaXJ5QWRhcHRlcjsKLQlwcml2YXRlIEludGVnZXIgZXhwaXJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUiA9IGJ1aWxkRXhwaXJ5VGltZU9mRGF5QWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGV4cGlyeVRpbWVPZkRheUFkYXB0ZXI7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gZXhwaXJ5VGltZU9mRGF5OwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcGFyZW50LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBUWVBFX0FEQVBURVIpOwotCQl0aGlzLnNpemVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgU0laRV9BREFQVEVSKTsKLQkJdGhpcy5zaGFyZWRBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odHlwZSwgU0hBUkVEX0FEQVBURVIpOwotCQl0aGlzLmFsd2F5c1JlZnJlc2hBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odHlwZSwgQUxXQVlTX1JFRlJFU0hfQURBUFRFUik7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHR5cGUsIFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSKTsKLQkJdGhpcy5kaXNhYmxlSGl0c0FkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0eXBlLCBESVNBQkxFX0hJVFNfQURBUFRFUik7Ci0JCXRoaXMuY29vcmRpbmF0aW9uVHlwZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIENPT1JESU5BVElPTl9UWVBFX0FEQVBURVIpOwotCQl0aGlzLmV4cGlyeUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCBFWFBJUllfQURBUFRFUik7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlciA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodHlwZSwgRVhQSVJZX1RJTUVfT0ZfREFZX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnR5cGUgPSB0aGlzLmJ1aWxkVHlwZShhc3RSb290KTsKLQkJdGhpcy5zaXplID0gdGhpcy5idWlsZFNpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2hhcmVkID0gdGhpcy5idWlsZFNoYXJlZChhc3RSb290KTsKLQkJdGhpcy5hbHdheXNSZWZyZXNoID0gdGhpcy5idWlsZEFsd2F5c1JlZnJlc2goYXN0Um9vdCk7Ci0JCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID0gdGhpcy5idWlsZFJlZnJlc2hPbmx5SWZOZXdlcihhc3RSb290KTsKLQkJdGhpcy5kaXNhYmxlSGl0cyA9IHRoaXMuYnVpbGREaXNhYmxlSGl0cyhhc3RSb290KTsKLQkJdGhpcy5jb29yZGluYXRpb25UeXBlID0gdGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZXhwaXJ5ID0gdGhpcy5idWlsZEV4cGlyeShhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplRXhwaXJ5VGltZU9mRGF5KGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRXhwaXJ5VGltZU9mRGF5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheUFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4cGlyeVRpbWVPZkRheSA9IHRoaXMuYnVpbGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCXRoaXMuZXhwaXJ5VGltZU9mRGF5LmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVHlwZSh0aGlzLmJ1aWxkVHlwZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1NpemUodGhpcy5idWlsZFNpemUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNTaGFyZWQodGhpcy5idWlsZFNoYXJlZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Fsd2F5c1JlZnJlc2godGhpcy5idWlsZEFsd2F5c1JlZnJlc2goYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZWZyZXNoT25seUlmTmV3ZXIodGhpcy5idWlsZFJlZnJlc2hPbmx5SWZOZXdlcihhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Rpc2FibGVIaXRzKHRoaXMuYnVpbGREaXNhYmxlSGl0cyhhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Nvb3JkaW5hdGlvblR5cGUodGhpcy5idWlsZENvb3JkaW5hdGlvblR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNFeHBpcnkodGhpcy5idWlsZEV4cGlyeShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudHlwZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnNpemUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5zaGFyZWQgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5hbHdheXNSZWZyZXNoID09IG51bGwpICYmCi0JCQkJKHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyID09IG51bGwpICYmCi0JCQkJKHRoaXMuZGlzYWJsZUhpdHMgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5jb29yZGluYXRpb25UeXBlID09IG51bGwpICYmCi0JCQkJKHRoaXMuZXhwaXJ5ID09IG51bGwpICYmCi0JCQkJKHRoaXMuZXhwaXJ5VGltZU9mRGF5ID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHlwZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHlwZSwgdHlwZSkpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKENhY2hlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodHlwZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlKENhY2hlVHlwZSBhc3RUeXBlKSB7Ci0JCUNhY2hlVHlwZSBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IGFzdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX1BST1BFUlRZLCBvbGQsIGFzdFR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGVUeXBlIGJ1aWxkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FjaGVUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFRZUEVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogc2l6ZQotCXB1YmxpYyBJbnRlZ2VyIGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2l6ZShJbnRlZ2VyIHNpemUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc2l6ZSwgc2l6ZSkpIHsKLQkJCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCQl0aGlzLnNpemVBZGFwdGVyLnNldFZhbHVlKHNpemUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTaXplKEludGVnZXIgYXN0U2l6ZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc2l6ZTsKLQkJdGhpcy5zaXplID0gYXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNJWkVfUFJPUEVSVFksIG9sZCwgYXN0U2l6ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2l6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zaXplQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTSVpFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHNoYXJlZAotCXB1YmxpYyBCb29sZWFuIGdldFNoYXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hhcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIHNoYXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zaGFyZWQsIHNoYXJlZCkpIHsKLQkJCXRoaXMuc2hhcmVkID0gc2hhcmVkOwotCQkJdGhpcy5zaGFyZWRBZGFwdGVyLnNldFZhbHVlKHNoYXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1NoYXJlZChCb29sZWFuIGFzdFNoYXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc2hhcmVkOwotCQl0aGlzLnNoYXJlZCA9IGFzdFNoYXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNIQVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RTaGFyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFNoYXJlZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zaGFyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0hBUkVEX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGFsd2F5cyByZWZyZXNoCi0JcHVibGljIEJvb2xlYW4gZ2V0QWx3YXlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuYWx3YXlzUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gYWx3YXlzUmVmcmVzaCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5hbHdheXNSZWZyZXNoLCBhbHdheXNSZWZyZXNoKSkgewotCQkJdGhpcy5hbHdheXNSZWZyZXNoID0gYWx3YXlzUmVmcmVzaDsKLQkJCXRoaXMuYWx3YXlzUmVmcmVzaEFkYXB0ZXIuc2V0VmFsdWUoYWx3YXlzUmVmcmVzaCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Fsd2F5c1JlZnJlc2goQm9vbGVhbiBhc3RBbHdheXNSZWZyZXNoKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5hbHdheXNSZWZyZXNoOwotCQl0aGlzLmFsd2F5c1JlZnJlc2ggPSBhc3RBbHdheXNSZWZyZXNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksIG9sZCwgYXN0QWx3YXlzUmVmcmVzaCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQWx3YXlzUmVmcmVzaChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbHdheXNSZWZyZXNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShBTFdBWVNfUkVGUkVTSF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiByZWZyZXNoIG9ubHkgaWYgbmV3ZXIKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlZnJlc2hPbmx5SWZOZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyLCByZWZyZXNoT25seUlmTmV3ZXIpKSB7Ci0JCQl0aGlzLnJlZnJlc2hPbmx5SWZOZXdlciA9IHJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJCXRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlci5zZXRWYWx1ZShyZWZyZXNoT25seUlmTmV3ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiBhc3RSZWZyZXNoT25seUlmTmV3ZXIpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlZnJlc2hPbmx5SWZOZXdlcjsKLQkJdGhpcy5yZWZyZXNoT25seUlmTmV3ZXIgPSBhc3RSZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksIG9sZCwgYXN0UmVmcmVzaE9ubHlJZk5ld2VyKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaE9ubHlJZk5ld2VyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZnJlc2hPbmx5SWZOZXdlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFJFRlJFU0hfT05MWV9JRl9ORVdFUl9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNhYmxlIGhpdHMKLQlwdWJsaWMgQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpIHsKLQkJcmV0dXJuIHRoaXMuZGlzYWJsZUhpdHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBkaXNhYmxlSGl0cykgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kaXNhYmxlSGl0cywgZGlzYWJsZUhpdHMpKSB7Ci0JCQl0aGlzLmRpc2FibGVIaXRzID0gZGlzYWJsZUhpdHM7Ci0JCQl0aGlzLmRpc2FibGVIaXRzQWRhcHRlci5zZXRWYWx1ZShkaXNhYmxlSGl0cyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Rpc2FibGVIaXRzKEJvb2xlYW4gYXN0RGlzYWJsZUhpdHMpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmRpc2FibGVIaXRzOwotCQl0aGlzLmRpc2FibGVIaXRzID0gYXN0RGlzYWJsZUhpdHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNBQkxFX0hJVFNfUFJPUEVSVFksIG9sZCwgYXN0RGlzYWJsZUhpdHMpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZERpc2FibGVIaXRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRpc2FibGVIaXRzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKERJU0FCTEVfSElUU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjb29yZGluYXRpb24gdHlwZQotCXB1YmxpYyBDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29vcmRpbmF0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvb3JkaW5hdGlvblR5cGUsIGNvb3JkaW5hdGlvblR5cGUpKSB7Ci0JCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBjb29yZGluYXRpb25UeXBlOwotCQkJdGhpcy5jb29yZGluYXRpb25UeXBlQWRhcHRlci5zZXRWYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGNvb3JkaW5hdGlvblR5cGUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgYXN0Q29vcmRpbmF0aW9uVHlwZSkgewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkID0gdGhpcy5jb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmNvb3JkaW5hdGlvblR5cGUgPSBhc3RDb29yZGluYXRpb25UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RDb29yZGluYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBidWlsZENvb3JkaW5hdGlvblR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmNvb3JkaW5hdGlvblR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvb3JkaW5hdGlvblR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDT09SRElOQVRJT05fVFlQRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkKLQlwdWJsaWMgSW50ZWdlciBnZXRFeHBpcnkoKSB7Ci0JCXJldHVybiB0aGlzLmV4cGlyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZXhwaXJ5LCBleHBpcnkpKSB7Ci0JCQl0aGlzLmV4cGlyeSA9IGV4cGlyeTsKLQkJCXRoaXMuZXhwaXJ5QWRhcHRlci5zZXRWYWx1ZShleHBpcnkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFeHBpcnkoSW50ZWdlciBhc3RFeHBpcnkpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmV4cGlyeTsKLQkJdGhpcy5leHBpcnkgPSBhc3RFeHBpcnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWFBJUllfUFJPUEVSVFksIG9sZCwgYXN0RXhwaXJ5KTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRFeHBpcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEV4cGlyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVYUElSWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBleHBpcnkgdGltZSBvZiBkYXkKLQlwdWJsaWMgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIHRoaXMuZXhwaXJ5VGltZU9mRGF5OwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gYWRkRXhwaXJ5VGltZU9mRGF5KCkgewotCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2V4cGlyeVRpbWVPZkRheScgZWxlbWVudCBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuZXhwaXJ5VGltZU9mRGF5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gdGhpcy5idWlsZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5uZXdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiB0aGlzLmV4cGlyeVRpbWVPZkRheTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB7Ci0JCWlmICh0aGlzLmV4cGlyeVRpbWVPZkRheSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCInZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50IGRvZXMgbm90IGV4aXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gbnVsbDsKLQkJb2xkLnJlbW92ZUFubm90YXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBidWlsZEV4cGlyeVRpbWVPZkRheSgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBFWFBJUllfVElNRV9PRl9EQVlfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNFeHBpcnlUaW1lT2ZEYXkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpID09IG51bGwpIHsKLQkJCXRoaXMuc3luY0V4cGlyeVRpbWVPZkRheV8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5leHBpcnlUaW1lT2ZEYXkgPT0gbnVsbCkgewotCQkJCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0b2QgPSB0aGlzLmJ1aWxkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJdG9kLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zeW5jRXhwaXJ5VGltZU9mRGF5Xyh0b2QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmV4cGlyeVRpbWVPZkRheS5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0V4cGlyeVRpbWVPZkRheV8oRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGFzdEV4cGlyeVRpbWVPZkRheSkgewotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gb2xkID0gdGhpcy5leHBpcnlUaW1lT2ZEYXk7Ci0JCXRoaXMuZXhwaXJ5VGltZU9mRGF5ID0gYXN0RXhwaXJ5VGltZU9mRGF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZLCBvbGQsIGFzdEV4cGlyeVRpbWVPZkRheSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRFeHBpcnlUaW1lT2ZEYXlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGV4dFJhbmdlKHRoaXMuZXhwaXJ5VGltZU9mRGF5QWRhcHRlci5nZXRBc3ROb2RlKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNpemVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19TSVpFLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNoYXJlZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1NIQVJFRCwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRFeHBpcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUlksIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQWx3YXlzUmVmcmVzaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0FMV0FZU19SRUZSRVNILCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlZnJlc2hPbmx5SWZOZXdlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGREaXNhYmxlSGl0c0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUywgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvb3JkaW5hdGlvblR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19DT09SRElOQVRJT05fVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEV4cGlyeVRpbWVPZkRheUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNBQ0hFX19FWFBJUllfVElNRV9PRl9EQVksIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBhNTkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DaGFuZ2VUcmFja2luZwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIENoYW5nZVRyYWNraW5nVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKENoYW5nZVRyYWNraW5nVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIGFzdFZhbHVlKSB7Ci0JCUNoYW5nZVRyYWNraW5nVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VUcmFja2luZ1R5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2hhbmdlVHJhY2tpbmdUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX19WQUxVRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTMyYjZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZTwvY29kZT4KLSAqLwotZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4KLQlpbXBsZW1lbnRzIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhdGFWYWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YVZhbHVlOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gb2JqZWN0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCi0KLQlTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBwYXJlbnQsIE1lbWJlciBtZW1iZXIsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKG1lbWJlciwgaWRhYSkpOwotCQl0aGlzLmRhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGREYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5kYXRhVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZERhdGFWYWx1ZUFkYXB0ZXIoKTsKLQkJdGhpcy5vYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRPYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm9iamVjdFZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRPYmplY3RWYWx1ZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5kYXRhVmFsdWUgPSB0aGlzLmJ1aWxkRGF0YVZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLm9iamVjdFZhbHVlID0gdGhpcy5idWlsZE9iamVjdFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNEYXRhVmFsdWUodGhpcy5idWlsZERhdGFWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY09iamVjdFZhbHVlKHRoaXMuYnVpbGRPYmplY3RWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZGF0YSB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0YVZhbHVlKFN0cmluZyBkYXRhVmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZGF0YVZhbHVlLCBkYXRhVmFsdWUpKSB7Ci0JCQl0aGlzLmRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKLQkJCXRoaXMuZGF0YVZhbHVlQWRhcHRlci5zZXRWYWx1ZShkYXRhVmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNEYXRhVmFsdWUoU3RyaW5nIGFzdERhdGFWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kYXRhVmFsdWU7Ci0JCXRoaXMuZGF0YVZhbHVlID0gYXN0RGF0YVZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3REYXRhVmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0YVZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhdGFWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmRhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREYXRhVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZGF0YVZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKiBvYmplY3QgdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgb2JqZWN0VmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub2JqZWN0VmFsdWUsIG9iamVjdFZhbHVlKSkgewotCQkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQkJdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUob2JqZWN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPYmplY3RWYWx1ZShTdHJpbmcgYXN0T2JqZWN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMub2JqZWN0VmFsdWU7Ci0JCXRoaXMub2JqZWN0VmFsdWUgPSBhc3RPYmplY3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RPYmplY3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRPYmplY3RWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3RWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMub2JqZWN0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLm9iamVjdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbgotCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5kYXRhVmFsdWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5vYmplY3RWYWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkQWRhcHRlcnMoKSB7Ci0JCXN1cGVyLnJlYnVpbGRBZGFwdGVycygpOwotCQl0aGlzLmRhdGFWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGREYXRhVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5kYXRhVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZERhdGFWYWx1ZUFkYXB0ZXIoKTsKLQkJdGhpcy5vYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRPYmplY3RWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm9iamVjdFZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRPYmplY3RWYWx1ZUFkYXB0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9yZU9uKE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwKSB7Ci0JCXN1cGVyLnN0b3JlT24obWFwKTsKLQkJbWFwLnB1dChEQVRBX1ZBTFVFX1BST1BFUlRZLCB0aGlzLmRhdGFWYWx1ZSk7Ci0JCXRoaXMuZGF0YVZhbHVlID0gbnVsbDsKLQkJbWFwLnB1dChPQkpFQ1RfVkFMVUVfUFJPUEVSVFksIHRoaXMub2JqZWN0VmFsdWUpOwotCQl0aGlzLm9iamVjdFZhbHVlID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZXN0b3JlRnJvbShNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewotCQlzdXBlci5yZXN0b3JlRnJvbShtYXApOwotCQl0aGlzLnNldERhdGFWYWx1ZSgoU3RyaW5nKSBtYXAuZ2V0KERBVEFfVkFMVUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5zZXRPYmplY3RWYWx1ZSgoU3RyaW5nKSBtYXAuZ2V0KE9CSkVDVF9WQUxVRV9QUk9QRVJUWSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZGF0YVZhbHVlKTsKLQkJc2IuYXBwZW5kKCI9PiIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm9iamVjdFZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0Jc3RhdGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNyZWF0ZUNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIHBhcmVudCwgTWVtYmVyIG1lbWJlciwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIG1lbWJlciwgYnVpbGRDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uQWRhcHRlcihkYWEsIGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTLCBpbmRleCwgQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjVjOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb252ZXJ0QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoVkFMVUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlRfX1ZBTFVFLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2MjFhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDT05WRVJURVJfQ0xBU1NfQURBUFRFUiA9IGJ1aWxkQ29udmVydGVyQ2xhc3NBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb252ZXJ0ZXJDbGFzc0FkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyQ2xhc3M7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbiNmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lOwotCS8vIHdlIG5lZWQgYSBmbGFnIHNpbmNlIHRoZSBmLXEgbmFtZSBjYW4gYmUgbnVsbAotCXByaXZhdGUgYm9vbGVhbiBmcUNvbnZlcnRlckNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIENPTlZFUlRFUl9DTEFTU19BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXJDbGFzcyA9IHRoaXMuYnVpbGRDb252ZXJ0ZXJDbGFzcyhhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNDb252ZXJ0ZXJDbGFzcyh0aGlzLmJ1aWxkQ29udmVydGVyQ2xhc3MoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5jb252ZXJ0ZXJDbGFzcyA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyIGNsYXNzCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyQ2xhc3MoU3RyaW5nIGNvbnZlcnRlckNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvbnZlcnRlckNsYXNzLCBjb252ZXJ0ZXJDbGFzcykpIHsKLQkJCXRoaXMuY29udmVydGVyQ2xhc3MgPSBjb252ZXJ0ZXJDbGFzczsKLQkJCXRoaXMuZnFDb252ZXJ0ZXJDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlci5zZXRWYWx1ZShjb252ZXJ0ZXJDbGFzcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0NvbnZlcnRlckNsYXNzKFN0cmluZyBhc3RDb252ZXJ0ZXJDbGFzcykgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5jb252ZXJ0ZXJDbGFzcywgYXN0Q29udmVydGVyQ2xhc3MpKSB7Ci0JCQl0aGlzLnN5bmNDb252ZXJ0ZXJDbGFzc18oYXN0Q29udmVydGVyQ2xhc3MpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb252ZXJ0ZXJDbGFzc18oU3RyaW5nIGFzdENvbnZlcnRlckNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlckNsYXNzOwotCQl0aGlzLmNvbnZlcnRlckNsYXNzID0gYXN0Q29udmVydGVyQ2xhc3M7Ci0JCXRoaXMuZnFDb252ZXJ0ZXJDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgYXN0Q29udmVydGVyQ2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29udmVydGVyQ2xhc3MoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyQ2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDT05WRVJURVJfQ0xBU1NfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMuY29udmVydGVyQ2xhc3MgIT0gbnVsbCkKLQkJCQkmJiBBU1RUb29scy50eXBlSW1wbGVtZW50c0ludGVyZmFjZSh0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpLCBpbnRlcmZhY2VOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY29udmVydGVyIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKCkgewotCQlpZiAodGhpcy5mcUNvbnZlcnRlckNsYXNzTmFtZVN0YWxlKSB7Ci0JCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKCk7Ci0JCQl0aGlzLmZxQ29udmVydGVyQ2xhc3NOYW1lU3RhbGUgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZENvbnZlcnRlckNsYXNzTmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuY29udmVydGVyQ2xhc3MgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ29udmVydGVyQ2xhc3NOYW1lXygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWVfKCkgewotCQlyZXR1cm4gQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmNvbnZlcnRlckNsYXNzQWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYnVpbGRBU1RSb290KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUl9fQ09OVkVSVEVSX0NMQVNTLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyN2M5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DdXN0b21pemVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUlkQ2xhc3NBbm5vdGF0aW9uI2Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lOwotCS8vIHdlIG5lZWQgYSBmbGFnIHNpbmNlIHRoZSBmLXEgbmFtZSBjYW4gYmUgbnVsbAotCXByaXZhdGUgYm9vbGVhbiBmcUN1c3RvbWl6ZXJDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ3VzdG9taXplckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5mcUN1c3RvbWl6ZXJDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgYXN0VmFsdWUpKSB7Ci0JCQl0aGlzLnN5bmNWYWx1ZV8oYXN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZV8oU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZnFDdXN0b21pemVyQ2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjdXN0b21pemVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgIT0gbnVsbCkKLQkJCQkmJiBBU1RUb29scy50eXBlSXNTdWJUeXBlT2YodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSwgaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKSB7Ci0JCWlmICh0aGlzLmZxQ3VzdG9taXplckNsYXNzTmFtZVN0YWxlKSB7Ci0JCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ3VzdG9taXplckNsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQkJCXRoaXMuZnFDdXN0b21pemVyQ2xhc3NOYW1lU3RhbGUgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lXygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDdXN0b21pemVyQ2xhc3NOYW1lXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5DVVNUT01JWkVSX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNmQzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZUNoZWNraW5nCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgRXhpc3RlbmNlVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHR5cGUsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEV4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRXhpc3RlbmNlVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoRXhpc3RlbmNlVHlwZSBhc3RWYWx1ZSkgewotCQlFeGlzdGVuY2VUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEV4aXN0ZW5jZVR5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRXhpc3RlbmNlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lOR19fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjOWI1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkpvaW5GZXRjaAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBKb2luRmV0Y2hUeXBlIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpvaW5GZXRjaEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZShKb2luRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShKb2luRmV0Y2hUeXBlIGFzdFZhbHVlKSB7Ci0JCUpvaW5GZXRjaFR5cGUgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgSm9pbkZldGNoVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBKb2luRmV0Y2hUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzFlM2Q1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gdmFsdWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGF0dHJpYnV0ZSwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNdXRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBCb29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoQm9vbGVhbiBhc3RWYWx1ZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5NVVRBQkxFX19WQUxVRSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkY2U2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnRlcgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPE1lbWJlcj4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCVN0cmluZyBuYW1lOwotCQkKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCVNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgZGFhKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCB0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm5hbWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIE5hbWVkQ29udmVydGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPdmVycmlkZUFubm90YXRpb24uTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjVjYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gREVGQVVMVF9PQkpFQ1RfVkFMVUVfQURBUFRFUiA9IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGVmYXVsdE9iamVjdFZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWU7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IG5ldyBWZWN0b3I8TmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBDb252ZXJzaW9uVmFsdWVzQW5ub3RhdGlvbkNvbnRhaW5lciBjb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyID0gbmV3IENvbnZlcnNpb25WYWx1ZXNBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXIgcGFyZW50LCBNZW1iZXIgbWVtYmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWVtYmVyLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KG1lbWJlciwgREVGQVVMVF9PQkpFQ1RfVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZShhc3RSb290KTsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lclRvb2xzLmluaXRpYWxpemUodGhpcy5jb252ZXJzaW9uVmFsdWVzQ29udGFpbmVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNEZWZhdWx0T2JqZWN0VmFsdWUodGhpcy5idWlsZERlZmF1bHRPYmplY3RWYWx1ZShhc3RSb290KSk7Ci0JCUFubm90YXRpb25Db250YWluZXJUb29scy5zeW5jaHJvbml6ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPT0gbnVsbCkgJiYKLQkJCQl0aGlzLmNvbnZlcnNpb25WYWx1ZXMuaXNFbXB0eSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE9iamVjdFR5cGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRlZmF1bHQgb2JqZWN0IHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0T2JqZWN0VmFsdWUoU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUsIGRlZmF1bHRPYmplY3RWYWx1ZSkpIHsKLQkJCXRoaXMuZGVmYXVsdE9iamVjdFZhbHVlID0gZGVmYXVsdE9iamVjdFZhbHVlOwotCQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyLnNldFZhbHVlKGRlZmF1bHRPYmplY3RWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0RlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgYXN0RGVmYXVsdE9iamVjdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0T2JqZWN0VmFsdWUgPSBhc3REZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3REZWZhdWx0T2JqZWN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRPYmplY3RWYWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXREZWZhdWx0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShERUZBVUxUX09CSkVDVF9WQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjb252ZXJzaW9uIHZhbHVlcwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4odGhpcy5jb252ZXJzaW9uVmFsdWVzKTsKLQl9Ci0KLQlJdGVyYWJsZTxOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVDb252ZXJzaW9uVmFsdWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPih0aGlzLmNvbnZlcnNpb25WYWx1ZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgY29udmVyc2lvblZhbHVlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWVBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVyc2lvblZhbHVlcy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgaW5kZXhPZkNvbnZlcnNpb25WYWx1ZShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gY29udmVyc2lvblZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuaW5kZXhPZihjb252ZXJzaW9uVmFsdWUpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiAoTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24pIEFubm90YXRpb25Db250YWluZXJUb29scy5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIpOwotCX0KLQotCU5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZV8oKSB7Ci0JCXJldHVybiB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZV8odGhpcy5jb252ZXJzaW9uVmFsdWVzLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBhZGRDb252ZXJzaW9uVmFsdWVfKGludCBpbmRleCkgewotCQlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmJ1aWxkQ29udmVyc2lvblZhbHVlKGluZGV4KTsKLQkJdGhpcy5jb252ZXJzaW9uVmFsdWVzLmFkZChpbmRleCwgY29udmVyc2lvblZhbHVlKTsKLQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQl2b2lkIHN5bmNBZGRDb252ZXJzaW9uVmFsdWUob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbikgewotCQlpbnQgaW5kZXggPSB0aGlzLmNvbnZlcnNpb25WYWx1ZXMuc2l6ZSgpOwotCQlOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmFkZENvbnZlcnNpb25WYWx1ZV8oaW5kZXgpOwotCQljb252ZXJzaW9uVmFsdWUuaW5pdGlhbGl6ZSgoQ29tcGlsYXRpb25Vbml0KSBhc3RBbm5vdGF0aW9uLmdldFJvb3QoKSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChDT05WRVJTSU9OX1ZBTFVFU19MSVNULCBpbmRleCwgY29udmVyc2lvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGJ1aWxkQ29udmVyc2lvblZhbHVlKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmNyZWF0ZUNvbnZlcnNpb25WYWx1ZSh0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhLCBpbmRleCk7Ci0JfQotCi0Jdm9pZCBjb252ZXJzaW9uVmFsdWVBZGRlZChpbnQgaW5kZXgsIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSkgewotCQl0aGlzLmZpcmVJdGVtQWRkZWQoQ09OVkVSU0lPTl9WQUxVRVNfTElTVCwgaW5kZXgsIGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyVG9vbHMubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIpOwotCX0KLQotCU5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIG1vdmVDb252ZXJzaW9uVmFsdWVfKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNvbnZlcnNpb25WYWx1ZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCkuZ2V0KHRhcmdldEluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KSB7Ci0JCUFubm90YXRpb25Db250YWluZXJUb29scy5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4LCB0aGlzLmNvbnZlcnNpb25WYWx1ZXNDb250YWluZXIpOwotCX0KLQotCU5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIHJlbW92ZUNvbnZlcnNpb25WYWx1ZV8oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnNpb25WYWx1ZXMucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQl2b2lkIHN5bmNSZW1vdmVDb252ZXJzaW9uVmFsdWVzKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIHRoaXMuY29udmVyc2lvblZhbHVlcywgQ09OVkVSU0lPTl9WQUxVRVNfTElTVCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiB2YWx1ZSBjb250YWluZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogYWRhcHQgdGhlIEFubm90YXRpb25Db250YWluZXIgaW50ZXJmYWNlIHRvIHRoZSBvYmplY3QgdHlwZSBjb252ZXJ0ZXIncwotCSAqIGNvbnZlcnNpb24gdmFsdWVzCi0JICovCi0JY2xhc3MgQ29udmVyc2lvblZhbHVlc0Fubm90YXRpb25Db250YWluZXIKLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uQ29udGFpbmVyPE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiAKLQl7Ci0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8TmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IGdldE5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5nZXROZXN0YWJsZUNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIE5lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZE5lc3RlZEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLmFkZENvbnZlcnNpb25WYWx1ZV8oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNBZGROZXN0ZWRBbm5vdGF0aW9uKEFubm90YXRpb24gYXN0QW5ub3RhdGlvbikgewotCQkJU291cmNlRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi50aGlzLnN5bmNBZGRDb252ZXJzaW9uVmFsdWUoYXN0QW5ub3RhdGlvbik7Ci0JCX0KLQotCQlwdWJsaWMgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gbW92ZU5lc3RlZEFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLnRoaXMubW92ZUNvbnZlcnNpb25WYWx1ZV8odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5yZW1vdmVDb252ZXJzaW9uVmFsdWVfKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNSZW1vdmVOZXN0ZWRBbm5vdGF0aW9ucyhpbnQgaW5kZXgpIHsKLQkJCVNvdXJjZUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24udGhpcy5zeW5jUmVtb3ZlQ29udmVyc2lvblZhbHVlcyhpbmRleCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3ZTcwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUHJpbWFyeUtleQotICovCi1wdWJsaWMgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSIAotCQkJPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gc3luYwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjljYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Qcml2YXRlT3duZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxBdHRyaWJ1dGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIHN5bmMKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzU4NDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZE9ubHkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPFR5cGU+Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgdHlwZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gc3luYwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMjE3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlzdXBlcihwYXJlbnQsIGF0dHJpYnV0ZSwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX1RSQU5TRk9STUVSX0NMQVNTOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Y2M3ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuU3RydWN0Q29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUVjbGlwc2VMaW5rTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENPTlZFUlRFUl9BREFQVEVSID0gYnVpbGRDb252ZXJ0ZXJBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb252ZXJ0ZXJBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGNvbnZlcnRlcjsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIHBhcmVudCwgTWVtYmVyIG1lbWJlcikgewotCQlzdXBlcihwYXJlbnQsIG1lbWJlciwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5jb252ZXJ0ZXJBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihtZW1iZXIsIENPTlZFUlRFUl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcih0aGlzLmJ1aWxkQ29udmVydGVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuY29udmVydGVyID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VOYW1lZENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVJfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0cnVjdENvbnZlcnRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29udmVydGVyCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIGNvbnZlcnRlcikgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlcikpIHsKLQkJCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQkJdGhpcy5jb252ZXJ0ZXJBZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0NvbnZlcnRlcihTdHJpbmcgYXN0Q29udmVydGVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBhc3RDb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgYXN0Q29udmVydGVyKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbnZlcnRlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoQ09OVkVSVEVSX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIsIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThlY2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248VHlwZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaG91ckRlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBob3VyQWRhcHRlcjsKLQlwcml2YXRlIEludGVnZXIgaG91cjsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWludXRlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IG1pbnV0ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIG1pbnV0ZTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNlY29uZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHNlY29uZDsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbWlsbGlzZWNvbmRBZGFwdGVyOwotCXByaXZhdGUgSW50ZWdlciBtaWxsaXNlY29uZDsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgVHlwZSB0eXBlLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIGRhYSk7Ci0JCXRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkSG91ckFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5ob3VyQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaW51dGVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubWludXRlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHR5cGUsIHRoaXMubWludXRlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFNlY29uZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5zZWNvbmRBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odHlwZSwgdGhpcy5zZWNvbmREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5taWxsaXNlY29uZEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0eXBlLCB0aGlzLm1pbGxpc2Vjb25kRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5ob3VyID0gdGhpcy5idWlsZEhvdXIoYXN0Um9vdCk7Ci0JCXRoaXMubWludXRlID0gdGhpcy5idWlsZE1pbnV0ZShhc3RSb290KTsKLQkJdGhpcy5zZWNvbmQgPSB0aGlzLmJ1aWxkU2Vjb25kKGFzdFJvb3QpOwotCQl0aGlzLm1pbGxpc2Vjb25kID0gdGhpcy5idWlsZE1pbGxpc2Vjb25kKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNIb3VyKHRoaXMuYnVpbGRIb3VyKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTWludXRlKHRoaXMuYnVpbGRNaW51dGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNTZWNvbmQodGhpcy5idWlsZFNlY29uZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY01pbGxpc2Vjb25kKHRoaXMuYnVpbGRNaWxsaXNlY29uZChhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmhvdXIgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5taW51dGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5zZWNvbmQgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5taWxsaXNlY29uZCA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGltZU9mRGF5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBob3VyCi0JcHVibGljIEludGVnZXIgZ2V0SG91cigpIHsKLQkJcmV0dXJuIHRoaXMuaG91cjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgaG91cikgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5ob3VyLCBob3VyKSkgewotCQkJdGhpcy5ob3VyID0gaG91cjsKLQkJCXRoaXMuaG91ckFkYXB0ZXIuc2V0VmFsdWUoaG91cik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0hvdXIoSW50ZWdlciBhc3RIb3VyKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5ob3VyOwotCQl0aGlzLmhvdXIgPSBhc3RIb3VyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSE9VUl9QUk9QRVJUWSwgb2xkLCBhc3RIb3VyKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRIb3VyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmhvdXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SG91clRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuaG91ckRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogbWludXRlCi0JcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkgewotCQlyZXR1cm4gdGhpcy5taW51dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbWludXRlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm1pbnV0ZSwgbWludXRlKSkgewotCQkJdGhpcy5taW51dGUgPSBtaW51dGU7Ci0JCQl0aGlzLm1pbnV0ZUFkYXB0ZXIuc2V0VmFsdWUobWludXRlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWludXRlKEludGVnZXIgYXN0TWludXRlKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5taW51dGU7Ci0JCXRoaXMubWludXRlID0gYXN0TWludXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUlOVVRFX1BST1BFUlRZLCBvbGQsIGFzdE1pbnV0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTWludXRlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1pbnV0ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNaW51dGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1pbnV0ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogc2Vjb25kCi0JcHVibGljIEludGVnZXIgZ2V0U2Vjb25kKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2Vjb25kKEludGVnZXIgbmV3U2Vjb25kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNlY29uZCwgbmV3U2Vjb25kKSkgewotCQkJdGhpcy5zZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCQl0aGlzLnNlY29uZEFkYXB0ZXIuc2V0VmFsdWUobmV3U2Vjb25kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2Vjb25kKEludGVnZXIgYXN0U2Vjb25kKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zZWNvbmQ7Ci0JCXRoaXMuc2Vjb25kID0gYXN0U2Vjb25kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VDT05EX1BST1BFUlRZLCBvbGQsIGFzdFNlY29uZCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2Vjb25kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNlY29uZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogbWlsbGlzZWNvbmQKLQlwdWJsaWMgSW50ZWdlciBnZXRNaWxsaXNlY29uZCgpIHsKLQkJcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBtaWxsaXNlY29uZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5taWxsaXNlY29uZCwgbWlsbGlzZWNvbmQpKSB7Ci0JCQl0aGlzLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7Ci0JCQl0aGlzLm1pbGxpc2Vjb25kQWRhcHRlci5zZXRWYWx1ZShtaWxsaXNlY29uZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01pbGxpc2Vjb25kKEludGVnZXIgYXN0TWlsbGlzZWNvbmQpIHsKLQkJSW50ZWdlciBvbGRNaWxsaXNlY29uZCA9IHRoaXMubWlsbGlzZWNvbmQ7Ci0JCXRoaXMubWlsbGlzZWNvbmQgPSBhc3RNaWxsaXNlY29uZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1JTExJU0VDT05EX1BST1BFUlRZLCBvbGRNaWxsaXNlY29uZCwgYXN0TWlsbGlzZWNvbmQpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZE1pbGxpc2Vjb25kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1pbGxpc2Vjb25kQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1pbGxpc2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5taWxsaXNlY29uZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSG91ckFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fSE9VUiwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRNaW51dGVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX01JTlVURSwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRTZWNvbmRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVlfX1NFQ09ORCwgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRNaWxsaXNlY29uZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oZGFhLCBFY2xpcHNlTGluay5USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTgyNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb248QXR0cmlidXRlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hBZGFwdGVyOwotCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gT1BUSU9OQUxfQURBUFRFUiA9IGJ1aWxkT3B0aW9uYWxBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLmZldGNoQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCBGRVRDSF9BREFQVEVSKTsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhdHRyaWJ1dGUsIE9QVElPTkFMX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKGFzdFJvb3QpOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNGZXRjaCh0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNPcHRpb25hbCh0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5mZXRjaCA9PSBudWxsKSAmJgotCQkJCSh0aGlzLm9wdGlvbmFsID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZmV0Y2gpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZmV0Y2gKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5mZXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZmV0Y2gsIGZldGNoKSkgewotCQkJdGhpcy5mZXRjaCA9IGZldGNoOwotCQkJdGhpcy5mZXRjaEFkYXB0ZXIuc2V0VmFsdWUoRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShmZXRjaCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGZXRjaChGZXRjaFR5cGUgYXN0RmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7Ci0JCXRoaXMuZmV0Y2ggPSBhc3RGZXRjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGFzdEZldGNoKTsKLQl9Ci0KLQlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShGRVRDSF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBvcHRpb25hbAotCXB1YmxpYyBCb29sZWFuIGdldE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBvcHRpb25hbCkpIHsKLQkJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJCXRoaXMub3B0aW9uYWxBZGFwdGVyLnNldFZhbHVlKG9wdGlvbmFsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jT3B0aW9uYWwoQm9vbGVhbiBhc3RPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWwgPSBhc3RPcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGQsIGFzdE9wdGlvbmFsKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcHRpb25hbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25hbEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE9QVElPTkFMX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTl9fT1BUSU9OQUwsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT05fX0ZFVENIKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JlMjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLS8qKgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuUmVhZFRyYW5zZm9ybWVyCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0cmFuc2Zvcm1lckNsYXNzRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyOwotCVN0cmluZyB0cmFuc2Zvcm1lckNsYXNzOwotCi0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtZXRob2REZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWV0aG9kQWRhcHRlcjsKLQlTdHJpbmcgbWV0aG9kOwotCi0KLQlTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgQXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIGRhYSk7Ci0JCXRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlciA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsIHRoaXMuZ2V0VHJhbnNmb3JtZXJDbGFzc0VsZW1lbnROYW1lKCksIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhdHRyaWJ1dGUsIHRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0KLQkJdGhpcy5tZXRob2REZWNsYXJhdGlvbkFkYXB0ZXIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIHRoaXMuZ2V0TWV0aG9kRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMubWV0aG9kQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYXR0cmlidXRlLCB0aGlzLm1ldGhvZERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXJDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5tZXRob2QgPSB0aGlzLmJ1aWxkTWV0aG9kKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNUcmFuc2Zvcm1lckNsYXNzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lckNsYXNzKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTWV0aG9kKHRoaXMuYnVpbGRNZXRob2QoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy50cmFuc2Zvcm1lckNsYXNzID09IG51bGwpICYmCi0JCQkJKHRoaXMubWV0aG9kID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHJhbnNmb3JtZXJDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyYW5zZm9ybWVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0cmFuc2Zvcm1lciBjbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0VHJhbnNmb3JtZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lckNsYXNzKFN0cmluZyB0cmFuc2Zvcm1lckNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnRyYW5zZm9ybWVyQ2xhc3MsIHRyYW5zZm9ybWVyQ2xhc3MpKSB7Ci0JCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPSB0cmFuc2Zvcm1lckNsYXNzOwotCQkJdGhpcy50cmFuc2Zvcm1lckNsYXNzQWRhcHRlci5zZXRWYWx1ZSh0cmFuc2Zvcm1lckNsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHJhbnNmb3JtZXJDbGFzcyhTdHJpbmcgYXN0VHJhbnNmb3JtZXJDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy50cmFuc2Zvcm1lckNsYXNzOwotCQl0aGlzLnRyYW5zZm9ybWVyQ2xhc3MgPSBhc3RUcmFuc2Zvcm1lckNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFJBTlNGT1JNRVJfQ0xBU1NfUFJPUEVSVFksIG9sZCwgYXN0VHJhbnNmb3JtZXJDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUcmFuc2Zvcm1lckNsYXNzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyQ2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHJhbnNmb3JtZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudHJhbnNmb3JtZXJDbGFzc0RlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3NFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogbWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLm1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRob2QoU3RyaW5nIG1ldGhvZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5tZXRob2QsIG1ldGhvZCkpIHsKLQkJCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQkJdGhpcy5tZXRob2RBZGFwdGVyLnNldFZhbHVlKG1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01ldGhvZChTdHJpbmcgYXN0TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1ldGhvZDsKLQkJdGhpcy5tZXRob2QgPSBhc3RNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRVRIT0RfUFJPUEVSVFksIG9sZCwgYXN0TWV0aG9kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE1ldGhvZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5tZXRob2RBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5tZXRob2REZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRNZXRob2RFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNTg2OWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudE1lbWJlciBwYXJlbnQsIE1lbWJlciBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUl9fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQmFzZVR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXREYXRhVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTJiM2Y5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uPEF0dHJpYnV0ZT4KLQlpbXBsZW1lbnRzIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlLCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg3NTVmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgZmluYWwgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbjsKLQlwcml2YXRlIGZpbmFsIENvbHVtbkFubm90YXRpb24gbnVsbENvbHVtbjsKLQotCi0JcHVibGljIFNvdXJjZUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24oSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50LCBhdHRyaWJ1dGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuY29sdW1uQWRhcHRlciA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKHRoaXMuZGFhKSk7Ci0JCXRoaXMubnVsbENvbHVtbiA9IHRoaXMuYnVpbGROdWxsQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmNvbHVtbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbHVtbiA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNDb2x1bW4oYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmNvbHVtbiA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUcmFuc2Zvcm1lckNsYXNzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE1ldGhvZEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVJfX01FVEhPRDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29sdW1uCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpIHsKLQkJcmV0dXJuICh0aGlzLmNvbHVtbiAhPSBudWxsKSA/IHRoaXMuY29sdW1uIDogdGhpcy5udWxsQ29sdW1uOwotCX0KLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGFkZENvbHVtbigpIHsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIidjb2x1bW4nIGVsZW1lbnQgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmNvbHVtbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmNvbHVtbiA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJdGhpcy5jb2x1bW4ubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2NvbHVtbicgZWxlbWVudCBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJQ29sdW1uQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmNvbHVtbjsKLQkJdGhpcy5jb2x1bW4gPSBudWxsOwotCQlvbGQucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29sdW1uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmNvbHVtbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNDb2x1bW5fKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKLQkJCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbCA9IGNyZWF0ZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJCQljb2wuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJCQl0aGlzLnN5bmNDb2x1bW5fKGNvbCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuY29sdW1uLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29sdW1uXyhDb2x1bW5Bbm5vdGF0aW9uIGFzdENvbHVtbikgewotCQlDb2x1bW5Bbm5vdGF0aW9uIG9sZCA9IHRoaXMuY29sdW1uOwotCQl0aGlzLmNvbHVtbiA9IGFzdENvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9QUk9QRVJUWSwgb2xkLCBhc3RDb2x1bW4pOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZE51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiBuZXcgTnVsbEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckNvbHVtbkFubm90YXRpb24odGhpcyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb2x1bW5UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuY29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmNvbHVtbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQkJcmV0dXJuIGdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbHVtbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgd3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcih3cml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbkFkYXB0ZXIsIEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4sIEpQQS5DT0xVTU4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENvbHVtbkFubm90YXRpb24gY3JlYXRlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBNZW1iZXIgbWVtYmVyLCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IFNvdXJjZUNvbHVtbkFubm90YXRpb24ocGFyZW50LCBtZW1iZXIsIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIod3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25BZGFwdGVyKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMjc5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBFY2xpcHNlTGluayBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAotCSAqIHRoZSBnaXZlbiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oZmlsZS5nZXRQcm9qZWN0KCksIGZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JfQotCQotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gRWNsaXBzZUxpbmsgT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgcnVudGltZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhbiBFY2xpcHNlTGluayBPUk0gcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXIgZm9yIAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBkZWZhdWx0IHJ1bnRpbWUgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXREZWZhdWx0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZ1bGxQYXRoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKHByb2plY3QsIGZ1bGxQYXRoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIGZpbGVQYXRoKSB7Ci0JCXN1cGVyKHByb2plY3QsIGZpbGVQYXRoLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJvb3QoT2JqZWN0IGNvbmZpZykgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQllbnRpdHlNYXBwaW5ncy5zZXRWZXJzaW9uKGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShWRVJTSU9OKSk7Ci0JCWdldFJlc291cmNlQ29udGVudHMoKS5hZGQoZW50aXR5TWFwcGluZ3MpOwotCQkKLQkJQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzID0gKEFjY2Vzc1R5cGUpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShERUZBVUxUX0FDQ0VTUyk7IAotCQlpZiAoZGVmYXVsdEFjY2VzcyAhPSBudWxsKSB7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwdU1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocHVNZXRhZGF0YSk7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwdURlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCXB1TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocHVEZWZhdWx0cyk7Ci0JCQlwdURlZmF1bHRzLnNldEFjY2VzcyhkZWZhdWx0QWNjZXNzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0Mzg5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rSnBhRmFjdG9yeSgpLCAKLQkJCWJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwgCi0JCQlidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8xXzEsCi0JCQkJSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyNzZjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBFY2xpcHNlTGluayBwbGF0Zm9ybQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTW9kZWxQcm92aWRlcnNUbyhBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChwcm92aWRlcnMsIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyk7Ci0JfQotCi0JLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTID0gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIEVjbGlwc2VMaW5rLXNwZWNpZmljIG1hcHBpbmdzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBjaGFuZ2UgZnJvbSBFY2xpcHNlTGluayAxLjAgdG8gMS4xCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIGNoYW5nZSBmcm9tIEVjbGlwc2VMaW5rIDEuMCB0byAxLjEKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIFNQRUNJRklFRF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3M2E2ZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0Fic3RyYWN0RWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BYnN0cmFjdFR5cGVNYXBwaW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3I8VD4KLXsKLQlwdWJsaWMgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKFQgdHlwZU1hcHBpbmcsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQsIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIodHlwZU1hcHBpbmcsIGpycHQsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5pc01lbWJlclR5cGUoKSAmJiAhdGhpcy5pc1N0YXRpY1R5cGUoKSkgewotCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRFY2xpcHNlTGlua1R5cGVNZXNzYWdlKEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19NRU1CRVJfQ0xBU1NfTk9UX1NUQVRJQykpOwotCQl9Ci0JCWlmICghdGhpcy5oYXNOb0FyZ0NvbnN0cnVjdG9yKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVHlwZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkRWNsaXBzZUxpbmtUeXBlTWVzc2FnZShTdHJpbmcgbXNnSUQpIHsKLQkJcmV0dXJuIERlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltc2dJRCwKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMudHlwZU1hcHBpbmcuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLnR5cGVNYXBwaW5nLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0VHlwZU1hcHBpbmdUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NjkwMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0RW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcgotewotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IoCi0JCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHksIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkKLQkJc3VwZXIoZW50aXR5LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHkpIHR5cGVNYXBwaW5nKCk7Ci0JfQotCQotCS8vIGluIEVjbGlwc2VMaW5rLCBhIGhpZXJhcmNoeSBtYXkgZGVmaW5lIGl0cyBwcmltYXJ5IGtleSBvbiBtdWx0aXBsZSBjbGFzc2VzLCBzbyBsb25nIGFzIHRoZQotCS8vIHJvb3QgZW50aXR5IGhhcyBhIGNvaGVyZW50IGRlZmluZWQgcHJpbWFyeSBrZXkuCi0JLy8gSG93ZXZlciwgdGhlIGlkIGNsYXNzIG1heSBvbmx5IGJlIGRlZmluZWQgb24gb25lIGNsYXNzIGluIHRoZSBoaWVyYXJjaHkuCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcmltYXJ5S2V5SXNOb3RSZWRlZmluZWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaWRDbGFzc1JlZmVyZW5jZSgpLmlzU3BlY2lmaWVkKCkgJiYgZGVmaW5lc0lkQ2xhc3NPbkFuY2VzdG9yKHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfUkVERUZJTkVELAotCQkJCQkJbmV3IFN0cmluZ1swXSwKLQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNQcmltYXJ5S2V5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBzdXBlci5kZWZpbmVzUHJpbWFyeUtleSh0eXBlTWFwcGluZykKLQkJCXx8ICgoRWNsaXBzZUxpbmtUeXBlTWFwcGluZykgdHlwZU1hcHBpbmcpLnVzZXNQcmltYXJ5S2V5Q29sdW1ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZXNJZENsYXNzKCkgewotCQlyZXR1cm4gc3VwZXIuc3BlY2lmaWVzSWRDbGFzcygpIHx8IGRlZmluZXNJZENsYXNzKHR5cGVNYXBwaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQzM2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcgotewotCXB1YmxpYyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yKAotCQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MsIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkKLQkJc3VwZXIobWFwcGVkU3VwZXJjbGFzcywgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0eXBlTWFwcGluZygpOwotCX0KLQkKLQkvLyBpbiBFY2xpcHNlTGluaywgYSBoaWVyYXJjaHkgbWF5IGRlZmluZSBpdHMgcHJpbWFyeSBrZXkgb24gbXVsdGlwbGUgY2xhc3Nlcywgc28gbG9uZyBhcyB0aGUKLQkvLyByb290IGVudGl0eSBoYXMgYSBjb2hlcmVudCBkZWZpbmVkIHByaW1hcnkga2V5LgotCS8vIEhvd2V2ZXIsIHRoZSBpZCBjbGFzcyBtYXkgb25seSBiZSBkZWZpbmVkIG9uIG9uZSBjbGFzcyBpbiB0aGUgaGllcmFyY2h5LgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWFyeUtleUlzTm90UmVkZWZpbmVkKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGlkQ2xhc3NSZWZlcmVuY2UoKS5pc1NwZWNpZmllZCgpICYmIGRlZmluZXNJZENsYXNzT25BbmNlc3Rvcih0eXBlTWFwcGluZygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbMF0sCi0JCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJdGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRJZENsYXNzVGV4dFJhbmdlKCkpKTsKLQkJfQotCX0KLQkKLQkvLyBpbiBFY2xpcHNlTGluaywgaXQncyBvbmx5IHRoZSByb290IGVudGl0eSB3aGVyZSB0aGlzIG1hdHRlcnMKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3NJc1VzZWRJZk5lY2Vzc2FyeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCS8vIGluIEVjbGlwc2VMaW5rLCBpdCdzIG9ubHkgdGhlIHJvb3QgZW50aXR5IHdoZXJlIHRoaXMgbWF0dGVycwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWRDbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBubyBvcAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZpbmVzUHJpbWFyeUtleShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gc3VwZXIuZGVmaW5lc1ByaW1hcnlLZXkodHlwZU1hcHBpbmcpCi0JCQl8fCAoKEVjbGlwc2VMaW5rVHlwZU1hcHBpbmcpIHR5cGVNYXBwaW5nKS51c2VzUHJpbWFyeUtleUNvbHVtbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOWQ4MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yPE1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc1ZhbGlkYXRvcihNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQsIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIobWFwcGVkU3VwZXJjbGFzcywganJwdCwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmlzRmluYWxUeXBlKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVHlwZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19GSU5BTF9DTEFTUykpOwotCQl9Ci0JCXN1cGVyLnZhbGlkYXRlVHlwZShtZXNzYWdlcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzQ5Mzc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcgotewotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGVWYWxpZGF0b3IoCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikKLQl7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJcmV0dXJuOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTM0MGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0VjbGlwc2VMaW5rVHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ1ZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yPFR5cGVNYXBwaW5nPgotewotCXB1YmxpYyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nVmFsaWRhdG9yKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0LCBUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKHR5cGVNYXBwaW5nLCBqcnB0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWRkYjJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzFDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLQotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFDb250ZXh0Tm9kZUZhY3RvcnkgZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbENvbnRleHROb2RlRmFjdG9yeQotewkKLQkKLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rMS4xLXNwZWNpZmljIE9STSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEocGFyZW50LCAoWG1sQXR0cmlidXRlTWFwcGluZykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3NDJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0RWNsaXBzZUxpbmtPcm1YbWxEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmQyNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0LkVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMS4xCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IGF0dHJpYnV0ZQotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xCi0JZXh0ZW5kcyBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzOwotCi0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlMV8xKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18odGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18oYWNjZXNzKTsKLQkJdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGFjY2VzcykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc18oQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiBBY2Nlc3NUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQXR0aWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yKHRoaXMsIHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjkzYzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4yIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsxXzJKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMV8ySnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZU1hcHBpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCS8vIG5vdGhpbmcgbmV3IGZvciBFY2xpcHNlTGluayAxLjIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCS8vIG5vdGhpbmcgbmV3IGZvciBFY2xpcHNlTGluayAxLjIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQYWNrYWdlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQkvLyBubyBwYWNrYWdlIGFubm90YXRpb25zCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OWY0NTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGUuT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5jb250ZXh0LmphdmEuRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rSnBhRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMkpwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogSmF2YSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phdmFQZXJzaXN0ZW50VHlwZTFfMihvd25lciwganJwdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYxNjRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1GYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rMV8ySnBhRmFjdG9yeSgpLCAKLQkJCWJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwgCi0JCQlidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkSnBhQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazFfMkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuWUVTOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uKAotCQkJCUpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19QTEFURk9STV9WRVJTSU9OXzFfMiwKLQkJCQlKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92MV8yL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDcwYjg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLk9ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzIuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNb2RlbFByb3ZpZGVyc1RvKEFycmF5TGlzdDxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHByb3ZpZGVycywgUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTKTsKLQl9Ci0KLQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMgPSBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gRWNsaXBzZUxpbmstc3BlY2lmaWMgbWFwcGluZ3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIGNoYW5nZSBmcm9tIEVjbGlwc2VMaW5rIDEuMSB0byAxLjIKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgRWNsaXBzZUxpbmsKLQkvLyBOQjogbm8gY2hhbmdlIGZyb20gRWNsaXBzZUxpbmsgMS4xIHRvIDEuMgotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVBlcnNpc3RlbnRUeXBlMV8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0Y2UxNzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YSAxLjIKLSAqIFN1cHBvcnQgZm9yIHNwZWNpZmllZCBhY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFQZXJzaXN0ZW50VHlwZTFfMgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhUGVyc2lzdGVudFR5cGUxXzIoUGVyc2lzdGVudFR5cGUuT3duZXIgcGFyZW50LCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXN1cGVyKHBhcmVudCwganJwdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2VzcyBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBY2Nlc3MyXzBBbm5vdGF0aW9uIGdldEFjY2Vzc0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQWNjZXNzMl8wQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLmdldE5vbk51bGxBbm5vdGF0aW9uKHRoaXMuZ2V0QWNjZXNzQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWNjZXNzQW5ub3RhdGlvbklmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlQWNjZXNzQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWNjZXNzQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5yZXNvdXJjZVBlcnNpc3RlbnRUeXBlLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRBY2Nlc3NBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFjY2Vzc0Fubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2VzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQWNjZXNzLCBhY2Nlc3MpKSB7Ci0JCQl0aGlzLmdldEFjY2Vzc0Fubm90YXRpb24oKS5zZXRWYWx1ZShBY2Nlc3NUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwoYWNjZXNzKSk7Ci0JCQl0aGlzLnJlbW92ZUFjY2Vzc0Fubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18oYWNjZXNzKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkU3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5nZXRBY2Nlc3NBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlc291cmNlQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2VzcyA9PSBudWxsKSA/Ci0JCQkJc3VwZXIucmVzb3VyY2VBdHRyaWJ1dGVzKCkgOgotCQkJCXRoaXMucmVzb3VyY2VQZXJzaXN0ZW50VHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoQWNjZXNzVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKHRoaXMuc3BlY2lmaWVkQWNjZXNzKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YxXzIvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmQyOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjFfMi9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDFfMkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdEVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMUNvbnRleHROb2RlRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua09ybVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMl9SRVNPVVJDRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzFDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkMmQyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0Fic3RyYWN0RWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLlBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sMl8wRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYxXzEuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8yLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rIDIuMCBwbGF0Zm9ybSBjb25maWcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTW9kZWxQcm92aWRlcnNUbyhBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChwcm92aWRlcnMsIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyk7Ci0JfQotCi0JLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTID0gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JLy8gTkI6IG5vIEVjbGlwc2VMaW5rLXNwZWNpZmljIG1hcHBpbmdzCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSBFY2xpcHNlTGluawotCS8vIE5COiBubyBjaGFuZ2UgZnJvbSBFY2xpcHNlTGluayAxLjIgdG8gMi4wCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUdlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09ybVhtbDFfMURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPcm1YbWwxXzJEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDFhODM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3QuQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpY0pwYURhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuSnBhRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMC5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotCi0vKioKLSAqICBFY2xpcHNlTGluayAyLjAgZmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGlua0pwYUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYUZhY3RvcnkyXzAKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KENvbmZpZyBjb25maWcpIHsKLQkJaWYgKCAhIChjb25maWcgaW5zdGFuY2VvZiBKcGFQcm9qZWN0Ml8wLkNvbmZpZykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbmZpZyBtdXN0IGJlIDIuMC1jb21wYXRpYmxlOiAiICsgY29uZmlnKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdXBlci5idWlsZEpwYVByb2plY3QoY29uZmlnKTsKLQl9Ci0JCi0JcHVibGljIE1ldGFtb2RlbFNvdXJjZVR5cGUuU3luY2hyb25pemVyIGJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKE1ldGFtb2RlbFNvdXJjZVR5cGUgc291cmNlVHlwZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNNZXRhbW9kZWxTeW5jaHJvbml6ZXIoc291cmNlVHlwZSk7Ci0JfQotCQotCXB1YmxpYyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGJ1aWxkRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcihKcGFEYXRhU291cmNlIGRhdGFTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcihkYXRhU291cmNlKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKFBlcnNpc3RlbnRUeXBlLk93bmVyIG93bmVyLCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMChvd25lciwganJwdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wKHBhcmVudCwgKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JfQotCi0JLy9UaGUgMi4wIEpQQSBzcGVjIHN1cHBvcnRzIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBvbiBhbiBlbWJlZGRlZCBtYXBwaW5nIHdoaWxlIHRoZSAxLjAgc3BlYyBkaWQgbm90Ci0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBidWlsZEphdmFEZXJpdmVkSWRlbnRpdHkoSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFEZXJpdmVkSWRlbnRpdHkyXzAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUNhY2hlYWJsZTJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBidWlsZEphdmFPcnBoYW5SZW1vdmFsKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU5hbWVkUXVlcnkyXzAocGFyZW50LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBidWlsZEphdmFDb2xsZWN0aW9uVGFibGUoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzAocGFyZW50LCBvd25lcik7Ci0JfQotCi0JcHVibGljIEphdmFPcmRlckNvbHVtbjJfMCBidWlsZEphdmFPcmRlckNvbHVtbihKYXZhT3JkZXJhYmxlMl8wIHBhcmVudCwgSmF2YU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFNYXBLZXlDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JkZXJhYmxlMl8wIGJ1aWxkSmF2YU9yZGVyYWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlcmFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPcmRlcmFibGUgYnVpbGRKYXZhT3JkZXJhYmxlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjExMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVBsYXRmb3JtRmFjdG9yeS5FY2xpcHNlTGlua1ZlcnNpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgRWNsaXBzZUxpbmsyXzBKcGFGYWN0b3J5KCksIAotCQkJdGhpcy5idWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksIAotCQkJdGhpcy5idWlsZEpwYVZhcmlhdGlvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmVyc2lvbigKLQkJCQlKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfUExBVEZPUk1fVkVSU0lPTl8yXzAsCi0JCQkJSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUFubm90YXRpb25Qcm92aWRlciBidWlsZEpwYUFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFWYXJpYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5ZRVM7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYjlkZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rIDIuMCBwbGF0Zm9ybSBjb25maWcKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NGZiMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoIGpvaW5GZXRjaDsKLQotCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luRmV0Y2ggPSBuZXcgSmF2YUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCX0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luRmV0Y2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkZldGNoLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGZldGNoICoqKioqKioqKioKLQotCXB1YmxpYyBFY2xpcHNlTGlua0pvaW5GZXRjaCBnZXRKb2luRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5GZXRjaDsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luRmV0Y2gudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOGFhY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdEZWZpbml0aW9uMl8wCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkKLQkpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyOTAwZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFY2xpcHNlTGluayBzdXBwb3J0cyBkZWZhdWx0IE06MSBtYXBwaW5ncy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRyaWJ1dGVIYXNNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHN1cGVyLmF0dHJpYnV0ZUhhc01hbnlUb09uZU1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSkgfHwKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCksIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkuZ2V0S2V5KCkpOwotCX0KLQotCS8qKgotCSAqIEVjbGlwc2VMaW5rIHN1cHBvcnRzIGRlZmF1bHQgMToxIG1hcHBpbmdzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGF0dHJpYnV0ZUhhc09uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBzdXBlci5hdHRyaWJ1dGVIYXNPbmVUb09uZU1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSkgfHwKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCksIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKS5nZXRLZXkoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSwKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5FQ0xJUFNFX0xJTktfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZCi0JKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E0ZmFiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLkVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkKLQkpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4MWU1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZSgKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZLAotCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCwKLQkJSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWQotCSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzUyZWRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSwKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLlNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAsCi0JCUphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLkVDTElQU0VfTElOS19TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkKLQkpOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKS5pc0RlZmF1bHQocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA0NzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0phdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVksCi0JCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLlNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAsCi0JCUphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uRUNMSVBTRV9MSU5LX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWQotCSk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkuaXNEZWZhdWx0KHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0OGM2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybU5hbWVkUXVlcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudEF0dHJpYnV0ZTFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotewkKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRBdHRyaWJ1dGUxXzEocGFyZW50LCAoWG1sQXR0cmlidXRlTWFwcGluZykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoT3JtRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAocGFyZW50LCByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0JCi0JcHVibGljIE9ybURlcml2ZWRJZGVudGl0eTJfMCBidWlsZE9ybURlcml2ZWRJZGVudGl0eShPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1EZXJpdmVkSWRlbnRpdHkyXzAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRWxlbWVudENvbGxlY3Rpb24gcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgYnVpbGRPcm1DYWNoZWFibGUoT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1DYWNoZWFibGUyXzAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ybU9ycGhhblJlbW92YWwoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMChwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAocGFyZW50LCByZXNvdXJjZU5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyBPcm1Db2xsZWN0aW9uVGFibGUyXzAgYnVpbGRPcm1Db2xsZWN0aW9uVGFibGUoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wKHBhcmVudCwgb3duZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PcmRlcmFibGUgYnVpbGRPcm1PcmRlcmFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ1c2UgI2J1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcmRlcmFibGUyXzAuT3duZXIgb3duZXIpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgT3JtT3JkZXJhYmxlMl8wIGJ1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcmRlcmFibGUyXzAuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT3JkZXJhYmxlKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtT3JkZXJDb2x1bW4yXzAgYnVpbGRPcm1PcmRlckNvbHVtbihPcm1PcmRlcmFibGUyXzAgcGFyZW50LCBPcm1PcmRlckNvbHVtbjJfMC5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwNDg4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLkVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiBPcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlOyBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBKYXZhLgotCSAqIEBzZWUgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSBUWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlPcm1FbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBBVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogT3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZTsgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgSmF2YS4KLQkgKiBAc2VlIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBBVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1JZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlYWRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua0phckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5FY2xpcHNlTGlua09wdGlvbnMyXzA7Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JaW1wbGVtZW50cyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBidWlsZFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXJGaWxlUmVmIGJ1aWxkSmFyRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0phckZpbGVSZWYocGFyZW50LCB4bWxKYXJGaWxlUmVmKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbm5lY3Rpb24yXzAgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpwYU9wdGlvbnMyXzAgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09wdGlvbnMyXzAoKFBlcnNpc3RlbmNlVW5pdDJfMCkgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZExvZ2dpbmcoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTG9nZ2luZzJfMCgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlY2I3MWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkuZUlOU1RBTkNFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjOTQ2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkVjbGlwc2VMaW5rQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjJfMDsKLQotCi0vKioKLSAqICBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbjJfMCBleHRlbmRzIEVjbGlwc2VMaW5rQ29ubmVjdGlvbgotCWltcGxlbWVudHMgQ29ubmVjdGlvbjJfMAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0Nvbm5lY3Rpb24yXzAoUGVyc2lzdGVuY2VVbml0Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydGllcygpIHsKLQkJdGhpcy5kcml2ZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwpOwotCQl0aGlzLnVzZXIgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIpOwotCQl0aGlzLnBhc3N3b3JkID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvc3RJbml0aWFsaXplKCkgewotCQlzdXBlci5wb3N0SW5pdGlhbGl6ZSgpOwotCi0JCS8vIEluaXRpYWxpemUgUHJvcGVydGllcyBmcm9tIGxlZ2FjeSBwcm9wZXJ0aWVzIG5hbWVzIGlmIG5vdCBpbml0aWFsaXplZC4KLQkJaWYodGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoRUNMSVBTRUxJTktfRFJJVkVSKSkgewotCQkJaWYodGhpcy5kcml2ZXIgPT0gbnVsbCkgewotCQkJCXRoaXMuZHJpdmVyID0gdGhpcy5nZXRTdHJpbmdWYWx1ZShFQ0xJUFNFTElOS19EUklWRVIpOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX1VSTCkpIHsKLQkJCWlmKHRoaXMudXJsID09IG51bGwpIHsKLQkJCQl0aGlzLnVybCA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfVVJMKTsKLQkJCX0KLQkJfQotCQlpZih0aGlzLnBlcnNpc3RlbmNlVW5pdEtleUV4aXN0cyhFQ0xJUFNFTElOS19VU0VSKSkgewotCQkJaWYodGhpcy51c2VyID09IG51bGwpIHsKLQkJCQl0aGlzLnVzZXIgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKEVDTElQU0VMSU5LX1VTRVIpOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKEVDTElQU0VMSU5LX1BBU1NXT1JEKSkgewotCQkJaWYodGhpcy5wYXNzd29yZCA9PSBudWxsKSB7Ci0JCQkJdGhpcy5wYXNzd29yZCA9IHRoaXMuZ2V0U3RyaW5nVmFsdWUoRUNMSVBTRUxJTktfUEFTU1dPUkQpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX0RSSVZFUikpIHsKLQkJCXRoaXMuZHJpdmVyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMKSkgewotCQkJdGhpcy51cmxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQpKSB7Ci0JCQl0aGlzLnBhc3N3b3JkQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgewotCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCkpIHsKLQkJCXRoaXMudXJsQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSKSkgewotCQkJdGhpcy51c2VyQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKLQkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGF0YWJhc2VDb25uZWN0aW9uUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLAotCQkJQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VUkwsCi0JCQlDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVIsCi0JCQlDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCwKLQkJCUNvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQkKLQkvKioKLQkgKiBNaWdyYXRlIHByb3BlcnRpZXMgbmFtZXMgdG8gRWNsaXBzZUxpbmsgMi4wIG5hbWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCBtaWdyYXRlUHJvcGVydGllcygpIHsKLQkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfRFJJVkVSLCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLCB0aGlzLmRyaXZlcik7Ci0JCXRoaXMubWlncmF0ZVN0cmluZ1Byb3BlcnR5KEVDTElQU0VMSU5LX1VSTCwgSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwgdGhpcy51cmwpOwotCQl0aGlzLm1pZ3JhdGVTdHJpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19VU0VSLCBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVNFUiwgdGhpcy51c2VyKTsKLQkJdGhpcy5taWdyYXRlU3RyaW5nUHJvcGVydHkoRUNMSVBTRUxJTktfUEFTU1dPUkQsIEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCwgdGhpcy5wYXNzd29yZCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtaWdyYXRlU3RyaW5nUHJvcGVydHkoU3RyaW5nIG9sZEtleSwgU3RyaW5nIG5ld0tleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmKHRoaXMucGVyc2lzdGVuY2VVbml0S2V5RXhpc3RzKG9sZEtleSkpIHsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob2xkS2V5KTsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkobmV3S2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLSAgICAgKiBNaWdyYXRlIGFsbCBwcm9wZXJ0aWVzIG5hbWVzIGJlZm9yZSB0aGUgcHJvcGVydHkgaXMgc2V0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJlU2V0UHJvcGVydHkoKSB7Ci0JCQotCQl0aGlzLm1pZ3JhdGVQcm9wZXJ0aWVzKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhYzBhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuRWNsaXBzZUxpbmtMb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0xvZ2dpbmcyXzAKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTG9nZ2luZzJfMCBleHRlbmRzIEVjbGlwc2VMaW5rTG9nZ2luZwotCWltcGxlbWVudHMgTG9nZ2luZzJfMAotewotCS8vICoqKioqKioqKiogRWNsaXBzZUxpbmsgcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKiogCi0JICogU3RvcmUgQ2F0ZWdvcnkgbGV2ZWxzIGluIGEgbWFwCi0JICoga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBDYXRlZ29yeSBwcm9wZXJ0eSBpZAotCSAqIAkJdmFsdWUgPSB2YWx1ZQotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgTG9nZ2luZ0xldmVsPiBjYXRlZ29yeVZhbHVlczsKLQotCXByaXZhdGUgQm9vbGVhbiBjb25uZWN0aW9uOwotCQotCXByaXZhdGUgTG9nZ2luZ0xldmVsIGNhdGVnb3JpZXNEZWZhdWx0VmFsdWU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0xvZ2dpbmcyXzAoUGVyc2lzdGVuY2VVbml0Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIEluaXRpYWxpemVzIHByb3BlcnRpZXMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUHJvcGVydGllcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb24gPSAKLQkJCXRoaXMuZ2V0Qm9vbGVhblZhbHVlKEVDTElQU0VMSU5LX0NPTk5FQ1RJT04pOwotCQkKLQkJdGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlID0gCi0JCQl0aGlzLmdldEVudW1WYWx1ZShFQ0xJUFNFTElOS19MRVZFTCwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShUUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoRVZFTlRfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KENPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShDQUNIRV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KFNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KEVKQl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoRE1TX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShFSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNhdGVnb3J5KE1FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJdGhpcy5pbml0aWFsaXplQ2F0ZWdvcnkoV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShQUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQl0aGlzLmluaXRpYWxpemVDYXRlZ29yeShTRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQl0aGlzLmNhdGVnb3J5VmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb2dnaW5nTGV2ZWw+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHNldCBhIGxvZ2dpbmcgbGV2ZWwgY2F0ZWdvcnkgdmFsdWUgZnJvbSB0aGUgdmFsdWUgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogCi0JICoga2V5ID0gQ2F0ZWdvcnkgcHJvcGVydHkgaWQ7IHZhbHVlID0gdmFsdWUgKExvZ2dpbmdMZXZlbCkKLQkgKiBAcGFyYW0gY2F0ZWdvcnlJZCAtIENhdGVnb3J5IHByb3BlcnR5IGlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnlJZCkgewotCQlTdHJpbmcgcHVLZXkgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdEtleU9mKGNhdGVnb3J5SWQpOwotCQlMb2dnaW5nTGV2ZWwgcHVWYWx1ZSA9IHRoaXMuZ2V0RW51bVZhbHVlKHB1S2V5LCBMb2dnaW5nTGV2ZWwudmFsdWVzKCkpOwotCi0JCXRoaXMuY2F0ZWdvcnlWYWx1ZXMucHV0KGNhdGVnb3J5SWQsIHB1VmFsdWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlzdXBlci5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DT05ORUNUSU9OKSkgewotCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eVJlbW92ZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DT05ORUNUSU9OKSkgewotCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19ETVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX01FVEFNT0RFTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLCBudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMKSkgewotCQkJdGhpcy5jYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwpKSB7Ci0JCQl0aGlzLmNhdGVnb3J5TG9nZ2luZ0NoYW5nZWRfKEVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCkpIHsKLQkJCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZF8oRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IEVjbGlwc2VMaW5rIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0KLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DT05ORUNUSU9OLAotCQkJQ09OTkVDVElPTl9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlTUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlDT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlRVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVBST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCUVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFSkJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlFSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlNRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwsCi0JCQlXRUFWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMLAotCQkJUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlFQ0xJUFNFTElOS19TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCwKLQkJCVNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb24gKioqKioqKioqKgotCXB1YmxpYyBCb29sZWFuIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdGlvbihCb29sZWFuIG5ld0Nvbm5lY3Rpb24pIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmNvbm5lY3Rpb247Ci0JCXRoaXMuY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247Ci0JCXRoaXMucHV0UHJvcGVydHkoQ09OTkVDVElPTl9QUk9QRVJUWSwgbmV3Q29ubmVjdGlvbik7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05ORUNUSU9OX1BST1BFUlRZLCBvbGQsIG5ld0Nvbm5lY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25uZWN0aW9uQ2hhbmdlZChTdHJpbmcgc3RyaW5nVmFsdWUpIHsKLQkJQm9vbGVhbiBuZXdWYWx1ZSA9IGdldEJvb2xlYW5WYWx1ZU9mKHN0cmluZ1ZhbHVlKTsKLQkJCi0JCUJvb2xlYW4gb2xkID0gdGhpcy5jb25uZWN0aW9uOwotCQl0aGlzLmNvbm5lY3Rpb24gPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTk5FQ1RJT05fUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldERlZmF1bHRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9DT05ORUNUSU9OOwotCX0KLQkKLQkvLyAqKioqKioqKioqIENhdGVnb3J5IExldmVscyAqKioqKioqKioqCi0JCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRMZXZlbChTdHJpbmcgY2F0ZWdvcnkpIHsKLQotCQlyZXR1cm4gdGhpcy5jYXRlZ29yeVZhbHVlcy5nZXQoY2F0ZWdvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExldmVsKFN0cmluZyBjYXRlZ29yeSwgTG9nZ2luZ0xldmVsIG5ld0xldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmdldExldmVsKGNhdGVnb3J5KTsKLQkJdGhpcy5jYXRlZ29yeVZhbHVlcy5wdXQoY2F0ZWdvcnksIG5ld0xldmVsKTsKLQkJdGhpcy5wdXRQcm9wZXJ0eShjYXRlZ29yeSwgbmV3TGV2ZWwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoY2F0ZWdvcnksIG9sZCwgbmV3TGV2ZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkXyhTdHJpbmcgZWNsaXBzZWxpbmtLZXksIFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlTdHJpbmcgY2F0ZWdvcnkgPSB0aGlzLnByb3BlcnR5SWRPZihlY2xpcHNlbGlua0tleSk7Ci0JCXRoaXMuY2F0ZWdvcnlMb2dnaW5nQ2hhbmdlZChjYXRlZ29yeSwgc3RyaW5nVmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYXRlZ29yeUxvZ2dpbmdDaGFuZ2VkKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUxvZ2dpbmdMZXZlbCBlbnVtVmFsdWUgPSBnZXRFbnVtVmFsdWVPZihzdHJpbmdWYWx1ZSwgTG9nZ2luZ0xldmVsLnZhbHVlcygpKTsKLQkJTG9nZ2luZ0xldmVsIG9sZCA9IHRoaXMuZ2V0TGV2ZWwoY2F0ZWdvcnkpOwotCQl0aGlzLmNhdGVnb3J5VmFsdWVzLnB1dChjYXRlZ29yeSwgZW51bVZhbHVlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGNhdGVnb3J5LCBvbGQsIGVudW1WYWx1ZSk7Ci0JfQotCi0JcHVibGljIExvZ2dpbmdMZXZlbCBnZXRDYXRlZ29yaWVzRGVmYXVsdExldmVsKCkgewotCQlyZXR1cm4gKHRoaXMuY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZSA9PSBudWxsKSA/IHN1cGVyLmdldERlZmF1bHRMZXZlbCgpIDogdGhpcy5jYXRlZ29yaWVzRGVmYXVsdFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldExldmVsKExvZ2dpbmdMZXZlbCBsZXZlbCkgewotCQlzdXBlci5zZXRMZXZlbChsZXZlbCk7Ci0JCXRoaXMuc2V0RGVmYXVsdExldmVsKGxldmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKSB7Ci0JCUxvZ2dpbmdMZXZlbCBvbGQgPSB0aGlzLmNhdGVnb3JpZXNEZWZhdWx0VmFsdWU7Ci0JCXRoaXMuY2F0ZWdvcmllc0RlZmF1bHRWYWx1ZSA9IGxldmVsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FURUdPUklFU19ERUZBVUxUX0xPR0dJTkdfUFJPUEVSVFksIG9sZCwgbGV2ZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMzY5ZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvRWNsaXBzZUxpbmtPcHRpb25zMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5FY2xpcHNlTGlua09wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rT3B0aW9uczJfMAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zMl8wIGV4dGVuZHMgRWNsaXBzZUxpbmtPcHRpb25zCi0JaW1wbGVtZW50cyBPcHRpb25zMl8wCi17Ci0JLy8gKioqKioqKioqKiBHZW5lcmljQ29ubmVjdGlvbiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIEludGVnZXIgbG9ja1RpbWVvdXQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHF1ZXJ5VGltZW91dDsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0czsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXM7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uczJfMChQZXJzaXN0ZW5jZVVuaXQyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQlzdXBlci5pbml0aWFsaXplUHJvcGVydGllcygpOwotCQkKLQkJdGhpcy5sb2NrVGltZW91dCA9IAotCQkJdGhpcy5nZXRJbnRlZ2VyVmFsdWUoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKTsKLQkJdGhpcy5xdWVyeVRpbWVvdXQgPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQpOwotCi0JCS8vIFZhbGlkYXRpb25Nb2RlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHBlcnNpc3RlbmNlIHVuaXQgZWxlbWVudAotCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUKTsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpOwotCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMgPSB0aGlzLmdldENvbXBvc2l0ZVZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJc3VwZXIucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCBuZXdWYWx1ZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7Ci0JCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgewotCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7Ci0JCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChudWxsKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQpKSB7Ci0JCQl0aGlzLnF1ZXJ5VGltZW91dENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c0NoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc0NoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc0NoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgcHJvcGVydHkgbmFtZXMga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZTogCi0JICogCQlrZXkgPSBQVSBwcm9wZXJ0eSBrZXkKLQkgKiAJCXZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQsCi0JCQlMT0NLX1RJTUVPVVRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQsCi0JCQlRVUVSWV9USU1FT1VUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNULAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMb2NrVGltZW91dCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0TG9ja1RpbWVvdXQoKSB7Ci0JCXJldHVybiB0aGlzLmxvY2tUaW1lb3V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KEludGVnZXIgbmV3TG9ja1RpbWVvdXQpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmxvY2tUaW1lb3V0OwotCQl0aGlzLmxvY2tUaW1lb3V0ID0gbmV3TG9ja1RpbWVvdXQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9DS19USU1FT1VUX1BST1BFUlRZLCBuZXdMb2NrVGltZW91dCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3TG9ja1RpbWVvdXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2NrVGltZW91dENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubG9ja1RpbWVvdXQ7Ci0JCXRoaXMubG9ja1RpbWVvdXQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0NLX1RJTUVPVVQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFF1ZXJ5VGltZW91dCgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlUaW1lb3V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMucXVlcnlUaW1lb3V0OwotCQl0aGlzLnF1ZXJ5VGltZW91dCA9IG5ld1F1ZXJ5VGltZW91dDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBuZXdRdWVyeVRpbWVvdXQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdRdWVyeVRpbWVvdXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBxdWVyeVRpbWVvdXRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnF1ZXJ5VGltZW91dDsKLQkJdGhpcy5xdWVyeVRpbWVvdXQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRRdWVyeVRpbWVvdXQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1FVRVJZX1RJTUVPVVQ7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKXsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgOiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0LmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5hZGQobmV3UHJlUGVyc2lzdENsYXNzTmFtZSk7Ci0JCQl0aGlzLnB1dFByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgbmV3UHJlUGVyc2lzdENsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMpOwotCQkJcmV0dXJuIG5ld1ByZVBlcnNpc3RDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJaWYodGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0XyhjbGFzc05hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0XyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IgKCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpID0gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0ID0gaS5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0LmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCk7Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCl7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUV4aXN0cyhTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2xhc3NOYW1lKSB7Ci0KLQkJZm9yIChTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIDogdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUuZXF1YWxzKHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoU3RyaW5nIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSl7Ci0KLQkJaWYoICEgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMobmV3UHJlVXBkYXRlQ2xhc3NOYW1lKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzLmFkZChuZXdQcmVVcGRhdGVDbGFzc05hbWUpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgbmV3UHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMpOwotCQkJcmV0dXJuIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWlmKHRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlXyhjbGFzc05hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIGNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVfKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWZvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBpID0gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSA9IGkubmV4dCgpOwotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzLnJlbW92ZSh2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUpOwotCQkJCXJldHVybiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNDaGFuZ2VkKCkgewotCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMgPSB0aGlzLmdldENvbXBvc2l0ZVZhbHVlKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcygpewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQl9Ci0JCi0JcHVibGljIGludCB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzU2l6ZSgpewotCQlyZXR1cm4gdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNsYXNzTmFtZSkgewotCi0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSA6IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcykgewotCQkJaWYodmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlLmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKFN0cmluZyBuZXdQcmVSZW1vdmVDbGFzc05hbWUpewotCi0JCWlmKCAhIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKG5ld1ByZVJlbW92ZUNsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcy5hZGQobmV3UHJlUmVtb3ZlQ2xhc3NOYW1lKTsKLQkJCXRoaXMucHV0UHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIG5ld1ByZVJlbW92ZUNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQkJCXJldHVybiBuZXdQcmVSZW1vdmVDbGFzc05hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlpZih0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZV8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBjbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlXyhTdHJpbmcgY2xhc3NOYW1lKXsKLQotCQlmb3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaSA9IHRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcygpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgPSBpLm5leHQoKTsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKTsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvZGRsZ2VuL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8wL2RkbGdlbi9FY2xpcHNlTGluazJfMERETEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTllYWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzAvZGRsZ2VuL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuZGRsZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbi5BYnN0cmFjdEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMERMTEdlbmVyYXRvciBsYXVuY2hlcyB0aGUgRWNsaXBzZUxpbmsgRERMIGdlbmVyYXRvciBpbiBhIHNlcGFyYXRlIFZNLgotICogIEZvciB0aGlzIGl0IHdpbGwgY3JlYXRlIGEgSmF2YSBDb25maWd1cmF0aW9uIG5hbWVkICJEYWxpIEVjbGlwc2VMaW5rIFRhYmxlIEdlbmVyYXRpb24iIAotICogIGluIHRoZSB0YXJnZXQgd29ya3NwYWNlIChub3RlOiB0aGUgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gYXQgZWFjaCBydW4pLgotICogIEl0IHdpbGwgdGhhbiBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24gY3JlYXRlZCB3aXRoIHRoZSBsb2dpbiBpbmZvcm1hdGlvbiBmcm9tIAotICogIHRoZSBjdXJyZW50IERhbGkgcHJvamVjdCwgYW5kIHBhc3NlcyBpdCB0byBFY2xpcHNlTGluay4KLSAqICAKLSAqICBQcmUtcmVxIGluIFBERSBlbnZpcm9ubWVudDoKLSAqICAJb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi5qYXIgaW4gRUNMSVBTRV9IT01FL3BsdWdpbnMKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0RETEdlbmVyYXRvcgotewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NT0RFX1BST1BFUlRZID0gImphdmF4LnBlcnNpc3RlbmNlLnZhbGlkYXRpb24ubW9kZSI7IAkgIC8vJE5PTi1OTFMtMSQKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChwdU5hbWUgPT0gbnVsbCB8fCBwdU5hbWUubGVuZ3RoKCkgPT0gMCB8fCBwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCW5ldyBFY2xpcHNlTGluazJfMERETEdlbmVyYXRvcihwdU5hbWUsIHByb2plY3QpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXN1cGVyKHB1TmFtZSwganBhUHJvamVjdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGluayBwcm9wZXJ0aWVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEFsbFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQWxsUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlWQUxJREFUSU9OX01PREVfUFJPUEVSVFksCi0JCQlOT05FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlci5idWlsZEN1c3RvbWl6YXRpb25Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQkKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HLAotCQkJRkFMU0UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyLmJ1aWxkQ29ubmVjdGlvblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywgCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXREcml2ZXJDbGFzc05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0aWVzLAotCQkJSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTCwKLQkJCShjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydGllcywKLQkJCUpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19VU0VSLAotCQkJKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVc2VyTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnRpZXMsCi0JCQlKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQsCi0JCQkoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJQYXNzd29yZCgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvQWJzdHJhY3RFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvQWJzdHJhY3RFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1YjFkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0Fic3RyYWN0RWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5BYnN0cmFjdEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCXN1cGVyLmFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDVhZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlcyBhbm5vdGF0aW9ucyBmb3IgMS4wIEVjbGlwc2VMaW5rIHBsYXRmb3JtCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsyXzFKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgVFlQRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uW10gVFlQRV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFR5cGVNYXBwaW5nQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQkvLyBub3RoaW5nIG5ldyBmb3IgRWNsaXBzZUxpbmsgMi4xCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PEFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBBVFRSSUJVVEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIEFUVFJJQlVURV9BTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFja2FnZUFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJLy8gbm8gcGFja2FnZSBhbm5vdGF0aW9ucwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1N2I1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1GYWN0b3J5LkVjbGlwc2VMaW5rVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeSgpLCAKLQkJCXRoaXMuYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCXRoaXMuYnVpbGRKcGFWYXJpYXRpb24oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8xLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFWYXJpYXRpb24oKSB7Ci0vLwkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLS8vCQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLS8vCQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYzFmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rIDIuMSBwbGF0Zm9ybSBjb25maWcKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYzU1YWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzEKLQlleHRlbmRzIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPFhtbEVsZW1lbnRDb2xsZWN0aW9uPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtRWNsaXBzZUxpbmtKb2luRmV0Y2ggam9pbkZldGNoOwotCi0KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzEoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JCXRoaXMuam9pbkZldGNoID0gbmV3IE9ybUVjbGlwc2VMaW5rSm9pbkZldGNoKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5GZXRjaC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luRmV0Y2gudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoIGdldEpvaW5GZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkZldGNoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gVE9ETyBqb2luIGZldGNoIHZhbGlkYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MGM1MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMUNvbnRleHROb2RlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5Ci17Ci0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMShwYXJlbnQsIChYbWxFbGVtZW50Q29sbGVjdGlvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcgYnVpbGRPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljQ29sbGVjdGlvbiByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nIGJ1aWxkT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMl8xKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA2ODdlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzAuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8xRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzFfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NmUxYjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9jb250ZXh0L29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcyXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzJfMQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMl8xKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxCYXNpY0NvbGxlY3Rpb24geG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJaWYgKCAhIHRoaXMuaXNWaXJ0dWFsKCkpIHsgLy8gaWYgdmlydHVhbCB0aGUgdW5kZXJseWluZyBqYXZhIGFubm90YXRpb24gd2lsbCBoYXZlIGEgamF2YSBkZXByZWNhdGlvbiB3YXJuaW5nCi0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5CQVNJQ19DT0xMRUNUSU9OX01BUFBJTkdfREVQUkVDQVRFRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvY29udGV4dC9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlMWZjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL2NvbnRleHQvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkRlZmF1bHRFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEKLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcKLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcyXzEoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEJhc2ljTWFwIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmICggISB0aGlzLmlzVmlydHVhbCgpKSB7IC8vaWYgdmlydHVhbCB0aGUgdW5kZXJseWluZyBqYXZhIGFubm90YXRpb24gd2lsbCBoYXZlIGEgamF2YSBkZXByZWNhdGlvbiB3YXJuaW5nCi0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEVjbGlwc2VMaW5rSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlFY2xpcHNlTGlua0pwYVZhbGlkYXRpb25NZXNzYWdlcy5CQVNJQ19NQVBfTUFQUElOR19ERVBSRUNBVEVELAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWVmNTZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNsYXNzRXh0cmFjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yMl8xQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvcjJfMUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3IyXzFBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xKChKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSkgcGFyZW50LCAoVHlwZSkgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSgoSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUpIHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMwMWM4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNsYXNzRXh0cmFjdG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMQotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEgCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVjbGlwc2VMaW5rMl8xLkNMQVNTX0VYVFJBQ1RPUl9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUKLQkvKioKLQkgKiBiaW5hcnkgaXMgYWxyZWFkeSBmdWxseS1xdWFsaWZpZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzE2MmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNsYXNzRXh0cmFjdG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMQotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbjxUeXBlPgotCWltcGxlbWVudHMgRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlwcml2YXRlIGJvb2xlYW4gZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMShKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0eXBlLCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEVjbGlwc2VMaW5rQ2xhc3NFeHRyYWN0b3JBbm5vdGF0aW9uMl8xIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgYXN0VmFsdWUpKSB7Ci0JCQl0aGlzLnN5bmNWYWx1ZV8oYXN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZV8oU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJaWYgKHRoaXMuZnFDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEVjbGlwc2VMaW5rMl8xLkNMQVNTX0VYVFJBQ1RPUl9fVkFMVUUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I1YzllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzIvRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybUZhY3RvcnkuRWNsaXBzZUxpbmtWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8wLkVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5FY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtRmFjdG9yeQotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKLXsKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IEVjbGlwc2VMaW5rMl8wSnBhRmFjdG9yeSgpLCAKLQkJCXRoaXMuYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLCAKLQkJCXRoaXMuYnVpbGRKcGFWYXJpYXRpb24oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybS5WZXJzaW9uIGJ1aWxkSnBhVmVyc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZlcnNpb24oCi0JCQkJSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX1BMQVRGT1JNX1ZFUlNJT05fMl8yLAotCQkJCUpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRKcGFBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfMUpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFWYXJpYXRpb24oKSB7Ci0vLwkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLS8vCQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLS8vCQkJCQlyZXR1cm4gU3VwcG9ydGVkLllFUzsKLS8vCQkJCX0KLS8vCQkJCQotLy8JCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1Nzc2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMS5BYnN0cmFjdEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMi5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShjb250ZW50VHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCXN1cGVyLmFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzIvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODI1Y2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzFDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzFEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzJEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDJfMkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotLy8JQE92ZXJyaWRlCi0vLwlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLS8vCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRTsKLS8vCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8xQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8yX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiBPUk0gdHlwZSBtYXBwaW5ncyAqKioqKioqKioKLQkKLS8vCUBPdmVycmlkZQotLy8JcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLS8vCQkvLyBvcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlLCBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBqYXZhCi0vLwkJLy8gQHNlZSB7QGxpbmsgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVByb3ZpZGVyfQotLy8JCS8vIE5PVEU6IG5vIG5ldyB0eXBlIG1hcHBpbmcgcHJvdmlkZXJzIGZyb20gZWNsaXBzZWxpbmsgMS4wIHRvIDEuMQotLy8JCXJldHVybiBuZXcgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotLy8JCQlPcm1FbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCl9OwotLy8JfQotCQotCQotCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0JCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIGJ1aWxkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotLy8JCS8vIG9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmUsIGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIGphdmEKLS8vCQkvLyBAc2VlIHtAbGluayBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtUHJvdmlkZXJ9Ci0vLwkJcmV0dXJuIG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLS8vCQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1JZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0vLwkJCU9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLS8vCQkJT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotLy8JCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKX07Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9wbGF0Zm9ybS9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9wbGF0Zm9ybS9FY2xpcHNlTGlua1BsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTUyODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcGxhdGZvcm0vRWNsaXBzZUxpbmtQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotCi0vKioKLSAqIENvbnN0YW50cyBwZXJ0YWluaW5nIHRvIHRoZSBFY2xpcHNlTGluayBKUEEgcGxhdGZvcm1zIGFuZCB0aGVpciBncm91cAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BsYXRmb3JtIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBHUk9VUAotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtR3JvdXAoImVjbGlwc2VsaW5rIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8xXzAKLQkJCT0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgib3JnLmVjbGlwc2UuZWNsaXBzZWxpbmsucGxhdGZvcm0iKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzFfMQotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazFfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMV8yCi0JCQk9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImVjbGlwc2VsaW5rMV8yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzAKLQkJCT0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSgiZWNsaXBzZWxpbmsyXzAiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMQotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJlY2xpcHNlbGluazJfMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTm90IGZvciBpbnN0YW50aWF0aW9uCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BsYXRmb3JtKCkge30KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQmFzZUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyNzIwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29tbW9uIHByb3RvY29sIGFtb25nOgotICogICAgIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlR5cGVDb252ZXJ0ZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5PYmplY3RUeXBlQ29udmVydGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YVR5cGUoKTsKLQkJU3RyaW5nIERBVEFfVFlQRV9QUk9QRVJUWSA9ICJkYXRhVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50IG9mIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIGRhdGFUeXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RhdGFUeXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREYXRhVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBkYXRhIHR5cGUgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUKLQkgKiBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1R5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBNeURhdGFUeXBlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5NeURhdGFUeXBlIjwvY29kZT4gaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvcgotCSAqIDxjb2RlPm1vZGVsLk15RGF0YVR5cGU8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZERhdGFUeXBlKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0T2JqZWN0VHlwZSgpOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfUFJPUEVSVFkgPSAib2JqZWN0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFR5cGUnIGVsZW1lbnQgb2YgdGhlIFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBvYmplY3RUeXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ29iamVjdFR5cGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE9iamVjdFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgb2JqZWN0IHR5cGUgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUKLQkgKiBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1R5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBNeU9iamVjdFR5cGUuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gPGNvZGU+Im1vZGVsLk15T2JqZWN0VHlwZSI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5NeU9iamVjdFR5cGU8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZE9iamVjdFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2NkYWUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBlbnVtCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9PQkpFQ1RfQ0hBTkdFUyksCi0JSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKSwKLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyhFY2xpcHNlTGluay5DQUNIRV9DT09SRElOQVRJT05fVFlQRV9fU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpLAotCU5PTkUoRWNsaXBzZUxpbmsuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX05PTkUpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JQ2FjaGVDb29yZGluYXRpb25UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlIDogQ2FjaGVDb29yZGluYXRpb25UeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoY2FjaGVDb29yZGluYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gY2FjaGVDb29yZGluYXRpb25UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY2FjaGVDb29yZGluYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoY2FjaGVDb29yZGluYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGNhY2hlQ29vcmRpbmF0aW9uVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DYWNoZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1ZGQ5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgZW51bQotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQotCUZVTEwoRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRV9fRlVMTCksCi0JV0VBSyhFY2xpcHNlTGluay5DQUNIRV9UWVBFX19XRUFLKSwKLQlTT0ZUKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX1NPRlQpLAotCVNPRlRfV0VBSyhFY2xpcHNlTGluay5DQUNIRV9UWVBFX19TT0ZUX1dFQUspLAotCUhBUkRfV0VBSyhFY2xpcHNlTGluay5DQUNIRV9UWVBFX19IQVJEX1dFQUspLAotCUNBQ0hFKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX0NBQ0hFKSwKLQlOT05FKEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEVfX05PTkUpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JQ2FjaGVUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENhY2hlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChDYWNoZVR5cGUgY2FjaGVUeXBlIDogQ2FjaGVUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoY2FjaGVUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gY2FjaGVUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShDYWNoZVR5cGUgY2FjaGVUeXBlKSB7Ci0JCXJldHVybiAoY2FjaGVUeXBlID09IG51bGwpID8gbnVsbCA6IGNhY2hlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYWM1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgZW51bQotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2hhbmdlVHJhY2tpbmdUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLQotCUFUVFJJQlVURShFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVRUUklCVVRFKSwKLQlPQkpFQ1QoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX09CSkVDVCksCi0JREVGRVJSRUQoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEVfX0RFRkVSUkVEKSwKLQlBVVRPKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFX19BVVRPKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUNoYW5nZVRyYWNraW5nVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VUcmFja2luZ1R5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDaGFuZ2VUcmFja2luZ1R5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZSA6IENoYW5nZVRyYWNraW5nVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGNoYW5nZVRyYWNraW5nVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIGNoYW5nZVRyYWNraW5nVHlwZSkgewotCQlyZXR1cm4gKGNoYW5nZVRyYWNraW5nVHlwZSA9PSBudWxsKSA/IG51bGwgOiBjaGFuZ2VUcmFja2luZ1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluay5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2ZmMjEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsgewotCi0JLy8gRWNsaXBzZUxpbmsgcGFja2FnZQotCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAiLiI7Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8vIEVjbGlzcGVMaW5rIGFubm90YXRpb25zCi0JU3RyaW5nIEJBU0lDX0NPTExFQ1RJT04gPSBQQUNLQUdFXyArICJCYXNpY0NvbGxlY3Rpb24iOwotCVN0cmluZyBCQVNJQ19NQVAgPSBQQUNLQUdFXyArICJCYXNpY01hcCI7Ci0JU3RyaW5nIENBQ0hFID0gUEFDS0FHRV8gKyAiQ2FjaGUiOwotCQlTdHJpbmcgQ0FDSEVfX1NIQVJFRCA9ICJzaGFyZWQiOwotCQlTdHJpbmcgQ0FDSEVfX0VYUElSWSA9ICJleHBpcnkiOwotCQlTdHJpbmcgQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnlUaW1lT2ZEYXkiOwotCQlTdHJpbmcgQ0FDSEVfX1RZUEUgPSAidHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9fU0laRSA9ICJzaXplIjsKLQkJU3RyaW5nIENBQ0hFX19BTFdBWVNfUkVGUkVTSCA9ICJhbHdheXNSZWZyZXNoIjsKLQkJU3RyaW5nIENBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSAicmVmcmVzaE9ubHlJZk5ld2VyIjsKLQkJU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZUhpdHMiOwotCQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvblR5cGUiOwotCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkcgPSBQQUNLQUdFXyArICJDaGFuZ2VUcmFja2luZyI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRSA9IFBBQ0tBR0VfICsgIkNvbnZlcnNpb25WYWx1ZSI7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gImRhdGFWYWx1ZSI7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUgPSAib2JqZWN0VmFsdWUiOwotCVN0cmluZyBDT05WRVJUID0gUEFDS0FHRV8gKyAiQ29udmVydCI7Ci0JCVN0cmluZyBDT05WRVJUX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIENPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIkNvbnZlcnRlciI7Ci0JCVN0cmluZyBDT05WRVJURVJfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBDT05WRVJURVJfX0NPTlZFUlRFUl9DTEFTUyA9ICJjb252ZXJ0ZXJDbGFzcyI7Ci0JU3RyaW5nIENVU1RPTUlaRVIgPSBQQUNLQUdFXyArICJDdXN0b21pemVyIjsKLQkJU3RyaW5nIENVU1RPTUlaRVJfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gUEFDS0FHRV8gKyAiRXhpc3RlbmNlQ2hlY2tpbmciOwotCQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEpPSU5fRkVUQ0ggPSBQQUNLQUdFXyArICJKb2luRmV0Y2giOwotCQlTdHJpbmcgSk9JTl9GRVRDSF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBNVVRBQkxFID0gUEFDS0FHRV8gKyAiTXV0YWJsZSI7Ci0JCVN0cmluZyBNVVRBQkxFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIk9iamVjdFR5cGVDb252ZXJ0ZXIiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSAiZGF0YVR5cGUiOwotCQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3RUeXBlIjsKLQkJU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSAiY29udmVyc2lvblZhbHVlcyI7Ci0JCVN0cmluZyBPQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFID0gImRlZmF1bHRPYmplY3RWYWx1ZSI7Ci0JU3RyaW5nIFBSSU1BUllfS0VZID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleSI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9fVkFMSURBVElPTiA9ICJ2YWxpZGF0aW9uIjsKLQkJU3RyaW5nIFBSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRSA9ICJjYWNoZUtleVR5cGUiOwotCQlTdHJpbmcgUFJJTUFSWV9LRVlfX0NPTFVNTlMgPSAiY29sdW1ucyI7Ci0JU3RyaW5nIFBSSVZBVEVfT1dORUQgPSBQQUNLQUdFXyArICJQcml2YXRlT3duZWQiOwotCVN0cmluZyBSRUFEX09OTFkgPSBQQUNLQUdFXyArICJSZWFkT25seSI7Ci0JU3RyaW5nIFJFQURfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJSZWFkVHJhbnNmb3JtZXIiOwotCQlTdHJpbmcgUkVBRF9UUkFOU0ZPUk1FUl9fVFJBTlNGT1JNRVJfQ0xBU1MgPSAidHJhbnNmb3JtZXJDbGFzcyI7Ci0JCVN0cmluZyBSRUFEX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9IFBBQ0tBR0VfICsgIlN0cnVjdENvbnZlcnRlciI7Ci0JCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSID0gImNvbnZlcnRlciI7Ci0JU3RyaW5nIFRJTUVfT0ZfREFZID0gUEFDS0FHRV8gKyAiVGltZU9mRGF5IjsKLQkJU3RyaW5nIFRJTUVfT0ZfREFZX19IT1VSID0gImhvdXIiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTlVURSA9ICJtaW51dGUiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX1NFQ09ORCA9ICJzZWNvbmQiOwotCQlTdHJpbmcgVElNRV9PRl9EQVlfX01JTExJU0VDT05EID0gIm1pbGxpc2Vjb25kIjsKLQlTdHJpbmcgVFJBTlNGT1JNQVRJT04gPSBQQUNLQUdFXyArICJUcmFuc2Zvcm1hdGlvbiI7Ci0JCVN0cmluZyBUUkFOU0ZPUk1BVElPTl9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgVFJBTlNGT1JNQVRJT05fX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLQlTdHJpbmcgVFlQRV9DT05WRVJURVIgPSBQQUNLQUdFXyArICJUeXBlQ29udmVydGVyIjsKLQkJU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhVHlwZSI7Ci0JCVN0cmluZyBUWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSAib2JqZWN0VHlwZSI7Ci0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSBQQUNLQUdFXyArICJWYXJpYWJsZU9uZVRvT25lIjsKLQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVIgPSBQQUNLQUdFXyArICJXcml0ZVRyYW5zZm9ybWVyIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19UUkFOU0ZPUk1FUl9DTEFTUyA9ICJ0cmFuc2Zvcm1lckNsYXNzIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19NRVRIT0QgPSAibWV0aG9kIjsKLQkJU3RyaW5nIFdSSVRFX1RSQU5TRk9STUVSX19DT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTID0gUEFDS0FHRV8gKyAiV3JpdGVUcmFuc2Zvcm1lcnMiOwotCQlTdHJpbmcgV1JJVEVfVFJBTlNGT1JNRVJTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQkvLyBFY2xpcHNlTGluayBlbnVtcwotCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlQ29vcmRpbmF0aW9uVHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV8gPSBDQUNIRV9DT09SRElOQVRJT05fVFlQRSArICIuIjsKLQkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX09CSkVDVF9DSEFOR0VTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIlNFTkRfT0JKRUNUX0NIQU5HRVMiOwotCQlTdHJpbmcgQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfX0lOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTID0gQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEVfICsgIklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIjsKLQkJU3RyaW5nIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFX19TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyI7Ci0JCVN0cmluZyBDQUNIRV9DT09SRElOQVRJT05fVFlQRV9fTk9ORSA9IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFXyArICJOT05FIjsKLQlTdHJpbmcgQ0FDSEVfVFlQRSA9IFBBQ0tBR0VfICsgIkNhY2hlVHlwZSI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFXyA9IENBQ0hFX1RZUEUgKyAiLiI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19GVUxMID0gQ0FDSEVfVFlQRV8gKyAiRlVMTCI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19XRUFLID0gQ0FDSEVfVFlQRV8gKyAiV0VBSyI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUID0gQ0FDSEVfVFlQRV8gKyAiU09GVCI7Ci0JCVN0cmluZyBDQUNIRV9UWVBFX19TT0ZUX1dFQUsgPSBDQUNIRV9UWVBFXyArICJTT0ZUX1dFQUsiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fSEFSRF9XRUFLID0gQ0FDSEVfVFlQRV8gKyAiSEFSRF9XRUFLIjsKLQkJU3RyaW5nIENBQ0hFX1RZUEVfX0NBQ0hFID0gQ0FDSEVfVFlQRV8gKyAiQ0FDSEUiOwotCQlTdHJpbmcgQ0FDSEVfVFlQRV9fTk9ORSA9IENBQ0hFX1RZUEVfICsgIk5PTkUiOwotCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IFBBQ0tBR0VfICsgIkNoYW5nZVRyYWNraW5nVHlwZSI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRSArICIuIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19BVFRSSUJVVEUgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiQVRUUklCVVRFIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19PQkpFQ1QgPSBDSEFOR0VfVFJBQ0tJTkdfVFlQRV8gKyAiT0JKRUNUIjsKLQkJU3RyaW5nIENIQU5HRV9UUkFDS0lOR19UWVBFX19ERUZFUlJFRCA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJERUZFUlJFRCI7Ci0JCVN0cmluZyBDSEFOR0VfVFJBQ0tJTkdfVFlQRV9fQVVUTyA9IENIQU5HRV9UUkFDS0lOR19UWVBFXyArICJBVVRPIjsKLQlTdHJpbmcgRVhJU1RFTkNFX1RZUEUgPSBQQUNLQUdFXyArICJFeGlzdGVuY2VUeXBlIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFXyA9IEVYSVNURU5DRV9UWVBFICsgIi4iOwotCQlTdHJpbmcgRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0NBQ0hFID0gRVhJU1RFTkNFX1RZUEVfICsgIkNIRUNLX0NBQ0hFIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19DSEVDS19EQVRBQkFTRSA9IEVYSVNURU5DRV9UWVBFXyArICJDSEVDS19EQVRBQkFTRSI7Ci0JCVN0cmluZyBFWElTVEVOQ0VfVFlQRV9fQVNTVU1FX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfRVhJU1RFTkNFIjsKLQkJU3RyaW5nIEVYSVNURU5DRV9UWVBFX19BU1NVTUVfTk9OX0VYSVNURU5DRSA9IEVYSVNURU5DRV9UWVBFXyArICJBU1NVTUVfTk9OX0VYSVNURU5DRSI7Ci0JU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRSA9IFBBQ0tBR0VfICsgIkpvaW5GZXRjaFR5cGUiOwotCQlTdHJpbmcgSk9JTl9GRVRDSF9UWVBFXyA9IEpPSU5fRkVUQ0hfVFlQRSArICIuIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fSU5ORVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIklOTkVSIjsKLQkJU3RyaW5nIEpPSU5fRkVUQ0hfVFlQRV9fT1VURVIgPSBKT0lOX0ZFVENIX1RZUEVfICsgIk9VVEVSIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E2OTJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNDb2xsZWN0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbkFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQkFTSUNfQ09MTEVDVElPTjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtCYXNpY01hcEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkODdmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZWxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQmFzaWNNYXAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQmFzaWNNYXBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkJBU0lDX01BUDsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwOTRmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DQUNIRTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUNhY2hlVHlwZSBnZXRUeXBlKCk7Ci0JCVN0cmluZyBUWVBFX1BST1BFUlRZID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFR5cGUoQ2FjaGVUeXBlIHR5cGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0eXBlJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzaXplJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSW50ZWdlciBnZXRTaXplKCk7Ci0JCVN0cmluZyBTSVpFX1BST1BFUlRZID0gInNpemUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzaXplJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFNpemUoSW50ZWdlciBzaXplKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzaXplJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzaGFyZWQnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFNoYXJlZCgpOwotCQlTdHJpbmcgU0hBUkVEX1BST1BFUlRZID0gInNoYXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NoYXJlZCcgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTaGFyZWQoQm9vbGVhbiBzaGFyZWQpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzaGFyZWQnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2hhcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdleHBpcnknIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldEV4cGlyeSgpOwotCQlTdHJpbmcgRVhQSVJZX1BST1BFUlRZID0gImV4cGlyeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2V4cGlyeScgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRFeHBpcnkoSW50ZWdlciBleHBpcnkpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdleHBpcnknIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RXhwaXJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIGdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlTdHJpbmcgRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZID0gImV4cGlyeVRpbWVPZkRheSI7IC8vJE5PTi1OTFMtMSQKLQotCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiBhZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQotCXZvaWQgcmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZXhwaXJ5VGltZU9mRGF5JyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEV4cGlyeVRpbWVPZkRheVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Fsd2F5c1JlZnJlc2gnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKTsKLQkJU3RyaW5nIEFMV0FZU19SRUZSRVNIX1BST1BFUlRZID0gImFsd2F5c1JlZnJlc2giOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdhbHdheXNSZWZyZXNoJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEFsd2F5c1JlZnJlc2goQm9vbGVhbiBhbHdheXNSZWZyZXNoKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdhbHdheXNSZWZyZXNoJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEFsd2F5c1JlZnJlc2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZWZyZXNoT25seUlmTmV3ZXInIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlTdHJpbmcgUkVGUkVTSF9PTkxZX0lGX05FV0VSX1BST1BFUlRZID0gInJlZnJlc2hPbmx5SWZOZXdlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3JlZnJlc2hPbmx5SWZOZXdlcicgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9Ci0JICogZm9yIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZyZXNoT25seUlmTmV3ZXJUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkaXNhYmxlSGl0cycgZWxlbWVudCBvZiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0RGlzYWJsZUhpdHMoKTsKLQkJU3RyaW5nIERJU0FCTEVfSElUU19QUk9QRVJUWSA9ICJkaXNhYmxlSGl0cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Rpc2FibGVIaXRzJyBlbGVtZW50IG9mIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERpc2FibGVIaXRzKEJvb2xlYW4gZGlzYWJsZUhpdHMpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Rpc2FibGVIaXRzJyBlbGVtZW50LgotCSAqIElmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0KLQkgKiBmb3IgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERpc2FibGVzSGl0c1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nvb3JkaW5hdGlvblR5cGUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgZ2V0Q29vcmRpbmF0aW9uVHlwZSgpOwotCQlTdHJpbmcgQ09PUkRJTkFUSU9OX1RZUEVfUFJPUEVSVFkgPSAiY29vcmRpbmF0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nvb3JkaW5hdGlvblR5cGUnIGVsZW1lbnQgb2YgdGhlIENhY2hlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q29vcmRpbmF0aW9uVHlwZShDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2Nvb3JkaW5hdGlvblR5cGUnIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfQotCSAqIGZvciB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q29vcmRpbmF0aW9uVHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MjI4ZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNoYW5nZVRyYWNraW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkc7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuICBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1ZjY3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnNpb25WYWx1ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUU7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RhdGFWYWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGF0YVZhbHVlKCk7Ci0JCVN0cmluZyBEQVRBX1ZBTFVFX1BST1BFUlRZID0gImRhdGFWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGF0YVZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIGRhdGFWYWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2RhdGFWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbnZlcnNpb25WYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREYXRhVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRPYmplY3RWYWx1ZSgpOwotCQlTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdvYmplY3RWYWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVyc2lvblZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0T2JqZWN0VmFsdWUoU3RyaW5nIG9iamVjdFZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnb2JqZWN0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb252ZXJzaW9uVmFsdWUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0T2JqZWN0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzgwYjk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNvbnZlcnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ09OVkVSVDsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ29udmVydCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29udmVydCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU0MTI3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuQ09OVkVSVEVSOwotCQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJU3RyaW5nIENPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSA9ICJjb252ZXJ0ZXJDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlckNsYXNzJyBlbGVtZW50IG9mIHRoZSBDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRDb252ZXJ0ZXJDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY29udmVydGVyIGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlCi0JICogQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtDb252ZXJ0ZXIoR2VuZGVyQ29udmVydGVyLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5HZW5kZXJDb252ZXJ0ZXIiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yCi0JICogPGNvZGU+bW9kZWwuR2VuZGVyQ29udmVydGVyPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDb252ZXJ0ZXJDbGFzc05hbWUoKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb252ZXJ0ZXJDbGFzcycgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udmVydGVyIGNsYXNzIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciNFQ0xJUFNFTElOS19DT05WRVJURVJfQ0xBU1NfTkFNRQotCSAqLwotCWJvb2xlYW4gY29udmVydGVyQ2xhc3NJbXBsZW1lbnRzSW50ZXJmYWNlKFN0cmluZyBpbnRlcmZhY2VOYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDhkODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ3VzdG9taXplcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5DVVNUT01JWkVSOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ3VzdG9taXplciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgY3VzdG9taXplciBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZQotCSAqIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7Q3VzdG9taXplcihFbXBsb3llZUN1c3RvbWl6ZXIuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gPGNvZGU+Im1vZGVsLkVtcGxveWVlQ3VzdG9taXplciI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuCi0JICogaW1wb3J0IGZvciA8Y29kZT5tb2RlbC5FbXBsb3llZUN1c3RvbWl6ZXI8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDdXN0b21pemVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXN0b21pemVyIGNsYXNzIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXIjRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUUKLQkgKi8KLQlib29sZWFuIGN1c3RvbWl6ZXJDbGFzc0ltcGxlbWVudHNJbnRlcmZhY2UoU3RyaW5nIGludGVyZmFjZU5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkOTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5FeGlzdGVuY2VDaGVja2luZwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUV4aXN0ZW5jZVR5cGUgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShFeGlzdGVuY2VUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTNkM2IxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuSk9JTl9GRVRDSDsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEpvaW5GZXRjaCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSm9pbkZldGNoVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBKb2luRmV0Y2ggYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShKb2luRmV0Y2hUeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBKb2luRmV0Y2ggYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE5MTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VsaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk11dGFibGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuTVVUQUJMRTsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTXV0YWJsZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTXV0YWJsZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNdXRhYmxlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmMxYTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBhbW9uZzoKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJ0ZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5TdHJ1Y3RDb252ZXJ0ZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiAgICAgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuT2JqZWN0VHlwZUNvbnZlcnRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtOYW1lZENvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqQ29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ3VzdG9tQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzZkZjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLk9iamVjdFR5cGVDb252ZXJ0ZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24KLQlleHRlbmRzIEJhc2VFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnNpb25WYWx1ZXMnIGVsZW1lbnQgb2YgdGhlIE9iamVjdFR5cGVDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzKCk7Ci0JCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFU19MSVNUID0gImNvbnZlcnNpb25WYWx1ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JaW50IGNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZUF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JaW50IGluZGV4T2ZDb252ZXJzaW9uVmFsdWUoRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGFkZENvbnZlcnNpb25WYWx1ZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29udmVyc2lvblZhbHVlcycgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUNvbnZlcnNpb25WYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJzaW9uVmFsdWVzJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDb252ZXJzaW9uVmFsdWUoaW50IGluZGV4KTsKLQkKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGVmYXVsdE9iamVjdFZhbHVlJyBlbGVtZW50IG9mIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX09CSkVDVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0T2JqZWN0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRPYmplY3RWYWx1ZScgZWxlbWVudCBvZiB0aGUgT2JqZWN0VHlwZUNvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkZWZhdWx0T2JqZWN0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPYmplY3RUeXBlQ29udmVydGVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldERlZmF1bHRPYmplY3RWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGFhNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaW1hcnlLZXkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3MDk3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlByaXZhdGVPd25lZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17CQotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5QUklWQVRFX09XTkVEOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzkxMjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkT25seQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsJCi0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlJFQURfT05MWTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMwMGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhjZDczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlN0cnVjdENvbnZlcnRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBFY2xpcHNlTGlua05hbWVkQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb252ZXJ0ZXInIGVsZW1lbnQgb2YgdGhlIFN0cnVjdENvbnZlcnRlciBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0ZXIoKTsKLQkJU3RyaW5nIENPTlZFUlRFUl9QUk9QRVJUWSA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbnZlcnRlcicgZWxlbWVudCBvZiB0aGUgU3RydWN0Q29udmVydGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q29udmVydGVyKFN0cmluZyBjb252ZXJ0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjb252ZXJ0ZXInIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBTdHJ1Y3RDb252ZXJ0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q29udmVydGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzg3MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVGltZU9mRGF5PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZOwotCi0KLQkvLyAqKioqKioqKioqIGhvdXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdob3VyJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldEhvdXIoKTsKLQkJU3RyaW5nIEhPVVJfUFJPUEVSVFkgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaG91cicgZWxlbWVudCBvZiB0aGUgVGltZU9mRGF5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50IGZyb20gdGhlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHNldEhvdXIoSW50ZWdlciBob3VyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnaG91cicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRIb3VyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBtaW51dGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtaW51dGUnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCUludGVnZXIgZ2V0TWludXRlKCk7Ci0JCVN0cmluZyBNSU5VVEVfUFJPUEVSVFkgPSAibWludXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtaW51dGUnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRNaW51dGUoSW50ZWdlciBtaW51dGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdtaW51dGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWludXRlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBzZWNvbmQgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCUludGVnZXIgZ2V0U2Vjb25kKCk7Ci0JCVN0cmluZyBTRUNPTkRfUFJPUEVSVFkgPSAic2Vjb25kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRTZWNvbmQoSW50ZWdlciBzZWNvbmQpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzZWNvbmQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2Vjb25kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBtaWxsaXNlY29uZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21pbGxpc2Vjb25kJyBlbGVtZW50IG9mIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlJbnRlZ2VyIGdldE1pbGxpc2Vjb25kKCk7Ci0JCVN0cmluZyBNSUxMSVNFQ09ORF9QUk9QRVJUWSA9ICJtaWxsaXNlY29uZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQgb2YgdGhlIFRpbWVPZkRheSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBhbm5vdGF0aW9uCi0JICovCi0Jdm9pZCBzZXRNaWxsaXNlY29uZChJbnRlZ2VyIG1pbGxpc2Vjb25kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWlsbGlzZWNvbmQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUaW1lT2ZEYXkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWlsbGlzZWNvbmRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDAzODYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuVHJhbnNmb3JtYXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2giOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2ZldGNoJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOwotCQlTdHJpbmcgT1BUSU9OQUxfUFJPUEVSVFkgPSAib3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvcHRpb25hbCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzkyMTBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBhbW9uZzoKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5SZWFkVHJhbnNmb3JtZXIKLSAqICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Xcml0ZVRyYW5zZm9ybWVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1RyYW5zZm9ybWVyQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHJhbnNmb3JtZXJDbGFzcycgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1JlYWRUcmFuc2Zvcm1lcih0cmFuc2Zvcm1lckNsYXNzPUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIuCi0JICovCi0JU3RyaW5nIGdldFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJU3RyaW5nIFRSQU5TRk9STUVSX0NMQVNTX1BST1BFUlRZID0gInRyYW5zZm9ybWVyQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RyYW5zZm9ybWVyQ2xhc3MnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFRyYW5zZm9ybWVyQ2xhc3MoU3RyaW5nIHRyYW5zZm9ybWVyQ2xhc3MpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0cmFuc2Zvcm1lckNsYXNzJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFRyYW5zZm9ybWVyQ2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21ldGhvZCcgZWxlbWVudCBvZiB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWV0aG9kKCk7Ci0JCVN0cmluZyBNRVRIT0RfUFJPUEVSVFkgPSAibWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdtZXRob2QnIGVsZW1lbnQgb2YgdGhlICpUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1ldGhvZChTdHJpbmcgbWV0aG9kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbWV0aG9kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRyYW5zZm9ybWVyIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MzAyODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UeXBlQ29udmVydGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYmFmMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5WYXJpYWJsZU9uZVRvT25lCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLlZBUklBQkxFX09ORV9UT19PTkU7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY5ZWI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VsaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLldyaXRlVHJhbnNmb3JtZXIKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rVHJhbnNmb3JtZXJBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW4nIGVsZW1lbnQgb2YgdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uKCk7Ci0JCVN0cmluZyBDT0xVTU5fUFJPUEVSVFkgPSAiY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIGEgQ29sdW1uQW5ub3RhdGlvbiwgYnV0IGRvIG5vdCByZXR1cm4gbnVsbCBpZiB0aGUgJ2NvbHVtbicKLQkgKiBlbGVtZW50IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRpb24uIEluc3RlYWQKLQkgKiByZXR1cm4gYSBudWxsIG9iamVjdC4KLQkgKi8KLQlDb2x1bW5Bbm5vdGF0aW9uIGdldE5vbk51bGxDb2x1bW4oKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgJ2NvbHVtbicgZWxlbWVudCB0byB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqLwotCUNvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICdjb2x1bW4nIGVsZW1lbnQgZnJvbSB0aGUgV3JpdGVUcmFuc2Zvcm1lciBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbHVtbicgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q29sdW1uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FeGlzdGVuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI3ODI3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGVudW0KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkV4aXN0ZW5jZVR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgZW51bSBFeGlzdGVuY2VUeXBlIHsKLQotICAgIENIRUNLX0NBQ0hFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19DSEVDS19DQUNIRSksCi0gICAgQ0hFQ0tfREFUQUJBU0UoRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEVfX0NIRUNLX0RBVEFCQVNFKSwKLSAgICBBU1NVTUVfRVhJU1RFTkNFKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFX19BU1NVTUVfRVhJU1RFTkNFKSwKLSAgICBBU1NVTUVfTk9OX0VYSVNURU5DRShFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRV9fQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JRXhpc3RlbmNlVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXhpc3RlbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChFeGlzdGVuY2VUeXBlIGV4aXN0ZW5jZVR5cGUgOiBFeGlzdGVuY2VUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZXhpc3RlbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGV4aXN0ZW5jZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEV4aXN0ZW5jZVR5cGUgZXhpc3RlbmNlVHlwZSkgewotCQlyZXR1cm4gKGV4aXN0ZW5jZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZXhpc3RlbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWJmODFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgZW51bQotICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuSm9pbkZldGNoVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotCi0gICAgSU5ORVIoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFX19JTk5FUiksCi0gICAgT1VURVIoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFX19PVVRFUik7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlKb2luRmV0Y2hUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIEpvaW5GZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKb2luRmV0Y2hUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKEpvaW5GZXRjaFR5cGUgam9pbkZldGNoVHlwZSA6IEpvaW5GZXRjaFR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChqb2luRmV0Y2hUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gam9pbkZldGNoVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoSm9pbkZldGNoVHlwZSBqb2luRmV0Y2hUeXBlKSB7Ci0JCXJldHVybiAoam9pbkZldGNoVHlwZSA9PSBudWxsKSA/IG51bGwgOiBqb2luRmV0Y2hUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1NWE0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5Db252ZXJzaW9uVmFsdWUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmM2RjZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNDb2xsZWN0aW9ucyA8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMgPGVtPkJhc2ljIE1hcHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2Zvcm1hdGlvbnMgPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzIDxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNDb2xsZWN0aW9ucygpIDxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXNpY0NvbGxlY3Rpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNDb2xsZWN0aW9uPiBiYXNpY0NvbGxlY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmFzaWNNYXBzKCkgPGVtPkJhc2ljIE1hcHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmFzaWNNYXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQmFzaWNNYXA+IGJhc2ljTWFwczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zZm9ybWF0aW9ucygpIDxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNmb3JtYXRpb25zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHJhbnNmb3JtYXRpb24+IHRyYW5zZm9ybWF0aW9uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkgPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhcmlhYmxlT25lVG9PbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gdmFyaWFibGVPbmVUb09uZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQXR0cmlidXRlcygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuQVRUUklCVVRFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXNpYyBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzaWMgQ29sbGVjdGlvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX0Jhc2ljQ29sbGVjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4gZ2V0QmFzaWNDb2xsZWN0aW9ucygpCi0JewotCQlpZiAoYmFzaWNDb2xsZWN0aW9ucyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY0NvbGxlY3Rpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEJhc2ljQ29sbGVjdGlvbj4oWG1sQmFzaWNDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMpOwotCQl9Ci0JCXJldHVybiBiYXNpY0NvbGxlY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2ljIE1hcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhc2ljIE1hcHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXNpYyBNYXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEJhc2ljTWFwPiBnZXRCYXNpY01hcHMoKQotCXsKLQkJaWYgKGJhc2ljTWFwcyA9PSBudWxsKQotCQl7Ci0JCQliYXNpY01hcHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQmFzaWNNYXA+KFhtbEJhc2ljTWFwLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfTUFQUyk7Ci0JCX0KLQkJcmV0dXJuIGJhc2ljTWFwczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zZm9ybWF0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUcmFuc2Zvcm1hdGlvbj4gZ2V0VHJhbnNmb3JtYXRpb25zKCkKLQl7Ci0JCWlmICh0cmFuc2Zvcm1hdGlvbnMgPT0gbnVsbCkKLQkJewotCQkJdHJhbnNmb3JtYXRpb25zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFRyYW5zZm9ybWF0aW9uPihYbWxUcmFuc2Zvcm1hdGlvbi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zZm9ybWF0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYXJpYWJsZSBPbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhcmlhYmxlIE9uZSBUbyBPbmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVmFyaWFibGVPbmVUb09uZT4gZ2V0VmFyaWFibGVPbmVUb09uZXMoKQotCXsKLQkJaWYgKHZhcmlhYmxlT25lVG9PbmVzID09IG51bGwpCi0JCXsKLQkJCXZhcmlhYmxlT25lVG9PbmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFZhcmlhYmxlT25lVG9PbmU+KFhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlT25lVG9PbmVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY0NvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY01hcHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHJhbnNmb3JtYXRpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmFyaWFibGVPbmVUb09uZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBnZXRCYXNpY0NvbGxlY3Rpb25zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCXJldHVybiBnZXRCYXNpY01hcHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKLQkJCQlyZXR1cm4gZ2V0VHJhbnNmb3JtYXRpb25zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKLQkJCQlyZXR1cm4gZ2V0VmFyaWFibGVPbmVUb09uZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxCYXNpY0NvbGxlY3Rpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCWdldEJhc2ljTWFwcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QmFzaWNNYXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxCYXNpY01hcD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUzoKLQkJCQlnZXRUcmFuc2Zvcm1hdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldFRyYW5zZm9ybWF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHJhbnNmb3JtYXRpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUzoKLQkJCQlnZXRWYXJpYWJsZU9uZVRvT25lcygpLmNsZWFyKCk7Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFZhcmlhYmxlT25lVG9PbmU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlnZXRCYXNpY0NvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19NQVBTOgotCQkJCWdldEJhc2ljTWFwcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCWdldFRyYW5zZm9ybWF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVM6Ci0JCQkJZ2V0VmFyaWFibGVPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUzoKLQkJCQlyZXR1cm4gYmFzaWNDb2xsZWN0aW9ucyAhPSBudWxsICYmICFiYXNpY0NvbGxlY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDX01BUFM6Ci0JCQkJcmV0dXJuIGJhc2ljTWFwcyAhPSBudWxsICYmICFiYXNpY01hcHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TOgotCQkJCXJldHVybiB0cmFuc2Zvcm1hdGlvbnMgIT0gbnVsbCAmJiAhdHJhbnNmb3JtYXRpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZBUklBQkxFX09ORV9UT19PTkVTOgotCQkJCXJldHVybiB2YXJpYWJsZU9uZVRvT25lcyAhPSBudWxsICYmICF2YXJpYWJsZU9uZVRvT25lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKLQkJQXJyYXlMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldElkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0QmFzaWNNYXBzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWZXJzaW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9NYW55cygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0T25lVG9PbmVzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRWYXJpYWJsZU9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2Zvcm1hdGlvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldFRyYW5zaWVudHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ3M7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxBdHRyaWJ1dGVNYXBwaW5nW10gRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZID0gbmV3IFhtbEF0dHJpYnV0ZU1hcHBpbmdbMF07Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlFY2xpcHNlTGluay5BVFRSSUJVVEVTLCAKLQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlYbWxJZC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuSUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfSWRzKCkpLAotCQkJWG1sRW1iZWRkZWRJZC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuRU1CRURERURfSUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKSksCi0JCQlYbWxCYXNpYy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQkFTSUMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpLAotCQkJWG1sQmFzaWNDb2xsZWN0aW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5CQVNJQ19DT0xMRUNUSU9OLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpKSwKLQkJCVhtbEJhc2ljTWFwLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5CQVNJQ19NQVAsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKSksCi0JCQlYbWxWZXJzaW9uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5WRVJTSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkpLAotCQkJWG1sTWFueVRvT25lLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQU5ZX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkpLAotCQkJWG1sT25lVG9NYW55LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5PTkVfVE9fTUFOWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb01hbnlzKCkpLAotCQkJWG1sT25lVG9PbmUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk9ORV9UT19PTkUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9PbmVzKCkpLAotCQkJWG1sVmFyaWFibGVPbmVUb09uZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVkFSSUFCTEVfT05FX1RPX09ORSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZhcmlhYmxlT25lVG9PbmVzKCkpLAotCQkJWG1sTWFueVRvTWFueS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFOWV9UT19NQU5ZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCkpLAotCQkJWG1sRWxlbWVudENvbGxlY3Rpb24uYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZXNfMl8wX0VsZW1lbnRDb2xsZWN0aW9ucygpKSwKLQkJCVhtbEVtYmVkZGVkLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5FTUJFRERFRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKSksCi0JCQlYbWxUcmFuc2Zvcm1hdGlvbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuVFJBTlNGT1JNQVRJT04sIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKSksCi0JCQlYbWxUcmFuc2llbnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLlRSQU5TSUVOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkpLAotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9DYWNoZUNvb3JkaW5hdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5M2VjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVDb29yZGluYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRU5EX09CSkVDVF9DSEFOR0VTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU0VORF9PQkpFQ1RfQ0hBTkdFUygwLCAiU0VORF9PQkpFQ1RfQ0hBTkdFUyIsICJTRU5EX09CSkVDVF9DSEFOR0VTIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlZBTElEQVRFIENIQU5HRUQgT0JKRUNUUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUU19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKDEsICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIsICJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUygyLCAiU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLCAiU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoMywgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VORCBPQkpFQ1QgQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRU5EX09CSkVDVF9DSEFOR0VTCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VORF9PQkpFQ1RfQ0hBTkdFU19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlZBTElEQVRFIENIQU5HRUQgT0JKRUNUUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5WQUxJREFURSBDSEFOR0VEIE9CSkVDVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUU19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRU5EIE5FVyBPQkpFQ1RTIFdJVEggQ0hBTkdFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VORCBORVcgT0JKRUNUUyBXSVRIIENIQU5HRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVDb29yZGluYXRpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IENhY2hlQ29vcmRpbmF0aW9uVHlwZVtdCi0JCXsKLQkJCVNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JCQlJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkJCVNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQkJTk9ORSwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PENhY2hlQ29vcmRpbmF0aW9uVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVDb29yZGluYXRpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBTRU5EX09CSkVDVF9DSEFOR0VTX1ZBTFVFOiByZXR1cm4gU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkJCWNhc2UgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFNfVkFMVUU6IHJldHVybiBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUzsKLQkJCWNhc2UgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVNfVkFMVUU6IHJldHVybiBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUzsKLQkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENhY2hlQ29vcmRpbmF0aW9uVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vQ2FjaGVDb29yZGluYXRpb25UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vQ2FjaGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzVhZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0NhY2hlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBDYWNoZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGVUxMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRlVMTCgwLCAiRlVMTCIsICJGVUxMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1dFQUtfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlXRUFLKDEsICJXRUFLIiwgIldFQUsiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNPRlQoMiwgIlNPRlQiLCAiU09GVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NPRlRfV0VBS19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNPRlRfV0VBSygzLCAiU09GVF9XRUFLIiwgIlNPRlRfV0VBSyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SEFSRCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hBUkRfV0VBS19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUhBUkRfV0VBSyg0LCAiSEFSRF9XRUFLIiwgIkhBUkRfV0VBSyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDQUNIRSg1LCAiQ0FDSEUiLCAiQ0FDSEUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoNiwgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNGVUxMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRlVMTF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5XRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1dFQUsKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUFLX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPRlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPRlRfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U09GVCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TT0ZUIFdFQUs8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU09GVF9XRUFLCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09GVF9XRUFLX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkhBUkQgV0VBSzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SEFSRCBXRUFLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0hBUkRfV0VBSwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBUkRfV0VBS19WQUxVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DQUNIRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUNIRV9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FX1ZBTFVFID0gNjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgQ2FjaGVUeXBlW10KLQkJewotCQkJRlVMTCwKLQkJCVdFQUssCi0JCQlTT0ZULAotCQkJU09GVF9XRUFLLAotCQkJSEFSRF9XRUFLLAotCQkJQ0FDSEUsCi0JCQlOT05FLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxDYWNoZVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQ2FjaGVUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkNhY2hlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZVR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgRlVMTF9WQUxVRTogcmV0dXJuIEZVTEw7Ci0JCQljYXNlIFdFQUtfVkFMVUU6IHJldHVybiBXRUFLOwotCQkJY2FzZSBTT0ZUX1ZBTFVFOiByZXR1cm4gU09GVDsKLQkJCWNhc2UgU09GVF9XRUFLX1ZBTFVFOiByZXR1cm4gU09GVF9XRUFLOwotCQkJY2FzZSBIQVJEX1dFQUtfVkFMVUU6IHJldHVybiBIQVJEX1dFQUs7Ci0JCQljYXNlIENBQ0hFX1ZBTFVFOiByZXR1cm4gQ0FDSEU7Ci0JCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBDYWNoZVR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0NhY2hlVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjMmNiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluawotCWV4dGVuZHMgSlBBCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSI7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIxLjAiOwotCQotCS8vIEVjbGlwc2VMaW5rIHNwZWNpZmljIG5vZGVzCi0JCi0JU3RyaW5nIEFDQ0VTU19NRVRIT0RTID0gImFjY2Vzcy1tZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCA9ICJnZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCA9ICJzZXQtbWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19DT0xMRUNUSU9OID0gImJhc2ljLWNvbGxlY3Rpb24iOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBCQVNJQ19NQVAgPSAiYmFzaWMtbWFwIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0FDSEUgPSAiY2FjaGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fRVhQSVJZID0gImV4cGlyeSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19TSVpFID0gInNpemUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fU0hBUkVEID0gInNoYXJlZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19UWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fQUxXQVlTX1JFRlJFU0ggPSAiYWx3YXlzLXJlZnJlc2giOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSID0gInJlZnJlc2gtb25seS1pZi1uZXdlciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENBQ0hFX19ESVNBQkxFX0hJVFMgPSAiZGlzYWJsZS1oaXRzIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFID0gImNvb3JkaW5hdGlvbi10eXBlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0hBTkdFX1RSQUNLSU5HID0gImNoYW5nZS10cmFja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBDT05WRVJTSU9OX1ZBTFVFID0gImNvbnZlcnNpb24tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUgPSAiZGF0YS12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFID0gIm9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT05WRVJUID0gImNvbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTlZFUlRFUl9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBDT1BZX1BPTElDWSA9ICJjb3B5LXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPUFlfUE9MSUNZX19DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgQ0xPTkVfQ09QWV9QT0xJQ1kgPSAiY2xvbmUtY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBDTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EID0gIm1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EID0gIndvcmtpbmctY29weS1tZXRob2QiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIENVU1RPTUlaRVIgPSAiY3VzdG9taXplciI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyI7ICAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgRVhJU1RFTkNFX0NIRUNLSU5HID0gImV4aXN0ZW5jZS1jaGVja2luZyI7ICAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWSA9ICJleHBpcnktdGltZS1vZi1kYXkiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBFWFBJUllfVElNRV9PRl9EQVlfX0hPVVIgPSAiaG91ciI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlOVVRFID0gIm1pbnV0ZSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fU0VDT05EID0gInNlY29uZCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVYUElSWV9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAibWlsbGlzZWNvbmQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBJTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gImluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSk9JTl9GRVRDSCA9ICJqb2luLWZldGNoIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTVVUQUJMRSA9ICJtdXRhYmxlIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9ICJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVCA9ICJoaW50IjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gInJlc3VsdC1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHQtc2V0LW1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBOQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QUk9DRURVUkVfTkFNRSA9ICJwcm9jZWR1cmUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVCA9ICJyZXR1cm5zLXJlc3VsdC1zZXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBQQVJBTUVURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gInF1ZXJ5LXBhcmFtZXRlciI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIFBBUkFNRVRFUl9fVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEUgPSAiamRiYy10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9ICJqZGJjLXR5cGUtbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0KLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gIm9iamVjdC10eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gImRhdGEtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9ICJkZWZhdWx0LW9iamVjdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkcgPSAib3B0aW1pc3RpYy1sb2NraW5nIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU4gPSAic2VsZWN0ZWQtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBPUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSAiY2FzY2FkZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBQUklWQVRFX09XTkVEID0gInByaXZhdGUtb3duZWQiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUFJPUEVSVFlfX1ZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUk9QRVJUWV9fVkFMVUVfVFlQRSA9ICJ2YWx1ZS10eXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBSRUFEX09OTFkgPSAicmVhZC1vbmx5IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlTdHJpbmcgU1RSVUNUX0NPTlZFUlRFUiA9ICJzdHJ1Y3QtY29udmVydGVyIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTVFJVQ1RfQ09OVkVSVEVSX19OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFRSQU5TRk9STUFUSU9OID0gInRyYW5zZm9ybWF0aW9uIjsgIC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUWVBFID0gInR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBUWVBFX0NPTlZFUlRFUiA9ICJ0eXBlLWNvbnZlcnRlciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9ICJkYXRhLXR5cGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9ICJvYmplY3QtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIFZBUklBQkxFX09ORV9UT19PTkUgPSAidmFyaWFibGUtb25lLXRvLW9uZSI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTBhYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybUZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUVjbGlwc2VMaW5rT3JtRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgPSAoRWNsaXBzZUxpbmtPcm1GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnhtaSIpOyAKLQkJCWlmICh0aGVFY2xpcHNlTGlua09ybUZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BRERJVElPTkFMX0NSSVRFUklBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQWRkaXRpb25hbENyaXRlcmlhKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5BVFRSSUJVVEVTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlQXR0cmlidXRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWNDb2xsZWN0aW9uKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWNNYXAoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENhY2hlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENsb25lQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09QWV9QT0xJQ1k6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEN1c3RvbWl6ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbGVtZW50Q29sbGVjdGlvbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRlZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWRJZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVudGl0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRmV0Y2hBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEZldGNoR3JvdXAoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEhhc2hQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbElkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVg6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxJbmRleCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxKb2luVGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9NYW55KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9PbmUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT25lVG9NYW55KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU46IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPcmRlckNvbHVtbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByaW1hcnlLZXkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxRdWVyeVJlZGlyZWN0b3JzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxSZXR1cm5JbnNlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFRpbWVPZkRheSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVHJhbnNmb3JtYXRpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUcmFuc2llbnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sVmVyc2lvbigpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuQ0FDSEVfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlQ2FjaGVUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbENoYW5nZVRyYWNraW5nVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0RJUkVDVElPTjoKLQkJCQlyZXR1cm4gY3JlYXRlWG1sRGlyZWN0aW9uRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5FWElTVEVOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRXhpc3RlbmNlVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlWG1sSm9pbkZldGNoVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFOgotCQkJCXJldHVybiBjcmVhdGVYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0Q2FjaGVDb29yZGluYXRpb25UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkNBQ0hFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWNoZVR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0WG1sQ2hhbmdlVHJhY2tpbmdUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ESVJFQ1RJT046Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxEaXJlY3Rpb25Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuRVhJU1RFTkNFX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRFeGlzdGVuY2VUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRYbWxKb2luRmV0Y2hUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBjcmVhdGVYbWxBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgeG1sQWNjZXNzTWV0aG9kcyA9IG5ldyBYbWxBY2Nlc3NNZXRob2RzKCk7Ci0JCXJldHVybiB4bWxBY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEgY3JlYXRlWG1sQWRkaXRpb25hbENyaXRlcmlhKCkKLQl7Ci0JCVhtbEFkZGl0aW9uYWxDcml0ZXJpYSB4bWxBZGRpdGlvbmFsQ3JpdGVyaWEgPSBuZXcgWG1sQWRkaXRpb25hbENyaXRlcmlhKCk7Ci0JCXJldHVybiB4bWxBZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgY3JlYXRlQXR0cmlidXRlcygpCi0JewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmFzaWMgY3JlYXRlWG1sQmFzaWMoKQotCXsKLQkJWG1sQmFzaWMgeG1sQmFzaWMgPSBuZXcgWG1sQmFzaWMoKTsKLQkJcmV0dXJuIHhtbEJhc2ljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXNpY0NvbGxlY3Rpb24gY3JlYXRlWG1sQmFzaWNDb2xsZWN0aW9uKCkKLQl7Ci0JCVhtbEJhc2ljQ29sbGVjdGlvbiB4bWxCYXNpY0NvbGxlY3Rpb24gPSBuZXcgWG1sQmFzaWNDb2xsZWN0aW9uKCk7Ci0JCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhc2ljTWFwIGNyZWF0ZVhtbEJhc2ljTWFwKCkKLQl7Ci0JCVhtbEJhc2ljTWFwIHhtbEJhc2ljTWFwID0gbmV3IFhtbEJhc2ljTWFwKCk7Ci0JCXJldHVybiB4bWxCYXNpY01hcDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmF0Y2hGZXRjaCBjcmVhdGVYbWxCYXRjaEZldGNoKCkKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggeG1sQmF0Y2hGZXRjaCA9IG5ldyBYbWxCYXRjaEZldGNoKCk7Ci0JCXJldHVybiB4bWxCYXRjaEZldGNoOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDYWNoZSBjcmVhdGVYbWxDYWNoZSgpCi0JewotCQlYbWxDYWNoZSB4bWxDYWNoZSA9IG5ldyBYbWxDYWNoZSgpOwotCQlyZXR1cm4geG1sQ2FjaGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIHhtbENoYW5nZVRyYWNraW5nID0gbmV3IFhtbENoYW5nZVRyYWNraW5nKCk7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xvbmVDb3B5UG9saWN5IGNyZWF0ZVhtbENsb25lQ29weVBvbGljeSgpCi0JewotCQlYbWxDbG9uZUNvcHlQb2xpY3kgeG1sQ2xvbmVDb3B5UG9saWN5ID0gbmV3IFhtbENsb25lQ29weVBvbGljeSgpOwotCQlyZXR1cm4geG1sQ2xvbmVDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2xsZWN0aW9uVGFibGUgY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkKLQl7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSB4bWxDb2xsZWN0aW9uVGFibGUgPSBuZXcgWG1sQ29sbGVjdGlvblRhYmxlKCk7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnNpb25WYWx1ZSBjcmVhdGVYbWxDb252ZXJzaW9uVmFsdWUoKQotCXsKLQkJWG1sQ29udmVyc2lvblZhbHVlIHhtbENvbnZlcnNpb25WYWx1ZSA9IG5ldyBYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJcmV0dXJuIHhtbENvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29udmVydGVyIGNyZWF0ZVhtbENvbnZlcnRlcigpCi0JewotCQlYbWxDb252ZXJ0ZXIgeG1sQ29udmVydGVyID0gbmV3IFhtbENvbnZlcnRlcigpOwotCQlyZXR1cm4geG1sQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb3B5UG9saWN5IGNyZWF0ZVhtbENvcHlQb2xpY3koKQotCXsKLQkJWG1sQ29weVBvbGljeSB4bWxDb3B5UG9saWN5ID0gbmV3IFhtbENvcHlQb2xpY3koKTsKLQkJcmV0dXJuIHhtbENvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEN1c3RvbWl6ZXIgY3JlYXRlWG1sQ3VzdG9taXplcigpCi0JewotCQlYbWxDdXN0b21pemVyIHhtbEN1c3RvbWl6ZXIgPSBuZXcgWG1sQ3VzdG9taXplcigpOwotCQlyZXR1cm4geG1sQ3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRWxlbWVudENvbGxlY3Rpb24gY3JlYXRlWG1sRWxlbWVudENvbGxlY3Rpb24oKQotCXsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24geG1sRWxlbWVudENvbGxlY3Rpb24gPSBuZXcgWG1sRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbWJlZGRhYmxlIGNyZWF0ZVhtbEVtYmVkZGFibGUoKQotCXsKLQkJWG1sRW1iZWRkYWJsZSB4bWxFbWJlZGRhYmxlID0gbmV3IFhtbEVtYmVkZGFibGUoKTsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGVkIGNyZWF0ZVhtbEVtYmVkZGVkKCkKLQl7Ci0JCVhtbEVtYmVkZGVkIHhtbEVtYmVkZGVkID0gbmV3IFhtbEVtYmVkZGVkKCk7Ci0JCXJldHVybiB4bWxFbWJlZGRlZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkZWRJZCBjcmVhdGVYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCVhtbEVtYmVkZGVkSWQgeG1sRW1iZWRkZWRJZCA9IG5ldyBYbWxFbWJlZGRlZElkKCk7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbnRpdHkgY3JlYXRlWG1sRW50aXR5KCkKLQl7Ci0JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSBuZXcgWG1sRW50aXR5KCk7Ci0JCXJldHVybiB4bWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCkKLQl7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzID0gbmV3IFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRmV0Y2hBdHRyaWJ1dGUgY3JlYXRlWG1sRmV0Y2hBdHRyaWJ1dGUoKQotCXsKLQkJWG1sRmV0Y2hBdHRyaWJ1dGUgeG1sRmV0Y2hBdHRyaWJ1dGUgPSBuZXcgWG1sRmV0Y2hBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIHhtbEZldGNoQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxGZXRjaEdyb3VwIGNyZWF0ZVhtbEZldGNoR3JvdXAoKQotCXsKLQkJWG1sRmV0Y2hHcm91cCB4bWxGZXRjaEdyb3VwID0gbmV3IFhtbEZldGNoR3JvdXAoKTsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbElkIGNyZWF0ZVhtbElkKCkKLQl7Ci0JCVhtbElkIHhtbElkID0gbmV3IFhtbElkKCk7Ci0JCXJldHVybiB4bWxJZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSW5kZXggY3JlYXRlWG1sSW5kZXgoKQotCXsKLQkJWG1sSW5kZXggeG1sSW5kZXggPSBuZXcgWG1sSW5kZXgoKTsKLQkJcmV0dXJuIHhtbEluZGV4OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBjcmVhdGVYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSB4bWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSA9IG5ldyBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQlyZXR1cm4geG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5UYWJsZSBjcmVhdGVYbWxKb2luVGFibGUoKQotCXsKLQkJWG1sSm9pblRhYmxlIHhtbEpvaW5UYWJsZSA9IG5ldyBYbWxKb2luVGFibGUoKTsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFueVRvTWFueSBjcmVhdGVYbWxNYW55VG9NYW55KCkKLQl7Ci0JCVhtbE1hbnlUb01hbnkgeG1sTWFueVRvTWFueSA9IG5ldyBYbWxNYW55VG9NYW55KCk7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxNYW55VG9PbmUgY3JlYXRlWG1sTWFueVRvT25lKCkKLQl7Ci0JCVhtbE1hbnlUb09uZSB4bWxNYW55VG9PbmUgPSBuZXcgWG1sTWFueVRvT25lKCk7Ci0JCXJldHVybiB4bWxNYW55VG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JewotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTmFtZWRDb252ZXJ0ZXIgY3JlYXRlWG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJWG1sTmFtZWRDb252ZXJ0ZXIgeG1sTmFtZWRDb252ZXJ0ZXIgPSBuZXcgWG1sTmFtZWRDb252ZXJ0ZXIoKTsKLQkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGNyZWF0ZVhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5ID0gbmV3IFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXcgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXR1cm4geG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9NYW55IGNyZWF0ZVhtbE9uZVRvTWFueSgpCi0JewotCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gbmV3IFhtbE9uZVRvTWFueSgpOwotCQlyZXR1cm4geG1sT25lVG9NYW55OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPbmVUb09uZSBjcmVhdGVYbWxPbmVUb09uZSgpCi0JewotCQlYbWxPbmVUb09uZSB4bWxPbmVUb09uZSA9IG5ldyBYbWxPbmVUb09uZSgpOwotCQlyZXR1cm4geG1sT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGNyZWF0ZVhtbE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIHhtbE9wdGltaXN0aWNMb2NraW5nID0gbmV3IFhtbE9wdGltaXN0aWNMb2NraW5nKCk7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gY3JlYXRlWG1sT3JkZXJDb2x1bW4oKQotCXsKLQkJWG1sT3JkZXJDb2x1bW4geG1sT3JkZXJDb2x1bW4gPSBuZXcgWG1sT3JkZXJDb2x1bW4oKTsKLQkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IG5ldyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJpbWFyeUtleSBjcmVhdGVYbWxQcmltYXJ5S2V5KCkKLQl7Ci0JCVhtbFByaW1hcnlLZXkgeG1sUHJpbWFyeUtleSA9IG5ldyBYbWxQcmltYXJ5S2V5KCk7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQcm9wZXJ0eSBjcmVhdGVYbWxQcm9wZXJ0eSgpCi0JewotCQlYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSA9IG5ldyBYbWxQcm9wZXJ0eSgpOwotCQlyZXR1cm4geG1sUHJvcGVydHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgY3JlYXRlWG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlYbWxRdWVyeVJlZGlyZWN0b3JzIHhtbFF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXcgWG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCQlyZXR1cm4geG1sUXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmV0dXJuSW5zZXJ0IGNyZWF0ZVhtbFJldHVybkluc2VydCgpCi0JewotCQlYbWxSZXR1cm5JbnNlcnQgeG1sUmV0dXJuSW5zZXJ0ID0gbmV3IFhtbFJldHVybkluc2VydCgpOwotCQlyZXR1cm4geG1sUmV0dXJuSW5zZXJ0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZWNvbmRhcnlUYWJsZSBjcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpCi0JewotCQlYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSA9IG5ldyBYbWxTZWNvbmRhcnlUYWJsZSgpOwotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBjcmVhdGVYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCXsKLQkJWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciA9IG5ldyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKTsKLQkJcmV0dXJuIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpCi0JewotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgeG1sU3RydWN0Q29udmVydGVyID0gbmV3IFhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXR1cm4geG1sU3RydWN0Q29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZSBjcmVhdGVYbWxUYWJsZSgpCi0JewotCQlYbWxUYWJsZSB4bWxUYWJsZSA9IG5ldyBYbWxUYWJsZSgpOwotCQlyZXR1cm4geG1sVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yID0gbmV3IFhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0JCXJldHVybiB4bWxUYWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGltZU9mRGF5IGNyZWF0ZVhtbFRpbWVPZkRheSgpCi0JewotCQlYbWxUaW1lT2ZEYXkgeG1sVGltZU9mRGF5ID0gbmV3IFhtbFRpbWVPZkRheSgpOwotCQlyZXR1cm4geG1sVGltZU9mRGF5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbiBjcmVhdGVYbWxUcmFuc2Zvcm1hdGlvbigpCi0JewotCQlYbWxUcmFuc2Zvcm1hdGlvbiB4bWxUcmFuc2Zvcm1hdGlvbiA9IG5ldyBYbWxUcmFuc2Zvcm1hdGlvbigpOwotCQlyZXR1cm4geG1sVHJhbnNmb3JtYXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRyYW5zaWVudCBjcmVhdGVYbWxUcmFuc2llbnQoKQotCXsKLQkJWG1sVHJhbnNpZW50IHhtbFRyYW5zaWVudCA9IG5ldyBYbWxUcmFuc2llbnQoKTsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBjcmVhdGVYbWxUeXBlQ29udmVydGVyKCkKLQl7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgeG1sVHlwZUNvbnZlcnRlciA9IG5ldyBYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJldHVybiB4bWxUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYXJpYWJsZU9uZVRvT25lIGNyZWF0ZVhtbFZhcmlhYmxlT25lVG9PbmUoKQotCXsKLQkJWG1sVmFyaWFibGVPbmVUb09uZSB4bWxWYXJpYWJsZU9uZVRvT25lID0gbmV3IFhtbFZhcmlhYmxlT25lVG9PbmUoKTsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZlcnNpb24gY3JlYXRlWG1sVmVyc2lvbigpCi0JewotCQlYbWxWZXJzaW9uIHhtbFZlcnNpb24gPSBuZXcgWG1sVmVyc2lvbigpOwotCQlyZXR1cm4geG1sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSGFzaFBhcnRpdGlvbmluZyBjcmVhdGVYbWxIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmcgeG1sSGFzaFBhcnRpdGlvbmluZyA9IG5ldyBYbWxIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxIYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQYXJ0aXRpb25pbmcgY3JlYXRlWG1sUGFydGl0aW9uaW5nKCkKLQl7Ci0JCVhtbFBhcnRpdGlvbmluZyB4bWxQYXJ0aXRpb25pbmcgPSBuZXcgWG1sUGFydGl0aW9uaW5nKCk7Ci0JCXJldHVybiB4bWxQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZyBjcmVhdGVYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nIHhtbFBpbm5lZFBhcnRpdGlvbmluZyA9IG5ldyBYbWxQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmFuZ2VQYXJ0aXRpb25pbmcgY3JlYXRlWG1sUmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmcgeG1sUmFuZ2VQYXJ0aXRpb25pbmcgPSBuZXcgWG1sUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFJhbmdlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyBjcmVhdGVYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyB4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IG5ldyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQlyZXR1cm4geG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgY3JlYXRlWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXcgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQlyZXR1cm4geG1sUm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmcgY3JlYXRlWG1sVW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJWG1sVW5pb25QYXJ0aXRpb25pbmcgeG1sVW5pb25QYXJ0aXRpb25pbmcgPSBuZXcgWG1sVW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJcmV0dXJuIHhtbFVuaW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYWx1ZVBhcnRpdGlvbmluZyBjcmVhdGVYbWxWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZyB4bWxWYWx1ZVBhcnRpdGlvbmluZyA9IG5ldyBYbWxWYWx1ZVBhcnRpdGlvbmluZygpOwotCQlyZXR1cm4geG1sVmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjcmVhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgcmVzdWx0ID0gQ2FjaGVDb29yZGluYXRpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRDYWNoZUNvb3JkaW5hdGlvblR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZVR5cGUgY3JlYXRlQ2FjaGVUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJQ2FjaGVUeXBlIHJlc3VsdCA9IENhY2hlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0Q2FjaGVUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGNyZWF0ZVhtbENoYW5nZVRyYWNraW5nVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nVHlwZSByZXN1bHQgPSBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbENoYW5nZVRyYWNraW5nVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbERpcmVjdGlvbiBjcmVhdGVYbWxEaXJlY3Rpb25Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxEaXJlY3Rpb24gcmVzdWx0ID0gWG1sRGlyZWN0aW9uLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxEaXJlY3Rpb25Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGNyZWF0ZUV4aXN0ZW5jZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlFeGlzdGVuY2VUeXBlIHJlc3VsdCA9IEV4aXN0ZW5jZVR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydEV4aXN0ZW5jZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGNyZWF0ZVhtbEpvaW5GZXRjaFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxKb2luRmV0Y2hUeXBlIHJlc3VsdCA9IFhtbEpvaW5GZXRjaFR5cGUuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbEpvaW5GZXRjaFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgY3JlYXRlWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHJlc3VsdCA9IFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FY2xpcHNlTGlua09ybVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3YjJiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1QYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gIm9ybSI7Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0ueG1pIjsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0iOwotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UuaW5pdCgpOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFMgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0QgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfRkVBVFVSRV9DT1VOVCA9IDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzIEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFkZGl0aW9uYWxDcml0ZXJpYSA8ZW0+WG1sIEFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFkZGl0aW9uYWxDcml0ZXJpYQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUEgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Dcml0ZXJpYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfX0NSSVRFUklBID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV8yMl9fQ1JJVEVSSUE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElORyA9IDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVMgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19JRFMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0lEUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWQgSWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURfSURTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXNpY3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fQkFTSUNTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1ZFUlNJT05TID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WRVJTSU9OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fT05FUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19PTkVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gTWFueXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fT05FX1RPX01BTllTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fTUFOWVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX09ORV9UT19PTkVTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fT05FUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFueSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRlZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRU1CRURERURTID0gT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVFJBTlNJRU5UUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmFzaWMgQ29sbGVjdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fQkFTSUNfQ09MTEVDVElPTlMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIE1hcHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fQkFTSUNfTUFQUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNmb3JtYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX1RSQU5TRk9STUFUSU9OUyA9IE9ybVBhY2thZ2UuQVRUUklCVVRFU19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFyaWFibGUgT25lIFRvIE9uZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fVkFSSUFCTEVfT05FX1RPX09ORVMgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQyA9IDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19PUFRJT05BTCA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJuIEluc2VydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fUkVUVVJOX1VQREFURSA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX01VVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQkFTSUNfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24gPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OID0gNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0NPTExFQ1RJT05fX05BTUUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwIDxlbT5YbWwgQmFzaWMgTWFwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNNYXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQID0gNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19OQU1FID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyBNYXA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaCA8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIID0gODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX19TSVpFID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfMjFfX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRSA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIXzIxX19CQVRDSF9GRVRDSF9UWVBFOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmF0Y2ggRmV0Y2g8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIXzIxX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIX0hPTERFUiA9IDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSCA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSA8ZW0+WG1sIENhY2hlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEUgPSAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhwaXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX0VYUElSWSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fU0laRSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYXJlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19TSEFSRUQgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfX1RZUEUgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbHdheXMgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNhYmxlIEhpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRElTQUJMRV9ISVRTID0gNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29vcmRpbmF0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEUgPSA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeHBpcnkgVGltZSBPZiBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZID0gODsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENhY2hlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0ZFQVRVUkVfQ09VTlQgPSA5OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciA8ZW0+WG1sIENhY2hlIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUiA9IDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEUgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyA9IDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyA8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lORyA9IDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DSEFOR0VfVFJBQ0tJTkdfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVIgPSAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZID0gMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QgPSAxOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDI7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEUgPSAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVggPSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFID0gMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSU0lPTl9WQUxVRV9fT0JKRUNUX1ZBTFVFID0gMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnNpb24gVmFsdWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSU0lPTl9WQUxVRV9GRUFUVVJFX0NPVU5UID0gMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIgPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT05WRVJURVIgPSA0MjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRSA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIgPGVtPlhtbCBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUiA9IDE3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX19OQU1FID0gWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb252ZXJ0ZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIgPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSID0gMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUiA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVIgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUiA9IDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIgPGVtPlhtbCBDb252ZXJ0ZXJzIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJTX0hPTERFUiA9IDE5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUyA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUyA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUyA9IDM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb252ZXJ0ZXJzIEhvbGRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJURVJTX0hPTERFUl9GRUFUVVJFX0NPVU5UID0gNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nIDxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElORyA9IDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0IgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1NUUlVDVF9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kgPGVtPlhtbCBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT1BZX1BPTElDWSA9IDIxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPUFlfUE9MSUNZX19DTEFTUyA9IDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDb3B5IFBvbGljeTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT1BZX1BPTElDWV9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciA8ZW0+WG1sIEN1c3RvbWl6ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUiA9IDIyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUUgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ3VzdG9taXplcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DVVNUT01JWkVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyIDxlbT5YbWwgQ3VzdG9taXplciBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ1VTVE9NSVpFUl9IT0xERVIgPSAyMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NVU1RPTUlaRVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTiA9IDI0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OQU1FID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlkgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbGxlY3Rpb24gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDE4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTk9OX0NBQ0hFQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9GRUFUVVJFX0NPVU5UICsgMjY7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCArIDI3OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFID0gMjU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTEFTU19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX01FVEFEQVRBX0NPTVBMRVRFID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fTUVUQURBVEFfQ09NUExFVEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERUQgPSAyNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAyNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWSA9IDI4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19OQU1FID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTUVUQURBVEFfQ09NUExFVEUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX1BFUlNJU1QgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1JFTU9WRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1VQREFURSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QT1NUX0xPQUQgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JRF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUklNQVJZX0tFWSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1ZBTFVFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BBUlRJVElPTkVEID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURSA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JTkRFWCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUkVBRF9PTkxZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UICsgMjA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NBQ0hFID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDIzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDI3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAyOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDMwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDMxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfRkVBVFVSRV9DT1VOVCArIDM0OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgKyAzNTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1MgPSAyOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUFfTE9DQVRJT04gPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQV9MT0NBVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhY2thZ2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0U7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlMgPSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCArIDEyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEF0dHJpYnV0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFID0gMzA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAgPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUCA9IDMxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX19MT0FEID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfX0FUVFJJQlVURVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfMjFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRCA9IDMzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbmRleCA8ZW0+WG1sIEluZGV4PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbmRleAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVggPSAzNDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IDM1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2ggPGVtPlhtbCBKb2luIEZldGNoPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIID0gMzY7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEUgPSAzNzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTlkgPSAzODsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FID0gMzk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDQwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlIDxlbT5YbWwgTXV0YWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVVRBQkxFID0gNDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgPGVtPlhtbCBOYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlkgPSA0MzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSA0NDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IDxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZID0gNDU7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIDxlbT5YbWwgT25lIFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkUgPSA0NjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcgPSA0NzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU4gPSA0ODsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IDUwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gNTE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWSA9IDUzOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQgPGVtPlhtbCBQcml2YXRlIE93bmVkPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklWQVRFX09XTkVEID0gNTQ7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5IDxlbT5YbWwgUHJvcGVydHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWSA9IDU1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eUNvbnRhaW5lciA8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0NPTlRBSU5FUiA9IDU2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0NPTlRBSU5FUiA9IDU3OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzIDxlbT5YbWwgUXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlMgPSA1ODsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkgPGVtPlhtbCBSZWFkIE9ubHk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUFEX09OTFkgPSA2MDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmV0dXJuSW5zZXJ0IDxlbT5YbWwgUmV0dXJuIEluc2VydDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmV0dXJuSW5zZXJ0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVUVVJOX0lOU0VSVCA9IDYyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRSA9IDY0OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVIgPSA2NTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyIDxlbT5YbWwgU3RydWN0IENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RSVUNUX0NPTlZFUlRFUiA9IDY2OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEUgPSA2NzsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1IgPSA2ODsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5IDxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZID0gNjk7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uIDxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTiA9IDcwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVCA9IDcxOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyIDxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9DT05WRVJURVIgPSA3MjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSA8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORSA9IDc1OwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OID0gNzY7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSGFzaFBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9IQVNIX1BBUlRJVElPTklORyA9IDMyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSEFTSF9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0hBU0hfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX0lEX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0lEX19MT0I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0VOVU1FUkFURUQgPSBPcm1QYWNrYWdlLlhNTF9JRF9fRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fSU5ERVggPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX0lEX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NUUlVDVF9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9JRF9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT05WRVJUID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfSURfRkVBVFVSRV9DT1VOVCArIDEwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9JTkRFWF8yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX1NDSEVNQSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19TQ0hFTUE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF9fQ0FUQUxPRyA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYX19UQUJMRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX1VOSVFVRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19VTklRVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfX0NPTFVNTl9OQU1FUyA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0lOREVYXzIyX19DT0xVTU5fTkFNRVM7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJbmRleDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSU5ERVhfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1lfRkVBVFVSRV9DT1VOVCA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gRmV0Y2g8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19GRVRDSDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBQRURfQlkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURSA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDIwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1RBUkdFVF9FTlRJVFk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0NBU0NBREUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0lEID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0lEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX01BUFNfSUQgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTUFQU19JRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fT1BUSU9OQUwgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fT1BUSU9OQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX05PTl9DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDExOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xBU1NfTkFNRSA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTEFTU19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19NRVRBREFUQV9DT01QTEVURTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVkgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRSA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDE3OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0hBU0hfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDIyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05FRCA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMjc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDI5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDMxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUyA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAzMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UICsgMzc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM5OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0MDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VVEFCTEVfX01VVEFCTEUgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTXV0YWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVVRBQkxFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2NlZHVyZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUgPSAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm5zIFJlc3VsdCBTZXQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMgPSA1OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJhbWV0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTID0gNjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9GRUFUVVJFX0NPVU5UID0gNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVyc2lvbiBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVMgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fRkVUQ0g7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DQVNDQURFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JERVJfQ09MVU1OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUkRFUl9CWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUkRFUl9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1M7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9URU1QT1JBTCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU47Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcnBoYW4gUmVtb3ZhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0ggPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMTU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1BBUlRJVElPTkVEID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDE4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9GRUFUVVJFX0NPVU5UICsgMjA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCArIDIyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgKyAyMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19UQVJHRVRfRU5USVRZID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0ZFVENIOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQ0FTQ0FERSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9UQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19JRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX01BUFNfSUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBTX0lEOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09QVElPTkFMID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1BUSU9OQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDg7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFID0gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDEzOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcml2YXRlIE93bmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSCA9IE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCArIDE1OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE9uZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX0ZFQVRVUkVfQ09VTlQgKyAxNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREUgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMgPSAyOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09QVElNSVNUSUNfTE9DS0lOR19GRUFUVVJFX0NPVU5UID0gMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFID0gT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSA9IE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEUgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HID0gNDk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQYXJ0aXRpb25pbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERUxJTUlURURfSURFTlRJRklFUlMgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERUxJTUlURURfSURFTlRJRklFUlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQSA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0cgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFBlcnNpc3Q8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1QgPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1Q7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTID0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkcgPSA1MjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QSU5ORURfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04gPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9fVkFMSURBVElPTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlMgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEUgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8xMV9GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklWQVRFX09XTkVEX0ZFQVRVUkVfQ09VTlQgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfX05BTUUgPSAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19WQUxVRSA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRSA9IDI7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcm9wZXJ0eTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9GRUFUVVJFX0NPVU5UID0gMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByb3BlcnR5IENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVMgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fQUxMX1FVRVJJRVM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVCA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVCA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRVBPUlQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEUgPSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fVVBEQVRFOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnNlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURSA9IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19ERUxFVEU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU19GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJhbmdlUGFydGl0aW9uaW5nIDxlbT5YbWwgUmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSYW5nZVBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkFOR0VfUEFSVElUSU9OSU5HID0gNTk7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkFOR0VfUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZID0gMDsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJlYWQgT25seTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRUFEX09OTFlfRkVBVFVSRV9DT1VOVCA9IDE7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gNjE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfX05BTUUgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjJfX05BTUU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFkgPSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9SRVRVUk5fSU5TRVJUXzIxX19SRVRVUk5fT05MWTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVUVVJOX0lOU0VSVF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF8yMV9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSA2MzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRyA9IE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19TQ0hFTUEgPSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1NDSEVNQTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9IE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fQ1JFQVRJT05fU1VGRklYID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXJlY3Rpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OID0gMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FID0gMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUGFyYW1ldGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiA9IDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRSA9IDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpkYmMgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEUgPSA0OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSA9IDU7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9GRUFUVVJFX0NPVU5UID0gNjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NUUlVDVF9DT05WRVJURVJfX05BTUUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU3RydWN0IENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TVFJVQ1RfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19DQVRBTE9HID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19TQ0hFTUEgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9fU0NIRU1BOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTiA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT047Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX05BTUUgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0c7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZSBDb25zdHJhaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVggPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhvdXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fSE9VUiA9IDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RJTUVfT0ZfREFZX19NSU5VVEUgPSAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fU0VDT05EID0gMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWlsbGlzZWNvbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQgPSAzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVElNRV9PRl9EQVlfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1MgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fX05BTUUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TSUVOVF9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVMgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUcmFuc2llbnQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNJRU5UX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9fTkFNRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUgPSBYTUxfTkFNRURfQ09OVkVSVEVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IFhNTF9OQU1FRF9DT05WRVJURVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTlZFUlRFUl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pb25QYXJ0aXRpb25pbmcgPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaW9uUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklPTl9QQVJUSVRJT05JTkcgPSA3MzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSU9OX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklPTl9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFsdWVQYXJ0aXRpb25pbmcgPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQUxVRV9QQVJUSVRJT05JTkcgPSA3NDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBTFVFX1BBUlRJVElPTklOR19fTkFNRSA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMl9fTkFNRTsKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05BTUUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HID0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORyA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA4OwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05FRCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEUgPSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQUNDRVNTID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTkFNRSA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX05BTUU7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fTE9CID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX1RFTVBPUkFMID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19BVFRSSUJVVEVfVFlQRSA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDA7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fSU5ERVggPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgMjsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fUFJPUEVSVElFUyA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDM7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19NVVRBQkxFID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgNDsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgNTsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDY7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fRkVBVFVSRV9DT1VOVCArIDc7Ci0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSID0gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9GRUFUVVJFX0NPVU5UICsgODsKLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTlZFUlQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyA5OwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0NPT1JESU5BVElPTl9UWVBFID0gNzc7Ci0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZSA8ZW0+Q2FjaGUgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldENhY2hlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX1RZUEUgPSA3ODsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEUgPSA3OTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJUkVDVElPTiA9IDgwOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlIDxlbT5FeGlzdGVuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRFeGlzdGVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhJU1RFTkNFX1RZUEUgPSA4MTsKLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fRkVUQ0hfVFlQRSA9IDgyOwotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRSA9IDgzOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFkZGl0aW9uYWxDcml0ZXJpYUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYXR0cmlidXRlc0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNNYXBFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhdGNoRmV0Y2hFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhdGNoRmV0Y2hIb2xkZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDYWNoZUhvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb252ZXJ0ZXJFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbnZlcnRlckhvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb3B5UG9saWN5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDdXN0b21pemVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEZldGNoQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEdyb3VwRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSW5kZXhFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxKb2luRmV0Y2hFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5UYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNdXRhYmxlRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZENvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55RUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9yZGVyQ29sdW1uRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaW1hcnlLZXlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByaXZhdGVPd25lZEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlSZWRpcmVjdG9yc0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmVhZE9ubHlFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJldHVybkluc2VydEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU3RydWN0Q29udmVydGVyRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUYWJsZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRpbWVPZkRheUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRyYW5zaWVudEVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHlwZUNvbnZlcnRlckVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSGFzaFBhcnRpdGlvbmluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQaW5uZWRQYXJ0aXRpb25pbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJhbmdlUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ0VDbGFzcyA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVW5pb25QYXJ0aXRpb25pbmdFQ2xhc3MgPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZhbHVlUGFydGl0aW9uaW5nRUNsYXNzID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGNhY2hlVHlwZUVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbENoYW5nZVRyYWNraW5nVHlwZUVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbERpcmVjdGlvbkVFbnVtID0gbnVsbDsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGV4aXN0ZW5jZVR5cGVFRW51bSA9IG51bGw7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxKb2luRmV0Y2hUeXBlRUVudW0gPSBudWxsOwotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0geG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UpOwotCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyA8ZW0+WG1sIEFjY2VzcyBNZXRob2RzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBY2Nlc3MgTWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0R2V0TWV0aG9kIDxlbT5HZXQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R2V0IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRHZXRNZXRob2QoKQotCSAqIEBzZWUgI2dldFhtbEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBY2Nlc3NNZXRob2RzX0dldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWNjZXNzTWV0aG9kc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCA8ZW0+U2V0IE1ldGhvZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNldCBNZXRob2Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0U2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWNjZXNzTWV0aG9kc19TZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFjY2VzcyBNZXRob2RzIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAc2VlICNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBZGRpdGlvbmFsQ3JpdGVyaWEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIHhtbEFkZGl0aW9uYWxDcml0ZXJpYUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QXR0cmlidXRlcygpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljQ29sbGVjdGlvbnMgPGVtPkJhc2ljIENvbGxlY3Rpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5CYXNpYyBDb2xsZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY0NvbGxlY3Rpb25zKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY01hcHMgPGVtPkJhc2ljIE1hcHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJhc2ljIE1hcHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0QmFzaWNNYXBzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19CYXNpY01hcHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFRyYW5zZm9ybWF0aW9ucyA8ZW0+VHJhbnNmb3JtYXRpb25zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UcmFuc2Zvcm1hdGlvbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNmb3JtYXRpb25zKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19UcmFuc2Zvcm1hdGlvbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZhcmlhYmxlT25lVG9PbmVzIDxlbT5WYXJpYWJsZSBPbmUgVG8gT25lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VmFyaWFibGUgT25lIFRvIE9uZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VmFyaWFibGVPbmVUb09uZXMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX1ZhcmlhYmxlT25lVG9PbmVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpYygpCi0JewotCQlyZXR1cm4geG1sQmFzaWNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24gPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY0NvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY0NvbGxlY3Rpb24oKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwIDxlbT5YbWwgQmFzaWMgTWFwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBNYXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNNYXAoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljTWFwRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaCA8ZW0+WG1sIEJhdGNoIEZldGNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXRjaCBGZXRjaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIHhtbEJhdGNoRmV0Y2hFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyIDxlbT5YbWwgQmF0Y2ggRmV0Y2ggSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkKLQl7Ci0JCXJldHVybiB4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXIjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQHNlZSAjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQmF0Y2hGZXRjaEhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUgPGVtPlhtbCBDYWNoZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FjaGUoKQotCXsKLQkJcmV0dXJuIHhtbENhY2hlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnkgPGVtPkV4cGlyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4cGlyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5KCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0V4cGlyeSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNpemU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfU2l6ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaGFyZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9TaGFyZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX1R5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEFsd2F5c1JlZnJlc2ggPGVtPkFsd2F5cyBSZWZyZXNoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEFsd2F5c1JlZnJlc2goKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2FjaGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldERpc2FibGVIaXRzIDxlbT5EaXNhYmxlIEhpdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNhYmxlIEhpdHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldERpc2FibGVIaXRzKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0Rpc2FibGVIaXRzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDYpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRDb29yZGluYXRpb25UeXBlIDxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRDb29yZGluYXRpb25UeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxDYWNoZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlX0Nvb3JkaW5hdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRFeHBpcnlUaW1lT2ZEYXkoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDYWNoZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIgPGVtPlhtbCBDYWNoZSBIb2xkZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENhY2hlIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDYWNoZUhvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ2FjaGVIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNhY2hlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRDYWNoZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGVIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ2FjaGVIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBzZWUgI2dldFhtbENhY2hlSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENhY2hlSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyA8ZW0+WG1sIENoYW5nZSBUcmFja2luZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiB4bWxDaGFuZ2VUcmFja2luZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2hhbmdlVHJhY2tpbmdfVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIDxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2hhbmdlIFRyYWNraW5nIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0JewotCQlyZXR1cm4geG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5IDxlbT5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENsb25lIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIHhtbENsb25lQ29weVBvbGljeUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDbG9uZUNvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAc2VlICNnZXRYbWxDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENsb25lQ29weVBvbGljeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uVGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnNpb25WYWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgVmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZSNnZXREYXRhVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnNpb25WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldE9iamVjdFZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnNpb25WYWx1ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4geG1sQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyI2dldENsYXNzTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGVyX0NsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIgPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0ZXIgSG9sZGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnRlckhvbGRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0Q29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIgPGVtPlhtbCBDb252ZXJ0ZXJzIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLQl7Ci0JCXJldHVybiB4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRUeXBlQ29udmVydGVycyA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRlcnNIb2xkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVycyA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcgPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldENvbnZlcnQgPGVtPkNvbnZlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db252ZXJ0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0Q29udmVydCgpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIHhtbENvcHlQb2xpY3lFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvcHlQb2xpY3kjZ2V0Q2xhc3NfIDxlbT5DbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXygpCi0JICogQHNlZSAjZ2V0WG1sQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvcHlQb2xpY3lFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDdXN0b21pemVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ3VzdG9taXplcigpCi0JewotCQlyZXR1cm4geG1sQ3VzdG9taXplckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplciNnZXRDdXN0b21pemVyQ2xhc3NOYW1lIDxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQ3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEN1c3RvbWl6ZXJfQ3VzdG9taXplckNsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ3VzdG9taXplckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDdXN0b21pemVyIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotCXsKLQkJcmV0dXJuIHhtbEN1c3RvbWl6ZXJIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXJIb2xkZXIjZ2V0Q3VzdG9taXplcigpCi0JICogQHNlZSAjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24gPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JewotCQlyZXR1cm4geG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW1iZWRkYWJsZV9Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbWJlZGRhYmxlX0Nsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW1iZWRkYWJsZV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZCgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkIDxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWRJZCgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRJZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHkoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE9wdGltaXN0aWNMb2NraW5nIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0luc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENsb25lQ29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X0Nsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eU1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cCA8ZW0+WG1sIEZldGNoIEdyb3VwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEZldGNoR3JvdXAoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJZCgpCi0JewotCQlyZXR1cm4geG1sSWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbmRleCA8ZW0+WG1sIEluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJbmRleCgpCi0JewotCQlyZXR1cm4geG1sSW5kZXhFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSA8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoIDxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiB4bWxKb2luRmV0Y2hFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaCNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAc2VlICNnZXRYbWxKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxKb2luRmV0Y2hFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEpvaW5UYWJsZSgpCi0JewotCQlyZXR1cm4geG1sSm9pblRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSA8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSA8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvT25lKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JewotCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRPcHRpbWlzdGljTG9ja2luZyA8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSA8ZW0+WG1sIE11dGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE11dGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxNdXRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUgPGVtPk11dGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdXRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlI2dldE11dGFibGUoKQotCSAqIEBzZWUgI2dldFhtbE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE11dGFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyIDxlbT5YbWwgTmFtZWQgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZENvbnZlcnRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSA8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UHJvY2VkdXJlTmFtZSA8ZW0+UHJvY2VkdXJlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQcm9jZWR1cmVOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJldHVybnNSZXN1bHRTZXQoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SGludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0SGludHMoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXRQYXJhbWV0ZXJzIDxlbT5QYXJhbWV0ZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFBhcmFtZXRlcnMoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1BhcmFtZXRlcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRhdGEgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9iamVjdCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldE9iamVjdFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldENvbnZlcnNpb25WYWx1ZXMgPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRDb252ZXJzaW9uVmFsdWVzKCkKLQkgKiBAc2VlICNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9Db252ZXJzaW9uVmFsdWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGVmYXVsdE9iamVjdFZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueSgpCi0JewotCQlyZXR1cm4geG1sT25lVG9NYW55RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvT25lKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb09uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcHRpbWlzdGljIExvY2tpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJcmV0dXJuIHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0VHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0Q2FzY2FkZSgpCi0JICogQHNlZSAjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFNlbGVjdGVkQ29sdW1ucyA8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0U2VsZWN0ZWRDb2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3JkZXJDb2x1bW4oKQotCXsKLQkJcmV0dXJuIHhtbE9yZGVyQ29sdW1uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkgPGVtPlhtbCBQcmltYXJ5IEtleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQcmltYXJ5S2V5KCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkIDxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUHJpdmF0ZSBPd25lZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpdmF0ZU93bmVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiB4bWxQcml2YXRlT3duZWRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCNpc1ByaXZhdGVPd25lZCgpCi0JICogQHNlZSAjZ2V0WG1sUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJpdmF0ZU93bmVkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcm9wZXJ0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQcm9wZXJ0eSgpCi0JewotCQlyZXR1cm4geG1sUHJvcGVydHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByb3BlcnR5X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByb3BlcnR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByb3BlcnR5X1ZhbHVlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyIDxlbT5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyI2dldFByb3BlcnRpZXMoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5Q29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUHJvcGVydHlDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzIDxlbT5YbWwgUXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4geG1sUXVlcnlSZWRpcmVjdG9yc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5IDxlbT5YbWwgUmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZWFkIE9ubHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlYWRPbmx5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUmVhZE9ubHkoKQotCXsKLQkJcmV0dXJuIHhtbFJlYWRPbmx5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVhZCBPbmx5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSgpCi0JICogQHNlZSAjZ2V0WG1sUmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZWFkT25seV9SZWFkT25seSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVhZE9ubHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCA8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJldHVybkluc2VydCgpCi0JewotCQlyZXR1cm4geG1sUmV0dXJuSW5zZXJ0RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0JewotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgPGVtPlhtbCBTdG9yZWQgUHJvY2VkdXJlIFBhcmFtZXRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4geG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0RGlyZWN0aW9uIDxlbT5EaXJlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXJlY3Rpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXREaXJlY3Rpb24oKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9EaXJlY3Rpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRRdWVyeVBhcmFtZXRlciA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlIDxlbT5UeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldFR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlIDxlbT5KZGJjIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KZGJjIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlTmFtZSA8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHhtbFN0cnVjdENvbnZlcnRlckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29udmVydGVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIjZ2V0Q29udmVydGVyKCkKLQkgKiBAc2VlICNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxUYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5IDxlbT5YbWwgVGltZSBPZiBEYXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRpbWUgT2YgRGF5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUaW1lT2ZEYXkoKQotCXsKLQkJcmV0dXJuIHhtbFRpbWVPZkRheUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ib3VyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0SG91cigpCi0JICogQHNlZSAjZ2V0WG1sVGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGltZU9mRGF5X0hvdXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWludXRlIDxlbT5NaW51dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW51dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaW51dGUoKQotCSAqIEBzZWUgI2dldFhtbFRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRpbWVPZkRheV9NaW51dGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0U2Vjb25kIDxlbT5TZWNvbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TZWNvbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQoKQotCSAqIEBzZWUgI2dldFhtbFRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRpbWVPZkRheV9TZWNvbmQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRpbWVPZkRheUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRNaWxsaXNlY29uZCgpCi0JICogQHNlZSAjZ2V0WG1sVGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUaW1lT2ZEYXlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uIDxlbT5YbWwgVHJhbnNmb3JtYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zZm9ybWF0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudCA8ZW0+WG1sIFRyYW5zaWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHJhbnNpZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUcmFuc2llbnQoKQotCXsKLQkJcmV0dXJuIHhtbFRyYW5zaWVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHlwZSBDb252ZXJ0ZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB4bWxUeXBlQ29udmVydGVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EYXRhIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0T2JqZWN0VHlwZSA8ZW0+T2JqZWN0IFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmVyc2lvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZlcnNpb24oKQotCXsKLQkJcmV0dXJuIHhtbFZlcnNpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxIYXNoUGFydGl0aW9uaW5nIDxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxIYXNoUGFydGl0aW9uaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSGFzaFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4geG1sSGFzaFBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQYXJ0aXRpb25pbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHhtbFBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4geG1sUGlubmVkUGFydGl0aW9uaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4geG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZyA8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxVbmlvblBhcnRpdGlvbmluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nIDxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhbHVlUGFydGl0aW9uaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHhtbFZhbHVlUGFydGl0aW9uaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUgPGVtPkNhY2hlIENvb3JkaW5hdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q2FjaGUgQ29vcmRpbmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlIDxlbT5DYWNoZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+Q2FjaGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRDYWNoZVR5cGUoKQotCXsKLQkJcmV0dXJuIGNhY2hlVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotCXsKLQkJcmV0dXJuIHhtbENoYW5nZVRyYWNraW5nVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24gPGVtPlhtbCBEaXJlY3Rpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgRGlyZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbERpcmVjdGlvbigpCi0JewotCQlyZXR1cm4geG1sRGlyZWN0aW9uRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUgPGVtPkV4aXN0ZW5jZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldEV4aXN0ZW5jZVR5cGUoKQotCXsKLQkJcmV0dXJuIGV4aXN0ZW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBKb2luIEZldGNoIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbEpvaW5GZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5GZXRjaFR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIDxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgT3B0aW1pc3RpYyBMb2NraW5nIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKCkKLQl7Ci0JCXJldHVybiB4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1GYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19NRVRIT0RTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfX0dFVF9NRVRIT0QpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc01ldGhvZHNFQ2xhc3MsIFhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCk7Ci0KLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUyk7Ci0KLQkJeG1sQWRkaXRpb25hbENyaXRlcmlhRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BRERJVElPTkFMX0NSSVRFUklBKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0KLQkJYXR0cmlidXRlc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVFRSSUJVVEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19CQVNJQ19DT0xMRUNUSU9OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fQkFTSUNfTUFQUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyk7Ci0KLQkJeG1sQmFzaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDKTsKLQotCQl4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDX0NPTExFQ1RJT04pOwotCi0JCXhtbEJhc2ljTWFwRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ19NQVApOwotCi0JCXhtbEJhdGNoRmV0Y2hFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBVENIX0ZFVENIKTsKLQotCQl4bWxCYXRjaEZldGNoSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVRDSF9GRVRDSF9IT0xERVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEJhdGNoRmV0Y2hIb2xkZXJFQ2xhc3MsIFhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIKTsKLQotCQl4bWxDYWNoZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ0FDSEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0VYUElSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fU0laRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fU0hBUkVEKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVFQ2xhc3MsIFhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlRUNsYXNzLCBYTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDYWNoZUVDbGFzcywgWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVkpOwotCi0JCXhtbENhY2hlSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRV9IT0xERVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbENhY2hlSG9sZGVyRUNsYXNzLCBYTUxfQ0FDSEVfSE9MREVSX19DQUNIRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2FjaGVIb2xkZXJFQ2xhc3MsIFhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORyk7Ci0KLQkJeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NIQU5HRV9UUkFDS0lORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MsIFhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUpOwotCi0JCXhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDaGFuZ2VUcmFja2luZ0hvbGRlckVDbGFzcywgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORyk7Ci0KLQkJeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DTE9ORV9DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xvbmVDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QpOwotCi0JCXhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJTSU9OX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJzaW9uVmFsdWVFQ2xhc3MsIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUpOwotCi0JCXhtbENvbnZlcnRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUpOwotCi0JCXhtbENvbnZlcnRlckhvbGRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09OVkVSVEVSX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVySG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MsIFhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSKTsKLQotCQl4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJURVJTX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ29udmVydGVyc0hvbGRlckVDbGFzcywgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxDb252ZXJ0ZXJzSG9sZGVyRUNsYXNzLCBYTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTKTsKLQotCQl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTlZFUlRJQkxFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQpOwotCi0JCXhtbENvcHlQb2xpY3lFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb3B5UG9saWN5RUNsYXNzLCBYTUxfQ09QWV9QT0xJQ1lfX0NMQVNTKTsKLQotCQl4bWxDdXN0b21pemVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DVVNUT01JWkVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDdXN0b21pemVyRUNsYXNzLCBYTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FKTsKLQotCQl4bWxDdXN0b21pemVySG9sZGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DVVNUT01JWkVSX0hPTERFUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcywgWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSKTsKLQotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQotCQl4bWxFbWJlZGRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1kpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhNTF9FTUJFRERBQkxFX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MpOwotCi0JCXhtbEVtYmVkZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRCk7Ci0KLQkJeG1sRW1iZWRkZWRJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRURERURfSUQpOwotCi0JCXhtbEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyk7Ci0KLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV9NQVBQSU5HUyk7Ci0KLQkJeG1sRmV0Y2hBdHRyaWJ1dGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0ZFVENIX0FUVFJJQlVURSk7Ci0KLQkJeG1sRmV0Y2hHcm91cEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRkVUQ0hfR1JPVVApOwotCi0JCXhtbEhhc2hQYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0hBU0hfUEFSVElUSU9OSU5HKTsKLQotCQl4bWxJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSUQpOwotCi0JCXhtbEluZGV4RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9JTkRFWCk7Ci0KLQkJeG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3lFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kpOwotCi0JCXhtbEpvaW5GZXRjaEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSk9JTl9GRVRDSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSm9pbkZldGNoRUNsYXNzLCBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCk7Ci0KLQkJeG1sSm9pblRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFKTsKLQotCQl4bWxNYW55VG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTlkpOwotCi0JCXhtbE1hbnlUb09uZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19PTkUpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyk7Ci0KLQkJeG1sTXV0YWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTVVUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTXV0YWJsZUVDbGFzcywgWE1MX01VVEFCTEVfX01VVEFCTEUpOwotCi0JCXhtbE5hbWVkQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkQ29udmVydGVyRUNsYXNzLCBYTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FKTsKLQotCQl4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlFQ2xhc3MsIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVJTKTsKLQotCQl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT2JqZWN0VHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE9iamVjdFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSk7Ci0KLQkJeG1sT25lVG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWSk7Ci0KLQkJeG1sT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19PTkUpOwotCi0JCXhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9wdGltaXN0aWNMb2NraW5nRUNsYXNzLCBYTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcHRpbWlzdGljTG9ja2luZ0VDbGFzcywgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMpOwotCi0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUkRFUl9DT0xVTU4pOwotCi0JCXhtbFBhcnRpdGlvbmluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEFSVElUSU9OSU5HKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTKTsKLQotCQl4bWxQaW5uZWRQYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BJTk5FRF9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFByaW1hcnlLZXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSU1BUllfS0VZKTsKLQotCQl4bWxQcml2YXRlT3duZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BSSVZBVEVfT1dORUQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQpOwotCi0JCXhtbFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByb3BlcnR5RUNsYXNzLCBYTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUpOwotCi0JCXhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWV9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTKTsKLQotCQl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQotCQl4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9SRURJUkVDVE9SUyk7Ci0KLQkJeG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JBTkdFX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sUmVhZE9ubHlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFQURfT05MWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUmVhZE9ubHlFQ2xhc3MsIFhNTF9SRUFEX09OTFlfX1JFQURfT05MWSk7Ci0KLQkJeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sUmV0dXJuSW5zZXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUKTsKLQotCQl4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9TRUNPTkRBUllfVEFCTEUpOwotCi0JCXhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlckVDbGFzcywgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyRUNsYXNzLCBYTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FKTsKLQotCQl4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NUUlVDVF9DT05WRVJURVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFN0cnVjdENvbnZlcnRlckVDbGFzcywgWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUik7Ci0KLQkJeG1sVGFibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RBQkxFKTsKLQotCQl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEVfR0VORVJBVE9SKTsKLQotCQl4bWxUaW1lT2ZEYXlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RJTUVfT0ZfREFZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUaW1lT2ZEYXlFQ2xhc3MsIFhNTF9USU1FX09GX0RBWV9fSE9VUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGltZU9mRGF5RUNsYXNzLCBYTUxfVElNRV9PRl9EQVlfX01JTlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGltZU9mRGF5RUNsYXNzLCBYTUxfVElNRV9PRl9EQVlfX1NFQ09ORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGltZU9mRGF5RUNsYXNzLCBYTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EKTsKLQotCQl4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNGT1JNQVRJT04pOwotCi0JCXhtbFRyYW5zaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNJRU5UKTsKLQotCQl4bWxUeXBlQ29udmVydGVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVHlwZUNvbnZlcnRlckVDbGFzcywgWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFR5cGVDb252ZXJ0ZXJFQ2xhc3MsIFhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUpOwotCi0JCXhtbFVuaW9uUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9VTklPTl9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFZhbHVlUGFydGl0aW9uaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WQUxVRV9QQVJUSVRJT05JTkcpOwotCi0JCXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZBUklBQkxFX09ORV9UT19PTkUpOwotCi0JCXhtbFZlcnNpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZFUlNJT04pOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQljYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKENBQ0hFX0NPT1JESU5BVElPTl9UWVBFKTsKLQkJY2FjaGVUeXBlRUVudW0gPSBjcmVhdGVFRW51bShDQUNIRV9UWVBFKTsKLQkJeG1sQ2hhbmdlVHJhY2tpbmdUeXBlRUVudW0gPSBjcmVhdGVFRW51bShYTUxfQ0hBTkdFX1RSQUNLSU5HX1RZUEUpOwotCQl4bWxEaXJlY3Rpb25FRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9ESVJFQ1RJT04pOwotCQlleGlzdGVuY2VUeXBlRUVudW0gPSBjcmVhdGVFRW51bShFWElTVEVOQ0VfVFlQRSk7Ci0JCXhtbEpvaW5GZXRjaFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9KT0lOX0ZFVENIX1RZUEUpOwotCQl4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lTlNfVVJJKTsKLQkJRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKTsKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1YnBhY2thZ2VzCi0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKTsKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpOwotCQlnZXRFU3VicGFja2FnZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSk7Ci0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxBZGRpdGlvbmFsQ3JpdGVyaWFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkpOwotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpKTsKLQkJYXR0cmlidXRlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEF0dHJpYnV0ZXMoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQmFzaWMoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sQmFzaWNfMV8xKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEJhc2ljXzJfMSgpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY0NvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKSk7Ci0JCXhtbEJhc2ljTWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNpY01hcEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljTWFwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sQmFzaWNNYXBfMl8yKCkpOwotCQl4bWxCYXRjaEZldGNoRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKSk7Ci0JCXhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMigpKTsKLQkJeG1sQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpKTsKLQkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVySG9sZGVyKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRW1iZWRkYWJsZSgpKTsKLQkJeG1sRW1iZWRkYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEVtYmVkZGFibGVfMl8xKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sRW1iZWRkYWJsZV8yXzIoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDdXN0b21pemVySG9sZGVyKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkpOwotCQl4bWxFbWJlZGRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRW1iZWRkZWRfMl8xKCkpOwotCQl4bWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbWJlZGRlZElkKCkpOwotCQl4bWxFbWJlZGRlZElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRW1iZWRkZWRJZF8yXzEoKSk7Ci0JCXhtbEVtYmVkZGVkSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbnRpdHkoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmdldFhtbEVudGl0eV8xXzEoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmdldFhtbEVudGl0eV8yXzAoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbEVudGl0eV8yXzEoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbEVudGl0eV8yXzIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlYWRPbmx5KCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDdXN0b21pemVySG9sZGVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ2FjaGVIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcigpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxFbnRpdHlNYXBwaW5ncygpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKSk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbEZldGNoQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkpOwotCQl4bWxGZXRjaEdyb3VwRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKSk7Ci0JCXhtbEhhc2hQYXJ0aXRpb25pbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxJZCgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxJZF8yXzEoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sSWRfMl8yKCkpOwotCQl4bWxJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXV0YWJsZSgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEluZGV4RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sSW5kZXhfMl8yKCkpOwotCQl4bWxKb2luVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxKb2luVGFibGUoKSk7Ci0JCXhtbEpvaW5UYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbEpvaW5UYWJsZV8yXzIoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxNYW55VG9NYW55KCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxNYW55VG9NYW55XzJfMSgpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbE1hbnlUb01hbnlfMl8yKCkpOwotCQl4bWxNYW55VG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5GZXRjaCgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sTWFueVRvT25lKCkpOwotCQl4bWxNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxNYW55VG9PbmVfMl8xKCkpOwotCQl4bWxNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxNYW55VG9PbmVfMl8yKCkpOwotCQl4bWxNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxNYW55VG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxSZWFkT25seSgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENhY2hlSG9sZGVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCkpOwotCQl4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE9uZVRvTWFueSgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMCgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMSgpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sT25lVG9NYW55XzJfMigpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJpdmF0ZU93bmVkKCkpOwotCQl4bWxPbmVUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT25lVG9PbmUoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sT25lVG9PbmVfMl8xKCkpOwotCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbE9uZVRvT25lXzJfMigpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFByaXZhdGVPd25lZCgpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxKb2luRmV0Y2goKSk7Ci0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW4oKSk7Ci0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkpOwotCQl4bWxQYXJ0aXRpb25pbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJeG1sUGlubmVkUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sUHJpbWFyeUtleUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmdldFhtbFByaW1hcnlLZXlfMV8xKCkpOwotCQl4bWxQcmltYXJ5S2V5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZ2V0WG1sUHJpbWFyeUtleV8yXzEoKSk7Ci0JCXhtbFF1ZXJ5UmVkaXJlY3RvcnNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpKTsKLQkJeG1sUmFuZ2VQYXJ0aXRpb25pbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKSk7Ci0JCXhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxSZXR1cm5JbnNlcnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkpOwotCQl4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKSk7Ci0JCXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKSk7Ci0JCXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sU2Vjb25kYXJ5VGFibGVfMl8yKCkpOwotCQl4bWxTdHJ1Y3RDb252ZXJ0ZXJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbnZlcnRlcigpKTsKLQkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxUYWJsZSgpKTsKLQkJeG1sVGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxUYWJsZV8yXzIoKSk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSk7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkpOwotCQl4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNmb3JtYXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzEoKSk7Ci0JCXhtbFRyYW5zZm9ybWF0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHJhbnNpZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sVHJhbnNpZW50KCkpOwotCQl4bWxUcmFuc2llbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxUeXBlQ29udmVydGVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKSk7Ci0JCXhtbFVuaW9uUGFydGl0aW9uaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkpOwotCQl4bWxWYWx1ZVBhcnRpdGlvbmluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpKTsKLQkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmFyaWFibGVPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFZlcnNpb24oKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5nZXRYbWxWZXJzaW9uXzJfMSgpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmdldFhtbFZlcnNpb25fMl8yKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVmVyc2lvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE11dGFibGUoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJnZXRNZXRob2QiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNldE1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbEFjY2Vzc01ldGhvZHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyRUNsYXNzLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAiWG1sQWNjZXNzTWV0aG9kc0hvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpLCB0aGlzLmdldFhtbEFjY2Vzc01ldGhvZHMoKSwgbnVsbCwgImFjY2Vzc01ldGhvZHMiLCBudWxsLCAwLCAxLCBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQWRkaXRpb25hbENyaXRlcmlhRUNsYXNzLCBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEuY2xhc3MsICJYbWxBZGRpdGlvbmFsQ3JpdGVyaWEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhhdHRyaWJ1dGVzRUNsYXNzLCBBdHRyaWJ1dGVzLmNsYXNzLCAiQXR0cmlidXRlcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19CYXNpY0NvbGxlY3Rpb25zKCksIHRoaXMuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCksIG51bGwsICJiYXNpY0NvbGxlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCksIHRoaXMuZ2V0WG1sQmFzaWNNYXAoKSwgbnVsbCwgImJhc2ljTWFwcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX1RyYW5zZm9ybWF0aW9ucygpLCB0aGlzLmdldFhtbFRyYW5zZm9ybWF0aW9uKCksIG51bGwsICJ0cmFuc2Zvcm1hdGlvbnMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19WYXJpYWJsZU9uZVRvT25lcygpLCB0aGlzLmdldFhtbFZhcmlhYmxlT25lVG9PbmUoKSwgbnVsbCwgInZhcmlhYmxlT25lVG9PbmVzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY0VDbGFzcywgWG1sQmFzaWMuY2xhc3MsICJYbWxCYXNpYyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2ljQ29sbGVjdGlvbkVDbGFzcywgWG1sQmFzaWNDb2xsZWN0aW9uLmNsYXNzLCAiWG1sQmFzaWNDb2xsZWN0aW9uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNNYXBFQ2xhc3MsIFhtbEJhc2ljTWFwLmNsYXNzLCAiWG1sQmFzaWNNYXAiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXRjaEZldGNoRUNsYXNzLCBYbWxCYXRjaEZldGNoLmNsYXNzLCAiWG1sQmF0Y2hGZXRjaCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhdGNoRmV0Y2hIb2xkZXJFQ2xhc3MsIFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MsICJYbWxCYXRjaEZldGNoSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCksIHRoaXMuZ2V0WG1sQmF0Y2hGZXRjaCgpLCBudWxsLCAiYmF0Y2hGZXRjaCIsIG51bGwsIDAsIDEsIFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDYWNoZUVDbGFzcywgWG1sQ2FjaGUuY2xhc3MsICJYbWxDYWNoZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfRXhwaXJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiZXhwaXJ5IiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1NpemUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzaXplIiwgbnVsbCwgMCwgMSwgWG1sQ2FjaGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENhY2hlX1NoYXJlZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJzaGFyZWQiLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfVHlwZSgpLCB0aGlzLmdldENhY2hlVHlwZSgpLCAidHlwZSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9BbHdheXNSZWZyZXNoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImFsd2F5c1JlZnJlc2giLCBudWxsLCAwLCAxLCBYbWxDYWNoZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJlZnJlc2hPbmx5SWZOZXdlciIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJkaXNhYmxlSGl0cyIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCksIHRoaXMuZ2V0Q2FjaGVDb29yZGluYXRpb25UeXBlKCksICJjb29yZGluYXRpb25UeXBlIiwgIiIsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDYWNoZV9FeHBpcnlUaW1lT2ZEYXkoKSwgdGhpcy5nZXRYbWxUaW1lT2ZEYXkoKSwgbnVsbCwgImV4cGlyeVRpbWVPZkRheSIsIG51bGwsIDAsIDEsIFhtbENhY2hlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2FjaGVIb2xkZXJFQ2xhc3MsIFhtbENhY2hlSG9sZGVyLmNsYXNzLCAiWG1sQ2FjaGVIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpLCB0aGlzLmdldFhtbENhY2hlKCksIG51bGwsICJjYWNoZSIsIG51bGwsIDAsIDEsIFhtbENhY2hlSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpLCB0aGlzLmdldEV4aXN0ZW5jZVR5cGUoKSwgImV4aXN0ZW5jZUNoZWNraW5nIiwgIiIsIDAsIDEsIFhtbENhY2hlSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2hhbmdlVHJhY2tpbmdFQ2xhc3MsIFhtbENoYW5nZVRyYWNraW5nLmNsYXNzLCAiWG1sQ2hhbmdlVHJhY2tpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKSwgdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxDaGFuZ2VUcmFja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENoYW5nZVRyYWNraW5nSG9sZGVyRUNsYXNzLCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcywgIlhtbENoYW5nZVRyYWNraW5nSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKSwgdGhpcy5nZXRYbWxDaGFuZ2VUcmFja2luZygpLCBudWxsLCAiY2hhbmdlVHJhY2tpbmciLCBudWxsLCAwLCAxLCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENsb25lQ29weVBvbGljeUVDbGFzcywgWG1sQ2xvbmVDb3B5UG9saWN5LmNsYXNzLCAiWG1sQ2xvbmVDb3B5UG9saWN5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kIiwgbnVsbCwgMCwgMSwgWG1sQ2xvbmVDb3B5UG9saWN5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ3b3JraW5nQ29weU1ldGhvZCIsIG51bGwsIDAsIDEsIFhtbENsb25lQ29weVBvbGljeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcywgWG1sQ29sbGVjdGlvblRhYmxlLmNsYXNzLCAiWG1sQ29sbGVjdGlvblRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVyc2lvblZhbHVlRUNsYXNzLCBYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsICJYbWxDb252ZXJzaW9uVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJzaW9uVmFsdWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnNpb25WYWx1ZV9PYmplY3RWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9iamVjdFZhbHVlIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVyc2lvblZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVydGVyRUNsYXNzLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICJYbWxDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnRlcl9DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb252ZXJ0ZXJIb2xkZXJFQ2xhc3MsIFhtbENvbnZlcnRlckhvbGRlci5jbGFzcywgIlhtbENvbnZlcnRlckhvbGRlciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKSwgdGhpcy5nZXRYbWxDb252ZXJ0ZXIoKSwgbnVsbCwgImNvbnZlcnRlciIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSwgdGhpcy5nZXRYbWxUeXBlQ29udmVydGVyKCksIG51bGwsICJ0eXBlQ29udmVydGVyIiwgbnVsbCwgMCwgMSwgWG1sQ29udmVydGVySG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpLCB0aGlzLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKSwgbnVsbCwgIm9iamVjdFR5cGVDb252ZXJ0ZXIiLCBudWxsLCAwLCAxLCBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSwgdGhpcy5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKSwgbnVsbCwgInN0cnVjdENvbnZlcnRlciIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRlckhvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbnZlcnRlcnNIb2xkZXJFQ2xhc3MsIFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MsICJYbWxDb252ZXJ0ZXJzSG9sZGVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sQ29udmVydGVyKCksIG51bGwsICJjb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSwgdGhpcy5nZXRYbWxUeXBlQ29udmVydGVyKCksIG51bGwsICJ0eXBlQ29udmVydGVycyIsIG51bGwsIDAsIC0xLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpLCBudWxsLCAib2JqZWN0VHlwZUNvbnZlcnRlcnMiLCBudWxsLCAwLCAtMSwgWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCksIHRoaXMuZ2V0WG1sU3RydWN0Q29udmVydGVyKCksIG51bGwsICJzdHJ1Y3RDb252ZXJ0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIlhtbENvbnZlcnRpYmxlTWFwcGluZyIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29udmVydCIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbENvcHlQb2xpY3lFQ2xhc3MsIFhtbENvcHlQb2xpY3kuY2xhc3MsICJYbWxDb3B5UG9saWN5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb3B5UG9saWN5X0NsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3MiLCBudWxsLCAwLCAxLCBYbWxDb3B5UG9saWN5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ3VzdG9taXplckVDbGFzcywgWG1sQ3VzdG9taXplci5jbGFzcywgIlhtbEN1c3RvbWl6ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEN1c3RvbWl6ZXJfQ3VzdG9taXplckNsYXNzTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImN1c3RvbWl6ZXJDbGFzc05hbWUiLCBudWxsLCAwLCAxLCBYbWxDdXN0b21pemVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ3VzdG9taXplckhvbGRlckVDbGFzcywgWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcywgIlhtbEN1c3RvbWl6ZXJIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxDdXN0b21pemVySG9sZGVyX0N1c3RvbWl6ZXIoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDbGFzc1JlZmVyZW5jZSgpLCBudWxsLCAiY3VzdG9taXplciIsIG51bGwsIDAsIDEsIFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb24uY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGFibGVFQ2xhc3MsIFhtbEVtYmVkZGFibGUuY2xhc3MsICJYbWxFbWJlZGRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW1iZWRkYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCksIG51bGwsICJjbG9uZUNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbWJlZGRhYmxlX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZEVDbGFzcywgWG1sRW1iZWRkZWQuY2xhc3MsICJYbWxFbWJlZGRlZCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkSWRFQ2xhc3MsIFhtbEVtYmVkZGVkSWQuY2xhc3MsICJYbWxFbWJlZGRlZElkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW50aXR5RUNsYXNzLCBYbWxFbnRpdHkuY2xhc3MsICJYbWxFbnRpdHkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpLCB0aGlzLmdldFhtbE9wdGltaXN0aWNMb2NraW5nKCksIG51bGwsICJvcHRpbWlzdGljTG9ja2luZyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCBudWxsLCAiaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDbG9uZUNvcHlQb2xpY3koKSwgbnVsbCwgImNsb25lQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRmV0Y2hBdHRyaWJ1dGVFQ2xhc3MsIFhtbEZldGNoQXR0cmlidXRlLmNsYXNzLCAiWG1sRmV0Y2hBdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEdyb3VwRUNsYXNzLCBYbWxGZXRjaEdyb3VwLmNsYXNzLCAiWG1sRmV0Y2hHcm91cCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEhhc2hQYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbEhhc2hQYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxIYXNoUGFydGl0aW9uaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSWRFQ2xhc3MsIFhtbElkLmNsYXNzLCAiWG1sSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJbmRleEVDbGFzcywgWG1sSW5kZXguY2xhc3MsICJYbWxJbmRleCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5RUNsYXNzLCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5jbGFzcywgIlhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pbkZldGNoRUNsYXNzLCBYbWxKb2luRmV0Y2guY2xhc3MsICJYbWxKb2luRmV0Y2giLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCksIHRoaXMuZ2V0WG1sSm9pbkZldGNoVHlwZSgpLCAiam9pbkZldGNoIiwgbnVsbCwgMCwgMSwgWG1sSm9pbkZldGNoLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlRUNsYXNzLCBYbWxKb2luVGFibGUuY2xhc3MsICJYbWxKb2luVGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9NYW55RUNsYXNzLCBYbWxNYW55VG9NYW55LmNsYXNzLCAiWG1sTWFueVRvTWFueSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZUVDbGFzcywgWG1sTWFueVRvT25lLmNsYXNzLCAiWG1sTWFueVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3MiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKSwgdGhpcy5nZXRYbWxPcHRpbWlzdGljTG9ja2luZygpLCBudWxsLCAib3B0aW1pc3RpY0xvY2tpbmciLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0NvcHlQb2xpY3koKSwgdGhpcy5nZXRYbWxDb3B5UG9saWN5KCksIG51bGwsICJjb3B5UG9saWN5IiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpLCB0aGlzLmdldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCksIG51bGwsICJpbnN0YW50aWF0aW9uQ29weVBvbGljeSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ2xvbmVDb3B5UG9saWN5KCksIHRoaXMuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCksIG51bGwsICJjbG9uZUNvcHlQb2xpY3kiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNdXRhYmxlRUNsYXNzLCBYbWxNdXRhYmxlLmNsYXNzLCAiWG1sTXV0YWJsZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE11dGFibGVfTXV0YWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJtdXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sTXV0YWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE5hbWVkQ29udmVydGVyRUNsYXNzLCBYbWxOYW1lZENvbnZlcnRlci5jbGFzcywgIlhtbE5hbWVkQ29udmVydGVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZENvbnZlcnRlcl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeUVDbGFzcywgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVzdWx0Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXN1bHRTZXRNYXBwaW5nIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvY2VkdXJlTmFtZSIsIG51bGwsIDAsIDEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZXR1cm5zUmVzdWx0U2V0IiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9IaW50cygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5SGludCgpLCBudWxsLCAiaGludHMiLCBudWxsLCAwLCAtMSwgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCksIHRoaXMuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCksIG51bGwsICJwYXJhbWV0ZXJzIiwgbnVsbCwgMCwgLTEsIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPYmplY3RUeXBlQ29udmVydGVyRUNsYXNzLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAiWG1sT2JqZWN0VHlwZUNvbnZlcnRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRhdGFUeXBlIiwgbnVsbCwgMCwgMSwgWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAib2JqZWN0VHlwZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpLCB0aGlzLmdldFhtbENvbnZlcnNpb25WYWx1ZSgpLCBudWxsLCAiY29udmVyc2lvblZhbHVlcyIsIG51bGwsIDAsIC0xLCBYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlZmF1bHRPYmplY3RWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlFQ2xhc3MsIFhtbE9uZVRvTWFueS5jbGFzcywgIlhtbE9uZVRvTWFueSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9uZVRvT25lRUNsYXNzLCBYbWxPbmVUb09uZS5jbGFzcywgIlhtbE9uZVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3B0aW1pc3RpY0xvY2tpbmdFQ2xhc3MsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAiWG1sT3B0aW1pc3RpY0xvY2tpbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1R5cGUoKSwgdGhpcy5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxPcHRpbWlzdGljTG9ja2luZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYXNjYWRlIiwgbnVsbCwgMCwgMSwgWG1sT3B0aW1pc3RpY0xvY2tpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENvbHVtbigpLCBudWxsLCAic2VsZWN0ZWRDb2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbE9wdGltaXN0aWNMb2NraW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5FQ2xhc3MsIFhtbE9yZGVyQ29sdW1uLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbFBhcnRpdGlvbmluZy5jbGFzcywgIlhtbFBhcnRpdGlvbmluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZURlZmF1bHRNYXBwaW5ncyIsIG51bGwsIDAsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGlubmVkUGFydGl0aW9uaW5nRUNsYXNzLCBYbWxQaW5uZWRQYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxQaW5uZWRQYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcmltYXJ5S2V5RUNsYXNzLCBYbWxQcmltYXJ5S2V5LmNsYXNzLCAiWG1sUHJpbWFyeUtleSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFByaXZhdGVPd25lZEVDbGFzcywgWG1sUHJpdmF0ZU93bmVkLmNsYXNzLCAiWG1sUHJpdmF0ZU93bmVkIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJwcml2YXRlT3duZWQiLCBudWxsLCAwLCAxLCBYbWxQcml2YXRlT3duZWQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcm9wZXJ0eUVDbGFzcywgWG1sUHJvcGVydHkuY2xhc3MsICJYbWxQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZSIsIG51bGwsIDAsIDEsIFhtbFByb3BlcnR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFByb3BlcnR5Q29udGFpbmVyRUNsYXNzLCBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcywgIlhtbFByb3BlcnR5Q29udGFpbmVyIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzLCAiWG1sUXVlcnlDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCksIG51bGwsICJuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sUXVlcnlDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeVJlZGlyZWN0b3JzRUNsYXNzLCBYbWxRdWVyeVJlZGlyZWN0b3JzLmNsYXNzLCAiWG1sUXVlcnlSZWRpcmVjdG9ycyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFJhbmdlUGFydGl0aW9uaW5nRUNsYXNzLCBYbWxSYW5nZVBhcnRpdGlvbmluZy5jbGFzcywgIlhtbFJhbmdlUGFydGl0aW9uaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUmVhZE9ubHlFQ2xhc3MsIFhtbFJlYWRPbmx5LmNsYXNzLCAiWG1sUmVhZE9ubHkiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxSZWFkT25seV9SZWFkT25seSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJyZWFkT25seSIsIG51bGwsIDAsIDEsIFhtbFJlYWRPbmx5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLmNsYXNzLCAiWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSZXR1cm5JbnNlcnRFQ2xhc3MsIFhtbFJldHVybkluc2VydC5jbGFzcywgIlhtbFJldHVybkluc2VydCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MsIFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzLCAiWG1sU2Vjb25kYXJ5VGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJFQ2xhc3MsIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5jbGFzcywgIlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0RpcmVjdGlvbigpLCB0aGlzLmdldFhtbERpcmVjdGlvbigpLCAiZGlyZWN0aW9uIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInF1ZXJ5UGFyYW1ldGVyIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInR5cGUiLCBudWxsLCAwLCAxLCBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImpkYmNUeXBlIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiamRiY1R5cGVOYW1lIiwgbnVsbCwgMCwgMSwgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU3RydWN0Q29udmVydGVyRUNsYXNzLCBYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsICJYbWxTdHJ1Y3RDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb252ZXJ0ZXIiLCBudWxsLCAwLCAxLCBYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUVDbGFzcywgWG1sVGFibGUuY2xhc3MsICJYbWxUYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVGltZU9mRGF5RUNsYXNzLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICJYbWxUaW1lT2ZEYXkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRpbWVPZkRheV9Ib3VyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAiaG91ciIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgIm1pbnV0ZSIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X1NlY29uZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgInNlY29uZCIsIG51bGwsIDAsIDEsIFhtbFRpbWVPZkRheS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibWlsbGlzZWNvbmQiLCBudWxsLCAwLCAxLCBYbWxUaW1lT2ZEYXkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUcmFuc2Zvcm1hdGlvbkVDbGFzcywgWG1sVHJhbnNmb3JtYXRpb24uY2xhc3MsICJYbWxUcmFuc2Zvcm1hdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEVDbGFzcywgWG1sVHJhbnNpZW50LmNsYXNzLCAiWG1sVHJhbnNpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHlwZUNvbnZlcnRlckVDbGFzcywgWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgIlhtbFR5cGVDb252ZXJ0ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkYXRhVHlwZSIsIG51bGwsIDAsIDEsIFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm9iamVjdFR5cGUiLCBudWxsLCAwLCAxLCBYbWxUeXBlQ29udmVydGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVW5pb25QYXJ0aXRpb25pbmdFQ2xhc3MsIFhtbFVuaW9uUGFydGl0aW9uaW5nLmNsYXNzLCAiWG1sVW5pb25QYXJ0aXRpb25pbmciLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWYWx1ZVBhcnRpdGlvbmluZ0VDbGFzcywgWG1sVmFsdWVQYXJ0aXRpb25pbmcuY2xhc3MsICJYbWxWYWx1ZVBhcnRpdGlvbmluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbFZhcmlhYmxlT25lVG9PbmVFQ2xhc3MsIFhtbFZhcmlhYmxlT25lVG9PbmUuY2xhc3MsICJYbWxWYXJpYWJsZU9uZVRvT25lIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbkVDbGFzcywgWG1sVmVyc2lvbi5jbGFzcywgIlhtbFZlcnNpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuY2xhc3MsICJDYWNoZUNvb3JkaW5hdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUNvb3JkaW5hdGlvblR5cGVFRW51bSwgQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlQ29vcmRpbmF0aW9uVHlwZUVFbnVtLCBDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVDb29yZGluYXRpb25UeXBlRUVudW0sIENhY2hlQ29vcmRpbmF0aW9uVHlwZS5OT05FKTsKLQotCQlpbml0RUVudW0oY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5jbGFzcywgIkNhY2hlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5GVUxMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlVHlwZUVFbnVtLCBDYWNoZVR5cGUuV0VBSyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLlNPRlQpOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5TT0ZUX1dFQUspOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlhZGRFRW51bUxpdGVyYWwoY2FjaGVUeXBlRUVudW0sIENhY2hlVHlwZS5DQUNIRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZVR5cGVFRW51bSwgQ2FjaGVUeXBlLk5PTkUpOwotCi0JCWluaXRFRW51bSh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmNsYXNzLCAiWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxDaGFuZ2VUcmFja2luZ1R5cGVFRW51bSwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbENoYW5nZVRyYWNraW5nVHlwZUVFbnVtLCBYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0KLQkJaW5pdEVFbnVtKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uY2xhc3MsICJYbWxEaXJlY3Rpb24iKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbERpcmVjdGlvbkVFbnVtLCBYbWxEaXJlY3Rpb24uSU4pOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5PVVQpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5JTl9PVVQpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sRGlyZWN0aW9uRUVudW0sIFhtbERpcmVjdGlvbi5PVVRfQ1VSU09SKTsKLQotCQlpbml0RUVudW0oZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLmNsYXNzLCAiRXhpc3RlbmNlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZXhpc3RlbmNlVHlwZUVFbnVtLCBFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKLQkJYWRkRUVudW1MaXRlcmFsKGV4aXN0ZW5jZVR5cGVFRW51bSwgRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChleGlzdGVuY2VUeXBlRUVudW0sIEV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCi0JCWluaXRFRW51bSh4bWxKb2luRmV0Y2hUeXBlRUVudW0sIFhtbEpvaW5GZXRjaFR5cGUuY2xhc3MsICJYbWxKb2luRmV0Y2hUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxKb2luRmV0Y2hUeXBlRUVudW0sIFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sSm9pbkZldGNoVHlwZUVFbnVtLCBYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQotCQlpbml0RUVudW0oeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5jbGFzcywgIlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5BTExfQ09MVU1OUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSwgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLkNIQU5HRURfQ09MVU1OUyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxPcHRpbWlzdGljTG9ja2luZ1R5cGVFRW51bSwgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLlNFTEVDVEVEX0NPTFVNTlMpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlRUVudW0sIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZS5WRVJTSU9OX0NPTFVNTik7Ci0KLQkJLy8gQ3JlYXRlIHJlc291cmNlCi0JCWNyZWF0ZVJlc291cmNlKGVOU19VUkkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzIDxlbT5YbWwgQWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FDQ0VTU19NRVRIT0RTID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdldCBNZXRob2Q8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX0dldE1ldGhvZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EID0gZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfU2V0TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPGVtPlhtbCBBY2Nlc3MgTWV0aG9kcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFMgPSBlSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFkZGl0aW9uYWxDcml0ZXJpYSA8ZW0+WG1sIEFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFkZGl0aW9uYWxDcml0ZXJpYQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BRERJVElPTkFMX0NSSVRFUklBID0gZUlOU1RBTkNFLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhc2ljIENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0JBU0lDX0NPTExFQ1RJT05TID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNDb2xsZWN0aW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzaWMgTWFwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19CQVNJQ19NQVBTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNNYXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UcmFuc2Zvcm1hdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fVFJBTlNGT1JNQVRJT05TID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVHJhbnNmb3JtYXRpb25zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYXJpYWJsZSBPbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19WQVJJQUJMRV9PTkVfVE9fT05FUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1ZhcmlhYmxlT25lVG9PbmVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljIDxlbT5YbWwgQmFzaWM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUMgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uIDxlbT5YbWwgQmFzaWMgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljTWFwIDxlbT5YbWwgQmFzaWMgTWFwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljTWFwKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX01BUCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY01hcCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoIDxlbT5YbWwgQmF0Y2ggRmV0Y2g8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBVENIX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlciA8ZW0+WG1sIEJhdGNoIEZldGNoIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSID0gZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUgPGVtPlhtbCBDYWNoZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DQUNIRSA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhwaXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX0VYUElSWSA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9FeHBpcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fU0laRSA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TaGFyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fU0hBUkVEID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX1NoYXJlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFsd2F5cyBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNhYmxlIEhpdHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQUNIRV9fRElTQUJMRV9ISVRTID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0Rpc2FibGVIaXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFX19DT09SRElOQVRJT05fVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeHBpcnkgVGltZSBPZiBEYXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZID0gZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciA8ZW0+WG1sIENhY2hlIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGVIb2xkZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DQUNIRV9IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ0FDSEVfSE9MREVSX19DQUNIRSA9IGVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0hBTkdFX1RSQUNLSU5HID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ0hvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kgPGVtPlhtbCBDbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NMT05FX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbENsb25lQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRCA9IGVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfTWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Xb3JraW5nIENvcHkgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QgPSBlSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X1dvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xMRUNUSU9OX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUgPGVtPlhtbCBDb252ZXJzaW9uIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJzaW9uVmFsdWUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSU0lPTl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRhdGEgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnNpb25WYWx1ZV9EYXRhVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJzaW9uVmFsdWVfT2JqZWN0VmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyIDxlbT5YbWwgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJfQ2xhc3NOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciA8ZW0+WG1sIENvbnZlcnRlciBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJURVJfSE9MREVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyIDxlbT5YbWwgQ29udmVydGVycyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTlZFUlRFUlNfSE9MREVSID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSA8ZW0+WG1sIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29weVBvbGljeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPUFlfUE9MSUNZX19DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxDb3B5UG9saWN5X0NsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIgPGVtPlhtbCBDdXN0b21pemVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DVVNUT01JWkVSID0gZUlOU1RBTkNFLmdldFhtbEN1c3RvbWl6ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVyX0N1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciA8ZW0+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DVVNUT01JWkVSX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxDdXN0b21pemVySG9sZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DdXN0b21pemVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVIgPSBlSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlIDxlbT5YbWwgRW1iZWRkYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRUREQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRhYmxlX0Nsb25lQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU1CRUREQUJMRV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCA8ZW0+WG1sIEVtYmVkZGVkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpbWlzdGljIExvY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGUgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfQVRUUklCVVRFID0gZUlOU1RBTkNFLmdldFhtbEZldGNoQXR0cmlidXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAgPGVtPlhtbCBGZXRjaCBHcm91cDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVAgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCA8ZW0+WG1sIElkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbElkKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEID0gZUlOU1RBTkNFLmdldFhtbElkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4IDxlbT5YbWwgSW5kZXg8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXgoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSU5ERVggPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPlhtbCBJbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoIDxlbT5YbWwgSm9pbiBGZXRjaDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSCA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BUFBFRF9TVVBFUkNMQVNTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGltaXN0aWMgTG9ja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19PcHRpbWlzdGljTG9ja2luZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19Db3B5UG9saWN5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1kgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19DbG9uZUNvcHlQb2xpY3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE11dGFibGUgPGVtPlhtbCBNdXRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdXRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NVVRBQkxFID0gZUlOU1RBTkNFLmdldFhtbE11dGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NVVRBQkxFX19NVVRBQkxFID0gZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciA8ZW0+WG1sIE5hbWVkIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbnZlcnRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9DT05WRVJURVJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRDb252ZXJ0ZXJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyeTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1Jlc3VsdENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZWR1cmUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJucyBSZXN1bHQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfSGludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBPYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9PYmplY3RUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db252ZXJzaW9uIFZhbHVlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19DT05WRVJTSU9OX1ZBTFVFUyA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0NvbnZlcnNpb25WYWx1ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSA9IGVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ19DYXNjYWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TZWxlY3RlZCBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfU2VsZWN0ZWRDb2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09SREVSX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSA8ZW0+WG1sIFByaW1hcnkgS2V5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCA8ZW0+WG1sIFByaXZhdGUgT3duZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklWQVRFX09XTkVEID0gZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BST1BFUlRZID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUk9QRVJUWV9fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QUk9QRVJUWV9fVkFMVUVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIgPGVtPlhtbCBQcm9wZXJ0eSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5Q29udGFpbmVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJPUEVSVFlfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWV9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSA8ZW0+WG1sIFJlYWQgT25seTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRUFEX09OTFkgPSBlSU5TVEFOQ0UuZ2V0WG1sUmVhZE9ubHkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCA8ZW0+WG1sIFJldHVybiBJbnNlcnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SRVRVUk5fSU5TRVJUID0gZUlOU1RBTkNFLmdldFhtbFJldHVybkluc2VydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TRUNPTkRBUllfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIDxlbT5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRpcmVjdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0RpcmVjdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBQYXJhbWV0ZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9RdWVyeVBhcmFtZXRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KZGJjIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFID0gZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SmRiYyBUeXBlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlhtbCBTdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU1RSVUNUX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NUUlVDVF9DT05WRVJURVJfX0NPTlZFUlRFUiA9IGVJTlNUQU5DRS5nZXRYbWxTdHJ1Y3RDb252ZXJ0ZXJfQ29udmVydGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEVfR0VORVJBVE9SID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSA8ZW0+WG1sIFRpbWUgT2YgRGF5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVElNRV9PRl9EQVkgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ib3VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX0hPVVIgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X0hvdXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1pbnV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19NSU5VVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbnV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVElNRV9PRl9EQVlfX1NFQ09ORCA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NaWxsaXNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORCA9IGVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24gPGVtPlhtbCBUcmFuc2Zvcm1hdGlvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNmb3JtYXRpb24KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0ZPUk1BVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0lFTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sVHJhbnNpZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIgPGVtPlhtbCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFR5cGVDb252ZXJ0ZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFlQRV9DT05WRVJURVIgPSBlSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX0RhdGFUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSA8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZBUklBQkxFX09ORV9UT19PTkUgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFyaWFibGVPbmVUb09uZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIDxlbT5YbWwgVmVyc2lvbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEhhc2hQYXJ0aXRpb25pbmcgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSGFzaFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSEFTSF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQYXJ0aXRpb25pbmcgPGVtPlhtbCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSYW5nZVBhcnRpdGlvbmluZyA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9SQU5HRV9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlhtbCBSZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaW9uUGFydGl0aW9uaW5nIDxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSU9OX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxVbmlvblBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYWx1ZVBhcnRpdGlvbmluZyA8ZW0+WG1sIFZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFsdWVQYXJ0aXRpb25pbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WQUxVRV9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlIDxlbT5DYWNoZSBDb29yZGluYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRDYWNoZUNvb3JkaW5hdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIENBQ0hFX0NPT1JESU5BVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldENhY2hlQ29vcmRpbmF0aW9uVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUgPGVtPkNhY2hlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0Q2FjaGVUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBDQUNIRV9UWVBFID0gZUlOU1RBTkNFLmdldENhY2hlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUgPGVtPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9DSEFOR0VfVFJBQ0tJTkdfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ1R5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uIDxlbT5YbWwgRGlyZWN0aW9uPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbERpcmVjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX0RJUkVDVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxEaXJlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZSA8ZW0+RXhpc3RlbmNlIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEV4aXN0ZW5jZVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIEVYSVNURU5DRV9UWVBFID0gZUlOU1RBTkNFLmdldEV4aXN0ZW5jZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZSA8ZW0+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX0pPSU5fRkVUQ0hfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSA8ZW0+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX09QVElNSVNUSUNfTE9DS0lOR19UWVBFID0gZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL0VjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxNTRiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXRoaXMoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkksIFJlbmRlcmVyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBKcGFYbWxSZXNvdXJjZSh1cmksIHJlbmRlcmVyLCBKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIFhtbEVudGl0eU1hcHBpbmdzLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FeGlzdGVuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vRXhpc3RlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODk3MDdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9FeGlzdGVuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldEV4aXN0ZW5jZVR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEV4aXN0ZW5jZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hFQ0sgQ0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hFQ0tfQ0FDSEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlDSEVDS19DQUNIRSgwLCAiQ0hFQ0tfQ0FDSEUiLCAiQ0hFQ0tfQ0FDSEUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIRUNLIERBVEFCQVNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIRUNLX0RBVEFCQVNFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0hFQ0tfREFUQUJBU0UoMSwgIkNIRUNLX0RBVEFCQVNFIiwgIkNIRUNLX0RBVEFCQVNFIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BU1NVTUUgRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FTU1VNRV9FWElTVEVOQ0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBU1NVTUVfRVhJU1RFTkNFKDIsICJBU1NVTUVfRVhJU1RFTkNFIiwgIkFTU1VNRV9FWElTVEVOQ0UiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBOT04gRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FTU1VNRV9OT05fRVhJU1RFTkNFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQVNTVU1FX05PTl9FWElTVEVOQ0UoMywgIkFTU1VNRV9OT05fRVhJU1RFTkNFIiwgIkFTU1VNRV9OT05fRVhJU1RFTkNFIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEVDSyBDQUNIRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hFQ0sgQ0FDSEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hFQ0tfQ0FDSEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS19DQUNIRV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEVDSyBEQVRBQkFTRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0hFQ0sgREFUQUJBU0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hFQ0tfREFUQUJBU0UKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEVDS19EQVRBQkFTRV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BU1NVTUUgRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BU1NVTUUgRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FTU1VNRV9FWElTVEVOQ0UKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU1NVTUVfRVhJU1RFTkNFX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFTU1VNRSBOT04gRVhJU1RFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BU1NVTUUgTk9OIEVYSVNURU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBU1NVTUVfTk9OX0VYSVNURU5DRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTU1VNRV9OT05fRVhJU1RFTkNFX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhpc3RlbmNlVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBFeGlzdGVuY2VUeXBlW10KLQkJewotCQkJQ0hFQ0tfQ0FDSEUsCi0JCQlDSEVDS19EQVRBQkFTRSwKLQkJCUFTU1VNRV9FWElTVEVOQ0UsCi0JCQlBU1NVTUVfTk9OX0VYSVNURU5DRSwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEV4aXN0ZW5jZVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGlzdGVuY2VUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlFeGlzdGVuY2VUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhpc3RlbmNlVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJRXhpc3RlbmNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhpc3RlbmNlVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBDSEVDS19DQUNIRV9WQUxVRTogcmV0dXJuIENIRUNLX0NBQ0hFOwotCQkJY2FzZSBDSEVDS19EQVRBQkFTRV9WQUxVRTogcmV0dXJuIENIRUNLX0RBVEFCQVNFOwotCQkJY2FzZSBBU1NVTUVfRVhJU1RFTkNFX1ZBTFVFOiByZXR1cm4gQVNTVU1FX0VYSVNURU5DRTsKLQkJCWNhc2UgQVNTVU1FX05PTl9FWElTVEVOQ0VfVkFMVUU6IHJldHVybiBBU1NVTUVfTk9OX0VYSVNURU5DRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRXhpc3RlbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vRXhpc3RlbmNlVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNzQ3OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFjY2VzcyBNZXRob2RzPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldEdldE1ldGhvZCA8ZW0+R2V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzI2dldFNldE1ldGhvZCA8ZW0+U2V0IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kcygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxBY2Nlc3NNZXRob2RzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHZXRNZXRob2QoKSA8ZW0+R2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdldE1ldGhvZCgpIDxlbT5HZXQgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRHZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0aG9kID0gR0VUX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXRNZXRob2QoKSA8ZW0+U2V0IE1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfTUVUSE9EX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNldE1ldGhvZCgpIDxlbT5TZXQgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2V0TWV0aG9kID0gU0VUX01FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQUNDRVNTX01FVEhPRFM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2V0IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R2V0IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZXQgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRHZXRNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc19HZXRNZXRob2QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRHZXRNZXRob2QoKQotCXsKLQkJcmV0dXJuIGdldE1ldGhvZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHMjZ2V0R2V0TWV0aG9kIDxlbT5HZXQgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HZXQgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHZXRNZXRob2QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZXRNZXRob2QoU3RyaW5nIG5ld0dldE1ldGhvZCkKLQl7Ci0JCVN0cmluZyBvbGRHZXRNZXRob2QgPSBnZXRNZXRob2Q7Ci0JCWdldE1ldGhvZCA9IG5ld0dldE1ldGhvZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRCwgb2xkR2V0TWV0aG9kLCBnZXRNZXRob2QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXQgTWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXQgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNldE1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gc2V0TWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kcyNnZXRTZXRNZXRob2QgPGVtPlNldCBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNldCBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNldE1ldGhvZChTdHJpbmcgbmV3U2V0TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZFNldE1ldGhvZCA9IHNldE1ldGhvZDsKLQkJc2V0TWV0aG9kID0gbmV3U2V0TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9ELCBvbGRTZXRNZXRob2QsIHNldE1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXJldHVybiBnZXRHZXRNZXRob2QoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRDoKLQkJCQlyZXR1cm4gZ2V0U2V0TWV0aG9kKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXNldEdldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfX1NFVF9NRVRIT0Q6Ci0JCQkJc2V0U2V0TWV0aG9kKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19fR0VUX01FVEhPRDoKLQkJCQlzZXRHZXRNZXRob2QoR0VUX01FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgotCQkJCXNldFNldE1ldGhvZChTRVRfTUVUSE9EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9EOgotCQkJCXJldHVybiBHRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBnZXRNZXRob2QgIT0gbnVsbCA6ICFHRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhnZXRNZXRob2QpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX19TRVRfTUVUSE9EOgotCQkJCXJldHVybiBTRVRfTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBzZXRNZXRob2QgIT0gbnVsbCA6ICFTRVRfTUVUSE9EX0VERUZBVUxULmVxdWFscyhzZXRNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChnZXRNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGdldE1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2V0TWV0aG9kOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzZXRNZXRob2QpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRHZXRNZXRob2RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkR2V0TWV0aG9kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTX19HRVRfTUVUSE9ELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNfR2V0TWV0aG9kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNldE1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EU19fU0VUX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzX1NldE1ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gWG1sQWNjZXNzTWV0aG9kcwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzNhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFjY2Vzc01ldGhvZHNIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQWNjZXNzIE1ldGhvZHMgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzTWV0aG9kc0hvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlciNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQWNjZXNzTWV0aG9kc0hvbGRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFkZGl0aW9uYWxDcml0ZXJpYS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFkZGl0aW9uYWxDcml0ZXJpYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTYzM2Y3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBZGRpdGlvbmFsQ3JpdGVyaWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQWRkaXRpb25hbENyaXRlcmlhIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcml0ZXJpYSgpIDxlbT5Dcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSSVRFUklBX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyaXRlcmlhKCkgPGVtPkNyaXRlcmlhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcml0ZXJpYSA9IENSSVRFUklBX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGVyaWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcml0ZXJpYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yX0NyaXRlcmlhKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIGNyaXRlcmlhOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWRkaXRpb25hbENyaXRlcmlhI2dldENyaXRlcmlhIDxlbT5Dcml0ZXJpYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JpdGVyaWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyaXRlcmlhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JpdGVyaWEoU3RyaW5nIG5ld0NyaXRlcmlhKQotCXsKLQkJU3RyaW5nIG9sZENyaXRlcmlhID0gY3JpdGVyaWE7Ci0JCWNyaXRlcmlhID0gbmV3Q3JpdGVyaWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUEsIG9sZENyaXRlcmlhLCBjcml0ZXJpYSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfX0NSSVRFUklBOgotCQkJCXJldHVybiBnZXRDcml0ZXJpYSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BRERJVElPTkFMX0NSSVRFUklBX19DUklURVJJQToKLQkJCQlzZXRDcml0ZXJpYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUE6Ci0JCQkJc2V0Q3JpdGVyaWEoQ1JJVEVSSUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQURESVRJT05BTF9DUklURVJJQV9fQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIENSSVRFUklBX0VERUZBVUxUID09IG51bGwgPyBjcml0ZXJpYSAhPSBudWxsIDogIUNSSVRFUklBX0VERUZBVUxULmVxdWFscyhjcml0ZXJpYSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyaXRlcmlhOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcml0ZXJpYSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDcml0ZXJpYVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDcml0ZXJpYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DUklURVJJQSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMl9Dcml0ZXJpYSgpKTsKLQl9Ci0JCi19IC8vIFhtbEFkZGl0aW9uYWxDcml0ZXJpYQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWEwMTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlTWFwcGluZyAKLQlleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZywgCi0JCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotfSAvLyBYbWxBdHRyaWJ1dGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzMyNDMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXNpYyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgaW1wbGVtZW50cyBYbWxCYXNpY18xXzEsIFhtbEJhc2ljXzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlR2VuZXJhdG9yKCkgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRHZW5lcmF0ZWRWYWx1ZSgpIDxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5JbnNlcnQoKSA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmV0dXJuSW5zZXJ0IHJldHVybkluc2VydDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmV0dXJuVXBkYXRlKCkgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFVFVSTl9VUERBVEVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVyblVwZGF0ZSgpIDxlbT5SZXR1cm4gVXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5VcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHJldHVyblVwZGF0ZSA9IFJFVFVSTl9VUERBVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtdXRhYmxlID0gTVVUQUJMRV9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgY29udmVydGVyOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVyKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQgPSBDT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhc2ljKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXV0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNdXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlX011dGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE11dGFibGUoKQotCXsKLQkJcmV0dXJuIG11dGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCi0JewotCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOwotCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTVVUQUJMRSwgb2xkTXV0YWJsZSwgbXV0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnZlcnQoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydChTdHJpbmcgbmV3Q29udmVydCkKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ID0gY29udmVydDsKLQkJY29udmVydCA9IG5ld0NvbnZlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JewotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBvbGRTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9yOwotCQlzZXF1ZW5jZUdlbmVyYXRvciA9IG5ld1NlcXVlbmNlR2VuZXJhdG9yOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvcikKLQl7Ci0JCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSB0YWJsZUdlbmVyYXRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1RhYmxlR2VuZXJhdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG5ld1RhYmxlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUiwgbmV3VGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R2VuZXJhdGVkIFZhbHVlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRHZW5lcmF0ZWRWYWx1ZShYbWxHZW5lcmF0ZWRWYWx1ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sR2VuZXJhdGVkVmFsdWUgb2xkR2VuZXJhdGVkVmFsdWUgPSBnZW5lcmF0ZWRWYWx1ZTsKLQkJZ2VuZXJhdGVkVmFsdWUgPSBuZXdHZW5lcmF0ZWRWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKQotCXsKLQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IGdlbmVyYXRlZFZhbHVlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClnZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3R2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3R2VuZXJhdGVkVmFsdWUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUobmV3R2VuZXJhdGVkVmFsdWUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFLCBuZXdHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gSW5zZXJ0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJldHVybkluc2VydChYbWxSZXR1cm5JbnNlcnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSZXR1cm5JbnNlcnQgZ2V0UmV0dXJuSW5zZXJ0KCkKLQl7Ci0JCXJldHVybiByZXR1cm5JbnNlcnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmV0dXJuSW5zZXJ0KFhtbFJldHVybkluc2VydCBuZXdSZXR1cm5JbnNlcnQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSZXR1cm5JbnNlcnQgb2xkUmV0dXJuSW5zZXJ0ID0gcmV0dXJuSW5zZXJ0OwotCQlyZXR1cm5JbnNlcnQgPSBuZXdSZXR1cm5JbnNlcnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQsIG9sZFJldHVybkluc2VydCwgbmV3UmV0dXJuSW5zZXJ0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFJldHVybkluc2VydCA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuSW5zZXJ0KFhtbFJldHVybkluc2VydCBuZXdSZXR1cm5JbnNlcnQpCi0JewotCQlpZiAobmV3UmV0dXJuSW5zZXJ0ICE9IHJldHVybkluc2VydCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmV0dXJuSW5zZXJ0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJldHVybkluc2VydCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JldHVybkluc2VydCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXR1cm5JbnNlcnQpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJULCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJldHVybkluc2VydChuZXdSZXR1cm5JbnNlcnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVCwgbmV3UmV0dXJuSW5zZXJ0LCBuZXdSZXR1cm5JbnNlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm4gVXBkYXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJldHVyblVwZGF0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuVXBkYXRlKCkKLQl7Ci0JCXJldHVybiByZXR1cm5VcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRSZXR1cm5VcGRhdGUgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJldHVyblVwZGF0ZShCb29sZWFuIG5ld1JldHVyblVwZGF0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkUmV0dXJuVXBkYXRlID0gcmV0dXJuVXBkYXRlOwotCQlyZXR1cm5VcGRhdGUgPSBuZXdSZXR1cm5VcGRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEUsIG9sZFJldHVyblVwZGF0ZSwgcmV0dXJuVXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRSwgb2xkQXR0cmlidXRlVHlwZSwgYXR0cmlidXRlVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSLCBvbGRUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobmV3VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOwotCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXR1cm5JbnNlcnQobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fUkVUVVJOX0lOU0VSVDoKLQkJCQlyZXR1cm4gZ2V0UmV0dXJuSW5zZXJ0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFJldHVyblVwZGF0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIGdldE11dGFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgotCQkJCXJldHVybiBnZXRDb252ZXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fSU5TRVJUOgotCQkJCXNldFJldHVybkluc2VydCgoWG1sUmV0dXJuSW5zZXJ0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6Ci0JCQkJc2V0UmV0dXJuVXBkYXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOgotCQkJCXNldEdlbmVyYXRlZFZhbHVlKChYbWxHZW5lcmF0ZWRWYWx1ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJc2V0UmV0dXJuSW5zZXJ0KChYbWxSZXR1cm5JbnNlcnQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOgotCQkJCXNldFJldHVyblVwZGF0ZShSRVRVUk5fVVBEQVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6Ci0JCQkJc2V0Q29udmVydGVyKChYbWxDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXNldFN0cnVjdENvbnZlcnRlcigoWG1sU3RydWN0Q29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6Ci0JCQkJcmV0dXJuIHJldHVybkluc2VydCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19SRVRVUk5fVVBEQVRFOgotCQkJCXJldHVybiBSRVRVUk5fVVBEQVRFX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5VcGRhdGUgIT0gbnVsbCA6ICFSRVRVUk5fVVBEQVRFX0VERUZBVUxULmVxdWFscyhyZXR1cm5VcGRhdGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6Ci0JCQkJcmV0dXJuIE1VVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IG11dGFibGUgIT0gbnVsbCA6ICFNVVRBQkxFX0VERUZBVUxULmVxdWFscyhtdXRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09OVkVSVEVSOgotCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljXzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fR0VORVJBVEVEX1ZBTFVFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfQkFTSUNfMTFfX0dFTkVSQVRFRF9WQUxVRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVDsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfQkFTSUNfMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NFUVVFTkNFX0dFTkVSQVRPUjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY18xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19HRU5FUkFURURfVkFMVUU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9JTlNFUlQ7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fUkVUVVJOX1VQREFURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1JFVFVSTl9VUERBVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdXRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX19DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAocmV0dXJuVXBkYXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXR1cm5VcGRhdGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE11dGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29udmVydFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRJbmRleFRyYW5zbGF0b3IoKSwgCi0JCQlidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkTG9iVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJldHVybkluc2VydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmV0dXJuVXBkYXRlVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5NVVRBQkxFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEluZGV4LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8yX0luZGV4KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRHZW5lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxHZW5lcmF0ZWRWYWx1ZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuR0VORVJBVEVEX1ZBTFVFLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfQ29udmVydCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazFfMS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU2VxdWVuY2VHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVybkluc2VydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxSZXR1cm5JbnNlcnQuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlJFVFVSTl9JTlNFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2ljXzJfMV9SZXR1cm5JbnNlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVyblVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5SRVRVUk5fVVBEQVRFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljQ29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ1OWZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY0NvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY0NvbGxlY3Rpb25fMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNpYyBDb2xsZWN0aW9uIEltcGw8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiAqCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEJhc2ljQ29sbGVjdGlvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYXNjYWRlT25EZWxldGUgPSBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxCYXNpY0NvbGxlY3Rpb24oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVNJQ19DT0xMRUNUSU9OOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNDb2xsZWN0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVPbkRlbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljQ29sbGVjdGlvbiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZU9uRGVsZXRlICE9IG51bGwgOiAhQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNpY0NvbGxlY3Rpb25fMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQkFTSUNfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNpY01hcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGQwY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNpYyBNYXAgSW1wbDwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuICoKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXNpY01hcCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXNpY01hcCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbEJhc2ljTWFwXzJfMgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhc2NhZGVPbkRlbGV0ZSA9IENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhc2ljTWFwKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQkFTSUNfTUFQOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpY01hcCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUyk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhc2ljTWFwXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU9uRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWNNYXAjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIG5ld0Nhc2NhZGVPbkRlbGV0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZU9uRGVsZXRlID0gY2FzY2FkZU9uRGVsZXRlOwotCQljYXNjYWRlT25EZWxldGUgPSBuZXdDYXNjYWRlT25EZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2ljTWFwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfQkFTSUNfTUFQXzIyX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFTSUNfTUFQX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBU0lDX01BUF9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzaWNNYXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9CQVNJQ19NQVBfMjJfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVNJQ19NQVBfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2guamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXRjaEZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzAxZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhdGNoRmV0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG0gQmF0Y2ggRmV0Y2g8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxCYXRjaEZldGNoIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sQmF0Y2hGZXRjaF8yXzEKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgU0laRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaXplKCkgPGVtPlNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHNpemUgPSBTSVpFX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQmF0Y2hGZXRjaFR5cGVfMl8xIEJBVENIX0ZFVENIX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaFR5cGUoKSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCYXRjaEZldGNoVHlwZV8yXzEgYmF0Y2hGZXRjaFR5cGUgPSBCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2goKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9CQVRDSF9GRVRDSDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0U2l6ZSgpCi0JewotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2gjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBuZXdTaXplKQotCXsKLQkJSW50ZWdlciBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBzZWUgI3NldEJhdGNoRmV0Y2hUeXBlKEJhdGNoRmV0Y2hUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEJhdGNoRmV0Y2hfMl8xX0JhdGNoRmV0Y2hUeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJhdGNoRmV0Y2hUeXBlXzJfMSBnZXRCYXRjaEZldGNoVHlwZSgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaFR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoI2dldEJhdGNoRmV0Y2hUeXBlIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEKLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoRmV0Y2hUeXBlKEJhdGNoRmV0Y2hUeXBlXzJfMSBuZXdCYXRjaEZldGNoVHlwZSkKLQl7Ci0JCUJhdGNoRmV0Y2hUeXBlXzJfMSBvbGRCYXRjaEZldGNoVHlwZSA9IGJhdGNoRmV0Y2hUeXBlOwotCQliYXRjaEZldGNoVHlwZSA9IG5ld0JhdGNoRmV0Y2hUeXBlID09IG51bGwgPyBCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUIDogbmV3QmF0Y2hGZXRjaFR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEUsIG9sZEJhdGNoRmV0Y2hUeXBlLCBiYXRjaEZldGNoVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19TSVpFOgotCQkJCXJldHVybiBnZXRTaXplKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2hUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19TSVpFOgotCQkJCXNldFNpemUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fQkFUQ0hfRkVUQ0hfVFlQRToKLQkJCQlzZXRCYXRjaEZldGNoVHlwZSgoQmF0Y2hGZXRjaFR5cGVfMl8xKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX1NJWkU6Ci0JCQkJc2V0U2l6ZShTSVpFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfX0JBVENIX0ZFVENIX1RZUEU6Ci0JCQkJc2V0QmF0Y2hGZXRjaFR5cGUoQkFUQ0hfRkVUQ0hfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9fU0laRToKLQkJCQlyZXR1cm4gU0laRV9FREVGQVVMVCA9PSBudWxsID8gc2l6ZSAhPSBudWxsIDogIVNJWkVfRURFRkFVTFQuZXF1YWxzKHNpemUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX19CQVRDSF9GRVRDSF9UWVBFOgotCQkJCXJldHVybiBiYXRjaEZldGNoVHlwZSAhPSBCQVRDSF9GRVRDSF9UWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzaXplOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaXplKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBiYXRjaEZldGNoVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYmF0Y2hGZXRjaFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFNpemVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTaXplVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENIX19TSVpFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENIX19UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBYbUJhdGNoRmV0Y2gKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXRjaEZldGNoSG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmF0Y2hGZXRjaEhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWI2NzQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXRjaEZldGNoSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXRjaCBGZXRjaCBIb2xkZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXRjaEZldGNoSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIHZhbHVlKTsKLQotfSAvLyBYbWxCYXRjaEZldGNoSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWY5NmY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeSA8ZW0+RXhwaXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2hhcmVkIDxlbT5TaGFyZWQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRSZWZyZXNoT25seUlmTmV3ZXIgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldENvb3JkaW5hdGlvblR5cGUgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldEV4cGlyeVRpbWVPZkRheSA8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDYWNoZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhwaXJ5KCkgPGVtPkV4cGlyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhwaXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgRVhQSVJZX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cGlyeSgpIDxlbT5FeHBpcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cGlyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgZXhwaXJ5ID0gRVhQSVJZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNpemUoKSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFNJWkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2l6ZSgpIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBzaXplID0gU0laRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFyZWQoKSA8ZW0+U2hhcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTaGFyZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2hhcmVkKCkgPGVtPlNoYXJlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2hhcmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzaGFyZWQgPSBTSEFSRURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWNoZVR5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWx3YXlzUmVmcmVzaCgpIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWx3YXlzUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEFMV0FZU19SRUZSRVNIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsd2F5c1JlZnJlc2goKSA8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsd2F5c1JlZnJlc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGFsd2F5c1JlZnJlc2ggPSBBTFdBWVNfUkVGUkVTSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKSA8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWZyZXNoT25seUlmTmV3ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIgPSBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzYWJsZUhpdHMoKSA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNhYmxlSGl0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIERJU0FCTEVfSElUU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNhYmxlSGl0cygpIDxlbT5EaXNhYmxlIEhpdHM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2FibGVIaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBkaXNhYmxlSGl0cyA9IERJU0FCTEVfSElUU19FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb29yZGluYXRpb25UeXBlKCkgPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb29yZGluYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUgPSBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4cGlyeVRpbWVPZkRheSgpIDxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4cGlyeVRpbWVPZkRheSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DQUNIRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeHBpcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4cGlyeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeHBpcnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4cGlyeShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfRXhwaXJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEV4cGlyeSgpCi0JewotCQlyZXR1cm4gZXhwaXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5IDxlbT5FeHBpcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhwaXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5KEludGVnZXIgbmV3RXhwaXJ5KQotCXsKLQkJSW50ZWdlciBvbGRFeHBpcnkgPSBleHBpcnk7Ci0JCWV4cGlyeSA9IG5ld0V4cGlyeTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZLCBvbGRFeHBpcnksIGV4cGlyeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2l6ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRTaXplKCkKLQl7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0U2l6ZSA8ZW0+U2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoSW50ZWdlciBuZXdTaXplKQotCXsKLQkJSW50ZWdlciBvbGRTaXplID0gc2l6ZTsKLQkJc2l6ZSA9IG5ld1NpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkUsIG9sZFNpemUsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFyZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNoYXJlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNoYXJlZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfU2hhcmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRTaGFyZWQoKQotCXsKLQkJcmV0dXJuIHNoYXJlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlI2dldFNoYXJlZCA8ZW0+U2hhcmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNoYXJlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNoYXJlZChCb29sZWFuIG5ld1NoYXJlZCkKLQl7Ci0JCUJvb2xlYW4gb2xkU2hhcmVkID0gc2hhcmVkOwotCQlzaGFyZWQgPSBuZXdTaGFyZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NIQVJFRCwgb2xkU2hhcmVkLCBzaGFyZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlCi0JICogQHNlZSAjc2V0VHlwZShDYWNoZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9UeXBlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlVHlwZSBnZXRUeXBlKCkKLQl7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZQotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKENhY2hlVHlwZSBuZXdUeXBlKQotCXsKLQkJQ2FjaGVUeXBlIG9sZFR5cGUgPSB0eXBlOwotCQl0eXBlID0gbmV3VHlwZSA9PSBudWxsID8gVFlQRV9FREVGQVVMVCA6IG5ld1R5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbHdheXMgUmVmcmVzaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsd2F5c1JlZnJlc2goQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0Fsd2F5c1JlZnJlc2goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldEFsd2F5c1JlZnJlc2goKQotCXsKLQkJcmV0dXJuIGFsd2F5c1JlZnJlc2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXRBbHdheXNSZWZyZXNoIDxlbT5BbHdheXMgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWx3YXlzIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsd2F5c1JlZnJlc2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4gbmV3QWx3YXlzUmVmcmVzaCkKLQl7Ci0JCUJvb2xlYW4gb2xkQWx3YXlzUmVmcmVzaCA9IGFsd2F5c1JlZnJlc2g7Ci0JCWFsd2F5c1JlZnJlc2ggPSBuZXdBbHdheXNSZWZyZXNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSCwgb2xkQWx3YXlzUmVmcmVzaCwgYWx3YXlzUmVmcmVzaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmcmVzaCBPbmx5IElmIE5ld2VyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpCi0JewotCQlyZXR1cm4gcmVmcmVzaE9ubHlJZk5ld2VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyIDxlbT5SZWZyZXNoIE9ubHkgSWYgTmV3ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZnJlc2ggT25seSBJZiBOZXdlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4gbmV3UmVmcmVzaE9ubHlJZk5ld2VyKQotCXsKLQkJQm9vbGVhbiBvbGRSZWZyZXNoT25seUlmTmV3ZXIgPSByZWZyZXNoT25seUlmTmV3ZXI7Ci0JCXJlZnJlc2hPbmx5SWZOZXdlciA9IG5ld1JlZnJlc2hPbmx5SWZOZXdlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSLCBvbGRSZWZyZXNoT25seUlmTmV3ZXIsIHJlZnJlc2hPbmx5SWZOZXdlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2FibGUgSGl0czwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzYWJsZSBIaXRzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2FibGUgSGl0czwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGlzYWJsZUhpdHMoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlX0Rpc2FibGVIaXRzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXREaXNhYmxlSGl0cygpCi0JewotCQlyZXR1cm4gZGlzYWJsZUhpdHM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZSNnZXREaXNhYmxlSGl0cyA8ZW0+RGlzYWJsZSBIaXRzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNhYmxlIEhpdHM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2FibGVIaXRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzYWJsZUhpdHMoQm9vbGVhbiBuZXdEaXNhYmxlSGl0cykKLQl7Ci0JCUJvb2xlYW4gb2xkRGlzYWJsZUhpdHMgPSBkaXNhYmxlSGl0czsKLQkJZGlzYWJsZUhpdHMgPSBuZXdEaXNhYmxlSGl0czsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTLCBvbGREaXNhYmxlSGl0cywgZGlzYWJsZUhpdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db29yZGluYXRpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db29yZGluYXRpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZQotCSAqIEBzZWUgI3NldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfQ29vcmRpbmF0aW9uVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRDb29yZGluYXRpb25UeXBlKCkKLQl7Ci0JCXJldHVybiBjb29yZGluYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0Q29vcmRpbmF0aW9uVHlwZSA8ZW0+Q29vcmRpbmF0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvb3JkaW5hdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlCi0JICogQHNlZSAjZ2V0Q29vcmRpbmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlIG5ld0Nvb3JkaW5hdGlvblR5cGUpCi0JewotCQlDYWNoZUNvb3JkaW5hdGlvblR5cGUgb2xkQ29vcmRpbmF0aW9uVHlwZSA9IGNvb3JkaW5hdGlvblR5cGU7Ci0JCWNvb3JkaW5hdGlvblR5cGUgPSBuZXdDb29yZGluYXRpb25UeXBlID09IG51bGwgPyBDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCA6IG5ld0Nvb3JkaW5hdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFLCBvbGRDb29yZGluYXRpb25UeXBlLCBjb29yZGluYXRpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhwaXJ5IFRpbWUgT2YgRGF5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhwaXJ5IFRpbWUgT2YgRGF5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFeHBpcnlUaW1lT2ZEYXkoWG1sVGltZU9mRGF5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVfRXhwaXJ5VGltZU9mRGF5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUaW1lT2ZEYXkgZ2V0RXhwaXJ5VGltZU9mRGF5KCkKLQl7Ci0JCXJldHVybiBleHBpcnlUaW1lT2ZEYXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUaW1lT2ZEYXkgb2xkRXhwaXJ5VGltZU9mRGF5ID0gZXhwaXJ5VGltZU9mRGF5OwotCQlleHBpcnlUaW1lT2ZEYXkgPSBuZXdFeHBpcnlUaW1lT2ZEYXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgb2xkRXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2FjaGUjZ2V0RXhwaXJ5VGltZU9mRGF5IDxlbT5FeHBpcnkgVGltZSBPZiBEYXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4cGlyeSBUaW1lIE9mIERheTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RXhwaXJ5VGltZU9mRGF5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhwaXJ5VGltZU9mRGF5KFhtbFRpbWVPZkRheSBuZXdFeHBpcnlUaW1lT2ZEYXkpCi0JewotCQlpZiAobmV3RXhwaXJ5VGltZU9mRGF5ICE9IGV4cGlyeVRpbWVPZkRheSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWV4cGlyeVRpbWVPZkRheSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3RXhwaXJ5VGltZU9mRGF5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0V4cGlyeVRpbWVPZkRheSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFeHBpcnlUaW1lT2ZEYXkobmV3RXhwaXJ5VGltZU9mRGF5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWSwgbmV3RXhwaXJ5VGltZU9mRGF5LCBuZXdFeHBpcnlUaW1lT2ZEYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZX1RJTUVfT0ZfREFZOgotCQkJCXJldHVybiBiYXNpY1NldEV4cGlyeVRpbWVPZkRheShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWToKLQkJCQlyZXR1cm4gZ2V0RXhwaXJ5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJcmV0dXJuIGdldFNpemUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0hBUkVEOgotCQkJCXJldHVybiBnZXRTaGFyZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlyZXR1cm4gZ2V0QWx3YXlzUmVmcmVzaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19SRUZSRVNIX09OTFlfSUZfTkVXRVI6Ci0JCQkJcmV0dXJuIGdldFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6Ci0JCQkJcmV0dXJuIGdldERpc2FibGVIaXRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBnZXRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlyZXR1cm4gZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1NJWkU6Ci0JCQkJc2V0U2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1RZUEU6Ci0JCQkJc2V0VHlwZSgoQ2FjaGVUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgotCQkJCXNldEFsd2F5c1JlZnJlc2goKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXNldFJlZnJlc2hPbmx5SWZOZXdlcigoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19ESVNBQkxFX0hJVFM6Ci0JCQkJc2V0RGlzYWJsZUhpdHMoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZSgoQ2FjaGVDb29yZGluYXRpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0VYUElSWV9USU1FX09GX0RBWToKLQkJCQlzZXRFeHBpcnlUaW1lT2ZEYXkoKFhtbFRpbWVPZkRheSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUlk6Ci0JCQkJc2V0RXhwaXJ5KEVYUElSWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSVpFOgotCQkJCXNldFNpemUoU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJc2V0U2hhcmVkKFNIQVJFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgotCQkJCXNldFR5cGUoVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19BTFdBWVNfUkVGUkVTSDoKLQkJCQlzZXRBbHdheXNSZWZyZXNoKEFMV0FZU19SRUZSRVNIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUjoKLQkJCQlzZXRSZWZyZXNoT25seUlmTmV3ZXIoUkVGUkVTSF9PTkxZX0lGX05FV0VSX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0RJU0FCTEVfSElUUzoKLQkJCQlzZXREaXNhYmxlSGl0cyhESVNBQkxFX0hJVFNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fQ09PUkRJTkFUSU9OX1RZUEU6Ci0JCQkJc2V0Q29vcmRpbmF0aW9uVHlwZShDT09SRElOQVRJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJc2V0RXhwaXJ5VGltZU9mRGF5KChYbWxUaW1lT2ZEYXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRVhQSVJZOgotCQkJCXJldHVybiBFWFBJUllfRURFRkFVTFQgPT0gbnVsbCA/IGV4cGlyeSAhPSBudWxsIDogIUVYUElSWV9FREVGQVVMVC5lcXVhbHMoZXhwaXJ5KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fU0laRToKLQkJCQlyZXR1cm4gU0laRV9FREVGQVVMVCA9PSBudWxsID8gc2l6ZSAhPSBudWxsIDogIVNJWkVfRURFRkFVTFQuZXF1YWxzKHNpemUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19TSEFSRUQ6Ci0JCQkJcmV0dXJuIFNIQVJFRF9FREVGQVVMVCA9PSBudWxsID8gc2hhcmVkICE9IG51bGwgOiAhU0hBUkVEX0VERUZBVUxULmVxdWFscyhzaGFyZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0FMV0FZU19SRUZSRVNIOgotCQkJCXJldHVybiBBTFdBWVNfUkVGUkVTSF9FREVGQVVMVCA9PSBudWxsID8gYWx3YXlzUmVmcmVzaCAhPSBudWxsIDogIUFMV0FZU19SRUZSRVNIX0VERUZBVUxULmVxdWFscyhhbHdheXNSZWZyZXNoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fUkVGUkVTSF9PTkxZX0lGX05FV0VSOgotCQkJCXJldHVybiBSRUZSRVNIX09OTFlfSUZfTkVXRVJfRURFRkFVTFQgPT0gbnVsbCA/IHJlZnJlc2hPbmx5SWZOZXdlciAhPSBudWxsIDogIVJFRlJFU0hfT05MWV9JRl9ORVdFUl9FREVGQVVMVC5lcXVhbHMocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9fRElTQUJMRV9ISVRTOgotCQkJCXJldHVybiBESVNBQkxFX0hJVFNfRURFRkFVTFQgPT0gbnVsbCA/IGRpc2FibGVIaXRzICE9IG51bGwgOiAhRElTQUJMRV9ISVRTX0VERUZBVUxULmVxdWFscyhkaXNhYmxlSGl0cyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfX0NPT1JESU5BVElPTl9UWVBFOgotCQkJCXJldHVybiBjb29yZGluYXRpb25UeXBlICE9IENPT1JESU5BVElPTl9UWVBFX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX19FWFBJUllfVElNRV9PRl9EQVk6Ci0JCQkJcmV0dXJuIGV4cGlyeVRpbWVPZkRheSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleHBpcnk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4cGlyeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2l6ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2hhcmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzaGFyZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGFsd2F5c1JlZnJlc2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsd2F5c1JlZnJlc2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlZnJlc2hPbmx5SWZOZXdlcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmcmVzaE9ubHlJZk5ld2VyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkaXNhYmxlSGl0czogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzYWJsZUhpdHMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvb3JkaW5hdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvb3JkaW5hdGlvblR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRFeHBpcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4cGlyeVRpbWVPZkRheVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2hhcmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBbHdheXNSZWZyZXNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2FibGVIaXRzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb29yZGluYXRpb25UeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4cGlyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fRVhQSVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhwaXJ5VGltZU9mRGF5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFRpbWVPZkRheS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX0V4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2l6ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fU0laRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9TaXplKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNoYXJlZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fU0hBUkVELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1NoYXJlZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlX1R5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWx3YXlzUmVmcmVzaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRV9fQUxXQVlTX1JFRlJFU0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVfQWx3YXlzUmVmcmVzaCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX1JFRlJFU0hfT05MWV9JRl9ORVdFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9SZWZyZXNoT25seUlmTmV3ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlzYWJsZUhpdHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEVfX0RJU0FCTEVfSElUUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9EaXNhYmxlSGl0cygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb29yZGluYXRpb25UeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNBQ0hFX19DT09SRElOQVRJT05fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZV9Db29yZGluYXRpb25UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbENhY2hlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2FjaGVIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZUhvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE1YzBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDYWNoZUhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDYWNoZSBIb2xkZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZUhvbGRlciNnZXRFeGlzdGVuY2VDaGVja2luZyA8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ2FjaGVIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZShYbWxDYWNoZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENhY2hlIGdldENhY2hlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWNoZShYbWxDYWNoZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGlzdGVuY2UgQ2hlY2tpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlCi0JICogQHNlZSAjc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0V4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENhY2hlSG9sZGVyI2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ2FjaGVIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MmJiNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZzwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmcjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ2hhbmdlVHJhY2tpbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIFRZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZSgpIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIHR5cGUgPSBUWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0hBTkdFX1RSQUNLSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGUKLQkgKiBAc2VlICNzZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nX1R5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIG5ld1R5cGUpCi0JewotCQlYbWxDaGFuZ2VUcmFja2luZ1R5cGUgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlID09IG51bGwgPyBUWVBFX0VERUZBVUxUIDogbmV3VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEUsIG9sZFR5cGUsIHR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFOgotCQkJCXNldFR5cGUoKFhtbENoYW5nZVRyYWNraW5nVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX19UWVBFOgotCQkJCXJldHVybiB0eXBlICE9IFRZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRUeXBlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDaGFuZ2VUcmFja2luZ19UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbENoYW5nZVRyYWNraW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ0NDA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBIb2xkZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nSG9sZGVyI2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIjZ2V0Q2hhbmdlVHJhY2tpbmcgPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgdmFsdWUpOwotCi19IC8vIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTc2NWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENoYW5nZVRyYWNraW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gWG1sQ2hhbmdlVHJhY2tpbmdUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFUVFJJQlVURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVFRSSUJVVEVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVFRSSUJVVEUoMCwgIkFUVFJJQlVURSIsICJBVFRSSUJVVEUiKSwgLyoqCi0JICogVGhlICc8ZW0+PGI+T0JKRUNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09CSkVDVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU9CSkVDVCgxLCAiT0JKRUNUIiwgIk9CSkVDVCIpLCAvKioKLQkgKiBUaGUgJzxlbT48Yj5ERUZFUlJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNERUZFUlJFRF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCURFRkVSUkVEKDIsICJERUZFUlJFRCIsICJERUZFUlJFRCIpLCAvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVVRPKDMsICJBVVRPIiwgIkFVVE8iKQotCTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFUVFJJQlVURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVRUUklCVVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FUVFJJQlVURQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURV9WQUxVRSA9IDA7Ci0KLS8qKgotCSAqIFRoZSAnPGVtPjxiPk9CSkVDVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T0JKRUNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09CSkVDVAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9WQUxVRSA9IDE7Ci0KLS8qKgotCSAqIFRoZSAnPGVtPjxiPkRFRkVSUkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ERUZFUlJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNERUZFUlJFRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkVSUkVEX1ZBTFVFID0gMjsKLQotLyoqCi0JICogVGhlICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QVVUTzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBVVRPCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIENoYW5nZSBUcmFja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxDaGFuZ2VUcmFja2luZ1R5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sQ2hhbmdlVHJhY2tpbmdUeXBlW10KLQkJewotCQkJQVRUUklCVVRFLAotCQkJT0JKRUNULAotCQkJREVGRVJSRUQsCi0JCQlBVVRPLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFhtbENoYW5nZVRyYWNraW5nVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbENoYW5nZVRyYWNraW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgQ2hhbmdlIFRyYWNraW5nIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbENoYW5nZVRyYWNraW5nVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBDaGFuZ2UgVHJhY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbENoYW5nZVRyYWNraW5nVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBBVFRSSUJVVEVfVkFMVUU6IHJldHVybiBBVFRSSUJVVEU7Ci0JCQljYXNlIE9CSkVDVF9WQUxVRTogcmV0dXJuIE9CSkVDVDsKLQkJCWNhc2UgREVGRVJSRURfVkFMVUU6IHJldHVybiBERUZFUlJFRDsKLQkJCWNhc2UgQVVUT19WQUxVRTogcmV0dXJuIEFVVE87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbENoYW5nZVRyYWNraW5nVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sQ2hhbmdlVHJhY2tpbmdUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xvbmVDb3B5UG9saWN5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xvbmVDb3B5UG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MmFmZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsb25lQ29weVBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2xvbmUgQ29weSBQb2xpY3k8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsb25lQ29weVBvbGljeSNnZXRXb3JraW5nQ29weU1ldGhvZCA8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENsb25lQ29weVBvbGljeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kKCkgPGVtPk1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWV0aG9kKCkgPGVtPk1ldGhvZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZCA9IE1FVEhPRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nQ29weU1ldGhvZCgpIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nQ29weU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0lOR19DT1BZX01FVEhPRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRXb3JraW5nQ29weU1ldGhvZCgpIDxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRXb3JraW5nQ29weU1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCA9IFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1k7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWV0aG9kPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNZXRob2QoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpCi0JewotCQlyZXR1cm4gbWV0aG9kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xvbmVDb3B5UG9saWN5I2dldE1ldGhvZCA8ZW0+TWV0aG9kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGhvZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZChTdHJpbmcgbmV3TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZE1ldGhvZCA9IG1ldGhvZDsKLQkJbWV0aG9kID0gbmV3TWV0aG9kOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QsIG9sZE1ldGhvZCwgbWV0aG9kKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+V29ya2luZyBDb3B5IE1ldGhvZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+V29ya2luZyBDb3B5IE1ldGhvZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Xb3JraW5nIENvcHkgTWV0aG9kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRXb3JraW5nQ29weU1ldGhvZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXb3JraW5nQ29weU1ldGhvZCgpCi0JewotCQlyZXR1cm4gd29ya2luZ0NvcHlNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDbG9uZUNvcHlQb2xpY3kjZ2V0V29ya2luZ0NvcHlNZXRob2QgPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPldvcmtpbmcgQ29weSBNZXRob2Q8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFdvcmtpbmdDb3B5TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0V29ya2luZ0NvcHlNZXRob2QoU3RyaW5nIG5ld1dvcmtpbmdDb3B5TWV0aG9kKQotCXsKLQkJU3RyaW5nIG9sZFdvcmtpbmdDb3B5TWV0aG9kID0gd29ya2luZ0NvcHlNZXRob2Q7Ci0JCXdvcmtpbmdDb3B5TWV0aG9kID0gbmV3V29ya2luZ0NvcHlNZXRob2Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0QsIG9sZFdvcmtpbmdDb3B5TWV0aG9kLCB3b3JraW5nQ29weU1ldGhvZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6Ci0JCQkJcmV0dXJuIGdldE1ldGhvZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXJldHVybiBnZXRXb3JraW5nQ29weU1ldGhvZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DTE9ORV9DT1BZX1BPTElDWV9fTUVUSE9EOgotCQkJCXNldE1ldGhvZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6Ci0JCQkJc2V0V29ya2luZ0NvcHlNZXRob2QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19NRVRIT0Q6Ci0JCQkJc2V0TWV0aG9kKE1FVEhPRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NMT05FX0NPUFlfUE9MSUNZX19XT1JLSU5HX0NPUFlfTUVUSE9EOgotCQkJCXNldFdvcmtpbmdDb3B5TWV0aG9kKFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX01FVEhPRDoKLQkJCQlyZXR1cm4gTUVUSE9EX0VERUZBVUxUID09IG51bGwgPyBtZXRob2QgIT0gbnVsbCA6ICFNRVRIT0RfRURFRkFVTFQuZXF1YWxzKG1ldGhvZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0xPTkVfQ09QWV9QT0xJQ1lfX1dPUktJTkdfQ09QWV9NRVRIT0Q6Ci0JCQkJcmV0dXJuIFdPUktJTkdfQ09QWV9NRVRIT0RfRURFRkFVTFQgPT0gbnVsbCA/IHdvcmtpbmdDb3B5TWV0aG9kICE9IG51bGwgOiAhV09SS0lOR19DT1BZX01FVEhPRF9FREVGQVVMVC5lcXVhbHMod29ya2luZ0NvcHlNZXRob2QpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgd29ya2luZ0NvcHlNZXRob2Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHdvcmtpbmdDb3B5TWV0aG9kKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpLAotCQkJYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0aG9kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZX19NRVRIT0QsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2xvbmVDb3B5UG9saWN5X01ldGhvZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRXb3JraW5nQ29weU1ldGhvZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DTE9ORV9DT1BZX1BPTElDWV9fV09SS0lOR19DT1BZX01FVEhPRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDbG9uZUNvcHlQb2xpY3lfV29ya2luZ0NvcHlNZXRob2QoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbENsb25lQ29weVBvbGljeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbGxlY3Rpb25UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbGxlY3Rpb25UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzMzMWYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2xsZWN0aW9uVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29sbGVjdGlvblRhYmxlIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUgaW1wbGVtZW50cyBYbWxDb2xsZWN0aW9uVGFibGVfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uU3VmZml4KCkgPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0aW9uU3VmZml4ID0gQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbGxlY3Rpb25UYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTExFQ1RJT05fVEFCTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIGNyZWF0aW9uU3VmZml4OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcgbmV3Q3JlYXRpb25TdWZmaXgpCi0JewotCQlTdHJpbmcgb2xkQ3JlYXRpb25TdWZmaXggPSBjcmVhdGlvblN1ZmZpeDsKLQkJY3JlYXRpb25TdWZmaXggPSBuZXdDcmVhdGlvblN1ZmZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVgsIG9sZENyZWF0aW9uU3VmZml4LCBjcmVhdGlvblN1ZmZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlyZXR1cm4gZ2V0Q3JlYXRpb25TdWZmaXgoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlyZXR1cm4gQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUID09IG51bGwgPyBjcmVhdGlvblN1ZmZpeCAhPSBudWxsIDogIUNSRUFUSU9OX1NVRkZJWF9FREVGQVVMVC5lcXVhbHMoY3JlYXRpb25TdWZmaXgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbGxlY3Rpb25UYWJsZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09MTEVDVElPTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY3JlYXRpb25TdWZmaXg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNyZWF0aW9uU3VmZml4KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DUkVBVElPTl9TVUZGSVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0gLy8gWG1sQ29sbGVjdGlvblRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVyc2lvblZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVyc2lvblZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDZjOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnNpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29udmVyc2lvbiBWYWx1ZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldERhdGFWYWx1ZSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0T2JqZWN0VmFsdWUgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbnZlcnNpb25WYWx1ZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVZhbHVlKCkgPGVtPkRhdGEgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVmFsdWUoKSA8ZW0+RGF0YSBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGF0YVZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFWYWx1ZSA9IERBVEFfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VmFsdWUoKSA8ZW0+T2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFZhbHVlKCkgPGVtPk9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgb2JqZWN0VmFsdWUgPSBPQkpFQ1RfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29udmVyc2lvblZhbHVlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ09OVkVSU0lPTl9WQUxVRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EYXRhIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERhdGFWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJzaW9uVmFsdWVfRGF0YVZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVZhbHVlKCkKLQl7Ci0JCXJldHVybiBkYXRhVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWUjZ2V0RGF0YVZhbHVlIDxlbT5EYXRhIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhVmFsdWUoU3RyaW5nIG5ld0RhdGFWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGREYXRhVmFsdWUgPSBkYXRhVmFsdWU7Ci0JCWRhdGFWYWx1ZSA9IG5ld0RhdGFWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFLCBvbGREYXRhVmFsdWUsIGRhdGFWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T2JqZWN0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKQotCXsKLQkJcmV0dXJuIG9iamVjdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlI2dldE9iamVjdFZhbHVlIDxlbT5PYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T2JqZWN0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShTdHJpbmcgbmV3T2JqZWN0VmFsdWUpCi0JewotCQlTdHJpbmcgb2xkT2JqZWN0VmFsdWUgPSBvYmplY3RWYWx1ZTsKLQkJb2JqZWN0VmFsdWUgPSBuZXdPYmplY3RWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUsIG9sZE9iamVjdFZhbHVlLCBvYmplY3RWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERhdGFWYWx1ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRToKLQkJCQlzZXREYXRhVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRToKLQkJCQlzZXRPYmplY3RWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRToKLQkJCQlzZXREYXRhVmFsdWUoREFUQV9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlNJT05fVkFMVUVfX09CSkVDVF9WQUxVRToKLQkJCQlzZXRPYmplY3RWYWx1ZShPQkpFQ1RfVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSU0lPTl9WQUxVRV9fREFUQV9WQUxVRToKLQkJCQlyZXR1cm4gREFUQV9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZGF0YVZhbHVlICE9IG51bGwgOiAhREFUQV9WQUxVRV9FREVGQVVMVC5lcXVhbHMoZGF0YVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUU6Ci0JCQkJcmV0dXJuIE9CSkVDVF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VmFsdWUgIT0gbnVsbCA6ICFPQkpFQ1RfVkFMVUVfRURFRkFVTFQuZXF1YWxzKG9iamVjdFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkYXRhVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9iamVjdFZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvYmplY3RWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldERhdGFWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19EQVRBX1ZBTFVFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRPYmplY3RWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZERhdGFWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VmFsdWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGF0YVZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUVfX0RBVEFfVkFMVUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlX0RhdGFWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFX19PQkpFQ1RfVkFMVUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVyc2lvblZhbHVlX09iamVjdFZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxDb252ZXJzaW9uVmFsdWUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxZjM4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0NPTlZFUlRFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJfQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIG5ld0NsYXNzTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCWNsYXNzTmFtZSA9IG5ld0NsYXNzTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXJldHVybiBnZXRDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJURVJfX0NMQVNTKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJfQ2xhc3NOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5jbGFzc05hbWUubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19DTEFTUykuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAocGFja2FnZUxlbmd0aCA9PSAtMSkgewotCQkJcGFja2FnZUxlbmd0aCA9IDA7Ci0JCQluZXdOYW1lID0gbmV3TmFtZSArICcuJzsKLQkJfQotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5DT05WRVJURVJfX0NMQVNTKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci0KLX0gLy8gWG1sQ29udmVydGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVySG9sZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNDYzMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDdXN0b21Db252ZXJ0ZXIgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb252ZXJ0ZXJIb2xkZXIKLQlleHRlbmRzIEpwYUVPYmplY3QKLXsKLS8vIFRPRE8gYmp2IHJlbmFtZSB0byBYbWxDb252ZXJ0ZXJDb250YWluZXIKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFR5cGVDb252ZXJ0ZXIgZ2V0VHlwZUNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXIjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVySG9sZGVyI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlciNnZXRTdHJ1Y3RDb252ZXJ0ZXIgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ29udmVydGVySG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyc0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRlcnNIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY4NzBlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGVyc0hvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29udmVydGVycyBIb2xkZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcnNIb2xkZXIjZ2V0Q29udmVydGVycyA8ZW0+Q29udmVydGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFR5cGVDb252ZXJ0ZXJzIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyc0hvbGRlciNnZXRPYmplY3RUeXBlQ29udmVydGVycyA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyI2dldFN0cnVjdENvbnZlcnRlcnMgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb252ZXJ0ZXJzSG9sZGVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCi19IC8vIFhtbENvbnZlcnRlcnNIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0aWJsZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDb252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkOWQ1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZywgWG1sQ29udmVydGVySG9sZGVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb252ZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRDb252ZXJ0IDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb252ZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY29udmVydCBlbGVtZW50LiAgSWYgdGhlIGNvbnZlcnQgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbWFwcGluZyBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCk7Ci0KLX0gLy8gWG1sQ29udmVydGlibGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29weVBvbGljeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvcHlQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyMWI0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29weVBvbGljeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29weSBQb2xpY3k8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29weVBvbGljeSNnZXRDbGFzc18gPGVtPkNsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb3B5UG9saWN5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENvcHlQb2xpY3kgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzXygpIDxlbT5DbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NfKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc18oKSA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzXygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc18gPSBDTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb3B5UG9saWN5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ09QWV9QT0xJQ1k7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb3B5UG9saWN5X0NsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NfKCkKLQl7Ci0JCXJldHVybiBjbGFzc187Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb3B5UG9saWN5I2dldENsYXNzXyA8ZW0+Q2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgbmV3Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkQ2xhc3MgPSBjbGFzc187Ci0JCWNsYXNzXyA9IG5ld0NsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUywgb2xkQ2xhc3MsIGNsYXNzXykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NfKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlzZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09QWV9QT0xJQ1lfX0NMQVNTOgotCQkJCXNldENsYXNzKENMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPUFlfUE9MSUNZX19DTEFTUzoKLQkJCQlyZXR1cm4gQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzXyAhPSBudWxsIDogIUNMQVNTX0VERUZBVUxULmVxdWFscyhjbGFzc18pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjbGFzczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NfKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09QWV9QT0xJQ1lfX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvcHlQb2xpY3lfQ2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbENvcHlQb2xpY3kKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWMzNTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ3VzdG9taXplcjwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDdXN0b21pemVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEN1c3RvbWl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX0NMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpIDxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3VzdG9taXplckNsYXNzTmFtZSA9IENVU1RPTUlaRVJfQ0xBU1NfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDdXN0b21pemVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ1VTVE9NSVpFUjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXN0b21pemVyIENsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXIgQ2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEN1c3RvbWl6ZXJDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplcl9DdXN0b21pemVyQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9taXplckNsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY3VzdG9taXplckNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEN1c3RvbWl6ZXIjZ2V0Q3VzdG9taXplckNsYXNzTmFtZSA8ZW0+Q3VzdG9taXplciBDbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyIENsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXJDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyQ2xhc3NOYW1lKFN0cmluZyBuZXdDdXN0b21pemVyQ2xhc3NOYW1lKQotCXsKLQkJU3RyaW5nIG9sZEN1c3RvbWl6ZXJDbGFzc05hbWUgPSBjdXN0b21pemVyQ2xhc3NOYW1lOwotCQljdXN0b21pemVyQ2xhc3NOYW1lID0gbmV3Q3VzdG9taXplckNsYXNzTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUUsIG9sZEN1c3RvbWl6ZXJDbGFzc05hbWUsIGN1c3RvbWl6ZXJDbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIGdldEN1c3RvbWl6ZXJDbGFzc05hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9fQ1VTVE9NSVpFUl9DTEFTU19OQU1FOgotCQkJCXNldEN1c3RvbWl6ZXJDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRToKLQkJCQlzZXRDdXN0b21pemVyQ2xhc3NOYW1lKENVU1RPTUlaRVJfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX19DVVNUT01JWkVSX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENVU1RPTUlaRVJfQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY3VzdG9taXplckNsYXNzTmFtZSAhPSBudWxsIDogIUNVU1RPTUlaRVJfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY3VzdG9taXplckNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGN1c3RvbWl6ZXJDbGFzc05hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGN1c3RvbWl6ZXJDbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gWG1sQ3VzdG9taXplcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEN1c3RvbWl6ZXJIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxDdXN0b21pemVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzQ5NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEN1c3RvbWl6ZXJIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEN1c3RvbWl6ZXIgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDdXN0b21pemVySG9sZGVyI2dldEN1c3RvbWl6ZXIgPGVtPkN1c3RvbWl6ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEN1c3RvbWl6ZXJIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldEN1c3RvbWl6ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ3VzdG9taXplckhvbGRlciNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotfSAvLyBYbWxDdXN0b21pemVySG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlyZWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRGlyZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Yzc4MDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpcmVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbERpcmVjdGlvbigpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gWG1sRGlyZWN0aW9uIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSU4oMCwgIklOIiwgIklOIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1VUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1VUKDEsICJPVVQiLCAiT1VUIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTiBPVVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5fT1VUX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSU5fT1VUKDIsICJJTl9PVVQiLCAiSU5fT1VUIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVQgQ1VSU09SPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVF9DVVJTT1JfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlPVVRfQ1VSU09SKDMsICJPVVRfQ1VSU09SIiwgIk9VVF9DVVJTT1IiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTiBPVVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOIE9VVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTl9PVVQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTl9PVVRfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1VUIENVUlNPUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUIENVUlNPUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPVVRfQ1VSU09SCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUX0NVUlNPUl9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIERpcmVjdGlvbjwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sRGlyZWN0aW9uW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFhtbERpcmVjdGlvbltdCi0JCXsKLQkJCUlOLAotCQkJT1VULAotCQkJSU5fT1VULAotCQkJT1VUX0NVUlNPUiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sRGlyZWN0aW9uPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBEaXJlY3Rpb248L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxEaXJlY3Rpb24gZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbERpcmVjdGlvbiByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sRGlyZWN0aW9uIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlYbWxEaXJlY3Rpb24gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgRGlyZWN0aW9uPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sRGlyZWN0aW9uIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIElOX1ZBTFVFOiByZXR1cm4gSU47Ci0JCQljYXNlIE9VVF9WQUxVRTogcmV0dXJuIE9VVDsKLQkJCWNhc2UgSU5fT1VUX1ZBTFVFOiByZXR1cm4gSU5fT1VUOwotCQkJY2FzZSBPVVRfQ1VSU09SX1ZBTFVFOiByZXR1cm4gT1VUX0NVUlNPUjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgWG1sRGlyZWN0aW9uKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9YbWxEaXJlY3Rpb24KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjFlYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiBpbXBsZW1lbnRzIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcigpIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRlciBjb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVyKCkgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlciB0eXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RydWN0Q29udmVydGVyIHN0cnVjdENvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQgPSBDT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gbWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBLZXlDb252ZXJ0ID0gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nXzJfMiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUSVRJT05FRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFydGl0aW9uZWQgPSBQQVJUSVRJT05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYXNjYWRlT25EZWxldGUgPSBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTl9DQUNIRUFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub25DYWNoZWFibGUgPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOwotCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdUeXBlQ29udmVydGVyICE9IHR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobmV3VHlwZUNvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVIsIG5ld1R5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQlvYmplY3RUeXBlQ29udmVydGVyID0gbmV3T2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RydWN0Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7Ci0JCWNvbnZlcnQgPSBuZXdDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVCwgb2xkQ29udmVydCwgY29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gY29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gZ2V0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+KFhtbFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBLZXlDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBtYXBLZXlDb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OwotCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVCwgb2xkTWFwS2V5Q29udmVydCwgbWFwS2V5Q29udmVydCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlIG5ld0pvaW5GZXRjaCkKLQl7Ci0JCVhtbEpvaW5GZXRjaFR5cGUgb2xkSm9pbkZldGNoID0gam9pbkZldGNoOwotCQlqb2luRmV0Y2ggPSBuZXdKb2luRmV0Y2ggPT0gbnVsbCA/IEpPSU5fRkVUQ0hfRURFRkFVTFQgOiBuZXdKb2luRmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxCYXRjaEZldGNoIGdldEJhdGNoRmV0Y2goKQotCXsKLQkJcmV0dXJuIGJhdGNoRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxCYXRjaEZldGNoIG9sZEJhdGNoRmV0Y2ggPSBiYXRjaEZldGNoOwotCQliYXRjaEZldGNoID0gbmV3QmF0Y2hGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENILCBvbGRCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoKQotCXsKLQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gYmF0Y2hGZXRjaCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliYXRjaEZldGNoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENILCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdCYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0JhdGNoRmV0Y2gpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSCwgbmV3QmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORywgb2xkUGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJ0aXRpb25pbmcobmV3UGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkcsIG9sZFBpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORywgb2xkVmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HLCBvbGRIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobmV3SGFzaFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25lZChTdHJpbmcgbmV3UGFydGl0aW9uZWQpCi0JewotCQlTdHJpbmcgb2xkUGFydGl0aW9uZWQgPSBwYXJ0aXRpb25lZDsKLQkJcGFydGl0aW9uZWQgPSBuZXdQYXJ0aXRpb25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlT25EZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gbm9uQ2FjaGVhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uQ2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25DYWNoZWFibGUgPSBub25DYWNoZWFibGU7Ci0JCW5vbkNhY2hlYWJsZSA9IG5ld05vbkNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTl9DQUNIRUFCTEUsIG9sZE5vbkNhY2hlYWJsZSwgbm9uQ2FjaGVhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUNvbnZlcnQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEpvaW5GZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlzZXRNYXBLZXlDb252ZXJ0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKChYbWxKb2luRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05fQ0FDSEVBQkxFOgotCQkJCXNldE5vbkNhY2hlYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDoKLQkJCQlzZXRDb252ZXJ0KENPTlZFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKE5PTl9DQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIENPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnZlcnQgIT0gbnVsbCA6ICFDT05WRVJUX0VERUZBVUxULmVxdWFscyhjb252ZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBtYXBLZXlDb252ZXJ0ICE9IG51bGwgOiAhTUFQX0tFWV9DT05WRVJUX0VERUZBVUxULmVxdWFscyhtYXBLZXlDb252ZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2ggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID09IG51bGwgPyBjYXNjYWRlT25EZWxldGUgIT0gbnVsbCA6ICFDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVC5lcXVhbHMoY2FzY2FkZU9uRGVsZXRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIG5vbkNhY2hlYWJsZSAhPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkZldGNoLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fU1RSVUNUX0NPTlZFUlRFUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5Q29udmVydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwS2V5Q29udmVydCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5FTlVNRVJBVEVEKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkxPQik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRFTVBPUkFMKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShFY2xpcHNlTGluay5DT05WRVJUKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKSksCi0JCQlYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpKSwKLQkJCVhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkNPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2x1bW4oKSksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKSwKLQkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSksCi0JCQlYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKSwKLQkJCVhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpLAotCQkJWG1sQ29sbGVjdGlvblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2xsZWN0aW9uVGFibGUoKSksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTlZFUlQsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEJhdGNoRmV0Y2guYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlT25EZWxldGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQ2FzY2FkZVR5cGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkNBU0NBREVfT05fREVMRVRFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMDU0NjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkYWJsZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRhYmxlPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVtYmVkZGFibGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgaW1wbGVtZW50cyBYbWxFbWJlZGRhYmxlXzJfMSwgWG1sRW1iZWRkYWJsZV8yXzIsIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDb252ZXJ0ZXJzSG9sZGVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50Q2xhc3MoKSA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50Q2xhc3MgPSBQQVJFTlRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyKCkgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjdXN0b21pemVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlVHJhY2tpbmcoKSA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVycygpIDxlbT5Db252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxDb252ZXJ0ZXI+IGNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlQ29udmVydGVycygpIDxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiB0eXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBvYmplY3RUeXBlQ29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcnMoKSA8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gc3RydWN0Q29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbWJlZGRhYmxlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRUREQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCXsKLQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfMl9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudENsYXNzKCkKLQl7Ci0JCXJldHVybiBwYXJlbnRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyBuZXdQYXJlbnRDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRQYXJlbnRDbGFzcyA9IHBhcmVudENsYXNzOwotCQlwYXJlbnRDbGFzcyA9IG5ld1BhcmVudENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BBUkVOVF9DTEFTUywgb2xkUGFyZW50Q2xhc3MsIHBhcmVudENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZEN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQljdXN0b21pemVyID0gbmV3Q3VzdG9taXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBvbGRDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q3VzdG9taXplciA8ZW0+Q3VzdG9taXplcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q3VzdG9taXplcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplcikKLQl7Ci0JCWlmIChuZXdDdXN0b21pemVyICE9IGN1c3RvbWl6ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGN1c3RvbWl6ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY3VzdG9taXplcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEN1c3RvbWl6ZXIobmV3Q3VzdG9taXplciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVIsIG5ld0N1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DaGFuZ2UgVHJhY2tpbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXJfQ2hhbmdlVHJhY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENoYW5nZVRyYWNraW5nIGdldENoYW5nZVRyYWNraW5nKCkKLQl7Ci0JCXJldHVybiBjaGFuZ2VUcmFja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENoYW5nZVRyYWNraW5nIG9sZENoYW5nZVRyYWNraW5nID0gY2hhbmdlVHJhY2tpbmc7Ci0JCWNoYW5nZVRyYWNraW5nID0gbmV3Q2hhbmdlVHJhY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HLCBvbGRDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCi0JewotCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NoYW5nZVRyYWNraW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChjb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCWNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29udmVydGVyPihYbWxDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IGdldFN0cnVjdENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKHN0cnVjdENvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJc3RydWN0Q29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+KFhtbFN0cnVjdENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlX0NvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvcHlQb2xpY3kgZ2V0Q29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvcHlQb2xpY3kgb2xkQ29weVBvbGljeSA9IGNvcHlQb2xpY3k7Ci0JCWNvcHlQb2xpY3kgPSBuZXdDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q29weVBvbGljeSAhPSBjb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvcHlQb2xpY3kobmV3Q29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZLCBuZXdDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgb2xkSW5zdGFudGlhdGlvbkNvcHlQb2xpY3ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgIT0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsb25lIENvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbG9uZUNvcHlQb2xpY3kgZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjbG9uZUNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbG9uZUNvcHlQb2xpY3kgb2xkQ2xvbmVDb3B5UG9saWN5ID0gY2xvbmVDb3B5UG9saWN5OwotCQljbG9uZUNvcHlQb2xpY3kgPSBuZXdDbG9uZUNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG9sZENsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0Q2xvbmVDb3B5UG9saWN5IDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0Nsb25lQ29weVBvbGljeSAhPSBjbG9uZUNvcHlQb2xpY3kpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNsb25lQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbG9uZUNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobmV3Q2xvbmVDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1ksIG5ld0Nsb25lQ29weVBvbGljeSwgbmV3Q2xvbmVDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5ncykKLQl7Ci0JCUJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q3VzdG9taXplcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3RydWN0Q29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbG9uZUNvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BBUkVOVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0UGFyZW50Q2xhc3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBnZXRDaGFuZ2VUcmFja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldENsb25lQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgoWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoUEFSRU5UX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjoKLQkJCQlzZXRDdXN0b21pemVyKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXNldENoYW5nZVRyYWNraW5nKChYbWxDaGFuZ2VUcmFja2luZyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFhdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZXMgIT0gbnVsbCAmJiAhYXNzb2NpYXRpb25PdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1BBUkVOVF9DTEFTUzoKLQkJCQlyZXR1cm4gUEFSRU5UX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBwYXJlbnRDbGFzcyAhPSBudWxsIDogIVBBUkVOVF9DTEFTU19FREVGQVVMVC5lcXVhbHMocGFyZW50Q2xhc3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gY29udmVydGVycyAhPSBudWxsICYmICFjb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnMgIT0gbnVsbCAmJiAhc3RydWN0Q29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gY29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNsb25lQ29weVBvbGljeSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID09IG51bGwgPyBleGNsdWRlRGVmYXVsdE1hcHBpbmdzICE9IG51bGwgOiAhRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxULmVxdWFscyhleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRhYmxlXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkYWJsZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU1CRUREQUJMRV8yMl9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGFibGVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU1CRUREQUJMRV8yMl9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19QQVJFTlRfQ0xBU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ3VzdG9taXplckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DVVNUT01JWkVSX0hPTERFUl9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fQ1VTVE9NSVpFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DSEFOR0VfVFJBQ0tJTkdfSE9MREVSX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERBQkxFX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEVfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRUREQUJMRV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmVudENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZURlZmF1bHRNYXBwaW5nczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkJCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlBdHRyaWJ1dGVzLmJ1aWxkVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEN1c3RvbWl6ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLklOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9JbnN0YW50aWF0aW9uQ29weVBvbGljeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsb25lQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0xPTkVfQ09QWV9QT0xJQ1ksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV9DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlBBUkVOVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzJfUGFyZW50Q2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWVlMWI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVtYmVkZGVkIEltcGw8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIGltcGxlbWVudHMgWG1sRW1iZWRkZWRfMl8xLCBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVtYmVkZGVkXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9FTUJFRERFRF8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VNQkVEREVEXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZCgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRfMl8xX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWRJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmY2ZDAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZElkXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCBJZCBJbXBsPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCBpbXBsZW1lbnRzIFhtbEVtYmVkZGVkSWRfMl8xLCBYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWRJZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VNQkVEREVEX0lEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gYXR0cmlidXRlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWRJZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU1CRURERURfSURfMjFfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW1iZWRkZWRJZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VNQkVEREVEX0lEXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU1CRURERURfSURfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkXzJfMV9BdHRyaWJ1dGVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjgwODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHkgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSBpbXBsZW1lbnRzIFhtbEVudGl0eV8xXzEsIFhtbEVudGl0eV8yXzAsIFhtbEVudGl0eV8yXzEsIFhtbEVudGl0eV8yXzIsIFhtbFJlYWRPbmx5LCBYbWxDdXN0b21pemVySG9sZGVyLCBYbWxDaGFuZ2VUcmFja2luZ0hvbGRlciwgWG1sQ2FjaGVIb2xkZXIsIFhtbENvbnZlcnRlcnNIb2xkZXIsIFhtbFF1ZXJ5Q29udGFpbmVyLCBYbWxQcm9wZXJ0eUNvbnRhaW5lcgotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1hcnlLZXkoKSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5IHByaW1hcnlLZXk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZUludGVyY2VwdG9yKCkgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgY2FjaGVJbnRlcmNlcHRvcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKSA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxRdWVyeVJlZGlyZWN0b3JzIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2hHcm91cHMoKSA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoR3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZmV0Y2hHcm91cHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc0V4dHJhY3RvcigpIDxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzRXh0cmFjdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgY2xhc3NFeHRyYWN0b3I7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50Q2xhc3MoKSA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50Q2xhc3MgPSBQQVJFTlRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25pbmcoKSA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQYXJ0aXRpb25pbmdfMl8yIHBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5nZVBhcnRpdGlvbmluZygpIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIHJhbmdlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc2hQYXJ0aXRpb25pbmcoKSA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBoYXNoUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKSA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiB1bmlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJ0aXRpb25lZCA9IFBBUlRJVElPTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgYWRkaXRpb25hbENyaXRlcmlhOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhc2NhZGVPbkRlbGV0ZSA9IENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXgoKSA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5kZXhfMl8yIGluZGV4OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX09OTFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmVhZE9ubHkgPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyKCkgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjdXN0b21pemVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlVHJhY2tpbmcoKSA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGUoKSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGUgY2FjaGU7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlIEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGlzdGVuY2VDaGVja2luZygpIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VDaGVja2luZyA9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpbWlzdGljTG9ja2luZygpIDxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcgb3B0aW1pc3RpY0xvY2tpbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3B5UG9saWN5KCkgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29weVBvbGljeSBjb3B5UG9saWN5OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSA8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsb25lQ29weVBvbGljeSgpIDxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xvbmVDb3B5UG9saWN5IGNsb25lQ29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbnRpdHkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVhZE9ubHlfUmVhZE9ubHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFJlYWRPbmx5KCkKLQl7Ci0JCXJldHVybiByZWFkT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRPbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoQm9vbGVhbiBuZXdSZWFkT25seSkKLQl7Ci0JCUJvb2xlYW4gb2xkUmVhZE9ubHkgPSByZWFkT25seTsKLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWSwgb2xkUmVhZE9ubHksIHJlYWRPbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3VzdG9taXplcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDdXN0b21pemVyKCkKLQl7Ci0JCXJldHVybiBjdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEN1c3RvbWl6ZXIoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q3VzdG9taXplciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZEN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQljdXN0b21pemVyID0gbmV3Q3VzdG9taXplcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG9sZEN1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEN1c3RvbWl6ZXIgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlIG5ld0N1c3RvbWl6ZXIpCi0JewotCQlpZiAobmV3Q3VzdG9taXplciAhPSBjdXN0b21pemVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjdXN0b21pemVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWN1c3RvbWl6ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q3VzdG9taXplcihuZXdDdXN0b21pemVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSLCBuZXdDdXN0b21pemVyLCBuZXdDdXN0b21pemVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhbmdlIFRyYWNraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDaGFuZ2VUcmFja2luZyBnZXRDaGFuZ2VUcmFja2luZygpCi0JewotCQlyZXR1cm4gY2hhbmdlVHJhY2tpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDaGFuZ2VUcmFja2luZyBvbGRDaGFuZ2VUcmFja2luZyA9IGNoYW5nZVRyYWNraW5nOwotCQljaGFuZ2VUcmFja2luZyA9IG5ld0NoYW5nZVRyYWNraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HLCBvbGRDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENoYW5nZVRyYWNraW5nIDxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VUcmFja2luZyhYbWxDaGFuZ2VUcmFja2luZyBuZXdDaGFuZ2VUcmFja2luZykKLQl7Ci0JCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBjaGFuZ2VUcmFja2luZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2hhbmdlVHJhY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2hhbmdlVHJhY2tpbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFuZ2VUcmFja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobmV3Q2hhbmdlVHJhY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORywgbmV3Q2hhbmdlVHJhY2tpbmcsIG5ld0NoYW5nZVRyYWNraW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZShYbWxDYWNoZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENhY2hlSG9sZGVyX0NhY2hlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDYWNoZSBnZXRDYWNoZSgpCi0JewotCQlyZXR1cm4gY2FjaGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDYWNoZSBvbGRDYWNoZSA9IGNhY2hlOwotCQljYWNoZSA9IG5ld0NhY2hlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG9sZENhY2hlLCBuZXdDYWNoZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2FjaGUgPGVtPkNhY2hlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2FjaGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZShYbWxDYWNoZSBuZXdDYWNoZSkKLQl7Ci0JCWlmIChuZXdDYWNoZSAhPSBjYWNoZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FjaGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2FjaGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhY2hlKG5ld0NhY2hlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRSwgbmV3Q2FjaGUsIG5ld0NhY2hlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhpc3RlbmNlIENoZWNraW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCSAqIEBzZWUgI3NldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcl9FeGlzdGVuY2VDaGVja2luZygpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEV4aXN0ZW5jZVR5cGUgZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKQotCXsKLQkJcmV0dXJuIGV4aXN0ZW5jZUNoZWNraW5nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4aXN0ZW5jZUNoZWNraW5nIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRFeGlzdGVuY2VDaGVja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4aXN0ZW5jZUNoZWNraW5nKEV4aXN0ZW5jZVR5cGUgbmV3RXhpc3RlbmNlQ2hlY2tpbmcpCi0JewotCQlFeGlzdGVuY2VUeXBlIG9sZEV4aXN0ZW5jZUNoZWNraW5nID0gZXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWV4aXN0ZW5jZUNoZWNraW5nID0gbmV3RXhpc3RlbmNlQ2hlY2tpbmcgPT0gbnVsbCA/IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA6IG5ld0V4aXN0ZW5jZUNoZWNraW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HLCBvbGRFeGlzdGVuY2VDaGVja2luZywgZXhpc3RlbmNlQ2hlY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX0NvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbENvbnZlcnRlcj4gZ2V0Q29udmVydGVycygpCi0JewotCQlpZiAoY29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQljb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbENvbnZlcnRlcj4oWG1sQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTKTsKLQkJfQotCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChvYmplY3RUeXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlvYmplY3RUeXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPihYbWxPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmIChzdHJ1Y3RDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCXN0cnVjdENvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPihYbWxTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9PcHRpbWlzdGljTG9ja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3B0aW1pc3RpY0xvY2tpbmcgZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT3B0aW1pc3RpY0xvY2tpbmcgb2xkT3B0aW1pc3RpY0xvY2tpbmcgPSBvcHRpbWlzdGljTG9ja2luZzsKLQkJb3B0aW1pc3RpY0xvY2tpbmcgPSBuZXdPcHRpbWlzdGljTG9ja2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgb2xkT3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRPcHRpbWlzdGljTG9ja2luZyA8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9wdGltaXN0aWNMb2NraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3B0aW1pc3RpY0xvY2tpbmcoWG1sT3B0aW1pc3RpY0xvY2tpbmcgbmV3T3B0aW1pc3RpY0xvY2tpbmcpCi0JewotCQlpZiAobmV3T3B0aW1pc3RpY0xvY2tpbmcgIT0gb3B0aW1pc3RpY0xvY2tpbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9wdGltaXN0aWNMb2NraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9wdGltaXN0aWNMb2NraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE9wdGltaXN0aWNMb2NraW5nKG5ld09wdGltaXN0aWNMb2NraW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkcsIG5ld09wdGltaXN0aWNMb2NraW5nLCBuZXdPcHRpbWlzdGljTG9ja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvcHkgUG9saWN5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0NvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvcHlQb2xpY3kgZ2V0Q29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb3B5UG9saWN5KFhtbENvcHlQb2xpY3kgbmV3Q29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvcHlQb2xpY3kgb2xkQ29weVBvbGljeSA9IGNvcHlQb2xpY3k7Ci0JCWNvcHlQb2xpY3kgPSBuZXdDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG9sZENvcHlQb2xpY3ksIG5ld0NvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0NvcHlQb2xpY3kgIT0gY29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvcHlQb2xpY3kpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWSwgbmV3Q29weVBvbGljeSwgbmV3Q29weVBvbGljeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBvbGRJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfQ2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbG9uZUNvcHlQb2xpY3kgZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjbG9uZUNvcHlQb2xpY3k7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3ksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbG9uZUNvcHlQb2xpY3kgb2xkQ2xvbmVDb3B5UG9saWN5ID0gY2xvbmVDb3B5UG9saWN5OwotCQljbG9uZUNvcHlQb2xpY3kgPSBuZXdDbG9uZUNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldENsb25lQ29weVBvbGljeSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbG9uZUNvcHlQb2xpY3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbG9uZUNvcHlQb2xpY3koWG1sQ2xvbmVDb3B5UG9saWN5IG5ld0Nsb25lQ29weVBvbGljeSkKLQl7Ci0JCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gY2xvbmVDb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENsb25lQ29weVBvbGljeShuZXdDbG9uZUNvcHlQb2xpY3ksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMT05FX0NPUFlfUE9MSUNZLCBuZXdDbG9uZUNvcHlQb2xpY3ksIG5ld0Nsb25lQ29weVBvbGljeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PihYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJpbWFyeUtleSBnZXRQcmltYXJ5S2V5KCkKLQl7Ci0JCXJldHVybiBwcmltYXJ5S2V5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUHJpbWFyeUtleSBvbGRQcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKLQkJcHJpbWFyeUtleSA9IG5ld1ByaW1hcnlLZXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWSwgb2xkUHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleSA8ZW0+UHJpbWFyeSBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IG5ld1ByaW1hcnlLZXkpCi0JewotCQlpZiAobmV3UHJpbWFyeUtleSAhPSBwcmltYXJ5S2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmltYXJ5S2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByaW1hcnlLZXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJpbWFyeUtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmltYXJ5S2V5KG5ld1ByaW1hcnlLZXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZLCBuZXdQcmltYXJ5S2V5LCBuZXdQcmltYXJ5S2V5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FjaGUgSW50ZXJjZXB0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiBjYWNoZUludGVyY2VwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2FjaGVJbnRlcmNlcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZENhY2hlSW50ZXJjZXB0b3IgPSBjYWNoZUludGVyY2VwdG9yOwotCQljYWNoZUludGVyY2VwdG9yID0gbmV3Q2FjaGVJbnRlcmNlcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBvbGRDYWNoZUludGVyY2VwdG9yLCBuZXdDYWNoZUludGVyY2VwdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NhY2hlSW50ZXJjZXB0b3IpCi0JewotCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBjYWNoZUludGVyY2VwdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWNoZUludGVyY2VwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlSW50ZXJjZXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FjaGVJbnRlcmNlcHRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDYWNoZUludGVyY2VwdG9yKG5ld0NhY2hlSW50ZXJjZXB0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBuZXdDYWNoZUludGVyY2VwdG9yLCBuZXdDYWNoZUludGVyY2VwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gcXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgbmV3UXVlcnlSZWRpcmVjdG9ycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFF1ZXJ5UmVkaXJlY3RvcnMgb2xkUXVlcnlSZWRpcmVjdG9ycyA9IHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JCXF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXdRdWVyeVJlZGlyZWN0b3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMsIG9sZFF1ZXJ5UmVkaXJlY3RvcnMsIG5ld1F1ZXJ5UmVkaXJlY3RvcnMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyBuZXdRdWVyeVJlZGlyZWN0b3JzKQotCXsKLQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gcXVlcnlSZWRpcmVjdG9ycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdRdWVyeVJlZGlyZWN0b3JzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1F1ZXJ5UmVkaXJlY3RvcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhuZXdRdWVyeVJlZGlyZWN0b3JzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUywgbmV3UXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFfRmV0Y2hHcm91cHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEZldGNoR3JvdXA+IGdldEZldGNoR3JvdXBzKCkKLQl7Ci0JCWlmIChmZXRjaEdyb3VwcyA9PSBudWxsKQotCQl7Ci0JCQlmZXRjaEdyb3VwcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxGZXRjaEdyb3VwPihYbWxGZXRjaEdyb3VwLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTKTsKLQkJfQotCQlyZXR1cm4gZmV0Y2hHcm91cHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDbGFzc0V4dHJhY3RvcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldENsYXNzRXh0cmFjdG9yKCkKLQl7Ci0JCXJldHVybiBjbGFzc0V4dHJhY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDbGFzc0V4dHJhY3RvcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDbGFzc0V4dHJhY3RvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZENsYXNzRXh0cmFjdG9yID0gY2xhc3NFeHRyYWN0b3I7Ci0JCWNsYXNzRXh0cmFjdG9yID0gbmV3Q2xhc3NFeHRyYWN0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IsIG9sZENsYXNzRXh0cmFjdG9yLCBuZXdDbGFzc0V4dHJhY3Rvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDbGFzc0V4dHJhY3RvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzRXh0cmFjdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NsYXNzRXh0cmFjdG9yKQotCXsKLQkJaWYgKG5ld0NsYXNzRXh0cmFjdG9yICE9IGNsYXNzRXh0cmFjdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjbGFzc0V4dHJhY3RvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljbGFzc0V4dHJhY3RvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1IsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NsYXNzRXh0cmFjdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NsYXNzRXh0cmFjdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDbGFzc0V4dHJhY3RvcihuZXdDbGFzc0V4dHJhY3RvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SLCBuZXdDbGFzc0V4dHJhY3RvciwgbmV3Q2xhc3NFeHRyYWN0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmVudENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzFfUGFyZW50Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gcGFyZW50Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyBuZXdQYXJlbnRDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRQYXJlbnRDbGFzcyA9IHBhcmVudENsYXNzOwotCQlwYXJlbnRDbGFzcyA9IG5ld1BhcmVudENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTLCBvbGRQYXJlbnRDbGFzcywgcGFyZW50Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJ0aXRpb25pbmcobmV3UGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZyA9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSByYW5nZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG9sZFZhbHVlUGFydGl0aW9uaW5nID0gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JCXZhbHVlUGFydGl0aW9uaW5nID0gbmV3VmFsdWVQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobmV3SGFzaFBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IHVuaW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1bmlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HLCBuZXdVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmVkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvbmVkKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlT25EZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIG5ld0Nhc2NhZGVPbkRlbGV0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZU9uRGVsZXRlID0gY2FzY2FkZU9uRGVsZXRlOwotCQljYXNjYWRlT25EZWxldGUgPSBuZXdDYXNjYWRlT25EZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluZGV4KFhtbEluZGV4XzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzJfSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4XzJfMiBnZXRJbmRleCgpCi0JewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5kZXhfMl8yIG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkRFWCwgb2xkSW5kZXgsIG5ld0luZGV4KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZGV4KFhtbEluZGV4XzJfMiBuZXdJbmRleCkKLQl7Ci0JCWlmIChuZXdJbmRleCAhPSBpbmRleCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5kZXgpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luZGV4KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluZGV4KG5ld0luZGV4LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkRFWCwgbmV3SW5kZXgsIG5ld0luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIGdldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JewotCQlyZXR1cm4gYWRkaXRpb25hbENyaXRlcmlhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgb2xkQWRkaXRpb25hbENyaXRlcmlhID0gYWRkaXRpb25hbENyaXRlcmlhOwotCQlhZGRpdGlvbmFsQ3JpdGVyaWEgPSBuZXdBZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBLCBvbGRBZGRpdGlvbmFsQ3JpdGVyaWEsIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0QWRkaXRpb25hbENyaXRlcmlhIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpCi0JewotCQlpZiAobmV3QWRkaXRpb25hbENyaXRlcmlhICE9IGFkZGl0aW9uYWxDcml0ZXJpYSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWRkaXRpb25hbENyaXRlcmlhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFkZGl0aW9uYWxDcml0ZXJpYSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBZGRpdGlvbmFsQ3JpdGVyaWEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWRkaXRpb25hbENyaXRlcmlhKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUEsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWRkaXRpb25hbENyaXRlcmlhKG5ld0FkZGl0aW9uYWxDcml0ZXJpYSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQSwgbmV3QWRkaXRpb25hbENyaXRlcmlhLCBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCi0JewotCQlCb29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJpbWFyeUtleShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXJldHVybiBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRRdWVyeVJlZGlyZWN0b3JzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEZldGNoR3JvdXBzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDbGFzc0V4dHJhY3RvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWRkaXRpb25hbENyaXRlcmlhKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5kZXgobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBiYXNpY1NldEN1c3RvbWl6ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2hhbmdlVHJhY2tpbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0cnVjdENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldENvcHlQb2xpY3kobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBiYXNpY1NldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBnZXRQcmltYXJ5S2V5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlyZXR1cm4gZ2V0Q2FjaGVJbnRlcmNlcHRvcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuIGdldEZldGNoR3JvdXBzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I6Ci0JCQkJcmV0dXJuIGdldENsYXNzRXh0cmFjdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFBhcmVudENsYXNzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIGdldEFkZGl0aW9uYWxDcml0ZXJpYSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGdldEluZGV4KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIGdldFJlYWRPbmx5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJcmV0dXJuIGdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRToKLQkJCQlyZXR1cm4gZ2V0Q2FjaGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlyZXR1cm4gZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGdldENsb25lQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoWG1sUHJpbWFyeUtleSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJc2V0Q2FjaGVJbnRlcmNlcHRvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0ZFVENIX0dST1VQUzoKLQkJCQlnZXRGZXRjaEdyb3VwcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEZldGNoR3JvdXA+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I6Ci0JCQkJc2V0Q2xhc3NFeHRyYWN0b3IoKFhtbENsYXNzUmVmZXJlbmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKChYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VmFsdWVQYXJ0aXRpb25pbmcoKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05FRDoKLQkJCQlzZXRQYXJ0aXRpb25lZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXNldEFkZGl0aW9uYWxDcml0ZXJpYSgoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoWG1sSW5kZXhfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI6Ci0JCQkJc2V0Q3VzdG9taXplcigoWG1sQ2xhc3NSZWZlcmVuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOgotCQkJCXNldENhY2hlKChYbWxDYWNoZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXNldEV4aXN0ZW5jZUNoZWNraW5nKChFeGlzdGVuY2VUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCWdldENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFN0cnVjdENvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJc2V0T3B0aW1pc3RpY0xvY2tpbmcoKFhtbE9wdGltaXN0aWNMb2NraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT1BZX1BPTElDWToKLQkJCQlzZXRDb3B5UG9saWN5KChYbWxDb3B5UG9saWN5KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChYbWxQcmltYXJ5S2V5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXNldENhY2hlSW50ZXJjZXB0b3IoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM6Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjoKLQkJCQlzZXRDbGFzc0V4dHJhY3RvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOgotCQkJCXNldFBhcmVudENsYXNzKFBBUkVOVF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJc2V0QWRkaXRpb25hbENyaXRlcmlhKChYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZShDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoUkVBRF9PTkxZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DVVNUT01JWkVSOgotCQkJCXNldEN1c3RvbWl6ZXIoKFhtbENsYXNzUmVmZXJlbmNlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEU6Ci0JCQkJc2V0Q2FjaGUoKFhtbENhY2hlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlzZXRFeGlzdGVuY2VDaGVja2luZyhFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gcHJpbWFyeUtleSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGNhY2hlSW50ZXJjZXB0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBxdWVyeVJlZGlyZWN0b3JzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBmZXRjaEdyb3VwcyAhPSBudWxsICYmICFmZXRjaEdyb3Vwcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTEFTU19FWFRSQUNUT1I6Ci0JCQkJcmV0dXJuIGNsYXNzRXh0cmFjdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcGFyZW50Q2xhc3MgIT0gbnVsbCA6ICFQQVJFTlRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHBhcmVudENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQToKLQkJCQlyZXR1cm4gYWRkaXRpb25hbENyaXRlcmlhICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlyZXR1cm4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGVPbkRlbGV0ZSAhPSBudWxsIDogIUNBU0NBREVfT05fREVMRVRFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlT25EZWxldGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6Ci0JCQkJcmV0dXJuIGluZGV4ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SRUFEX09OTFk6Ci0JCQkJcmV0dXJuIFJFQURfT05MWV9FREVGQVVMVCA9PSBudWxsID8gcmVhZE9ubHkgIT0gbnVsbCA6ICFSRUFEX09OTFlfRURFRkFVTFQuZXF1YWxzKHJlYWRPbmx5KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gY2hhbmdlVHJhY2tpbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOgotCQkJCXJldHVybiBjYWNoZSAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXJldHVybiBleGlzdGVuY2VDaGVja2luZyAhPSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOgotCQkJCXJldHVybiBjb252ZXJ0ZXJzICE9IG51bGwgJiYgIWNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVycyAhPSBudWxsICYmICF0eXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVycyAhPSBudWxsICYmICFzdHJ1Y3RDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXJldHVybiBvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCA9PSBudWxsID8gZXhjbHVkZURlZmF1bHRNYXBwaW5ncyAhPSBudWxsIDogIUVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVC5lcXVhbHMoZXhjbHVkZURlZmF1bHRNYXBwaW5ncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eV8xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFX0lOVEVSQ0VQVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZXzIwX19DQUNIRV9JTlRFUkNFUFRPUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19RVUVSWV9SRURJUkVDVE9SUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0VOVElUWV8yMF9fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NMQVNTX0VYVFJBQ1RPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUkVOVF9DTEFTUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0VOVElUWV8yMV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQURESVRJT05BTF9DUklURVJJQTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRUFEX09OTFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ1VTVE9NSVpFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0FDSEVfSE9MREVSX19FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eV8xXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfRU5USVRZXzIwX19DQUNIRV9JTlRFUkNFUFRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRV9JTlRFUkNFUFRPUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0VOVElUWV8yMF9fUVVFUllfUkVESVJFQ1RPUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19GRVRDSF9HUk9VUFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU5USVRZXzIxX19DTEFTU19FWFRSQUNUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0xBU1NfRVhUUkFDVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1M6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUE6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQURESVRJT05BTF9DUklURVJJQTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfMjJfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1JFQURfT05MWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDdXN0b21pemVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NVU1RPTUlaRVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2hhbmdlVHJhY2tpbmdIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ0hBTkdFX1RSQUNLSU5HX0hPTERFUl9fQ0hBTkdFX1RSQUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0VYSVNURU5DRV9DSEVDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWElTVEVOQ0VfQ0hFQ0tJTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcmVudENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJlbnRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFydGl0aW9uZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcnRpdGlvbmVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlT25EZWxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVhZE9ubHk6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYWRPbmx5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGlzdGVuY2VDaGVja2luZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlYWRPbmx5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHkoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5kZXhUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluaGVyaXRhbmNlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzRXh0cmFjdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpbWlzdGljTG9ja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlSW50ZXJjZXB0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zdGFudGlhdGlvbkNveXBQb2xpY3lUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRRdWVyeVJlZGlyZWN0b3JzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdExpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEVudGl0eUxpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFBlcnNpc3RUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZVJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUG9zdFJlbW92ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJlVXBkYXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0VXBkYXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0TG9hZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEN1c3RvbWl6ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByaW1hcnlLZXkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMV8xX1ByaW1hcnlLZXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzRXh0cmFjdG9yVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5DTEFTU19FWFRSQUNUT1IsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9wdGltaXN0aWNMb2NraW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X09wdGltaXN0aWNMb2NraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDYWNoZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfQ2FjaGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlSW50ZXJjZXB0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkNBQ0hFX0lOVEVSQ0VQVE9SLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEZldGNoR3JvdXAuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkZFVENIX0dST1VQLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxRdWVyeVJlZGlyZWN0b3JzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SUywgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9Db3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbG9uZUNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9DbG9uZUNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlJFQURfT05MWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSZWFkT25seV9SZWFkT25seSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBhcmVudENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLlBBUkVOVF9DTEFTUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBZGRpdGlvbmFsQ3JpdGVyaWEuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkFERElUSU9OQUxfQ1JJVEVSSUEsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ0FTQ0FERV9PTl9ERUxFVEUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEluZGV4LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMl9JbmRleCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1RhYmxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlY29uZGFyeVRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFNlY29uZGFyeVRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VDT05EQVJZX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfU2Vjb25kYXJ5VGFibGVzKCkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2JmM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVudGl0eU1hcHBpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzIuRWNsaXBzZUxpbmsxXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHlNYXBwaW5ncyBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MgaW1wbGVtZW50cyBYbWxFbnRpdHlNYXBwaW5nc18yXzEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMiwgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sUXVlcnlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQYXJ0aXRpb25pbmdfMl8yPiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI+IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yPiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMj4gcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yPiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMj4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4gaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMj4gdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXJzKCkgPGVtPkNvbnZlcnRlcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbENvbnZlcnRlcj4gY29udmVydGVyczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXJzKCkgPGVtPlR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IHR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+IG9iamVjdFR5cGVDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVycygpIDxlbT5TdHJ1Y3QgQ29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RydWN0Q29udmVydGVyPiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTlRJVFlfTUFQUElOR1M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGFydGl0aW9uaW5nXzJfMj4gZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCWlmIChwYXJ0aXRpb25pbmcgPT0gbnVsbCkKLQkJewotCQkJcGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBhcnRpdGlvbmluZ18yXzI+KFhtbFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkcpOwotCQl9Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMj4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID09IG51bGwpCi0JCXsKLQkJCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMj4oWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMj4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlpZiAocm91bmRSb2JpblBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQlyb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yPihYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMj4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCWlmIChwaW5uZWRQYXJ0aXRpb25pbmcgPT0gbnVsbCkKLQkJewotCQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI+KFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI+IGdldFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCWlmIChyYW5nZVBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQlyYW5nZVBhcnRpdGlvbmluZyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI+KFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JBTkdFX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI+IGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCWlmICh2YWx1ZVBhcnRpdGlvbmluZyA9PSBudWxsKQotCQl7Ci0JCQl2YWx1ZVBhcnRpdGlvbmluZyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI+KFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSGFzaFBhcnRpdGlvbmluZ18yXzI+IGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgPT0gbnVsbCkKLQkJewotCQkJaGFzaFBhcnRpdGlvbmluZyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4oWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19IQVNIX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMj4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nID09IG51bGwpCi0JCXsKLQkJCXVuaW9uUGFydGl0aW9uaW5nID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMj4oWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVU5JT05fUEFSVElUSU9OSU5HKTsKLQkJfQotCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUeXBlQ29udmVydGVyPiBnZXRUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAodHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJdHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4oWG1sVHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxPYmplY3RUeXBlQ29udmVydGVyPiBnZXRPYmplY3RUeXBlQ29udmVydGVycygpCi0JewotCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJb2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4oWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JewotCQlpZiAobmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID09IG51bGwpCi0JCXsKLQkJCW5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PihYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBhcnRpdGlvbmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIYXNoUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFVuaW9uUGFydGl0aW9uaW5nKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFR5cGVDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRPYmplY3RUeXBlQ29udmVydGVycygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0cnVjdENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORzoKLQkJCQlnZXRQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCWdldFBhcnRpdGlvbmluZygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nXzJfMj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCWdldFJhbmdlUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCWdldFZhbHVlUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlnZXRIYXNoUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlnZXRIYXNoUGFydGl0aW9uaW5nKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlnZXRVbmlvblBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJZ2V0VW5pb25QYXJ0aXRpb25pbmcoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVFlQRV9DT05WRVJURVJTOgotCQkJCWdldFR5cGVDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVHlwZUNvbnZlcnRlcj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3RydWN0Q29udmVydGVycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU3RydWN0Q29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCWdldFBpbm5lZFBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCWdldFJhbmdlUGFydGl0aW9uaW5nKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCWdldEhhc2hQYXJ0aXRpb25pbmcoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlnZXRVbmlvblBhcnRpdGlvbmluZygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCWdldFN0cnVjdENvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhcGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhcmVwbGljYXRpb25QYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXBpbm5lZFBhcnRpdGlvbmluZy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXJhbmdlUGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhdmFsdWVQYXJ0aXRpb25pbmcuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCAmJiAhaGFzaFBhcnRpdGlvbmluZy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwgJiYgIXVuaW9uUGFydGl0aW9uaW5nLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXJzICE9IG51bGwgJiYgIW9iamVjdFR5cGVDb252ZXJ0ZXJzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1RSVUNUX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5TWFwcGluZ3NfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVyc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zID0gYnVpbGRWZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsxXzIuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMV8yLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMl8wLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMl8xLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoRWNsaXBzZUxpbmsyXzIuU0NIRU1BX1ZFUlNJT04sIEVjbGlwc2VMaW5rMl8yLlNDSEVNQV9MT0NBVElPTik7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zLmdldCh2ZXJzaW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBST09UX1RSQU5TTEFUT1IgPSBidWlsZFJvb3RUcmFuc2xhdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUk9PVF9UUkFOU0xBVE9SOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUm9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUm9vdFRyYW5zbGF0b3IoCi0JCQkJSlBBLkVOVElUWV9NQVBQSU5HUywKLQkJCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCksCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRWZXJzaW9uVHJhbnNsYXRvcih2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSwKLQkJCWJ1aWxkTmFtZXNwYWNlVHJhbnNsYXRvcihuYW1lc3BhY2UpLAotCQkJYnVpbGRTY2hlbWFOYW1lc3BhY2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYUxvY2F0aW9uVHJhbnNsYXRvcihuYW1lc3BhY2UsIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmJ1aWxkVHJhbnNsYXRvcihKUEEuUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSksCi0JCQlidWlsZFBhY2thZ2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpLAotCQkJWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkpLAotCQkJWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9UeXBlQ29udmVydGVycygpKSwKLQkJCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpLAotCQkJWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpKSwKLQkJCVhtbFNlcXVlbmNlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKSksCi0JCQlYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfVGFibGVHZW5lcmF0b3JzKCkpLAotCQkJWG1sUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSksCi0JCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUGlubmVkUGFydGl0aW9uaW5nLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5QSU5ORURfUEFSVElUSU9OSU5HLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlJBTkdFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVmFsdWVQYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlZBTFVFX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sSGFzaFBhcnRpdGlvbmluZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSEFTSF9QQVJUSVRJT05JTkcsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sVW5pb25QYXJ0aXRpb25pbmcuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLlVOSU9OX1BBUlRJVElPTklORywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkpLAotCQkJWG1sTmFtZWRRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKSksCi0JCQlYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpKSwKLQkJCVNxbFJlc3VsdFNldE1hcHBpbmcuYnVpbGRUcmFuc2xhdG9yKEpQQS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpKSwKLQkJCVhtbE1hcHBlZFN1cGVyY2xhc3MuYnVpbGRUcmFuc2xhdG9yKEpQQS5NQVBQRURfU1VQRVJDTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkpLAotCQkJWG1sRW50aXR5LmJ1aWxkVHJhbnNsYXRvcihKUEEuRU5USVRZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpKSwKLQkJCVhtbEVtYmVkZGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTUJFRERBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbWJlZGRhYmxlcygpKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sRmV0Y2hBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNiZGU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggQXR0cmlidXRlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEZldGNoQXR0cmlidXRlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRmV0Y2hBdHRyaWJ1dGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9GRVRDSF9BVFRSSUJVVEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9BVFRSSUJVVEVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0FUVFJJQlVURV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfQVRUUklCVVRFX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQkJZWxlbWVudE5hbWUsCi0JCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKX07Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoR3JvdXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxGZXRjaEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmZmZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEZldGNoR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBGZXRjaCBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEZldGNoR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxGZXRjaEdyb3VwXzJfMQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvYWQoKSA8ZW0+TG9hZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIExPQURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9hZCgpIDxlbT5Mb2FkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBsb2FkID0gTE9BRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKSA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hBdHRyaWJ1dGU+IGF0dHJpYnV0ZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRmV0Y2hHcm91cCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0ZFVENIX0dST1VQOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoR3JvdXAjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxGZXRjaEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEZldGNoQXR0cmlidXRlPihYbWxGZXRjaEF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9hZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9hZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2FkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9Mb2FkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRMb2FkKCkKLQl7Ci0JCXJldHVybiBsb2FkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cCNnZXRMb2FkIDxlbT5Mb2FkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRMb2FkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9hZChCb29sZWFuIG5ld0xvYWQpCi0JewotCQlCb29sZWFuIG9sZExvYWQgPSBsb2FkOwotCQlsb2FkID0gbmV3TG9hZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTE9BRCwgb2xkTG9hZCwgbG9hZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXR0cmlidXRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0xPQUQ6Ci0JCQkJcmV0dXJuIGdldExvYWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTE9BRDoKLQkJCQlzZXRMb2FkKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRmV0Y2hBdHRyaWJ1dGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0xPQUQ6Ci0JCQkJc2V0TG9hZChMT0FEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVM6Ci0JCQkJZ2V0QXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9GRVRDSF9HUk9VUF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX19MT0FEOgotCQkJCXJldHVybiBMT0FEX0VERUZBVUxUID09IG51bGwgPyBsb2FkICE9IG51bGwgOiAhTE9BRF9FREVGQVVMVC5lcXVhbHMobG9hZCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfRkVUQ0hfR1JPVVBfX0FUVFJJQlVURVM6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGxvYWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvYWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQkJZWxlbWVudE5hbWUsCi0JCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCQlidWlsZExvYWRUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRBdHRyaWJ1dGVzVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBfMl8xX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZXNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sRmV0Y2hBdHRyaWJ1dGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfQXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTG9hZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5GRVRDSF9HUk9VUF9fTE9BRCwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEhhc2hQYXJ0aXRpb25pbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxIYXNoUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNmViMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEhhc2hQYXJ0aXRpb25pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxIYXNoUGFydGl0aW9uaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEhhc2hQYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9IQVNIX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxIYXNoUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0hBU0hfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0hBU0hfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0hBU0hfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9IQVNIX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gWG1sSGFzaFBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbElkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMDMyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSWQ8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxJZCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgaW1wbGVtZW50cyBYbWxJZF8yXzEsIFhtbElkXzJfMiwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sTXV0YWJsZSwgWG1sQ29udmVydGlibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5kZXgoKSA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5kZXhfMl8yIGluZGV4OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXV0YWJsZSgpIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTVVUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIG11dGFibGUgPSBNVVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0KCkgPGVtPkNvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydCA9IENPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSWQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmRleChYbWxJbmRleF8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJZF8yXzJfSW5kZXgoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluZGV4XzJfMiBnZXRJbmRleCgpCi0JewotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SW5kZXgoWG1sSW5kZXhfMl8yIG5ld0luZGV4LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSW5kZXhfMl8yIG9sZEluZGV4ID0gaW5kZXg7Ci0JCWluZGV4ID0gbmV3SW5kZXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYLCBvbGRJbmRleCwgbmV3SW5kZXgpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChYbWxJbmRleF8yXzIgbmV3SW5kZXgpCi0JewotCQlpZiAobmV3SW5kZXggIT0gaW5kZXgpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluZGV4KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luZGV4KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5kZXgobmV3SW5kZXgsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVgsIG5ld0luZGV4LCBuZXdJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0TXV0YWJsZSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE11dGFibGUoQm9vbGVhbiBuZXdNdXRhYmxlKQotCXsKLQkJQm9vbGVhbiBvbGRNdXRhYmxlID0gbXV0YWJsZTsKLQkJbXV0YWJsZSA9IG5ld011dGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEUsIG9sZE11dGFibGUsIG11dGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7Ci0JCWNvbnZlcnQgPSBuZXdDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJULCBvbGRDb252ZXJ0LCBjb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOwotCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUeXBlQ29udmVydGVyIG9sZFR5cGVDb252ZXJ0ZXIgPSB0eXBlQ29udmVydGVyOwotCQl0eXBlQ29udmVydGVyID0gbmV3VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVIsIG9sZFR5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VHlwZUNvbnZlcnRlciA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSB0eXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0eXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSLCBuZXdUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvbGRPYmplY3RUeXBlQ29udmVydGVyID0gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJb2JqZWN0VHlwZUNvbnZlcnRlciA9IG5ld09iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiwgb2xkU3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1N0cnVjdENvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbmRleChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUeXBlQ29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOgotCQkJCXJldHVybiBnZXRNdXRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOgotCQkJCXNldEluZGV4KChYbWxJbmRleF8yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOgotCQkJCXNldEluZGV4KChYbWxJbmRleF8yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZShNVVRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBhdHRyaWJ1dGVUeXBlICE9IG51bGwgOiAhQVRUUklCVVRFX1RZUEVfRURFRkFVTFQuZXF1YWxzKGF0dHJpYnV0ZVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRToKLQkJCQlyZXR1cm4gTVVUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbXV0YWJsZSAhPSBudWxsIDogIU1VVEFCTEVfRURFRkFVTFQuZXF1YWxzKG11dGFibGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gc3RydWN0Q29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIENPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnZlcnQgIT0gbnVsbCA6ICFDT05WRVJUX0VERUZBVUxULmVxdWFscyhjb252ZXJ0KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSWRfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSURfMjJfX0lOREVYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE11dGFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX01VVEFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01VVEFCTEVfX01VVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZF8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX0FUVFJJQlVURV9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfSURfMjJfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fSU5ERVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fTVVUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSURfX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lEX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JRF9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSWQoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbmRleFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkR2VuZXJhdGVkVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk1VVEFCTEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluZGV4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEluZGV4LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSWRfMl8yX0luZGV4KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5FTlVNRVJBVEVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEluZGV4LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlYjliZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5kZXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBJbmRleDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXgoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sSW5kZXggZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxJbmRleF8yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTY2hlbWEoKSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hID0gU0NIRU1BX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyA9IENBVEFMT0dfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGUgPSBUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWUoKSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBVTklRVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlKCkgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiB1bmlxdWUgPSBVTklRVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5OYW1lcygpIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uTmFtZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEluZGV4KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSU5ERVg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4XzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4XzJfMl9TY2hlbWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKQotCXsKLQkJcmV0dXJuIHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4I2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRhbG9nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4XzJfMl9DYXRhbG9nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCi0JewotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4I2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKQotCXsKLQkJU3RyaW5nIG9sZENhdGFsb2cgPSBjYXRhbG9nOwotCQljYXRhbG9nID0gbmV3Q2F0YWxvZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ0FUQUxPRywgb2xkQ2F0YWxvZywgY2F0YWxvZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX1RhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKQotCXsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSW5kZXgjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpCi0JewotCQlTdHJpbmcgb2xkVGFibGUgPSB0YWJsZTsKLQkJdGFibGUgPSBuZXdUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVEFCTEUsIG9sZFRhYmxlLCB0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pcXVlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxJbmRleF8yXzJfVW5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKQotCXsKLQkJcmV0dXJuIHVuaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEluZGV4I2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaXF1ZShCb29sZWFuIG5ld1VuaXF1ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkVW5pcXVlID0gdW5pcXVlOwotCQl1bmlxdWUgPSBuZXdVbmlxdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1VOSVFVRSwgb2xkVW5pcXVlLCB1bmlxdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluZGV4XzJfMl9Db2x1bW5OYW1lcygpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpCi0JewotCQlpZiAoY29sdW1uTmFtZXMgPT0gbnVsbCkKLQkJewotCQkJY29sdW1uTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NPTFVNTl9OQU1FUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtbk5hbWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1NDSEVNQToKLQkJCQlyZXR1cm4gZ2V0U2NoZW1hKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldFRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1VOSVFVRToKLQkJCQlyZXR1cm4gZ2V0VW5pcXVlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX0NPTFVNTl9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX1VOSVFVRToKLQkJCQlzZXRVbmlxdWUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ09MVU1OX05BTUVTOgotCQkJCWdldENvbHVtbk5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19TQ0hFTUE6Ci0JCQkJc2V0U2NoZW1hKFNDSEVNQV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19VTklRVUU6Ci0JCQkJc2V0VW5pcXVlKFVOSVFVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19DT0xVTU5fTkFNRVM6Ci0JCQkJZ2V0Q29sdW1uTmFtZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSU5ERVhfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fU0NIRU1BOgotCQkJCXJldHVybiBTQ0hFTUFfRURFRkFVTFQgPT0gbnVsbCA/IHNjaGVtYSAhPSBudWxsIDogIVNDSEVNQV9FREVGQVVMVC5lcXVhbHMoc2NoZW1hKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gQ0FUQUxPR19FREVGQVVMVCA9PSBudWxsID8gY2F0YWxvZyAhPSBudWxsIDogIUNBVEFMT0dfRURFRkFVTFQuZXF1YWxzKGNhdGFsb2cpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0lOREVYX19UQUJMRToKLQkJCQlyZXR1cm4gVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRhYmxlICE9IG51bGwgOiAhVEFCTEVfRURFRkFVTFQuZXF1YWxzKHRhYmxlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fVU5JUVVFOgotCQkJCXJldHVybiBVTklRVUVfRURFRkFVTFQgPT0gbnVsbCA/IHVuaXF1ZSAhPSBudWxsIDogIVVOSVFVRV9FREVGQVVMVC5lcXVhbHModW5pcXVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9JTkRFWF9fQ09MVU1OX05BTUVTOgotCQkJCXJldHVybiBjb2x1bW5OYW1lcyAhPSBudWxsICYmICFjb2x1bW5OYW1lcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXRhbG9nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRhbG9nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXF1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodW5pcXVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2x1bW5OYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29sdW1uTmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDb2x1bW5OYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLCAKLQkJCWJ1aWxkVW5pcXVlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVhfX0NPTFVNTl9OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfQ29sdW1uTmFtZXMoKSk7Ci0JfQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fQ0FUQUxPRywgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX0NhdGFsb2coKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLklOREVYX19TQ0hFTUEsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9TY2hlbWEoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVhfX1RBQkxFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfVGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVW5pcXVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5JTkRFWF9fVU5JUVVFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfVW5pcXVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxJbmRleApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4N2Q5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBJbnN0YW50aWF0aW9uIFBvbGljeTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHt9OwotCX0KLQotfSAvLyBYbWxJbnN0YW50aWF0aW9uUG9saWN5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODZhNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5GZXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBKb2luIEZldGNoPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2goKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5GZXRjaCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2gjZ2V0Sm9pbkZldGNoIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBqb2luLWZldGNoIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkZldGNoVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTE5YjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbEpvaW5GZXRjaFR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5ORVJfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTk5FUigwLCAiSU5ORVIiLCAiSU5ORVIiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9VVEVSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09VVEVSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1VURVIoMSwgIk9VVEVSIiwgIk9VVEVSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTk5FUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5ORVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5ORVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTk5FUl9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PVVRFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VURVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1VURVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRFUl9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIEpvaW4gRmV0Y2ggVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxKb2luRmV0Y2hUeXBlW10KLQkJewotCQkJSU5ORVIsCi0JCQlPVVRFUiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sSm9pbkZldGNoVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sSm9pbkZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgSm9pbiBGZXRjaCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sSm9pbkZldGNoVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sSm9pbkZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBKb2luIEZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxKb2luRmV0Y2hUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIElOTkVSX1ZBTFVFOiByZXR1cm4gSU5ORVI7Ci0JCQljYXNlIE9VVEVSX1ZBTFVFOiByZXR1cm4gT1VURVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbEpvaW5GZXRjaFR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1htbEpvaW5GZXRjaFR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMzFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEpvaW5UYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlIGltcGxlbWVudHMgWG1sSm9pblRhYmxlXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDcmVhdGlvblN1ZmZpeCgpIDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGlvblN1ZmZpeCA9IENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9KT0lOX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiBjcmVhdGlvblN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYLCBvbGRDcmVhdGlvblN1ZmZpeCwgY3JlYXRpb25TdWZmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIGdldENyZWF0aW9uU3VmZml4KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJcmV0dXJuIENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCA9PSBudWxsID8gY3JlYXRpb25TdWZmaXggIT0gbnVsbCA6ICFDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQuZXF1YWxzKGNyZWF0aW9uU3VmZml4KTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVg6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyZWF0aW9uU3VmZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvblN1ZmZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DUkVBVElPTl9TVUZGSVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbEpvaW5UYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTBmNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxNYW55VG9NYW55IGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IGltcGxlbWVudHMgWG1sTWFueVRvTWFueV8yXzAsIFhtbE1hbnlUb01hbnlfMl8xLCBYbWxNYW55VG9NYW55XzJfMiwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29udmVydGVyIGNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGVDb252ZXJ0ZXIoKSA8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUeXBlQ29udmVydGVyIHR5cGVDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN0cnVjdENvbnZlcnRlcigpIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIgc3RydWN0Q29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb252ZXJ0KCkgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcEtleUNvbnZlcnQgPSBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXRjaEZldGNoKCkgPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQmF0Y2hGZXRjaCBiYXRjaEZldGNoOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZVR5cGUoKSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVHlwZSA9IEFUVFJJQlVURV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uaW5nKCkgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGFydGl0aW9uaW5nXzJfMiBwYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgcGlubmVkUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKSA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiByYW5nZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgdmFsdWVQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIYXNoUGFydGl0aW9uaW5nKCkgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgaGFzaFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgdW5pb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJUSVRJT05FRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFydGl0aW9uZWQgPSBQQVJUSVRJT05FRF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYXNjYWRlT25EZWxldGUgPSBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTl9DQUNIRUFCTEVfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub25DYWNoZWFibGUgPSBOT05fQ0FDSEVBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19NQU5ZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gRmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luRmV0Y2hUeXBlIGdldEpvaW5GZXRjaCgpCi0JewotCQlyZXR1cm4gam9pbkZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0gsIG9sZEpvaW5GZXRjaCwgam9pbkZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29udmVydGVyIGdldENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gY29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29udmVydGVyIG9sZENvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJY29udmVydGVyID0gbmV3Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSLCBvbGRDb252ZXJ0ZXIsIG5ld0NvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb252ZXJ0ZXIobmV3Q29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1R5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VHlwZUNvbnZlcnRlcihuZXdUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlciA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG9iamVjdFR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpb2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZ2V0U3RydWN0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgb2xkU3RydWN0Q29udmVydGVyID0gc3RydWN0Q29udmVydGVyOwotCQlzdHJ1Y3RDb252ZXJ0ZXIgPSBuZXdTdHJ1Y3RDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBvbGRTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RydWN0Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG5ld1N0cnVjdENvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbnZlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBLZXlDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiBtYXBLZXlDb252ZXJ0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRNYXBLZXlDb252ZXJ0IDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbnZlcnQoU3RyaW5nIG5ld01hcEtleUNvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkTWFwS2V5Q29udmVydCA9IG1hcEtleUNvbnZlcnQ7Ci0JCW1hcEtleUNvbnZlcnQgPSBuZXdNYXBLZXlDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJULCBvbGRNYXBLZXlDb252ZXJ0LCBtYXBLZXlDb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG9sZEJhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRCYXRjaEZldGNoIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2g8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCkKLQl7Ci0JCWlmIChuZXdCYXRjaEZldGNoICE9IGJhdGNoRmV0Y2gpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGJhdGNoRmV0Y2ggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYmF0Y2hGZXRjaCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENILCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEJhdGNoRmV0Y2gobmV3QmF0Y2hGZXRjaCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG5ld0JhdGNoRmV0Y2gsIG5ld0JhdGNoRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFBhcnRpdGlvbmluZyA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yIG5ld1BhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gcGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1BhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HLCBuZXdQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlyZXBsaWNhdGlvblBhcnRpdGlvbmluZyA9IG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBvbGRSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRQaW5uZWRQYXJ0aXRpb25pbmcgPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gcGlubmVkUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBvbGRSYW5nZVBhcnRpdGlvbmluZyA9IHJhbmdlUGFydGl0aW9uaW5nOwotCQlyYW5nZVBhcnRpdGlvbmluZyA9IG5ld1JhbmdlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBvbGRSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhuZXdSYW5nZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgb2xkVmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobmV3VmFsdWVQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG5ld0hhc2hQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBoYXNoUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChoYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWhhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HLCBuZXdIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG9sZFVuaW9uUGFydGl0aW9uaW5nID0gdW5pb25QYXJ0aXRpb25pbmc7Ci0JCXVuaW9uUGFydGl0aW9uaW5nID0gbmV3VW5pb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG9sZFVuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG5ld1VuaW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnRpdGlvbmVkKFN0cmluZyBuZXdQYXJ0aXRpb25lZCkKLQl7Ci0JCVN0cmluZyBvbGRQYXJ0aXRpb25lZCA9IHBhcnRpdGlvbmVkOwotCQlwYXJ0aXRpb25lZCA9IG5ld1BhcnRpdGlvbmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU9uRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueSNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4gbmV3Q2FzY2FkZU9uRGVsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRDYXNjYWRlT25EZWxldGUgPSBjYXNjYWRlT25EZWxldGU7Ci0JCWNhc2NhZGVPbkRlbGV0ZSA9IG5ld0Nhc2NhZGVPbkRlbGV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFLCBvbGRDYXNjYWRlT25EZWxldGUsIGNhc2NhZGVPbkRlbGV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55I2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIG5ld05vbkNhY2hlYWJsZSkKLQl7Ci0JCWJvb2xlYW4gb2xkTm9uQ2FjaGVhYmxlID0gbm9uQ2FjaGVhYmxlOwotCQlub25DYWNoZWFibGUgPSBuZXdOb25DYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFLCBvbGROb25DYWNoZWFibGUsIG5vbkNhY2hlYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRCYXRjaEZldGNoKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJc2V0QmF0Y2hGZXRjaCgoWG1sQmF0Y2hGZXRjaCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXNldE1hcEtleUNvbnZlcnQoTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKE5PTl9DQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaChKT0lOX0ZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBjb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBtYXBLZXlDb252ZXJ0ICE9IG51bGwgOiAhTUFQX0tFWV9DT05WRVJUX0VERUZBVUxULmVxdWFscyhtYXBLZXlDb252ZXJ0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBoYXNoUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZU9uRGVsZXRlICE9IG51bGwgOiAhQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19OT05fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBub25DYWNoZWFibGUgIT0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gam9pbkZldGNoICE9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb01hbnlfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX05PTl9DQUNIRUFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhdGNoRmV0Y2hIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9NYW55XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFueVRvTWFueV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTllfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChtYXBLZXlDb252ZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBLZXlDb252ZXJ0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJ0aXRpb25lZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFydGl0aW9uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVPbkRlbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FzY2FkZU9uRGVsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub25DYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5vbkNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRKb2luRmV0Y2hUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBwZWRCeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3JkZXJCeVRyYW5zbGF0b3IoKSwKLQkJCVhtbE9yZGVyQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuT1JERVJfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlXzJfMF9PcmRlckNvbHVtbigpKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Q29udmVydFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLk1BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREUsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1R5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT2JqZWN0VHlwZUNvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkFUVFJJQlVURV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxCYXRjaEZldGNoLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5CQVRDSF9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZU9uRGVsZXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIENhc2NhZGVUeXBlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMi5DQVNDQURFX09OX0RFTEVURSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVDb250YWluZXJfSm9pblRhYmxlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBkNDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvT25lXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gT25lPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hbnlUb09uZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIGltcGxlbWVudHMgWG1sTWFueVRvT25lXzJfMSwgWG1sTWFueVRvT25lXzJfMiwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT05fQ0FDSEVBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9uQ2FjaGVhYmxlID0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFueVRvT25lKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgb2xkUmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBvbGRWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBvbGRVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uQ2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25DYWNoZWFibGUgPSBub25DYWNoZWFibGU7Ci0JCW5vbkNhY2hlYWJsZSA9IG5ld05vbkNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRSwgb2xkTm9uQ2FjaGVhYmxlLCBub25DYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBnZXRCYXRjaEZldGNoKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBpbm5lZFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldEhhc2hQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gZ2V0UGFydGl0aW9uZWQoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gaXNOb25DYWNoZWFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXNldE5vbkNhY2hlYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKChYbWxKb2luRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXRjaEZldGNoICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gbm9uQ2FjaGVhYmxlICE9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX05PTl9DQUNIRUFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYW55VG9PbmVfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hbnlUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BTllfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFOWV9UT19PTkVfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJ0aXRpb25lZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFydGl0aW9uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqb2luRmV0Y2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpvaW5GZXRjaCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHNJZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcml2YXRlT3duZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQmF0Y2hGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxCYXRjaEZldGNoLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5CQVRDSF9GRVRDSCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEpvaW5UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNTYzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGluazJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICogCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENvcHlQb2xpY3kgPGVtPkNvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgaW1wbGVtZW50cyBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiwgWG1sUmVhZE9ubHksIFhtbEN1c3RvbWl6ZXJIb2xkZXIsIFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLCBYbWxDYWNoZUhvbGRlciwgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sUHJvcGVydHlDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5KCkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleSBwcmltYXJ5S2V5OwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlYWJsZSgpIDxlbT5DYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZWFibGUoKSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhY2hlYWJsZSA9IENBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlSW50ZXJjZXB0b3IoKSA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjYWNoZUludGVyY2VwdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2hHcm91cHMoKSA8ZW0+RmV0Y2ggR3JvdXBzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoR3JvdXBzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRmV0Y2hHcm91cD4gZmV0Y2hHcm91cHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcigpIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkgPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5PiBuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKSA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxRdWVyeVJlZGlyZWN0b3JzIHF1ZXJ5UmVkaXJlY3RvcnM7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFyZW50Q2xhc3MoKSA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJlbnRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0NMQVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmVudENsYXNzKCkgPGVtPlBhcmVudCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFyZW50Q2xhc3MgPSBQQVJFTlRfQ0xBU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25pbmcoKSA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQYXJ0aXRpb25pbmdfMl8yIHBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5nZVBhcnRpdGlvbmluZygpIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIHJhbmdlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc2hQYXJ0aXRpb25pbmcoKSA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBoYXNoUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKSA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiB1bmlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJ0aXRpb25lZCA9IFBBUlRJVElPTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgYWRkaXRpb25hbENyaXRlcmlhOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlYWRPbmx5KCkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX09OTFlfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9ubHkoKSA8ZW0+UmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmVhZE9ubHkgPSBSRUFEX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDdXN0b21pemVyKCkgPGVtPkN1c3RvbWl6ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEN1c3RvbWl6ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBjdXN0b21pemVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2hhbmdlVHJhY2tpbmcoKSA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDaGFuZ2VUcmFja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENoYW5nZVRyYWNraW5nIGNoYW5nZVRyYWNraW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGUoKSA8ZW0+Q2FjaGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2FjaGUgY2FjaGU7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFeGlzdGVuY2VUeXBlIEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFeGlzdGVuY2VDaGVja2luZygpIDxlbT5FeGlzdGVuY2UgQ2hlY2tpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRXhpc3RlbmNlVHlwZSBleGlzdGVuY2VDaGVja2luZyA9IEVYSVNURU5DRV9DSEVDS0lOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnRlcnMoKSA8ZW0+Q29udmVydGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVydGVyPiBjb252ZXJ0ZXJzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcnMoKSA8ZW0+VHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHlwZUNvbnZlcnRlcj4gdHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlQ29udmVydGVycygpIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gb2JqZWN0VHlwZUNvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTdHJ1Y3RDb252ZXJ0ZXI+IHN0cnVjdENvbnZlcnRlcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW1pc3RpY0xvY2tpbmcoKSA8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9wdGltaXN0aWNMb2NraW5nIG9wdGltaXN0aWNMb2NraW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29weVBvbGljeSgpIDxlbT5Db3B5IFBvbGljeTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvcHlQb2xpY3kgY29weVBvbGljeTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkgPGVtPkluc3RhbnRpYXRpb24gQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbG9uZUNvcHlQb2xpY3koKSA8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsb25lQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsb25lQ29weVBvbGljeSBjbG9uZUNvcHlQb2xpY3k7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01BUFBFRF9TVVBFUkNMQVNTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZE9ubHkoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJlYWRPbmx5X1JlYWRPbmx5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRSZWFkT25seSgpCi0JewotCQlyZXR1cm4gcmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFJlYWRPbmx5IDxlbT5SZWFkIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZE9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWFkT25seShCb29sZWFuIG5ld1JlYWRPbmx5KQotCXsKLQkJQm9vbGVhbiBvbGRSZWFkT25seSA9IHJlYWRPbmx5OwotCQlyZWFkT25seSA9IG5ld1JlYWRPbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFksIG9sZFJlYWRPbmx5LCByZWFkT25seSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkN1c3RvbWl6ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1c3RvbWl6ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3VzdG9taXplcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEN1c3RvbWl6ZXJIb2xkZXJfQ3VzdG9taXplcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q3VzdG9taXplcigpCi0JewotCQlyZXR1cm4gY3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDdXN0b21pemVyKFhtbENsYXNzUmVmZXJlbmNlIG5ld0N1c3RvbWl6ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRDdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJY3VzdG9taXplciA9IG5ld0N1c3RvbWl6ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVIsIG9sZEN1c3RvbWl6ZXIsIG5ld0N1c3RvbWl6ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDdXN0b21pemVyIDxlbT5DdXN0b21pemVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DdXN0b21pemVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDdXN0b21pemVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9taXplcihYbWxDbGFzc1JlZmVyZW5jZSBuZXdDdXN0b21pemVyKQotCXsKLQkJaWYgKG5ld0N1c3RvbWl6ZXIgIT0gY3VzdG9taXplcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljdXN0b21pemVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q3VzdG9taXplciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDdXN0b21pemVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDdXN0b21pemVyKG5ld0N1c3RvbWl6ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUiwgbmV3Q3VzdG9taXplciwgbmV3Q3VzdG9taXplcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNoYW5nZSBUcmFja2luZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNoYW5nZSBUcmFja2luZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDaGFuZ2VUcmFja2luZ0hvbGRlcl9DaGFuZ2VUcmFja2luZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2hhbmdlVHJhY2tpbmcgZ2V0Q2hhbmdlVHJhY2tpbmcoKQotCXsKLQkJcmV0dXJuIGNoYW5nZVRyYWNraW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENoYW5nZVRyYWNraW5nKFhtbENoYW5nZVRyYWNraW5nIG5ld0NoYW5nZVRyYWNraW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2hhbmdlVHJhY2tpbmcgb2xkQ2hhbmdlVHJhY2tpbmcgPSBjaGFuZ2VUcmFja2luZzsKLQkJY2hhbmdlVHJhY2tpbmcgPSBuZXdDaGFuZ2VUcmFja2luZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBvbGRDaGFuZ2VUcmFja2luZywgbmV3Q2hhbmdlVHJhY2tpbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDaGFuZ2VUcmFja2luZyA8ZW0+Q2hhbmdlIFRyYWNraW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFuZ2UgVHJhY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENoYW5nZVRyYWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hhbmdlVHJhY2tpbmcoWG1sQ2hhbmdlVHJhY2tpbmcgbmV3Q2hhbmdlVHJhY2tpbmcpCi0JewotCQlpZiAobmV3Q2hhbmdlVHJhY2tpbmcgIT0gY2hhbmdlVHJhY2tpbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNoYW5nZVRyYWNraW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNoYW5nZVRyYWNraW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDaGFuZ2VUcmFja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFuZ2VUcmFja2luZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhuZXdDaGFuZ2VUcmFja2luZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkcsIG5ld0NoYW5nZVRyYWNraW5nLCBuZXdDaGFuZ2VUcmFja2luZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q2FjaGUoWG1sQ2FjaGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2FjaGUgZ2V0Q2FjaGUoKQotCXsKLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlKFhtbENhY2hlIG5ld0NhY2hlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2FjaGUgb2xkQ2FjaGUgPSBjYWNoZTsKLQkJY2FjaGUgPSBuZXdDYWNoZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG9sZENhY2hlLCBuZXdDYWNoZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlIDxlbT5DYWNoZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FjaGUoWG1sQ2FjaGUgbmV3Q2FjaGUpCi0JewotCQlpZiAobmV3Q2FjaGUgIT0gY2FjaGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NhY2hlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NhY2hlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGUobmV3Q2FjaGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEUsIG5ld0NhY2hlLCBuZXdDYWNoZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4aXN0ZW5jZSBDaGVja2luZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUKLQkgKiBAc2VlICNzZXRFeGlzdGVuY2VDaGVja2luZyhFeGlzdGVuY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFeGlzdGVuY2VUeXBlIGdldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQl7Ci0JCXJldHVybiBleGlzdGVuY2VDaGVja2luZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RXhpc3RlbmNlQ2hlY2tpbmcgPGVtPkV4aXN0ZW5jZSBDaGVja2luZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhpc3RlbmNlIENoZWNraW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZQotCSAqIEBzZWUgI2dldEV4aXN0ZW5jZUNoZWNraW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZSBuZXdFeGlzdGVuY2VDaGVja2luZykKLQl7Ci0JCUV4aXN0ZW5jZVR5cGUgb2xkRXhpc3RlbmNlQ2hlY2tpbmcgPSBleGlzdGVuY2VDaGVja2luZzsKLQkJZXhpc3RlbmNlQ2hlY2tpbmcgPSBuZXdFeGlzdGVuY2VDaGVja2luZyA9PSBudWxsID8gRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUIDogbmV3RXhpc3RlbmNlQ2hlY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORywgb2xkRXhpc3RlbmNlQ2hlY2tpbmcsIGV4aXN0ZW5jZUNoZWNraW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9Db252ZXJ0ZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJ0ZXI+IGdldENvbnZlcnRlcnMoKQotCXsKLQkJaWYgKGNvbnZlcnRlcnMgPT0gbnVsbCkKLQkJewotCQkJY29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJ0ZXI+KFhtbENvbnZlcnRlci5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlcnNIb2xkZXJfVHlwZUNvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFR5cGVDb252ZXJ0ZXI+IGdldFR5cGVDb252ZXJ0ZXJzKCkKLQl7Ci0JCWlmICh0eXBlQ29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQl0eXBlQ29udmVydGVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUeXBlQ29udmVydGVyPihYbWxUeXBlQ29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiB0eXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVyc0hvbGRlcl9PYmplY3RUeXBlQ29udmVydGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT2JqZWN0VHlwZUNvbnZlcnRlcj4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKQotCXsKLQkJaWYgKG9iamVjdFR5cGVDb252ZXJ0ZXJzID09IG51bGwpCi0JCXsKLQkJCW9iamVjdFR5cGVDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE9iamVjdFR5cGVDb252ZXJ0ZXI+KFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMpOwotCQl9Ci0JCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1N0cnVjdENvbnZlcnRlcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4gZ2V0U3RydWN0Q29udmVydGVycygpCi0JewotCQlpZiAoc3RydWN0Q29udmVydGVycyA9PSBudWxsKQotCQl7Ci0JCQlzdHJ1Y3RDb252ZXJ0ZXJzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFN0cnVjdENvbnZlcnRlcj4oWG1sU3RydWN0Q29udmVydGVyLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcHRpbWlzdGljIExvY2tpbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9wdGltaXN0aWNMb2NraW5nIGdldE9wdGltaXN0aWNMb2NraW5nKCkKLQl7Ci0JCXJldHVybiBvcHRpbWlzdGljTG9ja2luZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhYbWxPcHRpbWlzdGljTG9ja2luZyBuZXdPcHRpbWlzdGljTG9ja2luZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nIG9sZE9wdGltaXN0aWNMb2NraW5nID0gb3B0aW1pc3RpY0xvY2tpbmc7Ci0JCW9wdGltaXN0aWNMb2NraW5nID0gbmV3T3B0aW1pc3RpY0xvY2tpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgb2xkT3B0aW1pc3RpY0xvY2tpbmcsIG5ld09wdGltaXN0aWNMb2NraW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0T3B0aW1pc3RpY0xvY2tpbmcgPGVtPk9wdGltaXN0aWMgTG9ja2luZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW1pc3RpYyBMb2NraW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcHRpbWlzdGljTG9ja2luZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGltaXN0aWNMb2NraW5nKFhtbE9wdGltaXN0aWNMb2NraW5nIG5ld09wdGltaXN0aWNMb2NraW5nKQotCXsKLQkJaWYgKG5ld09wdGltaXN0aWNMb2NraW5nICE9IG9wdGltaXN0aWNMb2NraW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcHRpbWlzdGljTG9ja2luZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcHRpbWlzdGljTG9ja2luZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T3B0aW1pc3RpY0xvY2tpbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3T3B0aW1pc3RpY0xvY2tpbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3B0aW1pc3RpY0xvY2tpbmcobmV3T3B0aW1pc3RpY0xvY2tpbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HLCBuZXdPcHRpbWlzdGljTG9ja2luZywgbmV3T3B0aW1pc3RpY0xvY2tpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29weVBvbGljeSBnZXRDb3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBjb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvcHlQb2xpY3koWG1sQ29weVBvbGljeSBuZXdDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29weVBvbGljeSBvbGRDb3B5UG9saWN5ID0gY29weVBvbGljeTsKLQkJY29weVBvbGljeSA9IG5ld0NvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBvbGRDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0Q29weVBvbGljeSA8ZW0+Q29weSBQb2xpY3k8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29weVBvbGljeShYbWxDb3B5UG9saWN5IG5ld0NvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q29weVBvbGljeSAhPSBjb3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvcHlQb2xpY3kpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29weVBvbGljeShuZXdDb3B5UG9saWN5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZLCBuZXdDb3B5UG9saWN5LCBuZXdDb3B5UG9saWN5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zdGFudGlhdGlvbiBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGdldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KCkKLQl7Ci0JCXJldHVybiBpbnN0YW50aWF0aW9uQ29weVBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gaW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWluc3RhbnRpYXRpb25Db3B5UG9saWN5ID0gbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG9sZEluc3RhbnRpYXRpb25Db3B5UG9saWN5LCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEluc3RhbnRpYXRpb25Db3B5UG9saWN5IDxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnN0YW50aWF0aW9uIENvcHkgUG9saWN5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5IG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCXsKLQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IGluc3RhbnRpYXRpb25Db3B5UG9saWN5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpbnN0YW50aWF0aW9uQ29weVBvbGljeSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClpbnN0YW50aWF0aW9uQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0luc3RhbnRpYXRpb25Db3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBuZXdJbnN0YW50aWF0aW9uQ29weVBvbGljeSwgbmV3SW5zdGFudGlhdGlvbkNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbG9uZSBDb3B5IFBvbGljeTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xvbmUgQ29weSBQb2xpY3k8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0Nsb25lQ29weVBvbGljeSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xvbmVDb3B5UG9saWN5IGdldENsb25lQ29weVBvbGljeSgpCi0JewotCQlyZXR1cm4gY2xvbmVDb3B5UG9saWN5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENsb25lQ29weVBvbGljeShYbWxDbG9uZUNvcHlQb2xpY3kgbmV3Q2xvbmVDb3B5UG9saWN5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xvbmVDb3B5UG9saWN5IG9sZENsb25lQ29weVBvbGljeSA9IGNsb25lQ29weVBvbGljeTsKLQkJY2xvbmVDb3B5UG9saWN5ID0gbmV3Q2xvbmVDb3B5UG9saWN5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgb2xkQ2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDbG9uZUNvcHlQb2xpY3kgPGVtPkNsb25lIENvcHkgUG9saWN5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbG9uZSBDb3B5IFBvbGljeTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xvbmVDb3B5UG9saWN5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xvbmVDb3B5UG9saWN5KFhtbENsb25lQ29weVBvbGljeSBuZXdDbG9uZUNvcHlQb2xpY3kpCi0JewotCQlpZiAobmV3Q2xvbmVDb3B5UG9saWN5ICE9IGNsb25lQ29weVBvbGljeSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2xvbmVDb3B5UG9saWN5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNsb25lQ29weVBvbGljeSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDbG9uZUNvcHlQb2xpY3kgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2xvbmVDb3B5UG9saWN5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1ksIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG5ld0Nsb25lQ29weVBvbGljeSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWSwgbmV3Q2xvbmVDb3B5UG9saWN5LCBuZXdDbG9uZUNvcHlQb2xpY3kpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xX1ByaW1hcnlLZXkoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpCi0JewotCQlyZXR1cm4gcHJpbWFyeUtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkgbmV3UHJpbWFyeUtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFByaW1hcnlLZXkgb2xkUHJpbWFyeUtleSA9IHByaW1hcnlLZXk7Ci0JCXByaW1hcnlLZXkgPSBuZXdQcmltYXJ5S2V5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgb2xkUHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSBuZXdQcmltYXJ5S2V5KQotCXsKLQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gcHJpbWFyeUtleSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJpbWFyeUtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcmltYXJ5S2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVksIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByaW1hcnlLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJpbWFyeUtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByaW1hcnlLZXkobmV3UHJpbWFyeUtleSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWSwgbmV3UHJpbWFyeUtleSwgbmV3UHJpbWFyeUtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FjaGVhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDYWNoZWFibGVfMl8wX0NhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBjYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldENhY2hlYWJsZSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIG5ld0NhY2hlYWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FjaGVhYmxlID0gY2FjaGVhYmxlOwotCQljYWNoZWFibGUgPSBuZXdDYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRDYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiBjYWNoZUludGVyY2VwdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3Q2FjaGVJbnRlcmNlcHRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG9sZENhY2hlSW50ZXJjZXB0b3IgPSBjYWNoZUludGVyY2VwdG9yOwotCQljYWNoZUludGVyY2VwdG9yID0gbmV3Q2FjaGVJbnRlcmNlcHRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IsIG9sZENhY2hlSW50ZXJjZXB0b3IsIG5ld0NhY2hlSW50ZXJjZXB0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIG5ld0NhY2hlSW50ZXJjZXB0b3IpCi0JewotCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBjYWNoZUludGVyY2VwdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjYWNoZUludGVyY2VwdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNhY2hlSW50ZXJjZXB0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q2FjaGVJbnRlcmNlcHRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDYWNoZUludGVyY2VwdG9yKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q2FjaGVJbnRlcmNlcHRvcihuZXdDYWNoZUludGVyY2VwdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SLCBuZXdDYWNoZUludGVyY2VwdG9yLCBuZXdDYWNoZUludGVyY2VwdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxGZXRjaEdyb3VwfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoIEdyb3VwczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxGZXRjaEdyb3VwPiBnZXRGZXRjaEdyb3VwcygpCi0JewotCQlpZiAoZmV0Y2hHcm91cHMgPT0gbnVsbCkKLQkJewotCQkJZmV0Y2hHcm91cHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRmV0Y2hHcm91cD4oWG1sRmV0Y2hHcm91cC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTKTsKLQkJfQotCQlyZXR1cm4gZmV0Y2hHcm91cHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBvbGRTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB0YWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIG9sZFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRhYmxlR2VuZXJhdG9yID0gbmV3VGFibGVHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRRdWVyeT4oWG1sTmFtZWRRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkTmF0aXZlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4oWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4gZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+KFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBY2Nlc3NNZXRob2RzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JewotCQlpZiAoc3FsUmVzdWx0U2V0TWFwcGluZ3MgPT0gbnVsbCkKLQkJewotCQkJc3FsUmVzdWx0U2V0TWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4oU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOwotCQl9Ci0JCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFF1ZXJ5UmVkaXJlY3RvcnMgZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gcXVlcnlSZWRpcmVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgbmV3UXVlcnlSZWRpcmVjdG9ycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFF1ZXJ5UmVkaXJlY3RvcnMgb2xkUXVlcnlSZWRpcmVjdG9ycyA9IHF1ZXJ5UmVkaXJlY3RvcnM7Ci0JCXF1ZXJ5UmVkaXJlY3RvcnMgPSBuZXdRdWVyeVJlZGlyZWN0b3JzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUywgb2xkUXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFF1ZXJ5UmVkaXJlY3RvcnMgPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UXVlcnlSZWRpcmVjdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyBuZXdRdWVyeVJlZGlyZWN0b3JzKQotCXsKLQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gcXVlcnlSZWRpcmVjdG9ycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClxdWVyeVJlZGlyZWN0b3JzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1F1ZXJ5UmVkaXJlY3RvcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UXVlcnlSZWRpcmVjdG9ycykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFF1ZXJ5UmVkaXJlY3RvcnMobmV3UXVlcnlSZWRpcmVjdG9ycywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUywgbmV3UXVlcnlSZWRpcmVjdG9ycywgbmV3UXVlcnlSZWRpcmVjdG9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUGFyZW50Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gcGFyZW50Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnRDbGFzcyhTdHJpbmcgbmV3UGFyZW50Q2xhc3MpCi0JewotCQlTdHJpbmcgb2xkUGFyZW50Q2xhc3MgPSBwYXJlbnRDbGFzczsKLQkJcGFyZW50Q2xhc3MgPSBuZXdQYXJlbnRDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTLCBvbGRQYXJlbnRDbGFzcywgcGFyZW50Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkcsIG9sZFBhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZyA9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HLCBvbGRQaW5uZWRQYXJ0aXRpb25pbmcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORywgb2xkUmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBuZXdSYW5nZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSByYW5nZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG5ld1JhbmdlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG9sZFZhbHVlUGFydGl0aW9uaW5nID0gdmFsdWVQYXJ0aXRpb25pbmc7Ci0JCXZhbHVlUGFydGl0aW9uaW5nID0gbmV3VmFsdWVQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORywgb2xkVmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORywgb2xkSGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HLCBvbGRVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIG5ld1VuaW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IHVuaW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl1bmlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobmV3VW5pb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HLCBuZXdVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmVkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25lZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvbmVkKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25lZChTdHJpbmcgbmV3UGFydGl0aW9uZWQpCi0JewotCQlTdHJpbmcgb2xkUGFydGl0aW9uZWQgPSBwYXJ0aXRpb25lZDsKLQkJcGFydGl0aW9uZWQgPSBuZXdQYXJ0aXRpb25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkKLQl7Ci0JCXJldHVybiBhZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgbmV3QWRkaXRpb25hbENyaXRlcmlhLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiBvbGRBZGRpdGlvbmFsQ3JpdGVyaWEgPSBhZGRpdGlvbmFsQ3JpdGVyaWE7Ci0JCWFkZGl0aW9uYWxDcml0ZXJpYSA9IG5ld0FkZGl0aW9uYWxDcml0ZXJpYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQSwgb2xkQWRkaXRpb25hbENyaXRlcmlhLCBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSkKLQl7Ci0JCWlmIChuZXdBZGRpdGlvbmFsQ3JpdGVyaWEgIT0gYWRkaXRpb25hbENyaXRlcmlhKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhZGRpdGlvbmFsQ3JpdGVyaWEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWRkaXRpb25hbENyaXRlcmlhKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QWRkaXRpb25hbENyaXRlcmlhICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FkZGl0aW9uYWxDcml0ZXJpYSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUEsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWRkaXRpb25hbENyaXRlcmlhKG5ld0FkZGl0aW9uYWxDcml0ZXJpYSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBLCBuZXdBZGRpdGlvbmFsQ3JpdGVyaWEsIG5ld0FkZGl0aW9uYWxDcml0ZXJpYSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoQm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKQotCXsKLQkJQm9vbGVhbiBvbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gZXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJZXhjbHVkZURlZmF1bHRNYXBwaW5ncyA9IG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgb2xkRXhjbHVkZURlZmF1bHRNYXBwaW5ncywgZXhjbHVkZURlZmF1bHRNYXBwaW5ncykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmltYXJ5S2V5KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYWNoZUludGVyY2VwdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRGZXRjaEdyb3VwcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UXVlcnlSZWRpcmVjdG9ycyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FERElUSU9OQUxfQ1JJVEVSSUE6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWRkaXRpb25hbENyaXRlcmlhKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBiYXNpY1NldEN1c3RvbWl6ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDaGFuZ2VUcmFja2luZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2FjaGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRDb252ZXJ0ZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFN0cnVjdENvbnZlcnRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPcHRpbWlzdGljTG9ja2luZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSU5TVEFOVElBVElPTl9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeShudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q2xvbmVDb3B5UG9saWN5KG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJcmV0dXJuIGdldFByaW1hcnlLZXkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBnZXRDYWNoZWFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJcmV0dXJuIGdldENhY2hlSW50ZXJjZXB0b3IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBnZXRGZXRjaEdyb3VwcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXJldHVybiBnZXRRdWVyeVJlZGlyZWN0b3JzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUkVOVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0UGFyZW50Q2xhc3MoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UGlubmVkUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFVuaW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXJldHVybiBnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXJldHVybiBnZXRSZWFkT25seSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOgotCQkJCXJldHVybiBnZXRDdXN0b21pemVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlyZXR1cm4gZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6Ci0JCQkJcmV0dXJuIGdldENhY2hlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYSVNURU5DRV9DSEVDS0lORzoKLQkJCQlyZXR1cm4gZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVycygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT1BUSU1JU1RJQ19MT0NLSU5HOgotCQkJCXJldHVybiBnZXRPcHRpbWlzdGljTG9ja2luZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBnZXRJbnN0YW50aWF0aW9uQ29weVBvbGljeSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlyZXR1cm4gZ2V0Q2xvbmVDb3B5UG9saWN5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6Ci0JCQkJc2V0UHJpbWFyeUtleSgoWG1sUHJpbWFyeUtleSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRUFCTEU6Ci0JCQkJc2V0Q2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXNldENhY2hlSW50ZXJjZXB0b3IoKFhtbENsYXNzUmVmZXJlbmNlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19GRVRDSF9HUk9VUFM6Ci0JCQkJZ2V0RmV0Y2hHcm91cHMoKS5jbGVhcigpOwotCQkJCWdldEZldGNoR3JvdXBzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxGZXRjaEdyb3VwPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE5hbWVkTmF0aXZlUXVlcnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmNsZWFyKCk7Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFNxbFJlc3VsdFNldE1hcHBpbmc+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTOgotCQkJCXNldFBhcmVudENsYXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOgotCQkJCXNldFBhcnRpdGlvbmluZygoWG1sUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlzZXRQaW5uZWRQYXJ0aXRpb25pbmcoKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0SGFzaFBhcnRpdGlvbmluZygoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXNldEFkZGl0aW9uYWxDcml0ZXJpYSgoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6Ci0JCQkJc2V0UmVhZE9ubHkoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKLQkJCQlzZXRDdXN0b21pemVyKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6Ci0JCQkJc2V0Q2hhbmdlVHJhY2tpbmcoKFhtbENoYW5nZVRyYWNraW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFOgotCQkJCXNldENhY2hlKChYbWxDYWNoZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcoKEV4aXN0ZW5jZVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09OVkVSVEVSUzoKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFR5cGVDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCWdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxPYmplY3RUeXBlQ29udmVydGVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdHJ1Y3RDb252ZXJ0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09QVElNSVNUSUNfTE9DS0lORzoKLQkJCQlzZXRPcHRpbWlzdGljTG9ja2luZygoWG1sT3B0aW1pc3RpY0xvY2tpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZOgotCQkJCXNldEluc3RhbnRpYXRpb25Db3B5UG9saWN5KChYbWxJbnN0YW50aWF0aW9uQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DTE9ORV9DT1BZX1BPTElDWToKLQkJCQlzZXRDbG9uZUNvcHlQb2xpY3koKFhtbENsb25lQ29weVBvbGljeSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUklNQVJZX0tFWToKLQkJCQlzZXRQcmltYXJ5S2V5KChYbWxQcmltYXJ5S2V5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOgotCQkJCXNldENhY2hlYWJsZShDQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVfSU5URVJDRVBUT1I6Ci0JCQkJc2V0Q2FjaGVJbnRlcmNlcHRvcigoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOgotCQkJCWdldEZldGNoR3JvdXBzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1FVRVJZX1JFRElSRUNUT1JTOgotCQkJCXNldFF1ZXJ5UmVkaXJlY3RvcnMoKFhtbFF1ZXJ5UmVkaXJlY3RvcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJc2V0UGFyZW50Q2xhc3MoUEFSRU5UX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKChYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VmFsdWVQYXJ0aXRpb25pbmcoKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05FRDoKLQkJCQlzZXRQYXJ0aXRpb25lZChQQVJUSVRJT05FRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXNldEFkZGl0aW9uYWxDcml0ZXJpYSgoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFQURfT05MWToKLQkJCQlzZXRSZWFkT25seShSRUFEX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ1VTVE9NSVpFUjoKLQkJCQlzZXRDdXN0b21pemVyKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzoKLQkJCQlzZXRDaGFuZ2VUcmFja2luZygoWG1sQ2hhbmdlVHJhY2tpbmcpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKLQkJCQlzZXRDYWNoZSgoWG1sQ2FjaGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6Ci0JCQkJc2V0RXhpc3RlbmNlQ2hlY2tpbmcoRVhJU1RFTkNFX0NIRUNLSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0Q29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19UWVBFX0NPTlZFUlRFUlM6Ci0JCQkJZ2V0VHlwZUNvbnZlcnRlcnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlnZXRPYmplY3RUeXBlQ29udmVydGVycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzoKLQkJCQlnZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJc2V0T3B0aW1pc3RpY0xvY2tpbmcoKFhtbE9wdGltaXN0aWNMb2NraW5nKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q29weVBvbGljeSgoWG1sQ29weVBvbGljeSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0SW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xPTkVfQ09QWV9QT0xJQ1k6Ci0JCQkJc2V0Q2xvbmVDb3B5UG9saWN5KChYbWxDbG9uZUNvcHlQb2xpY3kpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BSSU1BUllfS0VZOgotCQkJCXJldHVybiBwcmltYXJ5S2V5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gQ0FDSEVBQkxFX0VERUZBVUxUID09IG51bGwgPyBjYWNoZWFibGUgIT0gbnVsbCA6ICFDQUNIRUFCTEVfRURFRkFVTFQuZXF1YWxzKGNhY2hlYWJsZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NBQ0hFX0lOVEVSQ0VQVE9SOgotCQkJCXJldHVybiBjYWNoZUludGVyY2VwdG9yICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZXMgIT0gbnVsbCAmJiAhYXNzb2NpYXRpb25PdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOgotCQkJCXJldHVybiBmZXRjaEdyb3VwcyAhPSBudWxsICYmICFmZXRjaEdyb3Vwcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZFF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWRRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZE5hdGl2ZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19RVUVSWV9SRURJUkVDVE9SUzoKLQkJCQlyZXR1cm4gcXVlcnlSZWRpcmVjdG9ycyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFBBUkVOVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcGFyZW50Q2xhc3MgIT0gbnVsbCA6ICFQQVJFTlRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHBhcmVudENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOgotCQkJCXJldHVybiBhZGRpdGlvbmFsQ3JpdGVyaWEgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOgotCQkJCXJldHVybiBSRUFEX09OTFlfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWRPbmx5ICE9IG51bGwgOiAhUkVBRF9PTkxZX0VERUZBVUxULmVxdWFscyhyZWFkT25seSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6Ci0JCQkJcmV0dXJuIGN1c3RvbWl6ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0hBTkdFX1RSQUNLSU5HOgotCQkJCXJldHVybiBjaGFuZ2VUcmFja2luZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRToKLQkJCQlyZXR1cm4gY2FjaGUgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOgotCQkJCXJldHVybiBleGlzdGVuY2VDaGVja2luZyAhPSBFWElTVEVOQ0VfQ0hFQ0tJTkdfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6Ci0JCQkJcmV0dXJuIGNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhY29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1RZUEVfQ09OVkVSVEVSUzoKLQkJCQlyZXR1cm4gdHlwZUNvbnZlcnRlcnMgIT0gbnVsbCAmJiAhdHlwZUNvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PQkpFQ1RfVFlQRV9DT05WRVJURVJTOgotCQkJCXJldHVybiBvYmplY3RUeXBlQ29udmVydGVycyAhPSBudWxsICYmICFvYmplY3RUeXBlQ29udmVydGVycy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXJzICE9IG51bGwgJiYgIXN0cnVjdENvbnZlcnRlcnMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19PUFRJTUlTVElDX0xPQ0tJTkc6Ci0JCQkJcmV0dXJuIG9wdGltaXN0aWNMb2NraW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjb3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lOU1RBTlRJQVRJT05fQ09QWV9QT0xJQ1k6Ci0JCQkJcmV0dXJuIGluc3RhbnRpYXRpb25Db3B5UG9saWN5ICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NMT05FX0NPUFlfUE9MSUNZOgotCQkJCXJldHVybiBjbG9uZUNvcHlQb2xpY3kgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTOgotCQkJCXJldHVybiBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gbnVsbCA6ICFFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQuZXF1YWxzKGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk6IHJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRV9JTlRFUkNFUFRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0ZFVENIX0dST1VQUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9RVUVSSUVTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJFTlRfQ0xBU1M6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQURESVRJT05BTF9DUklURVJJQTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19BRERJVElPTkFMX0NSSVRFUklBOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19SRUFEX09OTFk6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NVU1RPTUlaRVJfSE9MREVSX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DSEFOR0VfVFJBQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWElTVEVOQ0VfQ0hFQ0tJTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUFJJTUFSWV9LRVk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMF9fQ0FDSEVfSU5URVJDRVBUT1I6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DQUNIRV9JTlRFUkNFUFRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRkVUQ0hfR1JPVVBTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVEFCTEVfR0VORVJBVE9SOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9RVUVSSUVTOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUVVFUllfUkVESVJFQ1RPUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUEFSRU5UX0NMQVNTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUEFSRU5UX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkFOR0VfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1VOSU9OX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUE6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19BRERJVElPTkFMX0NSSVRFUklBOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlYWRPbmx5LmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFQURfT05MWV9fUkVBRF9PTkxZOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fUkVBRF9PTkxZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEN1c3RvbWl6ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ1VTVE9NSVpFUl9IT0xERVJfX0NVU1RPTUlaRVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DVVNUT01JWkVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENoYW5nZVRyYWNraW5nSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NIQU5HRV9UUkFDS0lOR19IT0xERVJfX0NIQU5HRV9UUkFDS0lORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0NIQU5HRV9UUkFDS0lORzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDYWNoZUhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DQUNIRV9IT0xERVJfX0NBQ0hFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0FDSEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NBQ0hFX0hPTERFUl9fRVhJU1RFTkNFX0NIRUNLSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhJU1RFTkNFX0NIRUNLSU5HOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlcnNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSU19IT0xERVJfX0NPTlZFUlRFUlM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fVFlQRV9DT05WRVJURVJTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fVFlQRV9DT05WRVJURVJTOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJTX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlM7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUlNfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1NUUlVDVF9DT05WRVJURVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjYWNoZWFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhY2hlYWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFyZW50Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBhcmVudENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJ0aXRpb25lZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFydGl0aW9uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWRPbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWFkT25seSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhpc3RlbmNlQ2hlY2tpbmc6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4aXN0ZW5jZUNoZWNraW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWFkT25seVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhY2hlYWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuQ0FDSEVBQkxFKTsKLQl9Ci0JCi0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFkZGl0aW9uYWxDcml0ZXJpYVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ3VzdG9taXplclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2hhbmdlVHJhY2tpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9wdGltaXN0aWNMb2NraW5nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYWNoZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FjaGVJbnRlcmNlcHRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hHcm91cHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnN0YW50aWF0aW9uQ295cFBvbGljeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2xvbmVDb3B5UG9saWN5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFF1ZXJ5UmVkaXJlY3RvcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJlUmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQb3N0UmVtb3ZlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmVVcGRhdGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RVcGRhdGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFBvc3RMb2FkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlBdHRyaWJ1dGVzLmJ1aWxkVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5DQUNIRUFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZWFibGVfMl8wX0NhY2hlYWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlYWRPbmx5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlJFQURfT05MWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSZWFkT25seV9SZWFkT25seSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGlzdGVuY2VDaGVja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2FjaGVIb2xkZXJfRXhpc3RlbmNlQ2hlY2tpbmcoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRNYXBwaW5nc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEN1c3RvbWl6ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ2xhc3NSZWZlcmVuY2UuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ3VzdG9taXplckhvbGRlcl9DdXN0b21pemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDaGFuZ2VUcmFja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDaGFuZ2VUcmFja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENoYW5nZVRyYWNraW5nSG9sZGVyX0NoYW5nZVRyYWNraW5nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByaW1hcnlLZXkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMV8xLlBSSU1BUllfS0VZLCBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcHRpbWlzdGljTG9ja2luZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPcHRpbWlzdGljTG9ja2luZy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT1BUSU1JU1RJQ19MT0NLSU5HLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfT3B0aW1pc3RpY0xvY2tpbmcoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhY2hlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENhY2hlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDYWNoZUhvbGRlcl9DYWNoZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVJbnRlcmNlcHRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbGFzc1JlZmVyZW5jZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuQ0FDSEVfSU5URVJDRVBUT1IsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoR3JvdXBzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEZldGNoR3JvdXAuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkZFVENIX0dST1VQLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfQ29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX1R5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJzSG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RydWN0Q29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlcnNIb2xkZXJfU3RydWN0Q29udmVydGVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29weVBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT1BZX1BPTElDWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0NvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluc3RhbnRpYXRpb25Db3lwUG9saWN5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEluc3RhbnRpYXRpb25Db3B5UG9saWN5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5JTlNUQU5USUFUSU9OX0NPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfSW5zdGFudGlhdGlvbkNvcHlQb2xpY3koKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsb25lQ29weVBvbGljeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDbG9uZUNvcHlQb2xpY3kuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNMT05FX0NPUFlfUE9MSUNZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfQ2xvbmVDb3B5UG9saWN5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yLmJ1aWxkVHJhbnNsYXRvcihKUEEuVEFCTEVfR0VORVJBVE9SLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWRRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVkTmF0aXZlUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sTmFtZWROYXRpdmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk5BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUlksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTcWxSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFNxbFJlc3VsdFNldE1hcHBpbmcuYnVpbGRUcmFuc2xhdG9yKEpQQS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlSZWRpcmVjdG9yc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxRdWVyeVJlZGlyZWN0b3JzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SUywgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJlbnRDbGFzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5QQVJFTlRfQ0xBU1MsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1BhcmVudENsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWRkaXRpb25hbENyaXRlcmlhVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFkZGl0aW9uYWxDcml0ZXJpYS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQURESVRJT05BTF9DUklURVJJQSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxNdXRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzlkYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE11dGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTXV0YWJsZTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxNdXRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdXRhYmxlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldE11dGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXV0YWJsZSNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNdXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBtdXRhYmxlIGF0dGlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2MDJiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbnZlcnRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxOYW1lZENvbnZlcnRlciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWRDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9DT05WRVJURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29udmVydGVyI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfQ09OVkVSVEVSX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9DT05WRVJURVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX0NPTlZFUlRFUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQ09OVkVSVEVSX19OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29udmVydGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLX0gLy8gWG1sTmFtZWRDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmJlMzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcnk8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmV0dXJuc1Jlc3VsdFNldCA8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0SGludHMgPGVtPkhpbnRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UGFyYW1ldGVycyA8ZW0+UGFyYW1ldGVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdENsYXNzKCkgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1VMVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRDbGFzcygpIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzID0gUkVTVUxUX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFNldE1hcHBpbmcoKSA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0U2V0TWFwcGluZygpIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyA9IFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZWR1cmVOYW1lKCkgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZWR1cmVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRURVUkVfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZWR1cmVOYW1lKCkgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9jZWR1cmVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2NlZHVyZU5hbWUgPSBQUk9DRURVUkVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmV0dXJuc1Jlc3VsdFNldCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCA9IFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcmFtZXRlcnMoKSA8ZW0+UGFyYW1ldGVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJhbWV0ZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiBwYXJhbWV0ZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVzdWx0Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkKLQl7Ci0JCXJldHVybiByZXN1bHRDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MgPGVtPlJlc3VsdCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bHRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyBuZXdSZXN1bHRDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRSZXN1bHRDbGFzcyA9IHJlc3VsdENsYXNzOwotCQlyZXN1bHRDbGFzcyA9IG5ld1Jlc3VsdENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUywgb2xkUmVzdWx0Q2xhc3MsIHJlc3VsdENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVzdWx0IFNldCBNYXBwaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykKLQl7Ci0JCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKLQkJcmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCByZXN1bHRTZXRNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvY2VkdXJlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2NlZHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb2NlZHVyZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm9jZWR1cmVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUHJvY2VkdXJlTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2NlZHVyZU5hbWUoKQotCXsKLQkJcmV0dXJuIHByb2NlZHVyZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFByb2NlZHVyZU5hbWUgPGVtPlByb2NlZHVyZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9jZWR1cmUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UHJvY2VkdXJlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb2NlZHVyZU5hbWUoU3RyaW5nIG5ld1Byb2NlZHVyZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkUHJvY2VkdXJlTmFtZSA9IHByb2NlZHVyZU5hbWU7Ci0JCXByb2NlZHVyZU5hbWUgPSBuZXdQcm9jZWR1cmVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FLCBvbGRQcm9jZWR1cmVOYW1lLCBwcm9jZWR1cmVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJucyBSZXN1bHQgU2V0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXR1cm5zIFJlc3VsdCBTZXQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5zUmVzdWx0U2V0KEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X1JldHVybnNSZXN1bHRTZXQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFJldHVybnNSZXN1bHRTZXQoKQotCXsKLQkJcmV0dXJuIHJldHVybnNSZXN1bHRTZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5I2dldFJldHVybnNSZXN1bHRTZXQgPGVtPlJldHVybnMgUmVzdWx0IFNldDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJucyBSZXN1bHQgU2V0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXR1cm5zUmVzdWx0U2V0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmV0dXJuc1Jlc3VsdFNldChCb29sZWFuIG5ld1JldHVybnNSZXN1bHRTZXQpCi0JewotCQlCb29sZWFuIG9sZFJldHVybnNSZXN1bHRTZXQgPSByZXR1cm5zUmVzdWx0U2V0OwotCQlyZXR1cm5zUmVzdWx0U2V0ID0gbmV3UmV0dXJuc1Jlc3VsdFNldDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVRVUk5TX1JFU1VMVF9TRVQsIG9sZFJldHVybnNSZXN1bHRTZXQsIHJldHVybnNSZXN1bHRTZXQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxRdWVyeUhpbnQ+IGdldEhpbnRzKCkKLQl7Ci0JCWlmIChoaW50cyA9PSBudWxsKQotCQl7Ci0JCQloaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxRdWVyeUhpbnQ+KFhtbFF1ZXJ5SGludC5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGhpbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJhbWV0ZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUGFyYW1ldGVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkKLQl7Ci0JCWlmIChwYXJhbWV0ZXJzID09IG51bGwpCi0JCXsKLQkJCXBhcmFtZXRlcnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyPihYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUyk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFBhcmFtZXRlcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXJldHVybiBnZXRSZXN1bHRDbGFzcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKLQkJCQlyZXR1cm4gZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXJldHVybiBnZXRQcm9jZWR1cmVOYW1lKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VUOgotCQkJCXJldHVybiBnZXRSZXR1cm5zUmVzdWx0U2V0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuIGdldEhpbnRzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlzZXRSZXN1bHRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFNldE1hcHBpbmcoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BST0NFRFVSRV9OQU1FOgotCQkJCXNldFByb2NlZHVyZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlzZXRSZXR1cm5zUmVzdWx0U2V0KChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVFM6Ci0JCQkJZ2V0SGludHMoKS5jbGVhcigpOwotCQkJCWdldEhpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxRdWVyeUhpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXI+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJc2V0UmVzdWx0Q2xhc3MoUkVTVUxUX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXNldFJlc3VsdFNldE1hcHBpbmcoUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUU6Ci0JCQkJc2V0UHJvY2VkdXJlTmFtZShQUk9DRURVUkVfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlzZXRSZXR1cm5zUmVzdWx0U2V0KFJFVFVSTlNfUkVTVUxUX1NFVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUEFSQU1FVEVSUzoKLQkJCQlnZXRQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJcmV0dXJuIFJFU1VMVF9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gcmVzdWx0Q2xhc3MgIT0gbnVsbCA6ICFSRVNVTFRfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKHJlc3VsdENsYXNzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6Ci0JCQkJcmV0dXJuIFJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVCA9PSBudWxsID8gcmVzdWx0U2V0TWFwcGluZyAhPSBudWxsIDogIVJFU1VMVF9TRVRfTUFQUElOR19FREVGQVVMVC5lcXVhbHMocmVzdWx0U2V0TWFwcGluZyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUU6Ci0JCQkJcmV0dXJuIFBST0NFRFVSRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwcm9jZWR1cmVOYW1lICE9IG51bGwgOiAhUFJPQ0VEVVJFX05BTUVfRURFRkFVTFQuZXF1YWxzKHByb2NlZHVyZU5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1JFVFVSTlNfUkVTVUxUX1NFVDoKLQkJCQlyZXR1cm4gUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5zUmVzdWx0U2V0ICE9IG51bGwgOiAhUkVUVVJOU19SRVNVTFRfU0VUX0VERUZBVUxULmVxdWFscyhyZXR1cm5zUmVzdWx0U2V0KTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gaGludHMgIT0gbnVsbCAmJiAhaGludHMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUllfX1BBUkFNRVRFUlM6Ci0JCQkJcmV0dXJuIHBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlc3VsdENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bHRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdWx0U2V0TWFwcGluZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVzdWx0U2V0TWFwcGluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvY2VkdXJlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocHJvY2VkdXJlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmV0dXJuc1Jlc3VsdFNldDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmV0dXJuc1Jlc3VsdFNldCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb2NlZHVyZU5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFJldHVyblJlc3VsdFNldFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSGludFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUGFyYW1ldGVyVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fTkFNRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVzdWx0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9SZXN1bHRTZXRNYXBwaW5nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb2NlZHVyZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUFJPQ0VEVVJFX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9Qcm9jZWR1cmVOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJldHVyblJlc3VsdFNldFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fUkVUVVJOU19SRVNVTFRfU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnlfUmV0dXJuc1Jlc3VsdFNldCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRIaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFF1ZXJ5SGludC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuTkFNRURfU1RPUkVEX1BST0NFRFVSRV9RVUVSWV9fSElOVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5X0hpbnRzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQYXJhbWV0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5OQU1FRF9TVE9SRURfUFJPQ0VEVVJFX1FVRVJZX19QQVJBTUVURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeV9QYXJhbWV0ZXJzKCkpOwotCX0KLX0gLy8gWG1sTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPYmplY3RUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTZlZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9iamVjdFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyI2dldENvbnZlcnNpb25WYWx1ZXMgPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9iamVjdFR5cGVDb252ZXJ0ZXIjZ2V0RGVmYXVsdE9iamVjdFZhbHVlIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVyc2lvblZhbHVlcygpIDxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJzaW9uVmFsdWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0T2JqZWN0VmFsdWUoKSA8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRPYmplY3RWYWx1ZSgpIDxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSA9IERFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGF0YSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREYXRhVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RhdGFUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGUoKQotCXsKLQkJcmV0dXJuIGRhdGFUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREYXRhVHlwZSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EYXRhIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoU3RyaW5nIG5ld0RhdGFUeXBlKQotCXsKLQkJU3RyaW5nIG9sZERhdGFUeXBlID0gZGF0YVR5cGU7Ci0JCWRhdGFUeXBlID0gbmV3RGF0YVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKQotCXsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQlvYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFLCBvbGRPYmplY3RUeXBlLCBvYmplY3RUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVyc2lvbiBWYWx1ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnNpb25WYWx1ZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db252ZXJzaW9uIFZhbHVlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnNpb24gVmFsdWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9Db252ZXJzaW9uVmFsdWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+IGdldENvbnZlcnNpb25WYWx1ZXMoKQotCXsKLQkJaWYgKGNvbnZlcnNpb25WYWx1ZXMgPT0gbnVsbCkKLQkJewotCQkJY29udmVyc2lvblZhbHVlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxDb252ZXJzaW9uVmFsdWU+KFhtbENvbnZlcnNpb25WYWx1ZS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTKTsKLQkJfQotCQlyZXR1cm4gY29udmVyc2lvblZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBPYmplY3QgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlZmF1bHRPYmplY3RWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPYmplY3RUeXBlQ29udmVydGVyX0RlZmF1bHRPYmplY3RWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRPYmplY3RWYWx1ZSgpCi0JewotCQlyZXR1cm4gZGVmYXVsdE9iamVjdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlciNnZXREZWZhdWx0T2JqZWN0VmFsdWUgPGVtPkRlZmF1bHQgT2JqZWN0IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWZhdWx0IE9iamVjdCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE9iamVjdFZhbHVlKFN0cmluZyBuZXdEZWZhdWx0T2JqZWN0VmFsdWUpCi0JewotCQlTdHJpbmcgb2xkRGVmYXVsdE9iamVjdFZhbHVlID0gZGVmYXVsdE9iamVjdFZhbHVlOwotCQlkZWZhdWx0T2JqZWN0VmFsdWUgPSBuZXdEZWZhdWx0T2JqZWN0VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRSwgb2xkRGVmYXVsdE9iamVjdFZhbHVlLCBkZWZhdWx0T2JqZWN0VmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q29udmVyc2lvblZhbHVlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIGdldE9iamVjdFR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCXJldHVybiBnZXRDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXNldE9iamVjdFR5cGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVM6Ci0JCQkJZ2V0Q29udmVyc2lvblZhbHVlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udmVyc2lvblZhbHVlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29udmVyc2lvblZhbHVlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUU6Ci0JCQkJc2V0RGVmYXVsdE9iamVjdFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXNldE9iamVjdFR5cGUoT0JKRUNUX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0NPTlZFUlNJT05fVkFMVUVTOgotCQkJCWdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RFRkFVTFRfT0JKRUNUX1ZBTFVFOgotCQkJCXNldERlZmF1bHRPYmplY3RWYWx1ZShERUZBVUxUX09CSkVDVF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlyZXR1cm4gREFUQV9UWVBFX0VERUZBVUxUID09IG51bGwgPyBkYXRhVHlwZSAhPSBudWxsIDogIURBVEFfVFlQRV9FREVGQVVMVC5lcXVhbHMoZGF0YVR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJcmV0dXJuIE9CSkVDVF9UWVBFX0VERUZBVUxUID09IG51bGwgPyBvYmplY3RUeXBlICE9IG51bGwgOiAhT0JKRUNUX1RZUEVfRURFRkFVTFQuZXF1YWxzKG9iamVjdFR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09CSkVDVF9UWVBFX0NPTlZFUlRFUl9fQ09OVkVSU0lPTl9WQUxVRVM6Ci0JCQkJcmV0dXJuIGNvbnZlcnNpb25WYWx1ZXMgIT0gbnVsbCAmJiAhY29udmVyc2lvblZhbHVlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19ERUZBVUxUX09CSkVDVF9WQUxVRToKLQkJCQlyZXR1cm4gREVGQVVMVF9PQkpFQ1RfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRPYmplY3RWYWx1ZSAhPSBudWxsIDogIURFRkFVTFRfT0JKRUNUX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkZWZhdWx0T2JqZWN0VmFsdWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkYXRhVHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGF0YVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9iamVjdFR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9iamVjdFR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlZmF1bHRPYmplY3RWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVmYXVsdE9iamVjdFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZWZhdWx0T2JqZWN0VmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPYmplY3RUeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJzaW9uVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVyc2lvblZhbHVlLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfQ29udmVyc2lvblZhbHVlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREVGQVVMVF9PQkpFQ1RfVkFMVUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT2JqZWN0VHlwZUNvbnZlcnRlcl9EZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfRGF0YVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9iamVjdFR5cGVDb252ZXJ0ZXJfT2JqZWN0VHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5kYXRhVHlwZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIHBhY2thZ2VMZW5ndGgsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMub2JqZWN0VHlwZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVPYmplY3RUeXBlUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLm9iamVjdFR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi19IC8vIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPbmVUb01hbnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5YjllNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9uZVRvTWFueSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55IGltcGxlbWVudHMgWG1sT25lVG9NYW55XzJfMCwgWG1sT25lVG9NYW55XzJfMSwgWG1sT25lVG9NYW55XzJfMiwgWG1sQXR0cmlidXRlTWFwcGluZywgWG1sUHJpdmF0ZU93bmVkLCBYbWxKb2luRmV0Y2gKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcigpIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVyKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcEtleUNvbnZlcnQoKSA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29udmVydCgpIDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwS2V5Q29udmVydCA9IE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJhdGNoRmV0Y2goKSA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhdGNoRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxCYXRjaEZldGNoIGJhdGNoRmV0Y2g7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25pbmcoKSA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQYXJ0aXRpb25pbmdfMl8yIHBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5nZVBhcnRpdGlvbmluZygpIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIHJhbmdlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc2hQYXJ0aXRpb25pbmcoKSA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBoYXNoUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKSA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiB1bmlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJ0aXRpb25lZCA9IFBBUlRJVElPTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGVPbkRlbGV0ZSgpIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhc2NhZGVPbkRlbGV0ZSA9IENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vbkNhY2hlYWJsZSA9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1ByaXZhdGVPd25lZCgpIDxlbT5Qcml2YXRlIE93bmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc1ByaXZhdGVPd25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFBSSVZBVEVfT1dORURfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcml2YXRlT3duZWQgPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgWG1sSm9pbkZldGNoVHlwZSBKT0lOX0ZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5GZXRjaCgpIDxlbT5Kb2luIEZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luRmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luRmV0Y2hUeXBlIGpvaW5GZXRjaCA9IEpPSU5fRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX01BTlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcml2YXRlT3duZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiBwcml2YXRlT3duZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4gbmV3UHJpdmF0ZU93bmVkKQotCXsKLQkJYm9vbGVhbiBvbGRQcml2YXRlT3duZWQgPSBwcml2YXRlT3duZWQ7Ci0JCXByaXZhdGVPd25lZCA9IG5ld1ByaXZhdGVPd25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRCwgb2xkUHJpdmF0ZU93bmVkLCBwcml2YXRlT3duZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBGZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pbkZldGNoVHlwZSBnZXRKb2luRmV0Y2goKQotCXsKLQkJcmV0dXJuIGpvaW5GZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSCwgb2xkSm9pbkZldGNoLCBqb2luRmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkKLQl7Ci0JCXJldHVybiBjb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb252ZXJ0ZXIgb2xkQ29udmVydGVyID0gY29udmVydGVyOwotCQljb252ZXJ0ZXIgPSBuZXdDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUiwgb2xkQ29udmVydGVyLCBuZXdDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldENvbnZlcnRlciA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihYbWxDb252ZXJ0ZXIgbmV3Q29udmVydGVyKQotCXsKLQkJaWYgKG5ld0NvbnZlcnRlciAhPSBjb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVIsIG5ld0NvbnZlcnRlciwgbmV3Q29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHlwZUNvbnZlcnRlciBnZXRUeXBlQ29udmVydGVyKCkKLQl7Ci0JCXJldHVybiB0eXBlQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVHlwZUNvbnZlcnRlciBvbGRUeXBlQ29udmVydGVyID0gdHlwZUNvbnZlcnRlcjsKLQkJdHlwZUNvbnZlcnRlciA9IG5ld1R5cGVDb252ZXJ0ZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSLCBvbGRUeXBlQ29udmVydGVyLCBuZXdUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRUeXBlQ29udmVydGVyIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlQ29udmVydGVyKFhtbFR5cGVDb252ZXJ0ZXIgbmV3VHlwZUNvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdUeXBlQ29udmVydGVyICE9IHR5cGVDb252ZXJ0ZXIpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHR5cGVDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdHlwZUNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1R5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUeXBlQ29udmVydGVyKG5ld1R5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVIsIG5ld1R5cGVDb252ZXJ0ZXIsIG5ld1R5cGVDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9PYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPYmplY3RUeXBlQ29udmVydGVyIGdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIG9sZE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQlvYmplY3RUeXBlQ29udmVydGVyID0gbmV3T2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBvbGRPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRPYmplY3RUeXBlQ29udmVydGVyIDxlbT5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdFR5cGVDb252ZXJ0ZXIoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBuZXdPYmplY3RUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld09iamVjdFR5cGVDb252ZXJ0ZXIgIT0gb2JqZWN0VHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAob2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdPYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9TdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFN0cnVjdENvbnZlcnRlciBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHN0cnVjdENvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBvbGRTdHJ1Y3RDb252ZXJ0ZXIgPSBzdHJ1Y3RDb252ZXJ0ZXI7Ci0JCXN0cnVjdENvbnZlcnRlciA9IG5ld1N0cnVjdENvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiwgb2xkU3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFN0cnVjdENvbnZlcnRlciA8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RydWN0IENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U3RydWN0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0Q29udmVydGVyKFhtbFN0cnVjdENvbnZlcnRlciBuZXdTdHJ1Y3RDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3U3RydWN0Q29udmVydGVyICE9IHN0cnVjdENvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoc3RydWN0Q29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXN0cnVjdENvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1N0cnVjdENvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTdHJ1Y3RDb252ZXJ0ZXIpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUiwgbmV3U3RydWN0Q29udmVydGVyLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPihYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwS2V5Q29udmVydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleUNvbnZlcnQoKQotCXsKLQkJcmV0dXJuIG1hcEtleUNvbnZlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyBuZXdNYXBLZXlDb252ZXJ0KQotCXsKLQkJU3RyaW5nIG9sZE1hcEtleUNvbnZlcnQgPSBtYXBLZXlDb252ZXJ0OwotCQltYXBLZXlDb252ZXJ0ID0gbmV3TWFwS2V5Q29udmVydDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJULCBvbGRNYXBLZXlDb252ZXJ0LCBtYXBLZXlDb252ZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgb2xkQmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0QmF0Y2hGZXRjaCA8ZW0+QmF0Y2ggRmV0Y2g8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmF0Y2hGZXRjaChYbWxCYXRjaEZldGNoIG5ld0JhdGNoRmV0Y2gpCi0JewotCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBiYXRjaEZldGNoKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChiYXRjaEZldGNoICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWJhdGNoRmV0Y2gpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0gsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QmF0Y2hGZXRjaChuZXdCYXRjaEZldGNoLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENILCBuZXdCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgbmV3QXR0cmlidXRlVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGRBdHRyaWJ1dGVUeXBlID0gYXR0cmlidXRlVHlwZTsKLQkJYXR0cmlidXRlVHlwZSA9IG5ld0F0dHJpYnV0ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBhcnRpdGlvbmluZ18yXzIgZ2V0UGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGFydGl0aW9uaW5nXzJfMiBvbGRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCXBhcnRpdGlvbmluZyA9IG5ld1BhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIgbmV3UGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBwYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1BhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkcsIG5ld1BhcnRpdGlvbmluZywgbmV3UGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nID0gbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgb2xkUm91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZyAhPSByb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBvbGRQaW5uZWRQYXJ0aXRpb25pbmcgPSBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCXBpbm5lZFBhcnRpdGlvbmluZyA9IG5ld1Bpbm5lZFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgbmV3UGlubmVkUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1Bpbm5lZFBhcnRpdGlvbmluZyAhPSBwaW5uZWRQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwaW5uZWRQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGlubmVkUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG9sZFJhbmdlUGFydGl0aW9uaW5nID0gcmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCXJhbmdlUGFydGl0aW9uaW5nID0gbmV3UmFuZ2VQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORywgb2xkUmFuZ2VQYXJ0aXRpb25pbmcsIG5ld1JhbmdlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UmFuZ2VQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBvbGRWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gdmFsdWVQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHZhbHVlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXZhbHVlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiBoYXNoUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG9sZEhhc2hQYXJ0aXRpb25pbmcgPSBoYXNoUGFydGl0aW9uaW5nOwotCQloYXNoUGFydGl0aW9uaW5nID0gbmV3SGFzaFBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgbmV3SGFzaFBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IGhhc2hQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaGFzaFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdIYXNoUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0hhc2hQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkcsIG5ld0hhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIGdldFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB1bmlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgb2xkVW5pb25QYXJ0aXRpb25pbmcgPSB1bmlvblBhcnRpdGlvbmluZzsKLQkJdW5pb25QYXJ0aXRpb25pbmcgPSBuZXdVbmlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HLCBvbGRVbmlvblBhcnRpdGlvbmluZywgbmV3VW5pb25QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdVbmlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTkVELCBvbGRQYXJ0aXRpb25lZCwgcGFydGl0aW9uZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU9uRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiBuZXdDYXNjYWRlT25EZWxldGUpCi0JewotCQlCb29sZWFuIG9sZENhc2NhZGVPbkRlbGV0ZSA9IGNhc2NhZGVPbkRlbGV0ZTsKLQkJY2FzY2FkZU9uRGVsZXRlID0gbmV3Q2FzY2FkZU9uRGVsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DQVNDQURFX09OX0RFTEVURSwgb2xkQ2FzY2FkZU9uRGVsZXRlLCBjYXNjYWRlT25EZWxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gbmV3Tm9uQ2FjaGVhYmxlKQotCXsKLQkJYm9vbGVhbiBvbGROb25DYWNoZWFibGUgPSBub25DYWNoZWFibGU7Ci0JCW5vbkNhY2hlYWJsZSA9IG5ld05vbkNhY2hlYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRSwgb2xkTm9uQ2FjaGVhYmxlLCBub25DYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldE9iamVjdFR5cGVDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0U3RydWN0Q29udmVydGVyKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QmF0Y2hGZXRjaChudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0Q29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRUeXBlQ29udmVydGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Q29udmVydCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0QmF0Y2hGZXRjaCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gaXNOb25DYWNoZWFibGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGdldEFjY2Vzc01ldGhvZHMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgotCQkJCXJldHVybiBpc1ByaXZhdGVPd25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBnZXRKb2luRmV0Y2goKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRUeXBlQ29udmVydGVyKChYbWxUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6Ci0JCQkJc2V0TWFwS2V5Q29udmVydCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcm9wZXJ0eT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDoKLQkJCQlzZXRQcml2YXRlT3duZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDoKLQkJCQlzZXRKb2luRmV0Y2goKFhtbEpvaW5GZXRjaFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoWG1sQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlzZXRPYmplY3RUeXBlQ29udmVydGVyKChYbWxPYmplY3RUeXBlQ29udmVydGVyKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjoKLQkJCQlzZXRTdHJ1Y3RDb252ZXJ0ZXIoKFhtbFN0cnVjdENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ09OVkVSVDoKLQkJCQlzZXRNYXBLZXlDb252ZXJ0KE1BUF9LRVlfQ09OVkVSVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlzZXRCYXRjaEZldGNoKChYbWxCYXRjaEZldGNoKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZShBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJc2V0Q2FzY2FkZU9uRGVsZXRlKENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKE5PTl9DQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOgotCQkJCXNldFByaXZhdGVPd25lZChQUklWQVRFX09XTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOgotCQkJCXJldHVybiB0eXBlQ29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzICE9IG51bGwgJiYgIW1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOgotCQkJCXJldHVybiBNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQgPT0gbnVsbCA/IG1hcEtleUNvbnZlcnQgIT0gbnVsbCA6ICFNQVBfS0VZX0NPTlZFUlRfRURFRkFVTFQuZXF1YWxzKG1hcEtleUNvbnZlcnQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDoKLQkJCQlyZXR1cm4gYmF0Y2hGZXRjaCAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGF0dHJpYnV0ZVR5cGUgIT0gbnVsbCA6ICFBVFRSSUJVVEVfVFlQRV9FREVGQVVMVC5lcXVhbHMoYXR0cmlidXRlVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSEFTSF9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU6Ci0JCQkJcmV0dXJuIENBU0NBREVfT05fREVMRVRFX0VERUZBVUxUID09IG51bGwgPyBjYXNjYWRlT25EZWxldGUgIT0gbnVsbCA6ICFDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVC5lcXVhbHMoY2FzY2FkZU9uRGVsZXRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gbm9uQ2FjaGVhYmxlICE9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19KT0lOX0ZFVENIOgotCQkJCXJldHVybiBqb2luRmV0Y2ggIT0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGVySG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0NPTlZFUlQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmF0Y2hGZXRjaEhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19WQUxVRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX09ORV9UT19NQU5ZXzIyX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJJVkFURV9PV05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfX0pPSU5fRkVUQ0g7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0ZXJIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19UWVBFX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PQkpFQ1RfVFlQRV9DT05WRVJURVI7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1NUUlVDVF9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19TVFJVQ1RfQ09OVkVSVEVSOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT05WRVJUOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb01hbnlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0hBU0hfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV8yMl9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpdmF0ZU93bmVkLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSVZBVEVfT1dORURfX1BSSVZBVEVfT1dORUQ6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hcEtleUNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcEtleUNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcml2YXRlT3duZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaXZhdGVPd25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlYbWxPcmRlckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKSksCQkKLQkJCWJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUVudW1lcmF0ZWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNvbnZlcnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09OVkVSVCwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXNzb2NpYXRpb25PdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX0NvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfVHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPYmplY3RUeXBlQ29udmVydGVyLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTdHJ1Y3RDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpdmF0ZU93bmVkX1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pbkZldGNoX0pvaW5GZXRjaCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQmF0Y2hGZXRjaC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQkFUQ0hfRkVUQ0gsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaEhvbGRlcl9CYXRjaEZldGNoKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ0FTQ0FERV9PTl9ERUxFVEUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVDb250YWluZXJfSm9pblRhYmxlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5YzdkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gT25lPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT25lVG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sT25lVG9PbmUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lIGltcGxlbWVudHMgWG1sT25lVG9PbmVfMl8xLCBYbWxPbmVUb09uZV8yXzIsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbFByaXZhdGVPd25lZCwgWG1sSm9pbkZldGNoCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmF0Y2hGZXRjaCgpIDxlbT5CYXRjaCBGZXRjaDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhdGNoRmV0Y2ggYmF0Y2hGZXRjaDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmluZygpIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZ18yXzIgcGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBpbm5lZFBhcnRpdGlvbmluZygpIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHBpbm5lZFBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkgPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgcmFuZ2VQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIHZhbHVlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SGFzaFBhcnRpdGlvbmluZygpIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGhhc2hQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlvblBhcnRpdGlvbmluZygpIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHVuaW9uUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSVElUSU9ORURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFydGl0aW9uZWQoKSA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnRpdGlvbmVkID0gUEFSVElUSU9ORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlT25EZWxldGUoKSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gY2FzY2FkZU9uRGVsZXRlID0gQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBOT05fQ0FDSEVBQkxFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc05vbkNhY2hlYWJsZSgpIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbm9uQ2FjaGVhYmxlID0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUHJpdmF0ZU93bmVkKCkgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzUHJpdmF0ZU93bmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUFJJVkFURV9PV05FRF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQcml2YXRlT3duZWQoKSA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaXZhdGVPd25lZCA9IFBSSVZBVEVfT1dORURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxKb2luRmV0Y2hUeXBlIEpPSU5fRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkZldGNoKCkgPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5GZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5GZXRjaFR5cGUgam9pbkZldGNoID0gSk9JTl9GRVRDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPbmVUb09uZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09ORV9UT19PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJhdGNoIEZldGNoPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2gpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoSG9sZGVyX0JhdGNoRmV0Y2goKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEJhdGNoRmV0Y2ggZ2V0QmF0Y2hGZXRjaCgpCi0JewotCQlyZXR1cm4gYmF0Y2hGZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRCYXRjaEZldGNoKFhtbEJhdGNoRmV0Y2ggbmV3QmF0Y2hGZXRjaCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEJhdGNoRmV0Y2ggb2xkQmF0Y2hGZXRjaCA9IGJhdGNoRmV0Y2g7Ci0JCWJhdGNoRmV0Y2ggPSBuZXdCYXRjaEZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENILCBvbGRCYXRjaEZldGNoLCBuZXdCYXRjaEZldGNoKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldEJhdGNoRmV0Y2ggPGVtPkJhdGNoIEZldGNoPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QmF0Y2hGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhdGNoRmV0Y2goWG1sQmF0Y2hGZXRjaCBuZXdCYXRjaEZldGNoKQotCXsKLQkJaWYgKG5ld0JhdGNoRmV0Y2ggIT0gYmF0Y2hGZXRjaCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCliYXRjaEZldGNoKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QmF0Y2hGZXRjaCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdCYXRjaEZldGNoKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRCYXRjaEZldGNoKG5ld0JhdGNoRmV0Y2gsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSCwgbmV3QmF0Y2hGZXRjaCwgbmV3QmF0Y2hGZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uaW5nKFhtbFBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQYXJ0aXRpb25pbmdfMl8yIGdldFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yIG5ld1BhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFBhcnRpdGlvbmluZ18yXzIgb2xkUGFydGl0aW9uaW5nID0gcGFydGl0aW9uaW5nOwotCQlwYXJ0aXRpb25pbmcgPSBuZXdQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HLCBvbGRQYXJ0aXRpb25pbmcsIG5ld1BhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IHBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgbmV3UGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZywgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nID0gcm91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJcm91bmRSb2JpblBhcnRpdGlvbmluZyA9IG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBvbGRSb3VuZFJvYmluUGFydGl0aW9uaW5nLCBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gcm91bmRSb2JpblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocm91bmRSb2JpblBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyb3VuZFJvYmluUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGlubmVkUGFydGl0aW9uaW5nKFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIGdldFBpbm5lZFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG5ld1Bpbm5lZFBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgb2xkUGlubmVkUGFydGl0aW9uaW5nID0gcGlubmVkUGFydGl0aW9uaW5nOwotCQlwaW5uZWRQYXJ0aXRpb25pbmcgPSBuZXdQaW5uZWRQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgb2xkUGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IHBpbm5lZFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIGdldFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByYW5nZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgb2xkUmFuZ2VQYXJ0aXRpb25pbmcgPSByYW5nZVBhcnRpdGlvbmluZzsKLQkJcmFuZ2VQYXJ0aXRpb25pbmcgPSBuZXdSYW5nZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIG5ld1JhbmdlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IHJhbmdlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChyYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClyYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdSYW5nZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG5ld1JhbmdlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HLCBuZXdSYW5nZVBhcnRpdGlvbmluZywgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgb2xkVmFsdWVQYXJ0aXRpb25pbmcgPSB2YWx1ZVBhcnRpdGlvbmluZzsKLQkJdmFsdWVQYXJ0aXRpb25pbmcgPSBuZXdWYWx1ZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkcsIG9sZFZhbHVlUGFydGl0aW9uaW5nLCBuZXdWYWx1ZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRWYWx1ZVBhcnRpdGlvbmluZyA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIG5ld1ZhbHVlUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld1ZhbHVlUGFydGl0aW9uaW5nICE9IHZhbHVlUGFydGl0aW9uaW5nKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl2YWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdWYWx1ZVBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG5ld1ZhbHVlUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HLCBuZXdWYWx1ZVBhcnRpdGlvbmluZywgbmV3VmFsdWVQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIG5ld0hhc2hQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBvbGRIYXNoUGFydGl0aW9uaW5nID0gaGFzaFBhcnRpdGlvbmluZzsKLQkJaGFzaFBhcnRpdGlvbmluZyA9IG5ld0hhc2hQYXJ0aXRpb25pbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkcsIG9sZEhhc2hQYXJ0aXRpb25pbmcsIG5ld0hhc2hQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gaGFzaFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbmV3SGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBvbGRVbmlvblBhcnRpdGlvbmluZyA9IHVuaW9uUGFydGl0aW9uaW5nOwotCQl1bmlvblBhcnRpdGlvbmluZyA9IG5ld1VuaW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lI2dldFVuaW9uUGFydGl0aW9uaW5nIDxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlvblBhcnRpdGlvbmluZyhYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgbmV3VW5pb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gdW5pb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHVuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXVuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1VuaW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1VuaW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VW5pb25QYXJ0aXRpb25pbmcobmV3VW5pb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkcsIG5ld1VuaW9uUGFydGl0aW9uaW5nLCBuZXdVbmlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmVkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25lZChTdHJpbmcgbmV3UGFydGl0aW9uZWQpCi0JewotCQlTdHJpbmcgb2xkUGFydGl0aW9uZWQgPSBwYXJ0aXRpb25lZDsKLQkJcGFydGl0aW9uZWQgPSBuZXdQYXJ0aXRpb25lZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05FRCwgb2xkUGFydGl0aW9uZWQsIHBhcnRpdGlvbmVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZU9uRGVsZXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIG5ld0Nhc2NhZGVPbkRlbGV0ZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZU9uRGVsZXRlID0gY2FzY2FkZU9uRGVsZXRlOwotCQljYXNjYWRlT25EZWxldGUgPSBuZXdDYXNjYWRlT25EZWxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEUsIG9sZENhc2NhZGVPbkRlbGV0ZSwgY2FzY2FkZU9uRGVsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25DYWNoZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb25DYWNoZWFibGUoYm9vbGVhbiBuZXdOb25DYWNoZWFibGUpCi0JewotCQlib29sZWFuIG9sZE5vbkNhY2hlYWJsZSA9IG5vbkNhY2hlYWJsZTsKLQkJbm9uQ2FjaGVhYmxlID0gbmV3Tm9uQ2FjaGVhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEUsIG9sZE5vbkNhY2hlYWJsZSwgbm9uQ2FjaGVhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpdmF0ZSBPd25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcml2YXRlIE93bmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcml2YXRlT3duZWQoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZU93bmVkKCkKLQl7Ci0JCXJldHVybiBwcml2YXRlT3duZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcml2YXRlT3duZWQoYm9vbGVhbiBuZXdQcml2YXRlT3duZWQpCi0JewotCQlib29sZWFuIG9sZFByaXZhdGVPd25lZCA9IHByaXZhdGVPd25lZDsKLQkJcHJpdmF0ZU93bmVkID0gbmV3UHJpdmF0ZU93bmVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQsIG9sZFByaXZhdGVPd25lZCwgcHJpdmF0ZU93bmVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBGZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIEZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxKb2luRmV0Y2hfSm9pbkZldGNoKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5GZXRjaFR5cGUgZ2V0Sm9pbkZldGNoKCkKLQl7Ci0JCXJldHVybiBqb2luRmV0Y2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRKb2luRmV0Y2ggPGVtPkpvaW4gRmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gRmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0Sm9pbkZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUgbmV3Sm9pbkZldGNoKQotCXsKLQkJWG1sSm9pbkZldGNoVHlwZSBvbGRKb2luRmV0Y2ggPSBqb2luRmV0Y2g7Ci0JCWpvaW5GZXRjaCA9IG5ld0pvaW5GZXRjaCA9PSBudWxsID8gSk9JTl9GRVRDSF9FREVGQVVMVCA6IG5ld0pvaW5GZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENILCBvbGRKb2luRmV0Y2gsIGpvaW5GZXRjaCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXJldHVybiBiYXNpY1NldEJhdGNoRmV0Y2gobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFJhbmdlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEJhdGNoRmV0Y2goKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBpc05vbkNhY2hlYWJsZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBnZXRBY2Nlc3NNZXRob2RzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIGlzUHJpdmF0ZU93bmVkKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkZldGNoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKChYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JBTkdFX1BBUlRJVElPTklORzoKLQkJCQlzZXRSYW5nZVBhcnRpdGlvbmluZygoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRVbmlvblBhcnRpdGlvbmluZygoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXNldENhc2NhZGVPbkRlbGV0ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJc2V0Tm9uQ2FjaGVhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDoKLQkJCQlzZXRQcml2YXRlT3duZWQoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOgotCQkJCXNldEpvaW5GZXRjaCgoWG1sSm9pbkZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOgotCQkJCXNldEJhdGNoRmV0Y2goKFhtbEJhdGNoRmV0Y2gpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmFuZ2VQYXJ0aXRpb25pbmcoKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXNldFZhbHVlUGFydGl0aW9uaW5nKChYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19VTklPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VW5pb25QYXJ0aXRpb25pbmcoKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ6Ci0JCQkJc2V0UGFydGl0aW9uZWQoUEFSVElUSU9ORURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19DQVNDQURFX09OX0RFTEVURToKLQkJCQlzZXRDYXNjYWRlT25EZWxldGUoQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXNldE5vbkNhY2hlYWJsZShOT05fQ0FDSEVBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJPUEVSVElFUzoKLQkJCQlnZXRQcm9wZXJ0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDoKLQkJCQlzZXRQcml2YXRlT3duZWQoUFJJVkFURV9PV05FRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJc2V0Sm9pbkZldGNoKEpPSU5fRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQkFUQ0hfRkVUQ0g6Ci0JCQkJcmV0dXJuIGJhdGNoRmV0Y2ggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwaW5uZWRQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB2YWx1ZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBoYXNoUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiB1bmlvblBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBQQVJUSVRJT05FRF9FREVGQVVMVCA9PSBudWxsID8gcGFydGl0aW9uZWQgIT0gbnVsbCA6ICFQQVJUSVRJT05FRF9FREVGQVVMVC5lcXVhbHMocGFydGl0aW9uZWQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0NBU0NBREVfT05fREVMRVRFOgotCQkJCXJldHVybiBDQVNDQURFX09OX0RFTEVURV9FREVGQVVMVCA9PSBudWxsID8gY2FzY2FkZU9uRGVsZXRlICE9IG51bGwgOiAhQ0FTQ0FERV9PTl9ERUxFVEVfRURFRkFVTFQuZXF1YWxzKGNhc2NhZGVPbkRlbGV0ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlyZXR1cm4gbm9uQ2FjaGVhYmxlICE9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSVZBVEVfT1dORUQ6Ci0JCQkJcmV0dXJuIHByaXZhdGVPd25lZCAhPSBQUklWQVRFX09XTkVEX0VERUZBVUxUOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0pPSU5fRkVUQ0g6Ci0JCQkJcmV0dXJuIGpvaW5GZXRjaCAhPSBKT0lOX0ZFVENIX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXRjaEZldGNoSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURTsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaXZhdGVPd25lZC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklWQVRFX09XTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklWQVRFX09XTkVEX19QUklWQVRFX09XTkVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5GZXRjaC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19KT0lOX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmF0Y2hGZXRjaEhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19CQVRDSF9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZV8yXzEuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9PbmVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQ0FTQ0FERV9PTl9ERUxFVEU7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcml2YXRlT3duZWQuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJVkFURV9PV05FRF9fUFJJVkFURV9PV05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJVkFURV9PV05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luRmV0Y2guY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9fSk9JTl9GRVRDSDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fSk9JTl9GRVRDSDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHBhcnRpdGlvbmVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChwYXJ0aXRpb25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU9uRGVsZXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlT25EZWxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcml2YXRlT3duZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByaXZhdGVPd25lZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgam9pbkZldGNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqb2luRmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcml2YXRlT3duZWRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEpvaW5GZXRjaFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0RW50aXR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9ycGhhblJlbW92YWxUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHNJZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVPbkRlbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpdmF0ZU93bmVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZEJhdGNoRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByaXZhdGVPd25lZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUklWQVRFX09XTkVELCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaXZhdGVPd25lZF9Qcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5GZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5GZXRjaF9Kb2luRmV0Y2goKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByb3BlcnR5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFByb3BlcnR5LmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NNZXRob2RzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc01ldGhvZHMuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkFDQ0VTU19NRVRIT0RTLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRCYXRjaEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEJhdGNoRmV0Y2guYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkJBVENIX0ZFVENILCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXJfQmF0Y2hGZXRjaCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlT25EZWxldGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQ2FzY2FkZVR5cGUuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkNBU0NBREVfT05fREVMRVRFLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5UYWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luVGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX1RBQkxFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVDb250YWluZXJfSm9pblRhYmxlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9wdGltaXN0aWNMb2NraW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExMDc5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3B0aW1pc3RpYyBMb2NraW5nPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZyNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmcjZ2V0U2VsZWN0ZWRDb2x1bW5zIDxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcHRpbWlzdGljTG9ja2luZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPcHRpbWlzdGljTG9ja2luZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FzY2FkZSgpIDxlbT5DYXNjYWRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXNjYWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FTQ0FERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXNjYWRlKCkgPGVtPkNhc2NhZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIGNhc2NhZGUgPSBDQVNDQURFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VsZWN0ZWRDb2x1bW5zKCkgPGVtPlNlbGVjdGVkIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VsZWN0ZWRDb2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29sdW1uPiBzZWxlY3RlZENvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3B0aW1pc3RpY0xvY2tpbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nVHlwZQotCSAqIEBzZWUgI3NldFR5cGUoWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldFR5cGUgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUKLQkgKiBAc2VlICNnZXRUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUgbmV3VHlwZSkKLQl7Ci0JCVhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBvbGRUeXBlID0gdHlwZTsKLQkJdHlwZSA9IG5ld1R5cGUgPT0gbnVsbCA/IFRZUEVfRURFRkFVTFQgOiBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRSwgb2xkVHlwZSwgdHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sT3B0aW1pc3RpY0xvY2tpbmdfQ2FzY2FkZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0Q2FzY2FkZSgpCi0JewotCQlyZXR1cm4gY2FzY2FkZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9wdGltaXN0aWNMb2NraW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKEJvb2xlYW4gbmV3Q2FzY2FkZSkKLQl7Ci0JCUJvb2xlYW4gb2xkQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JCWNhc2NhZGUgPSBuZXdDYXNjYWRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERSwgb2xkQ2FzY2FkZSwgY2FzY2FkZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlbGVjdGVkIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZWxlY3RlZCBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VsZWN0ZWQgQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nX1NlbGVjdGVkQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29sdW1uPiBnZXRTZWxlY3RlZENvbHVtbnMoKQotCXsKLQkJaWYgKHNlbGVjdGVkQ29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQlzZWxlY3RlZENvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29sdW1uPihYbWxDb2x1bW4uY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRDb2x1bW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNlbGVjdGVkQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fQ0FTQ0FERToKLQkJCQlyZXR1cm4gZ2V0Q2FzY2FkZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0U2VsZWN0ZWRDb2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKLQkJCQlzZXRUeXBlKChYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fU0VMRUNURURfQ09MVU1OUzoKLQkJCQlnZXRTZWxlY3RlZENvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldFNlbGVjdGVkQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09QVElNSVNUSUNfTE9DS0lOR19fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZShDQVNDQURFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1BUSU1JU1RJQ19MT0NLSU5HX19TRUxFQ1RFRF9DT0xVTU5TOgotCQkJCWdldFNlbGVjdGVkQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1RZUEU6Ci0JCQkJcmV0dXJuIHR5cGUgIT0gVFlQRV9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX0NBU0NBREU6Ci0JCQkJcmV0dXJuIENBU0NBREVfRURFRkFVTFQgPT0gbnVsbCA/IGNhc2NhZGUgIT0gbnVsbCA6ICFDQVNDQURFX0VERUZBVUxULmVxdWFscyhjYXNjYWRlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIHNlbGVjdGVkQ29sdW1ucyAhPSBudWxsICYmICFzZWxlY3RlZENvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh0eXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0eXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXNjYWRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkVHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2VsZWN0ZWRDb2x1bW5UcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT1BUSU1JU1RJQ19MT0NLSU5HX19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX1R5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuT1BUSU1JU1RJQ19MT0NLSU5HX19DQVNDQURFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9wdGltaXN0aWNMb2NraW5nX0Nhc2NhZGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VsZWN0ZWRDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5PUFRJTUlTVElDX0xPQ0tJTkdfX1NFTEVDVEVEX0NPTFVNTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcHRpbWlzdGljTG9ja2luZ19TZWxlY3RlZENvbHVtbnMoKSk7Ci0JfQotCi19IC8vIFhtbE9wdGltaXN0aWNMb2NraW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODkzNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9wdGltaXN0aWNMb2NraW5nVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFMTCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FMTF9DT0xVTU5TX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQUxMX0NPTFVNTlMoMCwgIkFMTF9DT0xVTU5TIiwgIkFMTF9DT0xVTU5TIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEFOR0VEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0hBTkdFRF9DT0xVTU5TX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0hBTkdFRF9DT0xVTU5TKDEsICJDSEFOR0VEX0NPTFVNTlMiLCAiQ0hBTkdFRF9DT0xVTU5TIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRUxFQ1RFRCBDT0xVTU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NFTEVDVEVEX0NPTFVNTlNfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRUxFQ1RFRF9DT0xVTU5TKDIsICJTRUxFQ1RFRF9DT0xVTU5TIiwgIlNFTEVDVEVEX0NPTFVNTlMiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlZFUlNJT04gQ09MVU1OPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1ZFUlNJT05fQ09MVU1OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVkVSU0lPTl9DT0xVTU4oMywgIlZFUlNJT05fQ09MVU1OIiwgIlZFUlNJT05fQ09MVU1OIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTEwgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QUxMIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQUxMX0NPTFVNTlMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfQ09MVU1OU19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEFOR0VEIENPTFVNTlM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNIQU5HRUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFOR0VEX0NPTFVNTlMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEX0NPTFVNTlNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VMRUNURUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0VMRUNURUQgQ09MVU1OUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRUxFQ1RFRF9DT0xVTU5TCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNURURfQ09MVU1OU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5WRVJTSU9OIENPTFVNTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VkVSU0lPTiBDT0xVTU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVkVSU0lPTl9DT0xVTU4KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OX0NPTFVNTl9WQUxVRSA9IDM7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYbWxPcHRpbWlzdGljTG9ja2luZ1R5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlW10KLQkJewotCQkJQUxMX0NPTFVNTlMsCi0JCQlDSEFOR0VEX0NPTFVNTlMsCi0JCQlTRUxFQ1RFRF9DT0xVTU5TLAotCQkJVkVSU0lPTl9DT0xVTU4sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBPcHRpbWlzdGljIExvY2tpbmcgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIE9wdGltaXN0aWMgTG9ja2luZyBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIEFMTF9DT0xVTU5TX1ZBTFVFOiByZXR1cm4gQUxMX0NPTFVNTlM7Ci0JCQljYXNlIENIQU5HRURfQ09MVU1OU19WQUxVRTogcmV0dXJuIENIQU5HRURfQ09MVU1OUzsKLQkJCWNhc2UgU0VMRUNURURfQ09MVU1OU19WQUxVRTogcmV0dXJuIFNFTEVDVEVEX0NPTFVNTlM7Ci0JCQljYXNlIFZFUlNJT05fQ09MVU1OX1ZBTFVFOiByZXR1cm4gVkVSU0lPTl9DT0xVTU47Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFhtbE9wdGltaXN0aWNMb2NraW5nVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vWG1sT3B0aW1pc3RpY0xvY2tpbmdUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI3M2E5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyIENvbHVtbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPcmRlckNvbHVtbiBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gaW1wbGVtZW50cyBYbWxPcmRlckNvbHVtbl8yXzAKLXsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIENPUlJFQ1RJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb3JyZWN0aW9uVHlwZSgpIDxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvcnJlY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3JkZXJDb2x1bW4oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PUkRFUl9DT0xVTU47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSAjc2V0Q29ycmVjdGlvblR5cGUoT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzApCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfQ29ycmVjdGlvblR5cGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgZ2V0Q29ycmVjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIGNvcnJlY3Rpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0Q29ycmVjdGlvblR5cGUgPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMAotCSAqIEBzZWUgI2dldENvcnJlY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ycmVjdGlvblR5cGUoT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgbmV3Q29ycmVjdGlvblR5cGUpCi0JewotCQlPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCBvbGRDb3JyZWN0aW9uVHlwZSA9IGNvcnJlY3Rpb25UeXBlOwotCQljb3JyZWN0aW9uVHlwZSA9IG5ld0NvcnJlY3Rpb25UeXBlID09IG51bGwgPyBDT1JSRUNUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdDb3JyZWN0aW9uVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRSwgb2xkQ29ycmVjdGlvblR5cGUsIGNvcnJlY3Rpb25UeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGdldENvcnJlY3Rpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFOgotCQkJCXNldENvcnJlY3Rpb25UeXBlKChPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFOgotCQkJCXNldENvcnJlY3Rpb25UeXBlKENPUlJFQ1RJT05fVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0NPUlJFQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY29ycmVjdGlvblR5cGUgIT0gQ09SUkVDVElPTl9UWVBFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19DT1JSRUNUSU9OX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19DT1JSRUNUSU9OX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fQ09SUkVDVElPTl9UWVBFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29ycmVjdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvcnJlY3Rpb25UeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGROdWxsYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVXBkYXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb3JyZWN0aW9uVHlwZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvcnJlY3Rpb25UeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8wLkNPUlJFQ1RJT05fVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBhcnRpdGlvbmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNkZmFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQYXJ0aXRpb25pbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGFydGl0aW9uaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIFhtbFBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4MmEzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBpbXBsZW1lbnRzIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBY2Nlc3NNZXRob2RzIGdldEFjY2Vzc01ldGhvZHMoKQotCXsKLQkJcmV0dXJuIGFjY2Vzc01ldGhvZHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxBY2Nlc3NNZXRob2RzIG9sZEFjY2Vzc01ldGhvZHMgPSBhY2Nlc3NNZXRob2RzOwotCQlhY2Nlc3NNZXRob2RzID0gbmV3QWNjZXNzTWV0aG9kczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhdGFsb2dUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlbGltaXRlZElkZW50aWZpZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi19IC8vIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2VjMWJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzRXhjbHVkZURlZmF1bHRNYXBwaW5ncyA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKSA8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBFWENMVURFX0RFRkFVTFRfTUFQUElOR1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IE1hcHBpbmdzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzIDxlbT5FeGNsdWRlIERlZmF1bHQgTWFwcGluZ3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgRGVmYXVsdCBNYXBwaW5nczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncyhib29sZWFuIG5ld0V4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgPSBleGNsdWRlRGVmYXVsdE1hcHBpbmdzOwotCQlleGNsdWRlRGVmYXVsdE1hcHBpbmdzID0gbmV3RXhjbHVkZURlZmF1bHRNYXBwaW5nczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1MsIG9sZEV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MsIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZURlZmF1bHRNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJc2V0RXhjbHVkZURlZmF1bHRNYXBwaW5ncygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0VYQ0xVREVfREVGQVVMVF9NQVBQSU5HUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzKEVYQ0xVREVfREVGQVVMVF9NQVBQSU5HU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19FWENMVURFX0RFRkFVTFRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TWFwcGluZ3MgIT0gRVhDTFVERV9ERUZBVUxUX01BUFBJTkdTX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChleGNsdWRlRGVmYXVsdE1hcHBpbmdzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdE1hcHBpbmdzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsIAotCQkJc3RydWN0dXJhbEZlYXR1cmUsIAotCQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpLAotCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlRGVmYXVsdE1hcHBpbmdzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYQ0xVREVfREVGQVVMVF9NQVBQSU5HUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9FeGNsdWRlRGVmYXVsdE1hcHBpbmdzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQaW5uZWRQYXJ0aXRpb25pbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQaW5uZWRQYXJ0aXRpb25pbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmOGM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUGlubmVkUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQaW5uZWRQYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUElOTkVEX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBpbm5lZFBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUElOTkVEX1BBUlRJVElPTklOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUElOTkVEX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QSU5ORURfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFBpbm5lZFBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDRhYTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcmltYXJ5IEtleTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByaW1hcnlLZXkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxQcmltYXJ5S2V5XzFfMSwgWG1sUHJpbWFyeUtleV8yXzEKLXsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJZFZhbGlkYXRpb25UeXBlXzFfMSBWQUxJREFUSU9OX0VERUZBVUxUID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWxpZGF0aW9uKCkgPGVtPlZhbGlkYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbGlkYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJZFZhbGlkYXRpb25UeXBlXzFfMSB2YWxpZGF0aW9uID0gVkFMSURBVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbnMoKSA8ZW0+Q29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQ29sdW1uPiBjb2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhY2hlS2V5VHlwZSgpIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVLZXlUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENhY2hlS2V5VHlwZV8yXzEgQ0FDSEVfS0VZX1RZUEVfRURFRkFVTFQgPSBDYWNoZUtleVR5cGVfMl8xLklEX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVLZXlUeXBlKCkgPGVtPkNhY2hlIEtleSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZUtleVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBDYWNoZUtleVR5cGVfMl8xIGNhY2hlS2V5VHlwZSA9IENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9QUklNQVJZX0tFWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkgKiBAc2VlICNzZXRWYWxpZGF0aW9uKElkVmFsaWRhdGlvblR5cGVfMV8xKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfVmFsaWRhdGlvbigpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZFZhbGlkYXRpb25UeXBlXzFfMSBnZXRWYWxpZGF0aW9uKCkKLQl7Ci0JCXJldHVybiB2YWxpZGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBzZWUgI2dldFZhbGlkYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uKElkVmFsaWRhdGlvblR5cGVfMV8xIG5ld1ZhbGlkYXRpb24pCi0JewotCQlJZFZhbGlkYXRpb25UeXBlXzFfMSBvbGRWYWxpZGF0aW9uID0gdmFsaWRhdGlvbjsKLQkJdmFsaWRhdGlvbiA9IG5ld1ZhbGlkYXRpb24gPT0gbnVsbCA/IFZBTElEQVRJT05fRURFRkFVTFQgOiBuZXdWYWxpZGF0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OLCBvbGRWYWxpZGF0aW9uLCB2YWxpZGF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQ29sdW1uPiBnZXRDb2x1bW5zKCkKLQl7Ci0JCWlmIChjb2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQ29sdW1uPihYbWxDb2x1bW4uY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBjb2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xX0NhY2hlS2V5VHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUtleVR5cGVfMl8xIGdldENhY2hlS2V5VHlwZSgpCi0JewotCQlyZXR1cm4gY2FjaGVLZXlUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleSNnZXRDYWNoZUtleVR5cGUgPGVtPkNhY2hlIEtleSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMQotCSAqIEBzZWUgI2dldENhY2hlS2V5VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhY2hlS2V5VHlwZShDYWNoZUtleVR5cGVfMl8xIG5ld0NhY2hlS2V5VHlwZSkKLQl7Ci0JCUNhY2hlS2V5VHlwZV8yXzEgb2xkQ2FjaGVLZXlUeXBlID0gY2FjaGVLZXlUeXBlOwotCQljYWNoZUtleVR5cGUgPSBuZXdDYWNoZUtleVR5cGUgPT0gbnVsbCA/IENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUIDogbmV3Q2FjaGVLZXlUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRSwgb2xkQ2FjaGVLZXlUeXBlLCBjYWNoZUtleVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fVkFMSURBVElPTjoKLQkJCQlyZXR1cm4gZ2V0VmFsaWRhdGlvbigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgotCQkJCXJldHVybiBnZXRDb2x1bW5zKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXJldHVybiBnZXRDYWNoZUtleVR5cGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX1ZBTElEQVRJT046Ci0JCQkJc2V0VmFsaWRhdGlvbigoSWRWYWxpZGF0aW9uVHlwZV8xXzEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ09MVU1OUzoKLQkJCQlnZXRDb2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRDb2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxDb2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXNldENhY2hlS2V5VHlwZSgoQ2FjaGVLZXlUeXBlXzJfMSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgotCQkJCXNldFZhbGlkYXRpb24oVkFMSURBVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DT0xVTU5TOgotCQkJCWdldENvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9fQ0FDSEVfS0VZX1RZUEU6Ci0JCQkJc2V0Q2FjaGVLZXlUeXBlKENBQ0hFX0tFWV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19WQUxJREFUSU9OOgotCQkJCXJldHVybiB2YWxpZGF0aW9uICE9IFZBTElEQVRJT05fRURFRkFVTFQ7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGNvbHVtbnMgIT0gbnVsbCAmJiAhY29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfX0NBQ0hFX0tFWV9UWVBFOgotCQkJCXJldHVybiBjYWNoZUtleVR5cGUgIT0gQ0FDSEVfS0VZX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZXzIxX19DQUNIRV9LRVlfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX19DQUNIRV9LRVlfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbGlkYXRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbGlkYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhY2hlS2V5VHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2FjaGVLZXlUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleSgpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFZhbGlkYXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlS2V5VHlwZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbGlkYXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVlfX1ZBTElEQVRJT04sIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FjaGVLZXlUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8xLkNBQ0hFX0tFWV9UWVBFLCBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsxXzEuUFJJTUFSWV9LRVlfX0NPTFVNTiwgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpdmF0ZU93bmVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJpdmF0ZU93bmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDE5MTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaXZhdGVPd25lZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcml2YXRlIE93bmVkPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcml2YXRlT3duZWQjaXNQcml2YXRlT3duZWQgPGVtPlByaXZhdGUgT3duZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByaXZhdGVPd25lZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUHJpdmF0ZU93bmVkIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaXZhdGUgT3duZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaXZhdGUgT3duZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJpdmF0ZU93bmVkKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcml2YXRlT3duZWRfUHJpdmF0ZU93bmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJpdmF0ZU93bmVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaXZhdGVPd25lZCNpc1ByaXZhdGVPd25lZCA8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJpdmF0ZSBPd25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNQcml2YXRlT3duZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFByaXZhdGVPd25lZChib29sZWFuIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcHJpdmF0ZS1vd25lZCBhdHRpYnV0ZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UHJpdmF0ZU93bmVkVGV4dFJhbmdlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByb3BlcnR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwNjRkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByb3BlcnR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0VmFsdWVUeXBlIDxlbT5WYWx1ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQcm9wZXJ0eSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZSA9IFZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlVHlwZSgpIDxlbT5WYWx1ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVUeXBlKCkgPGVtPlZhbHVlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZVR5cGUgPSBWQUxVRV9UWVBFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByb3BlcnR5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUFJPUEVSVFk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5X05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGUoKQotCXsKLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5I2dldFZhbHVlVHlwZSA8ZW0+VmFsdWUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmFsdWVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWVUeXBlKFN0cmluZyBuZXdWYWx1ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkVmFsdWVUeXBlID0gdmFsdWVUeXBlOwotCQl2YWx1ZVR5cGUgPSBuZXdWYWx1ZVR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEUsIG9sZFZhbHVlVHlwZSwgdmFsdWVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFZhbHVlVHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRV9UWVBFOgotCQkJCXNldFZhbHVlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJc2V0VmFsdWVUeXBlKFZBTFVFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFX1RZUEU6Ci0JCQkJcmV0dXJuIFZBTFVFX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlVHlwZSAhPSBudWxsIDogIVZBTFVFX1RZUEVfRURFRkFVTFQuZXF1YWxzKHZhbHVlVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHZhbHVlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVmFsdWVUeXBlVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZX19OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFlfX1ZBTFVFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbHVlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QUk9QRVJUWV9fVkFMVUVfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9WYWx1ZVR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbFByb3BlcnR5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUHJvcGVydHlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJhMDBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxQcm9wZXJ0eUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJvcGVydHkgQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHlDb250YWluZXIjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByb3BlcnR5Q29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpOwotCi19IC8vIFhtbFByb3BlcnR5Q29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWZhYjBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUXVlcnkgQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzIDxlbT5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeUNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBTdG9yZWQgUHJvY2VkdXJlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgU3RvcmVkIFByb2NlZHVyZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnk+IGdldE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcmllcygpOwotCi19IC8vIFhtbFF1ZXJ5Q29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlSZWRpcmVjdG9ycy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5UmVkaXJlY3RvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiMWU5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlSZWRpcmVjdG9ycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBRdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxRdWVyeVJlZGlyZWN0b3JzIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsUXVlcmllcygpIDxlbT5BbGwgUXVlcmllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX1FVRVJJRVNfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsUXVlcmllcygpIDxlbT5BbGwgUXVlcmllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhbGxRdWVyaWVzID0gQUxMX1FVRVJJRVNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZEFsbCgpIDxlbT5SZWFkIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZEFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9BTExfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZEFsbCgpIDxlbT5SZWFkIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZEFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkQWxsID0gUkVBRF9BTExfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9iamVjdCgpIDxlbT5SZWFkIE9iamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9PQkpFQ1RfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVhZE9iamVjdCgpIDxlbT5SZWFkIE9iamVjdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVhZE9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkT2JqZWN0ID0gUkVBRF9PQkpFQ1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0KCkgPGVtPlJlcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPUlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVwb3J0KCkgPGVtPlJlcG9ydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwb3J0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlcG9ydCA9IFJFUE9SVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGUoKSA8ZW0+VXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGUoKSA8ZW0+VXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdXBkYXRlID0gVVBEQVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc2VydCgpIDxlbT5JbnNlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc2VydCgpIDxlbT5JbnNlcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBpbnNlcnQgPSBJTlNFUlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsZXRlKCkgPGVtPkRlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVsZXRlKCkgPGVtPkRlbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlbGV0ZSA9IERFTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxRdWVyeVJlZGlyZWN0b3JzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUVVFUllfUkVESVJFQ1RPUlM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBRdWVyaWVzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBbGxRdWVyaWVzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0FsbFF1ZXJpZXMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbGxRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiBhbGxRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlSZWRpcmVjdG9ycyNnZXRBbGxRdWVyaWVzIDxlbT5BbGwgUXVlcmllczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEFsbFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxRdWVyaWVzKFN0cmluZyBuZXdBbGxRdWVyaWVzKQotCXsKLQkJU3RyaW5nIG9sZEFsbFF1ZXJpZXMgPSBhbGxRdWVyaWVzOwotCQlhbGxRdWVyaWVzID0gbmV3QWxsUXVlcmllczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVMsIG9sZEFsbFF1ZXJpZXMsIGFsbFF1ZXJpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZWFkIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVhZCBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlYWRBbGwoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlYWRBbGwoKQotCXsKLQkJcmV0dXJuIHJlYWRBbGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldFJlYWRBbGwgPGVtPlJlYWQgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVhZEFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlYWRBbGwoU3RyaW5nIG5ld1JlYWRBbGwpCi0JewotCQlTdHJpbmcgb2xkUmVhZEFsbCA9IHJlYWRBbGw7Ci0JCXJlYWRBbGwgPSBuZXdSZWFkQWxsOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTCwgb2xkUmVhZEFsbCwgcmVhZEFsbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZE9iamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhZE9iamVjdCgpCi0JewotCQlyZXR1cm4gcmVhZE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnMjZ2V0UmVhZE9iamVjdCA8ZW0+UmVhZCBPYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVhZE9iamVjdChTdHJpbmcgbmV3UmVhZE9iamVjdCkKLQl7Ci0JCVN0cmluZyBvbGRSZWFkT2JqZWN0ID0gcmVhZE9iamVjdDsKLQkJcmVhZE9iamVjdCA9IG5ld1JlYWRPYmplY3Q7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNULCBvbGRSZWFkT2JqZWN0LCByZWFkT2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwb3J0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZXBvcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVwb3J0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3J0KCkKLQl7Ci0JCXJldHVybiByZXBvcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlcG9ydChTdHJpbmcgbmV3UmVwb3J0KQotCXsKLQkJU3RyaW5nIG9sZFJlcG9ydCA9IHJlcG9ydDsKLQkJcmVwb3J0ID0gbmV3UmVwb3J0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQsIG9sZFJlcG9ydCwgcmVwb3J0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRVcGRhdGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfVXBkYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiB1cGRhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldFVwZGF0ZSA8ZW0+VXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZShTdHJpbmcgbmV3VXBkYXRlKQotCXsKLQkJU3RyaW5nIG9sZFVwZGF0ZSA9IHVwZGF0ZTsKLQkJdXBkYXRlID0gbmV3VXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19VUERBVEUsIG9sZFVwZGF0ZSwgdXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zZXJ0KCkKLQl7Ci0JCXJldHVybiBpbnNlcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldEluc2VydCA8ZW0+SW5zZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc2VydChTdHJpbmcgbmV3SW5zZXJ0KQotCXsKLQkJU3RyaW5nIG9sZEluc2VydCA9IGluc2VydDsKLQkJaW5zZXJ0ID0gbmV3SW5zZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQsIG9sZEluc2VydCwgaW5zZXJ0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxldGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVsZXRlKCkKLQl7Ci0JCXJldHVybiBkZWxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeVJlZGlyZWN0b3JzI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGV0ZShTdHJpbmcgbmV3RGVsZXRlKQotCXsKLQkJU3RyaW5nIG9sZERlbGV0ZSA9IGRlbGV0ZTsKLQkJZGVsZXRlID0gbmV3RGVsZXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19ERUxFVEUsIG9sZERlbGV0ZSwgZGVsZXRlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTOgotCQkJCXJldHVybiBnZXRBbGxRdWVyaWVzKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMOgotCQkJCXJldHVybiBnZXRSZWFkQWxsKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUOgotCQkJCXJldHVybiBnZXRSZWFkT2JqZWN0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVDoKLQkJCQlyZXR1cm4gZ2V0UmVwb3J0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURToKLQkJCQlyZXR1cm4gZ2V0VXBkYXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVDoKLQkJCQlyZXR1cm4gZ2V0SW5zZXJ0KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURToKLQkJCQlyZXR1cm4gZ2V0RGVsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19BTExfUVVFUklFUzoKLQkJCQlzZXRBbGxRdWVyaWVzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEw6Ci0JCQkJc2V0UmVhZEFsbCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUOgotCQkJCXNldFJlYWRPYmplY3QoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRVBPUlQ6Ci0JCQkJc2V0UmVwb3J0KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFOgotCQkJCXNldFVwZGF0ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVDoKLQkJCQlzZXRJbnNlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19ERUxFVEU6Ci0JCQkJc2V0RGVsZXRlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fQUxMX1FVRVJJRVM6Ci0JCQkJc2V0QWxsUXVlcmllcyhBTExfUVVFUklFU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX0FMTDoKLQkJCQlzZXRSZWFkQWxsKFJFQURfQUxMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUOgotCQkJCXNldFJlYWRPYmplY3QoUkVBRF9PQkpFQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JUOgotCQkJCXNldFJlcG9ydChSRVBPUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFOgotCQkJCXNldFVwZGF0ZShVUERBVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJUOgotCQkJCXNldEluc2VydChJTlNFUlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFOgotCQkJCXNldERlbGV0ZShERUxFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTOgotCQkJCXJldHVybiBBTExfUVVFUklFU19FREVGQVVMVCA9PSBudWxsID8gYWxsUXVlcmllcyAhPSBudWxsIDogIUFMTF9RVUVSSUVTX0VERUZBVUxULmVxdWFscyhhbGxRdWVyaWVzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9RVUVSWV9SRURJUkVDVE9SU19fUkVBRF9BTEw6Ci0JCQkJcmV0dXJuIFJFQURfQUxMX0VERUZBVUxUID09IG51bGwgPyByZWFkQWxsICE9IG51bGwgOiAhUkVBRF9BTExfRURFRkFVTFQuZXF1YWxzKHJlYWRBbGwpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1FVRVJZX1JFRElSRUNUT1JTX19SRUFEX09CSkVDVDoKLQkJCQlyZXR1cm4gUkVBRF9PQkpFQ1RfRURFRkFVTFQgPT0gbnVsbCA/IHJlYWRPYmplY3QgIT0gbnVsbCA6ICFSRUFEX09CSkVDVF9FREVGQVVMVC5lcXVhbHMocmVhZE9iamVjdCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVDoKLQkJCQlyZXR1cm4gUkVQT1JUX0VERUZBVUxUID09IG51bGwgPyByZXBvcnQgIT0gbnVsbCA6ICFSRVBPUlRfRURFRkFVTFQuZXF1YWxzKHJlcG9ydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX1VQREFURToKLQkJCQlyZXR1cm4gVVBEQVRFX0VERUZBVUxUID09IG51bGwgPyB1cGRhdGUgIT0gbnVsbCA6ICFVUERBVEVfRURFRkFVTFQuZXF1YWxzKHVwZGF0ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0lOU0VSVDoKLQkJCQlyZXR1cm4gSU5TRVJUX0VERUZBVUxUID09IG51bGwgPyBpbnNlcnQgIT0gbnVsbCA6ICFJTlNFUlRfRURFRkFVTFQuZXF1YWxzKGluc2VydCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURToKLQkJCQlyZXR1cm4gREVMRVRFX0VERUZBVUxUID09IG51bGwgPyBkZWxldGUgIT0gbnVsbCA6ICFERUxFVEVfRURFRkFVTFQuZXF1YWxzKGRlbGV0ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGFsbFF1ZXJpZXM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsbFF1ZXJpZXMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWRBbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYWRBbGwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlYWRPYmplY3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlYWRPYmplY3QpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHJlcG9ydDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVwb3J0KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cGRhdGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVwZGF0ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgaW5zZXJ0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbnNlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlbGV0ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpLAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRBbGxRdWVyaWVzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWFkQWxsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWFkT2JqZWN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXBvcnRUcmFuc2xhdG9yKCksCi0JCQlidWlsZFVwZGF0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGREZWxldGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFsbFF1ZXJpZXNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlYWRBbGxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlYWRPYmplY3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzAuUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNULCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlcG9ydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fUkVQT1JULCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluc2VydFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fSU5TRVJULCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMC5RVUVSWV9SRURJUkVDVE9SU19fREVMRVRFLCBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxRdWVyeVJlZGlyZWN0b3JzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmFuZ2VQYXJ0aXRpb25pbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSYW5nZVBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFiY2UwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSYW5nZVBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUmFuZ2VQYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JBTkdFX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmFuZ2VQYXJ0aXRpb25pbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JBTkdFX1BBUlRJVElPTklOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JBTkdFX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkFOR0VfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SQU5HRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxSYW5nZVBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlYWRPbmx5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmOTI4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVhZE9ubHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUmVhZCBPbmx5PC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWFkT25seSNnZXRSZWFkT25seSA8ZW0+UmVhZCBPbmx5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxSZWFkT25seSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUmVhZE9ubHkgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBPbmx5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkT25seShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVhZE9ubHlfUmVhZE9ubHkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0UmVhZE9ubHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVhZE9ubHkjZ2V0UmVhZE9ubHkgPGVtPlJlYWQgT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT25seSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVhZE9ubHkoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlYWQtb25seSBhdHRpYnV0ZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVhZE9ubHlUZXh0UmFuZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE0NTY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJldHVybkluc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYyZjAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSZXR1cm5JbnNlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSZXR1cm4gSW5zZXJ0PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxSZXR1cm5JbnNlcnQgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxSZXR1cm5JbnNlcnRfMl8xCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJldHVybk9ubHkoKSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRVRVUk5fT05MWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXR1cm5Pbmx5KCkgPGVtPlJldHVybiBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXR1cm5Pbmx5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiByZXR1cm5Pbmx5ID0gUkVUVVJOX09OTFlfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmV0dXJuSW5zZXJ0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUkVUVVJOX0lOU0VSVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJldHVybk9ubHkoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0UmV0dXJuT25seSgpCi0JewotCQlyZXR1cm4gcmV0dXJuT25seTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydCNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXR1cm5Pbmx5KEJvb2xlYW4gbmV3UmV0dXJuT25seSkKLQl7Ci0JCUJvb2xlYW4gb2xkUmV0dXJuT25seSA9IHJldHVybk9ubHk7Ci0JCXJldHVybk9ubHkgPSBuZXdSZXR1cm5Pbmx5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfX1JFVFVSTl9PTkxZLCBvbGRSZXR1cm5Pbmx5LCByZXR1cm5Pbmx5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJcmV0dXJuIGdldFJldHVybk9ubHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJc2V0UmV0dXJuT25seSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JFVFVSTl9JTlNFUlRfX1JFVFVSTl9PTkxZOgotCQkJCXNldFJldHVybk9ubHkoUkVUVVJOX09OTFlfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUkVUVVJOX0lOU0VSVF9fUkVUVVJOX09OTFk6Ci0JCQkJcmV0dXJuIFJFVFVSTl9PTkxZX0VERUZBVUxUID09IG51bGwgPyByZXR1cm5Pbmx5ICE9IG51bGwgOiAhUkVUVVJOX09OTFlfRURFRkFVTFQuZXF1YWxzKHJldHVybk9ubHkpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZXR1cm5Pbmx5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXR1cm5Pbmx5KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRSZXR1cm5Pbmx5VHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmV0dXJuT25seVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5SRVRVUk5fT05MWSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMV9SZXR1cm5Pbmx5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlkNTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1JPVU5EX1JPQklOX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDJkMDQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTZWNvbmRhcnlUYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgaW1wbGVtZW50cyBYbWxTZWNvbmRhcnlUYWJsZV8yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uU3VmZml4KCkgPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRpb25TdWZmaXggPSBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRUNPTkRBUllfVEFCTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpCi0JewotCQlyZXR1cm4gY3JlYXRpb25TdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZSNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVgsIG9sZENyZWF0aW9uU3VmZml4LCBjcmVhdGlvblN1ZmZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uU3VmZml4ICE9IG51bGwgOiAhQ1JFQVRJT05fU1VGRklYX0VERUZBVUxULmVxdWFscyhjcmVhdGlvblN1ZmZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlY29uZGFyeVRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2Vjb25kYXJ5VGFibGVfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjcmVhdGlvblN1ZmZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25TdWZmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JFQVRJT05fU1VGRklYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFNlY29uZGFyeVRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjE5ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU3RvcmVkIFByb2NlZHVyZSBQYXJhbWV0ZXI8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyI2dldERpcmVjdGlvbiA8ZW0+RGlyZWN0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRRdWVyeVBhcmFtZXRlciA8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRUeXBlIDxlbT5UeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSA8ZW0+SmRiYyBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZU5hbWUgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbERpcmVjdGlvbiBESVJFQ1RJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlyZWN0aW9uKCkgPGVtPkRpcmVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRGlyZWN0aW9uIGRpcmVjdGlvbiA9IERJUkVDVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFF1ZXJ5UGFyYW1ldGVyKCkgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeVBhcmFtZXRlcigpIDxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5UGFyYW1ldGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyID0gUVVFUllfUEFSQU1FVEVSX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFR5cGUoKSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUeXBlKCkgPGVtPlR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZSA9IFRZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGUoKSA8ZW0+SmRiYyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKZGJjVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEpEQkNfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZSgpIDxlbT5KZGJjIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBqZGJjVHlwZSA9IEpEQkNfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKZGJjVHlwZU5hbWUoKSA8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRCQ19UWVBFX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SmRiY1R5cGVOYW1lKCkgPGVtPkpkYmMgVHlwZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKZGJjVHlwZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgamRiY1R5cGVOYW1lID0gSkRCQ19UWVBFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlyZWN0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXJlY3Rpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlyZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpcmVjdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpcmVjdGlvbgotCSAqIEBzZWUgI3NldERpcmVjdGlvbihYbWxEaXJlY3Rpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbERpcmVjdGlvbiBnZXREaXJlY3Rpb24oKQotCXsKLQkJcmV0dXJuIGRpcmVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXREaXJlY3Rpb24gPGVtPkRpcmVjdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlyZWN0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlyZWN0aW9uCi0JICogQHNlZSAjZ2V0RGlyZWN0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uKFhtbERpcmVjdGlvbiBuZXdEaXJlY3Rpb24pCi0JewotCQlYbWxEaXJlY3Rpb24gb2xkRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotCQlkaXJlY3Rpb24gPSBuZXdEaXJlY3Rpb24gPT0gbnVsbCA/IERJUkVDVElPTl9FREVGQVVMVCA6IG5ld0RpcmVjdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OLCBvbGREaXJlY3Rpb24sIGRpcmVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnkgUGFyYW1ldGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBQYXJhbWV0ZXI8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRdWVyeVBhcmFtZXRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtZXRlcigpCi0JewotCQlyZXR1cm4gcXVlcnlQYXJhbWV0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0UXVlcnlQYXJhbWV0ZXIgPGVtPlF1ZXJ5IFBhcmFtZXRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUGFyYW1ldGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeVBhcmFtZXRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW1ldGVyKFN0cmluZyBuZXdRdWVyeVBhcmFtZXRlcikKLQl7Ci0JCVN0cmluZyBvbGRRdWVyeVBhcmFtZXRlciA9IHF1ZXJ5UGFyYW1ldGVyOwotCQlxdWVyeVBhcmFtZXRlciA9IG5ld1F1ZXJ5UGFyYW1ldGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVIsIG9sZFF1ZXJ5UGFyYW1ldGVyLCBxdWVyeVBhcmFtZXRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotCXsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0VHlwZSA8ZW0+VHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIG5ld1R5cGUpCi0JewotCQlTdHJpbmcgb2xkVHlwZSA9IHR5cGU7Ci0JCXR5cGUgPSBuZXdUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19UWVBFLCBvbGRUeXBlLCB0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SmRiYyBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5KZGJjIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKZGJjVHlwZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX0pkYmNUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEpkYmNUeXBlKCkKLQl7Ci0JCXJldHVybiBqZGJjVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciNnZXRKZGJjVHlwZSA8ZW0+SmRiYyBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5KZGJjIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpkYmNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmRiY1R5cGUoSW50ZWdlciBuZXdKZGJjVHlwZSkKLQl7Ci0JCUludGVnZXIgb2xkSmRiY1R5cGUgPSBqZGJjVHlwZTsKLQkJamRiY1R5cGUgPSBuZXdKZGJjVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFLCBvbGRKZGJjVHlwZSwgamRiY1R5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KZGJjIFR5cGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEpkYmNUeXBlTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfSmRiY1R5cGVOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmRiY1R5cGVOYW1lKCkKLQl7Ci0JCXJldHVybiBqZGJjVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIjZ2V0SmRiY1R5cGVOYW1lIDxlbT5KZGJjIFR5cGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmRiYyBUeXBlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEpkYmNUeXBlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpkYmNUeXBlTmFtZShTdHJpbmcgbmV3SmRiY1R5cGVOYW1lKQotCXsKLQkJU3RyaW5nIG9sZEpkYmNUeXBlTmFtZSA9IGpkYmNUeXBlTmFtZTsKLQkJamRiY1R5cGVOYW1lID0gbmV3SmRiY1R5cGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRSwgb2xkSmRiY1R5cGVOYW1lLCBqZGJjVHlwZU5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fRElSRUNUSU9OOgotCQkJCXJldHVybiBnZXREaXJlY3Rpb24oKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5UGFyYW1ldGVyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1RZUEU6Ci0JCQkJcmV0dXJuIGdldFR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXJldHVybiBnZXRKZGJjVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0SmRiY1R5cGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19ESVJFQ1RJT046Ci0JCQkJc2V0RGlyZWN0aW9uKChYbWxEaXJlY3Rpb24pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fUVVFUllfUEFSQU1FVEVSOgotCQkJCXNldFF1ZXJ5UGFyYW1ldGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlzZXRUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXNldEpkYmNUeXBlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FOgotCQkJCXNldEpkYmNUeXBlTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKLQkJCQlzZXREaXJlY3Rpb24oRElSRUNUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUjoKLQkJCQlzZXRRdWVyeVBhcmFtZXRlcihRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlzZXRUeXBlKFRZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFOgotCQkJCXNldEpkYmNUeXBlKEpEQkNfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEVfTkFNRToKLQkJCQlzZXRKZGJjVHlwZU5hbWUoSkRCQ19UWVBFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RPUkVEX1BST0NFRFVSRV9QQVJBTUVURVJfX0RJUkVDVElPTjoKLQkJCQlyZXR1cm4gZGlyZWN0aW9uICE9IERJUkVDVElPTl9FREVGQVVMVDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19RVUVSWV9QQVJBTUVURVI6Ci0JCQkJcmV0dXJuIFFVRVJZX1BBUkFNRVRFUl9FREVGQVVMVCA9PSBudWxsID8gcXVlcnlQYXJhbWV0ZXIgIT0gbnVsbCA6ICFRVUVSWV9QQVJBTUVURVJfRURFRkFVTFQuZXF1YWxzKHF1ZXJ5UGFyYW1ldGVyKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fVFlQRToKLQkJCQlyZXR1cm4gVFlQRV9FREVGQVVMVCA9PSBudWxsID8gdHlwZSAhPSBudWxsIDogIVRZUEVfRURFRkFVTFQuZXF1YWxzKHR5cGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1NUT1JFRF9QUk9DRURVUkVfUEFSQU1FVEVSX19KREJDX1RZUEU6Ci0JCQkJcmV0dXJuIEpEQkNfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gamRiY1R5cGUgIT0gbnVsbCA6ICFKREJDX1RZUEVfRURFRkFVTFQuZXF1YWxzKGpkYmNUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVE9SRURfUFJPQ0VEVVJFX1BBUkFNRVRFUl9fSkRCQ19UWVBFX05BTUU6Ci0JCQkJcmV0dXJuIEpEQkNfVFlQRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBqZGJjVHlwZU5hbWUgIT0gbnVsbCA6ICFKREJDX1RZUEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoamRiY1R5cGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlyZWN0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkaXJlY3Rpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHF1ZXJ5UGFyYW1ldGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChxdWVyeVBhcmFtZXRlcik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdHlwZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgamRiY1R5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqZGJjVHlwZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGpkYmNUeXBlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUXVlcnlQYXJhbWV0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKZGJjVHlwZU5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpcmVjdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0RJUkVDVElPTiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfRGlyZWN0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX05BTUUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVBhcmFtZXRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX1FVRVJZX1BBUkFNRVRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfUXVlcnlQYXJhbWV0ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJfVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBBUkFNRVRFUl9fSkRCQ19UWVBFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpkYmNUeXBlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5QQVJBTUVURVJfX0pEQkNfVFlQRV9OQU1FLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcl9KZGJjVHlwZU5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIFhtbFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFN0cnVjdENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzAyODkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxTdHJ1Y3RDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTdHJ1Y3QgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXIjZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTdHJ1Y3RDb252ZXJ0ZXIgZXh0ZW5kcyBYbWxOYW1lZENvbnZlcnRlcgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlZFUlRFUl9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydGVyKCkgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRlciA9IENPTlZFUlRFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTdHJ1Y3RDb252ZXJ0ZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TVFJVQ1RfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tQ29udmVydGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29udmVydGVyKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlciNnZXRDb252ZXJ0ZXIgPGVtPkNvbnZlcnRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoU3RyaW5nIG5ld0NvbnZlcnRlcikKLQl7Ci0JCVN0cmluZyBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgY29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXNldENvbnZlcnRlcihDT05WRVJURVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBDT05WRVJURVJfRURFRkFVTFQgPT0gbnVsbCA/IGNvbnZlcnRlciAhPSBudWxsIDogIUNPTlZFUlRFUl9FREVGQVVMVC5lcXVhbHMoY29udmVydGVyKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29udmVydGVyOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb252ZXJ0ZXIpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFN0cnVjdENvbnZlcnRlcl9Db252ZXJ0ZXIoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLmNvbnZlcnRlci5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSX19DT05WRVJURVIpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5jb252ZXJ0ZXIubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUl9fQ09OVkVSVEVSKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci19IC8vIFhtbFN0cnVjdENvbnZlcnRlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkOWQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUYWJsZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUgaW1wbGVtZW50cyBYbWxUYWJsZV8yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uU3VmZml4KCkgPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRpb25TdWZmaXggPSBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiBjcmVhdGlvblN1ZmZpeDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcgbmV3Q3JlYXRpb25TdWZmaXgpCi0JewotCQlTdHJpbmcgb2xkQ3JlYXRpb25TdWZmaXggPSBjcmVhdGlvblN1ZmZpeDsKLQkJY3JlYXRpb25TdWZmaXggPSBuZXdDcmVhdGlvblN1ZmZpeDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYLCBvbGRDcmVhdGlvblN1ZmZpeCwgY3JlYXRpb25TdWZmaXgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXNldENyZWF0aW9uU3VmZml4KENSRUFUSU9OX1NVRkZJWF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uU3VmZml4ICE9IG51bGwgOiAhQ1JFQVRJT05fU1VGRklYX0VERUZBVUxULmVxdWFscyhjcmVhdGlvblN1ZmZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9fQ1JFQVRJT05fU1VGRklYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFRhYmxlXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfX0NSRUFUSU9OX1NVRkZJWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNyZWF0aW9uU3VmZml4OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjcmVhdGlvblN1ZmZpeCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGUoKSwgCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDcmVhdGlvblN1ZmZpeFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENyZWF0aW9uU3VmZml4VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rMl8yLkNSRUFUSU9OX1NVRkZJWCwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxUYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNGM2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUYWJsZUdlbmVyYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IgaW1wbGVtZW50cyBYbWxUYWJsZUdlbmVyYXRvcl8yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q3JlYXRpb25TdWZmaXgoKSA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENyZWF0aW9uU3VmZml4KCkgPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3JlYXRpb25TdWZmaXggPSBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRV9HRU5FUkFUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpCi0JewotCQlyZXR1cm4gY3JlYXRpb25TdWZmaXg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIG5ld0NyZWF0aW9uU3VmZml4KQotCXsKLQkJU3RyaW5nIG9sZENyZWF0aW9uU3VmZml4ID0gY3JlYXRpb25TdWZmaXg7Ci0JCWNyZWF0aW9uU3VmZml4ID0gbmV3Q3JlYXRpb25TdWZmaXg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVgsIG9sZENyZWF0aW9uU3VmZml4LCBjcmVhdGlvblN1ZmZpeCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWDoKLQkJCQlzZXRDcmVhdGlvblN1ZmZpeCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVg6Ci0JCQkJc2V0Q3JlYXRpb25TdWZmaXgoQ1JFQVRJT05fU1VGRklYX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ1JFQVRJT05fU1VGRklYOgotCQkJCXJldHVybiBDUkVBVElPTl9TVUZGSVhfRURFRkFVTFQgPT0gbnVsbCA/IGNyZWF0aW9uU3VmZml4ICE9IG51bGwgOiAhQ1JFQVRJT05fU1VGRklYX0VERUZBVUxULmVxdWFscyhjcmVhdGlvblN1ZmZpeCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFRhYmxlR2VuZXJhdG9yXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl8yMl9fQ1JFQVRJT05fU1VGRklYOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVGFibGVHZW5lcmF0b3JfMl8yLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfMjJfX0NSRUFUSU9OX1NVRkZJWDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DUkVBVElPTl9TVUZGSVg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjcmVhdGlvblN1ZmZpeDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY3JlYXRpb25TdWZmaXgpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwgCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwgCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yKCksIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZENyZWF0aW9uU3VmZml4VHJhbnNsYXRvcigpLAotCQkJYnVpbGRQa0NvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFZhbHVlQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlYbWxVbmlxdWVDb25zdHJhaW50LmJ1aWxkVHJhbnNsYXRvcihKUEEuVU5JUVVFX0NPTlNUUkFJTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCkpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ3JlYXRpb25TdWZmaXhUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuQ1JFQVRJT05fU1VGRklYLCBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFRhYmxlR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGltZU9mRGF5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGltZU9mRGF5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMGM3MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRpbWVPZkRheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUaW1lIE9mIERheTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbnV0ZSA8ZW0+TWludXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRpbWVPZkRheSNnZXRTZWNvbmQgPGVtPlNlY29uZDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWlsbGlzZWNvbmQgPGVtPk1pbGxpc2Vjb25kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVGltZU9mRGF5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRIb3VyKCkgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBIT1VSX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhvdXIoKSA8ZW0+SG91cjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SG91cigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgaG91ciA9IEhPVVJfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWludXRlKCkgPGVtPk1pbnV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWludXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgTUlOVVRFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pbnV0ZSgpIDxlbT5NaW51dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1pbnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgbWludXRlID0gTUlOVVRFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlY29uZCgpIDxlbT5TZWNvbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFNFQ09ORF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWNvbmQoKSA8ZW0+U2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWNvbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIHNlY29uZCA9IFNFQ09ORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaWxsaXNlY29uZCgpIDxlbT5NaWxsaXNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWlsbGlzZWNvbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBNSUxMSVNFQ09ORF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNaWxsaXNlY29uZCgpIDxlbT5NaWxsaXNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWlsbGlzZWNvbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIG1pbGxpc2Vjb25kID0gTUlMTElTRUNPTkRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGltZU9mRGF5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVElNRV9PRl9EQVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SG91cjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SG91cjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ib3VyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRIb3VyKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfSG91cigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRIb3VyKCkKLQl7Ci0JCXJldHVybiBob3VyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldEhvdXIgPGVtPkhvdXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhvdXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEhvdXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIb3VyKEludGVnZXIgbmV3SG91cikKLQl7Ci0JCUludGVnZXIgb2xkSG91ciA9IGhvdXI7Ci0JCWhvdXIgPSBuZXdIb3VyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSLCBvbGRIb3VyLCBob3VyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWludXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NaW51dGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWludXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNaW51dGUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFRpbWVPZkRheV9NaW51dGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0TWludXRlKCkKLQl7Ci0JCXJldHVybiBtaW51dGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUaW1lT2ZEYXkjZ2V0TWludXRlIDxlbT5NaW51dGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbnV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWludXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWludXRlKEludGVnZXIgbmV3TWludXRlKQotCXsKLQkJSW50ZWdlciBvbGRNaW51dGUgPSBtaW51dGU7Ci0JCW1pbnV0ZSA9IG5ld01pbnV0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlOVVRFLCBvbGRNaW51dGUsIG1pbnV0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2Vjb25kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlY29uZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2Vjb25kKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFNlY29uZCgpCi0JewotCQlyZXR1cm4gc2Vjb25kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldFNlY29uZCA8ZW0+U2Vjb25kPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNlY29uZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlY29uZChJbnRlZ2VyIG5ld1NlY29uZCkKLQl7Ci0JCUludGVnZXIgb2xkU2Vjb25kID0gc2Vjb25kOwotCQlzZWNvbmQgPSBuZXdTZWNvbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORCwgb2xkU2Vjb25kLCBzZWNvbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NaWxsaXNlY29uZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1pbGxpc2Vjb25kKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUaW1lT2ZEYXlfTWlsbGlzZWNvbmQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0TWlsbGlzZWNvbmQoKQotCXsKLQkJcmV0dXJuIG1pbGxpc2Vjb25kOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGltZU9mRGF5I2dldE1pbGxpc2Vjb25kIDxlbT5NaWxsaXNlY29uZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWlsbGlzZWNvbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1pbGxpc2Vjb25kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWlsbGlzZWNvbmQoSW50ZWdlciBuZXdNaWxsaXNlY29uZCkKLQl7Ci0JCUludGVnZXIgb2xkTWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZDsKLQkJbWlsbGlzZWNvbmQgPSBuZXdNaWxsaXNlY29uZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIG9sZE1pbGxpc2Vjb25kLCBtaWxsaXNlY29uZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgotCQkJCXJldHVybiBnZXRIb3VyKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKLQkJCQlyZXR1cm4gZ2V0TWludXRlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX1NFQ09ORDoKLQkJCQlyZXR1cm4gZ2V0U2Vjb25kKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTExJU0VDT05EOgotCQkJCXJldHVybiBnZXRNaWxsaXNlY29uZCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlzZXRIb3VyKChJbnRlZ2VyKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVElNRV9PRl9EQVlfX01JTlVURToKLQkJCQlzZXRNaW51dGUoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fU0VDT05EOgotCQkJCXNldFNlY29uZCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlzZXRNaWxsaXNlY29uZCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19IT1VSOgotCQkJCXNldEhvdXIoSE9VUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJc2V0TWludXRlKE1JTlVURV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6Ci0JCQkJc2V0U2Vjb25kKFNFQ09ORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlzZXRNaWxsaXNlY29uZChNSUxMSVNFQ09ORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9USU1FX09GX0RBWV9fSE9VUjoKLQkJCQlyZXR1cm4gSE9VUl9FREVGQVVMVCA9PSBudWxsID8gaG91ciAhPSBudWxsIDogIUhPVVJfRURFRkFVTFQuZXF1YWxzKGhvdXIpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSU5VVEU6Ci0JCQkJcmV0dXJuIE1JTlVURV9FREVGQVVMVCA9PSBudWxsID8gbWludXRlICE9IG51bGwgOiAhTUlOVVRFX0VERUZBVUxULmVxdWFscyhtaW51dGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19TRUNPTkQ6Ci0JCQkJcmV0dXJuIFNFQ09ORF9FREVGQVVMVCA9PSBudWxsID8gc2Vjb25kICE9IG51bGwgOiAhU0VDT05EX0VERUZBVUxULmVxdWFscyhzZWNvbmQpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RJTUVfT0ZfREFZX19NSUxMSVNFQ09ORDoKLQkJCQlyZXR1cm4gTUlMTElTRUNPTkRfRURFRkFVTFQgPT0gbnVsbCA/IG1pbGxpc2Vjb25kICE9IG51bGwgOiAhTUlMTElTRUNPTkRfRURFRkFVTFQuZXF1YWxzKG1pbGxpc2Vjb25kKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaG91cjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaG91cik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWludXRlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtaW51dGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNlY29uZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2Vjb25kKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtaWxsaXNlY29uZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWlsbGlzZWNvbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRIb3VyVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNaW51dGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlY29uZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWlsbGlzZWNvbmRUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEhvdXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuRVhQSVJZX1RJTUVfT0ZfREFZX19IT1VSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRpbWVPZkRheV9Ib3VyKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1pbnV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX01JTlVURSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfTWludXRlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNlY29uZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5FWFBJUllfVElNRV9PRl9EQVlfX1NFQ09ORCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUaW1lT2ZEYXlfU2Vjb25kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1pbGxpc2Vjb25kVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkVYUElSWV9USU1FX09GX0RBWV9fTUlMTElTRUNPTkQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGltZU9mRGF5X01pbGxpc2Vjb25kKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxUaW1lT2ZEYXkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUcmFuc2Zvcm1hdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZDM3MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHJhbnNmb3JtYXRpb24gSW1wbDwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuICoKLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2Zvcm1hdGlvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbFRyYW5zZm9ybWF0aW9uXzJfMSwgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVR5cGUgPSBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRyYW5zZm9ybWF0aW9uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2Zvcm1hdGlvbiNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyBuZXdBdHRyaWJ1dGVUeXBlKQotCXsKLQkJU3RyaW5nIG9sZEF0dHJpYnV0ZVR5cGUgPSBhdHRyaWJ1dGVUeXBlOwotCQlhdHRyaWJ1dGVUeXBlID0gbmV3QXR0cmlidXRlVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEUsIG9sZEF0dHJpYnV0ZVR5cGUsIGF0dHJpYnV0ZVR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zZm9ybWF0aW9uI2dldEFjY2Vzc01ldGhvZHMgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzKQotCXsKLQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gYWNjZXNzTWV0aG9kcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoYWNjZXNzTWV0aG9kcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClhY2Nlc3NNZXRob2RzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUywgbmV3QWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJvcGVydHk+IGdldFByb3BlcnRpZXMoKQotCXsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJewotCQkJcHJvcGVydGllcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcm9wZXJ0eT4oWG1sUHJvcGVydHkuY2xhc3MsIHRoaXMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0UHJvcGVydGllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBnZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJc2V0QWNjZXNzTWV0aG9kcygoWG1sQWNjZXNzTWV0aG9kcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRToKLQkJCQlzZXRBdHRyaWJ1dGVUeXBlKEFUVFJJQlVURV9UWVBFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGFjY2Vzc01ldGhvZHMgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gcHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVHJhbnNmb3JtYXRpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OXzIxX19BVFRSSUJVVEVfVFlQRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TRk9STUFUSU9OX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFRyYW5zZm9ybWF0aW9uXzJfMS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfVFJBTlNGT1JNQVRJT05fMjFfX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0ZPUk1BVElPTl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhdHRyaWJ1dGVUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhdHRyaWJ1dGVUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotLy8JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotLy8JCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0vLwkJCWJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSwKLS8vCQkJYnVpbGRSZWFkVHJhbnNmb3JtZXJUcmFuc2xhdG9yKCksCi0vLwkJCWJ1aWxkV3JpdGVUcmFuc2Zvcm1lclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJvcGVydHkuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlBST1BFUlRZLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzTWV0aG9kcy5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuQUNDRVNTX01FVEhPRFMsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcl9BY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZVR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzEuQVRUUklCVVRFX1RZUEUsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxY2M4ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUcmFuc2llbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHJhbnNpZW50KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRyYW5zaWVudCBleHRlbmRzIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50IGltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2Vzc01ldGhvZHMoKSA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBY2Nlc3NNZXRob2RzIGFjY2Vzc01ldGhvZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9wZXJ0aWVzKCkgPGVtPlByb3BlcnRpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByb3BlcnR5PiBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TSUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgb2xkQWNjZXNzTWV0aG9kcywgbmV3QWNjZXNzTWV0aG9kcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG5ld0FjY2Vzc01ldGhvZHMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJvcGVydGllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJvcGVydHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBhY2Nlc3NNZXRob2RzICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RSQU5TSUVOVF9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlRfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFJBTlNJRU5UX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDYxZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFR5cGVDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFR5cGUgQ3VzdG9tQ29udmVydGVyPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyI2dldERhdGFUeXBlIDxlbT5EYXRhIFR5cGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZUNvbnZlcnRlcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUeXBlQ29udmVydGVyIGV4dGVuZHMgWG1sTmFtZWRDb252ZXJ0ZXIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YVR5cGUoKSA8ZW0+RGF0YSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQV9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREYXRhVHlwZSgpIDxlbT5EYXRhIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERhdGFUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlID0gREFUQV9UWVBFX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPYmplY3RUeXBlKCkgPGVtPk9iamVjdCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2JqZWN0VHlwZSgpIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T2JqZWN0VHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHlwZUNvbnZlcnRlcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RZUEVfQ09OVkVSVEVSOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGEgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGEgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGF0YVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlKCkKLQl7Ci0JCXJldHVybiBkYXRhVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXIjZ2V0RGF0YVR5cGUgPGVtPkRhdGEgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGF0YSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREYXRhVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGFUeXBlKFN0cmluZyBuZXdEYXRhVHlwZSkKLQl7Ci0JCVN0cmluZyBvbGREYXRhVHlwZSA9IGRhdGFUeXBlOwotCQlkYXRhVHlwZSA9IG5ld0RhdGFUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIG9sZERhdGFUeXBlLCBkYXRhVHlwZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PYmplY3QgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RUeXBlKCkKLQl7Ci0JCXJldHVybiBvYmplY3RUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlciNnZXRPYmplY3RUeXBlIDxlbT5PYmplY3QgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9iamVjdFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RUeXBlKFN0cmluZyBuZXdPYmplY3RUeXBlKQotCXsKLQkJU3RyaW5nIG9sZE9iamVjdFR5cGUgPSBvYmplY3RUeXBlOwotCQlvYmplY3RUeXBlID0gbmV3T2JqZWN0VHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEUsIG9sZE9iamVjdFR5cGUsIG9iamVjdFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBnZXREYXRhVHlwZSgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1RZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRToKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXNldERhdGFUeXBlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJc2V0T2JqZWN0VHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRToKLQkJCQlzZXREYXRhVHlwZShEQVRBX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fT0JKRUNUX1RZUEU6Ci0JCQkJc2V0T2JqZWN0VHlwZShPQkpFQ1RfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9UWVBFX0NPTlZFUlRFUl9fREFUQV9UWVBFOgotCQkJCXJldHVybiBEQVRBX1RZUEVfRURFRkFVTFQgPT0gbnVsbCA/IGRhdGFUeXBlICE9IG51bGwgOiAhREFUQV9UWVBFX0VERUZBVUxULmVxdWFscyhkYXRhVHlwZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVFlQRV9DT05WRVJURVJfX09CSkVDVF9UWVBFOgotCQkJCXJldHVybiBPQkpFQ1RfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gb2JqZWN0VHlwZSAhPSBudWxsIDogIU9CSkVDVF9UWVBFX0VERUZBVUxULmVxdWFscyhvYmplY3RUeXBlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGF0YVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRhdGFUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvYmplY3RUeXBlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvYmplY3RUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGF0YVR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERhdGFUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19EQVRBX1RZUEUsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZUNvbnZlcnRlcl9EYXRhVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlQ29udmVydGVyX09iamVjdFR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZURhdGFUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRGF0YVR5cGVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuZGF0YVR5cGUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVJfX0RBVEFfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU9iamVjdFR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lT2JqZWN0VHlwZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5vYmplY3RUeXBlLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChwYWNrYWdlTGVuZ3RoID09IC0xKSB7Ci0JCQlwYWNrYWdlTGVuZ3RoID0gMDsKLQkJCW5ld05hbWUgPSBuZXdOYW1lICsgJy4nOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSX19PQkpFQ1RfVFlQRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi19IC8vIFhtbFR5cGVDb252ZXJ0ZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxVbmlvblBhcnRpdGlvbmluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaW9uUGFydGl0aW9uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDQyNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaW9uUGFydGl0aW9uaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxVbmlvblBhcnRpdGlvbmluZyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVU5JT05fUEFSVElUSU9OSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlvblBhcnRpdGlvbmluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVU5JT05fUEFSVElUSU9OSU5HX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVU5JT05fUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9VTklPTl9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1VOSU9OX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci19IC8vIFhtbFVuaW9uUGFydGl0aW9uaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmFsdWVQYXJ0aXRpb25pbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYWx1ZVBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWExNTAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYWx1ZVBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVQYXJ0aXRpb25pbmcgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWYWx1ZVBhcnRpdGlvbmluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZBTFVFX1BBUlRJVElPTklORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFsdWVQYXJ0aXRpb25pbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBTFVFX1BBUlRJVElPTklOR19fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFMVUVfUEFSVElUSU9OSU5HX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQUxVRV9QQVJUSVRJT05JTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBYbWxWYWx1ZVBhcnRpdGlvbmluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZhcmlhYmxlT25lVG9PbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS9YbWxWYXJpYWJsZU9uZVRvT25lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjM2MjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZhcmlhYmxlT25lVG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmUgSW1wbDwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKiAKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVmFyaWFibGVPbmVUb09uZSBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWNjZXNzTWV0aG9kcygpIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWNjZXNzTWV0aG9kcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc01ldGhvZHMgYWNjZXNzTWV0aG9kczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb3BlcnRpZXMoKSA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJvcGVydHk+IHByb3BlcnRpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25pbmcoKSA8ZW0+UGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQYXJ0aXRpb25pbmdfMl8yIHBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgcmVwbGljYXRpb25QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkgPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIHJvdW5kUm9iaW5QYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKSA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBwaW5uZWRQYXJ0aXRpb25pbmc7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSYW5nZVBhcnRpdGlvbmluZygpIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIHJhbmdlUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKSA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZVBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhhc2hQYXJ0aXRpb25pbmcoKSA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBoYXNoUGFydGl0aW9uaW5nOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKSA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiB1bmlvblBhcnRpdGlvbmluZzsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJ0aXRpb25lZCgpIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFydGl0aW9uZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTkVEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhcnRpdGlvbmVkKCkgPGVtPlBhcnRpdGlvbmVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBwYXJ0aXRpb25lZCA9IFBBUlRJVElPTkVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTm9uQ2FjaGVhYmxlKCkgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNOb25DYWNoZWFibGUoKSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vbkNhY2hlYWJsZSA9IE5PTl9DQUNIRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmFyaWFibGVPbmVUb09uZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1ZBUklBQkxFX09ORV9UT19PTkU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEFjY2Vzc01ldGhvZHMgZ2V0QWNjZXNzTWV0aG9kcygpCi0JewotCQlyZXR1cm4gYWNjZXNzTWV0aG9kczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEFjY2Vzc01ldGhvZHMgb2xkQWNjZXNzTWV0aG9kcyA9IGFjY2Vzc01ldGhvZHM7Ci0JCWFjY2Vzc01ldGhvZHMgPSBuZXdBY2Nlc3NNZXRob2RzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBvbGRBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0QWNjZXNzTWV0aG9kcyA8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzcyBNZXRob2RzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzTWV0aG9kcyhYbWxBY2Nlc3NNZXRob2RzIG5ld0FjY2Vzc01ldGhvZHMpCi0JewotCQlpZiAobmV3QWNjZXNzTWV0aG9kcyAhPSBhY2Nlc3NNZXRob2RzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFjY2Vzc01ldGhvZHMpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FjY2Vzc01ldGhvZHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEFjY2Vzc01ldGhvZHMobmV3QWNjZXNzTWV0aG9kcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTLCBuZXdBY2Nlc3NNZXRob2RzLCBuZXdBY2Nlc3NNZXRob2RzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJvcGVydHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQcm9wZXJ0eUNvbnRhaW5lcl9Qcm9wZXJ0aWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllcygpCi0JewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQl7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFByb3BlcnR5PihYbWxQcm9wZXJ0eS5jbGFzcywgdGhpcywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcnRpdGlvbmluZyhYbWxQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQYXJ0aXRpb25pbmdfMl8yIG9sZFBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJcGFydGl0aW9uaW5nID0gbmV3UGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgb2xkUGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRQYXJ0aXRpb25pbmcgPGVtPlBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiBuZXdQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGFydGl0aW9uaW5nICE9IHBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGFydGl0aW9uaW5nKG5ld1BhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORywgbmV3UGFydGl0aW9uaW5nLCBuZXdQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIGdldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgb2xkUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSByZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJcmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPSBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG9sZFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgbmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgIT0gcmVwbGljYXRpb25QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcobmV3UmVwbGljYXRpb25QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcsIG5ld1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nLCBuZXdSZXBsaWNhdGlvblBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiBnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgPSByb3VuZFJvYmluUGFydGl0aW9uaW5nOwotCQlyb3VuZFJvYmluUGFydGl0aW9uaW5nID0gbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG9sZFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmFyaWFibGVPbmVUb09uZSNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgbmV3Um91bmRSb2JpblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJvdW5kUm9iaW5QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpcm91bmRSb2JpblBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdSb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcsIG5ld1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHBpbm5lZFBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIG9sZFBpbm5lZFBhcnRpdGlvbmluZyA9IHBpbm5lZFBhcnRpdGlvbmluZzsKLQkJcGlubmVkUGFydGl0aW9uaW5nID0gbmV3UGlubmVkUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkcsIG9sZFBpbm5lZFBhcnRpdGlvbmluZywgbmV3UGlubmVkUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IHBpbm5lZFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGlubmVkUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bpbm5lZFBhcnRpdGlvbmluZykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQaW5uZWRQYXJ0aXRpb25pbmcobmV3UGlubmVkUGFydGl0aW9uaW5nLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORywgbmV3UGlubmVkUGFydGl0aW9uaW5nLCBuZXdQaW5uZWRQYXJ0aXRpb25pbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJhbmdlUGFydGl0aW9uaW5nKFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yIGdldFJhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiByYW5nZVBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgb2xkUmFuZ2VQYXJ0aXRpb25pbmcgPSByYW5nZVBhcnRpdGlvbmluZzsKLQkJcmFuZ2VQYXJ0aXRpb25pbmcgPSBuZXdSYW5nZVBhcnRpdGlvbmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG9sZFJhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgbmV3UmFuZ2VQYXJ0aXRpb25pbmcpCi0JewotCQlpZiAobmV3UmFuZ2VQYXJ0aXRpb25pbmcgIT0gcmFuZ2VQYXJ0aXRpb25pbmcpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHJhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXJhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1JhbmdlUGFydGl0aW9uaW5nICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1JhbmdlUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobmV3UmFuZ2VQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkcsIG5ld1JhbmdlUGFydGl0aW9uaW5nLCBuZXdSYW5nZVBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VmFsdWVQYXJ0aXRpb25pbmcoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHZhbHVlUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBvbGRWYWx1ZVBhcnRpdGlvbmluZyA9IHZhbHVlUGFydGl0aW9uaW5nOwotCQl2YWx1ZVBhcnRpdGlvbmluZyA9IG5ld1ZhbHVlUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgb2xkVmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiBuZXdWYWx1ZVBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdWYWx1ZVBhcnRpdGlvbmluZyAhPSB2YWx1ZVBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VmFsdWVQYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRWYWx1ZVBhcnRpdGlvbmluZyhuZXdWYWx1ZVBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORywgbmV3VmFsdWVQYXJ0aXRpb25pbmcsIG5ld1ZhbHVlUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRIYXNoUGFydGl0aW9uaW5nKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGdldEhhc2hQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIGhhc2hQYXJ0aXRpb25pbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgb2xkSGFzaFBhcnRpdGlvbmluZyA9IGhhc2hQYXJ0aXRpb25pbmc7Ci0JCWhhc2hQYXJ0aXRpb25pbmcgPSBuZXdIYXNoUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HLCBvbGRIYXNoUGFydGl0aW9uaW5nLCBuZXdIYXNoUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBuZXdIYXNoUGFydGl0aW9uaW5nKQotCXsKLQkJaWYgKG5ld0hhc2hQYXJ0aXRpb25pbmcgIT0gaGFzaFBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCloYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SGFzaFBhcnRpdGlvbmluZyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdIYXNoUGFydGl0aW9uaW5nKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRIYXNoUGFydGl0aW9uaW5nKG5ld0hhc2hQYXJ0aXRpb25pbmcsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORywgbmV3SGFzaFBhcnRpdGlvbmluZywgbmV3SGFzaFBhcnRpdGlvbmluZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIHVuaW9uUGFydGl0aW9uaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBvbGRVbmlvblBhcnRpdGlvbmluZyA9IHVuaW9uUGFydGl0aW9uaW5nOwotCQl1bmlvblBhcnRpdGlvbmluZyA9IG5ld1VuaW9uUGFydGl0aW9uaW5nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgb2xkVW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZhcmlhYmxlT25lVG9PbmUjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBuZXdVbmlvblBhcnRpdGlvbmluZykKLQl7Ci0JCWlmIChuZXdVbmlvblBhcnRpdGlvbmluZyAhPSB1bmlvblBhcnRpdGlvbmluZykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VW5pb25QYXJ0aXRpb25pbmcpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRVbmlvblBhcnRpdGlvbmluZyhuZXdVbmlvblBhcnRpdGlvbmluZywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORywgbmV3VW5pb25QYXJ0aXRpb25pbmcsIG5ld1VuaW9uUGFydGl0aW9uaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25lZChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25lZCgpCi0JewotCQlyZXR1cm4gcGFydGl0aW9uZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIG5ld1BhcnRpdGlvbmVkKQotCXsKLQkJU3RyaW5nIG9sZFBhcnRpdGlvbmVkID0gcGFydGl0aW9uZWQ7Ci0JCXBhcnRpdGlvbmVkID0gbmV3UGFydGl0aW9uZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9ORUQsIG9sZFBhcnRpdGlvbmVkLCBwYXJ0aXRpb25lZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiBub25DYWNoZWFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWYXJpYWJsZU9uZVRvT25lI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIG5ld05vbkNhY2hlYWJsZSkKLQl7Ci0JCWJvb2xlYW4gb2xkTm9uQ2FjaGVhYmxlID0gbm9uQ2FjaGVhYmxlOwotCQlub25DYWNoZWFibGUgPSBuZXdOb25DYWNoZWFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRSwgb2xkTm9uQ2FjaGVhYmxlLCBub25DYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRBY2Nlc3NNZXRob2RzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFBpbm5lZFBhcnRpdGlvbmluZyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UmFuZ2VQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFZhbHVlUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldEhhc2hQYXJ0aXRpb25pbmcobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBiYXNpY1NldFVuaW9uUGFydGl0aW9uaW5nKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIGdldFJhbmdlUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRWYWx1ZVBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXJldHVybiBnZXRQYXJ0aXRpb25lZCgpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU6Ci0JCQkJcmV0dXJuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTklORzoKLQkJCQlzZXRQYXJ0aXRpb25pbmcoKFhtbFBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzoKLQkJCQlzZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKChYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BJTk5FRF9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGlubmVkUGFydGl0aW9uaW5nKChYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19WQUxVRV9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0VmFsdWVQYXJ0aXRpb25pbmcoKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOgotCQkJCXNldEhhc2hQYXJ0aXRpb25pbmcoKFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlzZXRQYXJ0aXRpb25lZCgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UGFydGl0aW9uaW5nKChYbWxQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOgotCQkJCXNldFBpbm5lZFBhcnRpdGlvbmluZygoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXNldFJhbmdlUGFydGl0aW9uaW5nKChYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlzZXRWYWx1ZVBhcnRpdGlvbmluZygoWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlzZXRIYXNoUGFydGl0aW9uaW5nKChYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOgotCQkJCXNldFVuaW9uUGFydGl0aW9uaW5nKChYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOgotCQkJCXNldFBhcnRpdGlvbmVkKFBBUlRJVElPTkVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fTk9OX0NBQ0hFQUJMRToKLQkJCQlzZXROb25DYWNoZWFibGUoTk9OX0NBQ0hFQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiBwYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc6Ci0JCQkJcmV0dXJuIHJlcGxpY2F0aW9uUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByb3VuZFJvYmluUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gcGlubmVkUGFydGl0aW9uaW5nICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkFOR0VfUEFSVElUSU9OSU5HOgotCQkJCXJldHVybiByYW5nZVBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1ZBTFVFX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdmFsdWVQYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19IQVNIX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gaGFzaFBhcnRpdGlvbmluZyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1VOSU9OX1BBUlRJVElPTklORzoKLQkJCQlyZXR1cm4gdW5pb25QYXJ0aXRpb25pbmcgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05FRDoKLQkJCQlyZXR1cm4gUEFSVElUSU9ORURfRURFRkFVTFQgPT0gbnVsbCA/IHBhcnRpdGlvbmVkICE9IG51bGwgOiAhUEFSVElUSU9ORURfRURFRkFVTFQuZXF1YWxzKHBhcnRpdGlvbmVkKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBub25DYWNoZWFibGUgIT0gTk9OX0NBQ0hFQUJMRV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQWNjZXNzTWV0aG9kc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQcm9wZXJ0eUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9QUk9QRVJUWV9DT05UQUlORVJfX1BST1BFUlRJRVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QSU5ORURfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX0hBU0hfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1BBUlRJVElPTkVEOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19OT05fQ0FDSEVBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fQUNDRVNTX01FVEhPRFM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJvcGVydHlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfUFJPUEVSVFlfQ09OVEFJTkVSX19QUk9QRVJUSUVTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QUk9QRVJUSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUElOTkVEX1BBUlRJVElPTklORzsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WQVJJQUJMRV9PTkVfVE9fT05FX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVkFMVUVfUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fSEFTSF9QQVJUSVRJT05JTkc7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fVU5JT05fUEFSVElUSU9OSU5HOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5YTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkFSSUFCTEVfT05FX1RPX09ORV9fUEFSVElUSU9ORUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmFyaWFibGVPbmVUb09uZV8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEU6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfX05PTl9DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChwYXJ0aXRpb25lZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFydGl0aW9uZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5vbkNhY2hlYWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobm9uQ2FjaGVhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc3MDM3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGluazJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWZXJzaW9uPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqIAotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxWZXJzaW9uIGV4dGVuZHMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uIGltcGxlbWVudHMgWG1sVmVyc2lvbl8yXzEsIFhtbFZlcnNpb25fMl8yLCBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBYbWxNdXRhYmxlLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlVHlwZSgpIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhdHRyaWJ1dGVUeXBlID0gQVRUUklCVVRFX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbmRleCgpIDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJbmRleF8yXzIgaW5kZXg7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3NNZXRob2RzKCkgPGVtPkFjY2VzcyBNZXRob2RzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3NNZXRob2RzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzTWV0aG9kcyBhY2Nlc3NNZXRob2RzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNdXRhYmxlKCkgPGVtPk11dGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE11dGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBNVVRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11dGFibGUoKSA8ZW0+TXV0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TXV0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gbXV0YWJsZSA9IE1VVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb252ZXJ0ZXIoKSA8ZW0+Q29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VHlwZUNvbnZlcnRlcigpIDxlbT5UeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFR5cGVDb252ZXJ0ZXIgdHlwZUNvbnZlcnRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3RydWN0Q29udmVydGVyKCkgPGVtPlN0cnVjdCBDb252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFN0cnVjdENvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFN0cnVjdENvbnZlcnRlciBzdHJ1Y3RDb252ZXJ0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udmVydCgpIDxlbT5Db252ZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJUX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbnZlcnQoKSA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0ID0gQ09OVkVSVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxWZXJzaW9uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfVkVSU0lPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIG5ld0F0dHJpYnV0ZVR5cGUpCi0JewotCQlTdHJpbmcgb2xkQXR0cmlidXRlVHlwZSA9IGF0dHJpYnV0ZVR5cGU7Ci0JCWF0dHJpYnV0ZVR5cGUgPSBuZXdBdHRyaWJ1dGVUeXBlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFLCBvbGRBdHRyaWJ1dGVUeXBlLCBhdHRyaWJ1dGVUeXBlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmRleChYbWxJbmRleF8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSW5kZXhfMl8yIGdldEluZGV4KCkKLQl7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbmRleChYbWxJbmRleF8yXzIgbmV3SW5kZXgsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxJbmRleF8yXzIgb2xkSW5kZXggPSBpbmRleDsKLQkJaW5kZXggPSBuZXdJbmRleDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWCwgb2xkSW5kZXgsIG5ld0luZGV4KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmRleChYbWxJbmRleF8yXzIgbmV3SW5kZXgpCi0JewotCQlpZiAobmV3SW5kZXggIT0gaW5kZXgpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGluZGV4ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWluZGV4KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWCwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3SW5kZXggIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SW5kZXgpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0lOREVYLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEluZGV4KG5ld0luZGV4LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVgsIG5ld0luZGV4LCBuZXdJbmRleCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk11dGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk11dGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TXV0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TXV0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sTXV0YWJsZV9NdXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRNdXRhYmxlKCkKLQl7Ci0JCXJldHVybiBtdXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRNdXRhYmxlIDxlbT5NdXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNdXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TXV0YWJsZShCb29sZWFuIG5ld011dGFibGUpCi0JewotCQlCb29sZWFuIG9sZE11dGFibGUgPSBtdXRhYmxlOwotCQltdXRhYmxlID0gbmV3TXV0YWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFLCBvbGRNdXRhYmxlLCBtdXRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Db252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydCgpCi0JewotCQlyZXR1cm4gY29udmVydDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29udmVydCA8ZW0+Q29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udmVydDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29udmVydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnZlcnQoU3RyaW5nIG5ld0NvbnZlcnQpCi0JewotCQlTdHJpbmcgb2xkQ29udmVydCA9IGNvbnZlcnQ7Ci0JCWNvbnZlcnQgPSBuZXdDb252ZXJ0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQsIG9sZENvbnZlcnQsIGNvbnZlcnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXJfQWNjZXNzTWV0aG9kcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQWNjZXNzTWV0aG9kcyBnZXRBY2Nlc3NNZXRob2RzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3NNZXRob2RzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEFjY2Vzc01ldGhvZHMoWG1sQWNjZXNzTWV0aG9kcyBuZXdBY2Nlc3NNZXRob2RzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQWNjZXNzTWV0aG9kcyBvbGRBY2Nlc3NNZXRob2RzID0gYWNjZXNzTWV0aG9kczsKLQkJYWNjZXNzTWV0aG9kcyA9IG5ld0FjY2Vzc01ldGhvZHM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG9sZEFjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiNnZXRBY2Nlc3NNZXRob2RzIDxlbT5BY2Nlc3MgTWV0aG9kczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzIE1ldGhvZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFjY2Vzc01ldGhvZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3NNZXRob2RzKFhtbEFjY2Vzc01ldGhvZHMgbmV3QWNjZXNzTWV0aG9kcykKLQl7Ci0JCWlmIChuZXdBY2Nlc3NNZXRob2RzICE9IGFjY2Vzc01ldGhvZHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGFjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYWNjZXNzTWV0aG9kcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0FjY2Vzc01ldGhvZHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3QWNjZXNzTWV0aG9kcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0QWNjZXNzTWV0aG9kcyhuZXdBY2Nlc3NNZXRob2RzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQUNDRVNTX01FVEhPRFMsIG5ld0FjY2Vzc01ldGhvZHMsIG5ld0FjY2Vzc01ldGhvZHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcm9wZXJ0eX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbFByb3BlcnR5Q29udGFpbmVyX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29udmVydGVyKFhtbENvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9Db252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIGNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb252ZXJ0ZXIoWG1sQ29udmVydGVyIG5ld0NvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbnZlcnRlciBvbGRDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCWNvbnZlcnRlciA9IG5ld0NvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVIsIG9sZENvbnZlcnRlciwgbmV3Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29udmVydGVyIDxlbT5Db252ZXJ0ZXI8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKFhtbENvbnZlcnRlciBuZXdDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3Q29udmVydGVyICE9IGNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbnZlcnRlcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29udmVydGVyKG5ld0NvbnZlcnRlciwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUiwgbmV3Q29udmVydGVyLCBuZXdDb252ZXJ0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHlwZSBDdXN0b21Db252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHlwZSBDb252ZXJ0ZXI8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlI2dldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUeXBlQ29udmVydGVyIGdldFR5cGVDb252ZXJ0ZXIoKQotCXsKLQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihYbWxUeXBlQ29udmVydGVyIG5ld1R5cGVDb252ZXJ0ZXIsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUeXBlQ29udmVydGVyIG9sZFR5cGVDb252ZXJ0ZXIgPSB0eXBlQ29udmVydGVyOwotCQl0eXBlQ29udmVydGVyID0gbmV3VHlwZUNvbnZlcnRlcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgb2xkVHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldFR5cGVDb252ZXJ0ZXIgPGVtPlR5cGUgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VHlwZUNvbnZlcnRlcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVDb252ZXJ0ZXIoWG1sVHlwZUNvbnZlcnRlciBuZXdUeXBlQ29udmVydGVyKQotCXsKLQkJaWYgKG5ld1R5cGVDb252ZXJ0ZXIgIT0gdHlwZUNvbnZlcnRlcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0eXBlQ29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRUeXBlQ29udmVydGVyKG5ld1R5cGVDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUiwgbmV3VHlwZUNvbnZlcnRlciwgbmV3VHlwZUNvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ3VzdG9tQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX09iamVjdFR5cGVDb252ZXJ0ZXIoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRPYmplY3RUeXBlQ29udmVydGVyKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgbmV3T2JqZWN0VHlwZUNvbnZlcnRlciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciA9IG9iamVjdFR5cGVDb252ZXJ0ZXI7Ci0JCW9iamVjdFR5cGVDb252ZXJ0ZXIgPSBuZXdPYmplY3RUeXBlQ29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgb2xkT2JqZWN0VHlwZUNvbnZlcnRlciwgbmV3T2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2dldE9iamVjdFR5cGVDb252ZXJ0ZXIgPGVtPk9iamVjdCBUeXBlIENvbnZlcnRlcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPYmplY3RUeXBlQ29udmVydGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0VHlwZUNvbnZlcnRlcihYbWxPYmplY3RUeXBlQ29udmVydGVyIG5ld09iamVjdFR5cGVDb252ZXJ0ZXIpCi0JewotCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBvYmplY3RUeXBlQ29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvYmplY3RUeXBlQ29udmVydGVyICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9iamVjdFR5cGVDb252ZXJ0ZXIpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3T2JqZWN0VHlwZUNvbnZlcnRlciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdPYmplY3RUeXBlQ29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVIsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihuZXdPYmplY3RUeXBlQ29udmVydGVyLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBuZXdPYmplY3RUeXBlQ29udmVydGVyLCBuZXdPYmplY3RUeXBlQ29udmVydGVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3RydWN0IEN1c3RvbUNvbnZlcnRlcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGVySG9sZGVyX1N0cnVjdENvbnZlcnRlcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU3RydWN0Q29udmVydGVyIGdldFN0cnVjdENvbnZlcnRlcigpCi0JewotCQlyZXR1cm4gc3RydWN0Q29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihYbWxTdHJ1Y3RDb252ZXJ0ZXIgbmV3U3RydWN0Q29udmVydGVyLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU3RydWN0Q29udmVydGVyIG9sZFN0cnVjdENvbnZlcnRlciA9IHN0cnVjdENvbnZlcnRlcjsKLQkJc3RydWN0Q29udmVydGVyID0gbmV3U3RydWN0Q29udmVydGVyOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVIsIG9sZFN0cnVjdENvbnZlcnRlciwgbmV3U3RydWN0Q29udmVydGVyKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0U3RydWN0Q29udmVydGVyIDxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJ1Y3QgQ29udmVydGVyPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTdHJ1Y3RDb252ZXJ0ZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3RDb252ZXJ0ZXIoWG1sU3RydWN0Q29udmVydGVyIG5ld1N0cnVjdENvbnZlcnRlcikKLQl7Ci0JCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gc3RydWN0Q29udmVydGVyKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpc3RydWN0Q29udmVydGVyKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U3RydWN0Q29udmVydGVyKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSLCBuZXdTdHJ1Y3RDb252ZXJ0ZXIsIG5ld1N0cnVjdENvbnZlcnRlcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0lOREVYOgotCQkJCXJldHVybiBiYXNpY1NldEluZGV4KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXJldHVybiBiYXNpY1NldEFjY2Vzc01ldGhvZHMobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByb3BlcnRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb252ZXJ0ZXIobnVsbCwgbXNncyk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T2JqZWN0VHlwZUNvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBiYXNpY1NldFN0cnVjdENvbnZlcnRlcihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWDoKLQkJCQlyZXR1cm4gZ2V0SW5kZXgoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzTWV0aG9kcygpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOgotCQkJCXJldHVybiBnZXRNdXRhYmxlKCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVEVSOgotCQkJCXJldHVybiBnZXRDb252ZXJ0ZXIoKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIGdldFN0cnVjdENvbnZlcnRlcigpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQ6Ci0JCQkJcmV0dXJuIGdldENvbnZlcnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEU6Ci0JCQkJc2V0QXR0cmlidXRlVHlwZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg6Ci0JCQkJc2V0SW5kZXgoKFhtbEluZGV4XzJfMiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOgotCQkJCXNldEFjY2Vzc01ldGhvZHMoKFhtbEFjY2Vzc01ldGhvZHMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX01VVEFCTEU6Ci0JCQkJc2V0TXV0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldFR5cGVDb252ZXJ0ZXIoKFhtbFR5cGVDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0T2JqZWN0VHlwZUNvbnZlcnRlcigoWG1sT2JqZWN0VHlwZUNvbnZlcnRlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgotCQkJCXNldENvbnZlcnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXNldEF0dHJpYnV0ZVR5cGUoQVRUUklCVVRFX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWDoKLQkJCQlzZXRJbmRleCgoWG1sSW5kZXhfMl8yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlzZXRBY2Nlc3NNZXRob2RzKChYbWxBY2Nlc3NNZXRob2RzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOgotCQkJCXNldE11dGFibGUoTVVUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKLQkJCQlzZXRDb252ZXJ0ZXIoKFhtbENvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJc2V0VHlwZUNvbnZlcnRlcigoWG1sVHlwZUNvbnZlcnRlciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOgotCQkJCXNldE9iamVjdFR5cGVDb252ZXJ0ZXIoKFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1NUUlVDVF9DT05WRVJURVI6Ci0JCQkJc2V0U3RydWN0Q29udmVydGVyKChYbWxTdHJ1Y3RDb252ZXJ0ZXIpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlQ6Ci0JCQkJc2V0Q29udmVydChDT05WRVJUX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOgotCQkJCXJldHVybiBBVFRSSUJVVEVfVFlQRV9FREVGQVVMVCA9PSBudWxsID8gYXR0cmlidXRlVHlwZSAhPSBudWxsIDogIUFUVFJJQlVURV9UWVBFX0VERUZBVUxULmVxdWFscyhhdHRyaWJ1dGVUeXBlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWDoKLQkJCQlyZXR1cm4gaW5kZXggIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19BQ0NFU1NfTUVUSE9EUzoKLQkJCQlyZXR1cm4gYWNjZXNzTWV0aG9kcyAhPSBudWxsOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbCAmJiAhcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTVVUQUJMRToKLQkJCQlyZXR1cm4gTVVUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbXV0YWJsZSAhPSBudWxsIDogIU1VVEFCTEVfRURFRkFVTFQuZXF1YWxzKG11dGFibGUpOwotCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjoKLQkJCQlyZXR1cm4gY29udmVydGVyICE9IG51bGw7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIHR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGVDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19TVFJVQ1RfQ09OVkVSVEVSOgotCQkJCXJldHVybiBzdHJ1Y3RDb252ZXJ0ZXIgIT0gbnVsbDsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJUOgotCQkJCXJldHVybiBDT05WRVJUX0VERUZBVUxUID09IG51bGwgPyBjb252ZXJ0ICE9IG51bGwgOiAhQ09OVkVSVF9FREVGQVVMVC5lcXVhbHMoY29udmVydCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FUVFJJQlVURV9UWVBFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5YTUxfVkVSU0lPTl8yMV9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmVyc2lvbl8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fSU5ERVg6IHJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLlhNTF9WRVJTSU9OXzIyX19JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1BST1BFUlRJRVM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFZlcnNpb25fMl8xLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLlhNTF9WRVJTSU9OXzIxX19BVFRSSUJVVEVfVFlQRTogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQVRUUklCVVRFX1RZUEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sVmVyc2lvbl8yXzIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuWE1MX1ZFUlNJT05fMjJfX0lOREVYOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19JTkRFWDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0FDQ0VTU19NRVRIT0RTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByb3BlcnR5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1BST1BFUlRZX0NPTlRBSU5FUl9fUFJPUEVSVElFUzogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fUFJPUEVSVElFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXV0YWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9NVVRBQkxFX19NVVRBQkxFOiByZXR1cm4gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19NVVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRlckhvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RZUEVfQ09OVkVSVEVSOwotCQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19PQkpFQ1RfVFlQRV9DT05WRVJURVI6IHJldHVybiBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fU1RSVUNUX0NPTlZFUlRFUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fQ09OVkVSVDogcmV0dXJuIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09OVkVSVDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGF0dHJpYnV0ZVR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGF0dHJpYnV0ZVR5cGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG11dGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG11dGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNvbnZlcnQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNvbnZlcnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRNdXRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCUVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbigpLCAKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNdXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVUeXBlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRJbmRleFRyYW5zbGF0b3IoKSwgCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJUcmFuc2xhdG9yKCksCi0JCQlidWlsZFN0cnVjdENvbnZlcnRlclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJvcGVydHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc01ldGhvZHNUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTXV0YWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluay5NVVRBQkxFLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11dGFibGVfTXV0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbmRleFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxJbmRleC5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsyXzIuSU5ERVgsIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFZlcnNpb25fMl8yX0luZGV4KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb252ZXJ0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0NvbnZlcnQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbnZlcnRlclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLkNPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGlua09ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRlckhvbGRlcl9UeXBlQ29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPYmplY3RUeXBlQ29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbE9iamVjdFR5cGVDb252ZXJ0ZXIuYnVpbGRUcmFuc2xhdG9yKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfT2JqZWN0VHlwZUNvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RydWN0Q29udmVydGVyVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFN0cnVjdENvbnZlcnRlci5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0ZXJIb2xkZXJfU3RydWN0Q29udmVydGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcm9wZXJ0eVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoRWNsaXBzZUxpbmsuUFJPUEVSVFksIEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlDb250YWluZXJfUHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzTWV0aG9kc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NNZXRob2RzLmJ1aWxkVHJhbnNsYXRvcihFY2xpcHNlTGluay5BQ0NFU1NfTUVUSE9EUywgRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyX0FjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXR0cmlidXRlVHlwZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihFY2xpcHNlTGluazJfMS5BVFRSSUJVVEVfVFlQRSwgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmsxXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL0VjbGlwc2VMaW5rMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTE5ODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmsxXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazFfMQotCWV4dGVuZHMgRWNsaXBzZUxpbmsKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIxLjEiOwotCQotCS8vIEVjbGlwc2VMaW5rIDEuMSBzcGVjaWZpYyBub2RlcwotCQotCVN0cmluZyBQUklNQVJZX0tFWSA9ICJwcmltYXJ5LWtleSI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSSU1BUllfS0VZX19WQUxJREFUSU9OID0gInZhbGlkYXRpb24iOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQUklNQVJZX0tFWV9fQ09MVU1OID0gImNvbHVtbiI7ICAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmU0ZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjFfMUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLklEX1ZBTElEQVRJT05fVFlQRV8xMToKLQkJCQlyZXR1cm4gY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5JRF9WQUxJREFUSU9OX1RZUEVfMTE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRJZFZhbGlkYXRpb25UeXBlXzFfMVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgY3JlYXRlSWRWYWxpZGF0aW9uVHlwZV8xXzFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBJZFZhbGlkYXRpb25UeXBlXzFfMS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SWRWYWxpZGF0aW9uVHlwZV8xXzFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzM0ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gInYxXzEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0udjFfMS54bWkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xIDxlbT5YbWwgQmFzaWMgMTE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sQmFzaWNfMV8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzExX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18xMV9fR0VORVJBVEVEX1ZBTFVFID0gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzaWMgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMTFfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xIDxlbT5YbWwgRW50aXR5IDExPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzExX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAxMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTEgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfX1BSSU1BUllfS0VZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMTFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzExX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEgPGVtPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBTElEQVRJT05fVFlQRV8xMSA9IDQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXNpY18xXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5XzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQcmltYXJ5S2V5XzFfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgaW5pdCgpCi0JewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSA8ZW0+WG1sIEJhc2ljIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY18xXzEoKQotCXsKLQkJcmV0dXJuIHhtbEJhc2ljXzFfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQmFzaWNfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEVudGl0eV8xXzEgPGVtPlhtbCBFbnRpdHkgMTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5XzFfMSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5XzFfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5KCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDExPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEjZ2V0UHJpbWFyeUtleSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzFfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSAxMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlfMV8xKCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5XzFfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsaWRhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFByaW1hcnlLZXlfMV8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRDb2x1bW5zIDxlbT5Db2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldENvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbFByaW1hcnlLZXlfMV8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0JewotCQlyZXR1cm4gaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSBnZXRFY2xpcHNlTGlua09ybVYxXzFGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMV8xRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEJhc2ljXzFfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfMTEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEJhc2ljXzFfMUVDbGFzcywgWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUUpOwotCi0JCXhtbEVudGl0eV8xXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8xMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzFfMUVDbGFzcywgWE1MX0VOVElUWV8xMV9fUFJJTUFSWV9LRVkpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18xXzFFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVkpOwotCi0JCXhtbFByaW1hcnlLZXlfMV8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUklNQVJZX0tFWV8xMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MsIFhNTF9QUklNQVJZX0tFWV8xMV9fVkFMSURBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MsIFhNTF9QUklNQVJZX0tFWV8xMV9fQ09MVU1OUyk7Ci0KLQkJLy8gQ3JlYXRlIGVudW1zCi0JCWlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0gPSBjcmVhdGVFRW51bShJRF9WQUxJREFUSU9OX1RZUEVfMTEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7Ci0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxCYXNpY18xXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxCYXNpY18xXzFFQ2xhc3MsIFhtbEJhc2ljXzFfMS5jbGFzcywgIlhtbEJhc2ljXzFfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEJhc2ljXzFfMV9HZW5lcmF0ZWRWYWx1ZSgpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEdlbmVyYXRlZFZhbHVlKCksIG51bGwsICJnZW5lcmF0ZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbEJhc2ljXzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8xXzFFQ2xhc3MsIFhtbEVudGl0eV8xXzEuY2xhc3MsICJYbWxFbnRpdHlfMV8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzFfMV9QcmltYXJ5S2V5KCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxQcmltYXJ5S2V5KCksIG51bGwsICJwcmltYXJ5S2V5IiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUHJpbWFyeUtleSgpLCBudWxsLCAicHJpbWFyeUtleSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleV8xXzFFQ2xhc3MsIFhtbFByaW1hcnlLZXlfMV8xLmNsYXNzLCAiWG1sUHJpbWFyeUtleV8xXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCksIHRoaXMuZ2V0SWRWYWxpZGF0aW9uVHlwZV8xXzEoKSwgInZhbGlkYXRpb24iLCBudWxsLCAwLCAxLCBYbWxQcmltYXJ5S2V5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUHJpbWFyeUtleV8xXzFfQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENvbHVtbigpLCBudWxsLCAiY29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxQcmltYXJ5S2V5XzFfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuY2xhc3MsICJJZFZhbGlkYXRpb25UeXBlXzFfMSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaWRWYWxpZGF0aW9uVHlwZV8xXzFFRW51bSwgSWRWYWxpZGF0aW9uVHlwZV8xXzEuTlVMTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChpZFZhbGlkYXRpb25UeXBlXzFfMUVFbnVtLCBJZFZhbGlkYXRpb25UeXBlXzFfMS5aRVJPKTsKLQkJYWRkRUVudW1MaXRlcmFsKGlkVmFsaWRhdGlvblR5cGVfMV8xRUVudW0sIElkVmFsaWRhdGlvblR5cGVfMV8xLk5PTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSA8ZW0+WG1sIEJhc2ljIDExPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEJhc2ljXzFfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18xMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18xXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0JBU0lDXzExX19HRU5FUkFURURfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMV8xX0dlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSA8ZW0+WG1sIEVudGl0eSAxMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfMTEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzFfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfMTFfX1BSSU1BUllfS0VZID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18xMV9fUFJJTUFSWV9LRVkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18xXzFfUHJpbWFyeUtleSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMTE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV8xMSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzFfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSU1BUllfS0VZXzExX19WQUxJREFUSU9OID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX1ZhbGlkYXRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BSSU1BUllfS0VZXzExX19DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMV8xX0NvbHVtbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMSA8ZW0+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gSURfVkFMSURBVElPTl9UWVBFXzExID0gZUlOU1RBTkNFLmdldElkVmFsaWRhdGlvblR5cGVfMV8xKCk7Ci0KLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvSWRWYWxpZGF0aW9uVHlwZV8xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY1MjZhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9JZFZhbGlkYXRpb25UeXBlXzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRJZFZhbGlkYXRpb25UeXBlXzFfMSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gSWRWYWxpZGF0aW9uVHlwZV8xXzEgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOVUxMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JTlVMTCgwLCAiTlVMTCIsICJOVUxMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1pFUk9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlaRVJPKDIsICJaRVJPIiwgIlpFUk8iKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU5PTkUoMiwgIk5PTkUiLCAiTk9ORSIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+TlVMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOVUxMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5aRVJPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1pFUk8KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRVJPX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjTk9ORQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgSWRWYWxpZGF0aW9uVHlwZV8xXzFbXQotCQl7Ci0JCQlOVUxMLAotCQkJWkVSTywKLQkJCU5PTkUsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SWRWYWxpZGF0aW9uVHlwZV8xXzE+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+SWQgVmFsaWRhdGlvbiBUeXBlIDExPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUlkVmFsaWRhdGlvblR5cGVfMV8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlJZFZhbGlkYXRpb25UeXBlXzFfMSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPklkIFZhbGlkYXRpb24gVHlwZSAxMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElkVmFsaWRhdGlvblR5cGVfMV8xIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIE5VTExfVkFMVUU6IHJldHVybiBOVUxMOwotCQkJY2FzZSBaRVJPX1ZBTFVFOiByZXR1cm4gWkVSTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSWRWYWxpZGF0aW9uVHlwZV8xXzEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0lkVmFsaWRhdGlvblR5cGVfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxCYXNpY18xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEJhc2ljXzFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmY1NzY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEJhc2ljXzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgMTE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbEJhc2ljXzFfMSNnZXRHZW5lcmF0ZWRWYWx1ZSA8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2ljXzFfMSBleHRlbmRzIFhtbEdlbmVyYXRvckNvbnRhaW5lcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxCYXNpY18xXzFfR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxCYXNpY18xXzEjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgdmFsdWUpOwotCi19IC8vIFhtbEJhc2ljXzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sRW50aXR5XzFfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWJkZDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbEVudGl0eV8xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSAxMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sRW50aXR5XzFfMSNnZXRQcmltYXJ5S2V5IDxlbT5QcmltYXJ5IEtleTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzFfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzFfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByaW1hcnlLZXkoWG1sUHJpbWFyeUtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlI2dldFhtbEVudGl0eV8xXzFfUHJpbWFyeUtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQcmltYXJ5S2V5IGdldFByaW1hcnlLZXkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxFbnRpdHlfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IHZhbHVlKTsKLQotfSAvLyBYbWxFbnRpdHlfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1MWY3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzFfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMTE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18xXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmltYXJ5S2V5KFhtbFByaW1hcnlLZXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMV9QcmltYXJ5S2V5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFByaW1hcnlLZXkgZ2V0UHJpbWFyeUtleSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMV8xI2dldFByaW1hcnlLZXkgPGVtPlByaW1hcnkgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJpbWFyeUtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJpbWFyeUtleShYbWxQcmltYXJ5S2V5IHZhbHVlKTsKLQotfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzFfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92MV8xL1htbFByaW1hcnlLZXlfMV8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzODhlZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzEvWG1sUHJpbWFyeUtleV8xXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFByaW1hcnkgS2V5IDExPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5YbWxQcmltYXJ5S2V5XzFfMSNnZXRWYWxpZGF0aW9uIDxlbT5WYWxpZGF0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuWG1sUHJpbWFyeUtleV8xXzEjZ2V0Q29sdW1ucyA8ZW0+Q29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8xXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaW1hcnlLZXlfMV8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuSWRWYWxpZGF0aW9uVHlwZV8xXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5JZFZhbGlkYXRpb25UeXBlXzFfMQotCSAqIEBzZWUgI3NldFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uVHlwZV8xXzEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMV9WYWxpZGF0aW9uKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSWRWYWxpZGF0aW9uVHlwZV8xXzEgZ2V0VmFsaWRhdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLlhtbFByaW1hcnlLZXlfMV8xI2dldFZhbGlkYXRpb24gPGVtPlZhbGlkYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLklkVmFsaWRhdGlvblR5cGVfMV8xCi0JICogQHNlZSAjZ2V0VmFsaWRhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsaWRhdGlvbihJZFZhbGlkYXRpb25UeXBlXzFfMSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5XzFfMV9Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbENvbHVtbj4gZ2V0Q29sdW1ucygpOwotCi19IC8vIFhtbFByaW1hcnlLZXlfMV8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMi9FY2xpcHNlTGluazFfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YxXzIvRWNsaXBzZUxpbmsxXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlNzNiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjFfMi9FY2xpcHNlTGluazFfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazFfMgotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzEKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEVjbGlwc2VMaW5rLlNDSEVNQV9OQU1FU1BBQ0U7Ci0JU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTgk9ICIxLjIiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGluazJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmsyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2NjNjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGluazJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMSwgSlBBMl8wCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIjsKLQlTdHJpbmcgU0NIRU1BX1ZFUlNJT04JPSAiMi4wIjsKLQkKLQkvLyBFY2xpcHNlTGluayAyLjAgc3BlY2lmaWMgbm9kZXMKLQotCVN0cmluZyBDQUNIRV9JTlRFUkNFUFRPUiA9ICJjYWNoZS1pbnRlcmNlcHRvciI7Ci0JCi0JU3RyaW5nIENPUlJFQ1RJT05fVFlQRSA9ICJjb3JyZWN0aW9uLXR5cGUiOwotCVN0cmluZyBNQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFID0gIm1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiOwotCi0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTID0gInF1ZXJ5LXJlZGlyZWN0b3JzIjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX0FMTF9RVUVSSUVTID0gImFsbC1xdWVyaWVzIjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfQUxMID0gInJlYWQtYWxsIjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX1JFQURfT0JKRUNUID0gInJlYWQtb2JqZWN0IjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX1JFUE9SVCA9ICJyZXBvcnQiOwotCVN0cmluZyBRVUVSWV9SRURJUkVDVE9SU19fVVBEQVRFID0gInVwZGF0ZSI7Ci0JU3RyaW5nIFFVRVJZX1JFRElSRUNUT1JTX19JTlNFUlQgPSAiaW5zZXJ0IjsKLQlTdHJpbmcgUVVFUllfUkVESVJFQ1RPUlNfX0RFTEVURSA9ICJkZWxldGUiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMTdjMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjJfMC54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMl8wRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLk9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMDoKLQkJCQlyZXR1cm4gY3JlYXRlT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5PUkRFUl9DT1JSRUNUSU9OX1RZUEVfMjA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMFRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgY3JlYXRlT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCByZXN1bHQgPSBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNmY1M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gInYyXzAiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0udjJfMC54bWkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAgPGVtPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lciAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjAgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lciAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjAgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbnZlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjBfX01BUF9LRVlfQ09OVkVSVCA9IFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UID0gWE1MX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BQ0NFU1MgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTkFNRSA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FDQ0VTU19NRVRIT0RTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19QUk9QRVJUSUVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19fUFJPUEVSVElFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0xPQiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RFTVBPUkFMID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19FTlVNRVJBVEVEID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RZUEVfQ09OVkVSVEVSID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3RydWN0IENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09OVkVSVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVFlQRV9DT05WRVJURVJTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PYmplY3QgVHlwZSBDb252ZXJ0ZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUlMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19TVFJVQ1RfQ09OVkVSVEVSUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wIDxlbT5YbWwgRW50aXR5IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwX19RVUVSWV9SRURJUkVDVE9SUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19PQkpFQ1RfVFlQRV9DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX09CSkVDVF9UWVBFX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJ1Y3QgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19TVFJVQ1RfQ09OVkVSVEVSID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX19TVFJVQ1RfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT05WRVJUID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFQUJMRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX19DQUNIRV9JTlRFUkNFUFRPUiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQUNIRUFCTEVfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjAgPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19DT05WRVJURVIgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UeXBlIENvbnZlcnRlcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fVFlQRV9DT05WRVJURVI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2JqZWN0IFR5cGUgQ29udmVydGVyPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX09CSkVDVF9UWVBFX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fT0JKRUNUX1RZUEVfQ09OVkVSVEVSOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0cnVjdCBDb252ZXJ0ZXI8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fU1RSVUNUX0NPTlZFUlRFUiA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQ09OVkVSVEVSX0hPTERFUl9fU1RSVUNUX0NPTlZFUlRFUjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9DT05WRVJURVJfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29udmVydDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0NPTlZFUlRFUl9IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfX0NPUlJFQ1RJT05fVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsIFF1ZXJpZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fQUxMX1FVRVJJRVMgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlYWQgQWxsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwb3J0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFUE9SVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVCA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0RFTEVURSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgPGVtPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMCA9IDk7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sbGVjdGlvbiBNYXBwaW5nIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCNnZXRNYXBLZXlDb252ZXJ0IDxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQoKQotCSAqIEBzZWUgI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2xsZWN0aW9uTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5XzJfMCgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5XzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8wX1F1ZXJ5UmVkaXJlY3RvcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCA8ZW0+WG1sIE1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lciAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAjZ2V0TWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMgPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCNnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQHNlZSAjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvcigpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAgPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCA8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyQ29sdW1uXzJfMCgpCi0JewotCQlyZXR1cm4geG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRDb3JyZWN0aW9uVHlwZSA8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRDb3JyZWN0aW9uVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCA8ZW0+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9ycyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0QWxsUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZEFsbCA8ZW0+UmVhZCBBbGw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWFkIEFsbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsKCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkT2JqZWN0IDxlbT5SZWFkIE9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlYWRPYmplY3QoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVwb3J0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZXBvcnQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRVcGRhdGUgPGVtPlVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRVcGRhdGUoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfVXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0SW5zZXJ0IDxlbT5JbnNlcnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnNlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0SW5zZXJ0KCkKLQkgKiBAc2VlICNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0luc2VydCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMCA8ZW0+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCgpCi0JewotCQlyZXR1cm4gb3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtVjJfMEZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT0xMRUNUSU9OX01BUFBJTkdfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMEVDbGFzcywgWE1MX0NPTExFQ1RJT05fTUFQUElOR18yMF9fTUFQX0tFWV9DT05WRVJUKTsKLQotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCk7Ci0KLQkJeG1sRW50aXR5XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzIwKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8wRUNsYXNzLCBYTUxfRU5USVRZXzIwX19DQUNIRV9JTlRFUkNFUFRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfMEVDbGFzcywgWE1MX0VOVElUWV8yMF9fUVVFUllfUkVESVJFQ1RPUlMpOwotCi0JCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfMjApOwotCi0JCXhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MsIFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMF9fQ0FDSEVfSU5URVJDRVBUT1IpOwotCi0JCXhtbE9uZVRvTWFueV8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZXzIwKTsKLQotCQl4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09SREVSX0NPTFVNTl8yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYTUxfT1JERVJfQ09MVU1OXzIwX19DT1JSRUNUSU9OX1RZUEUpOwotCi0JCXhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fQUxMX1FVRVJJRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1JFQURfQUxMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVQT1JUKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeVJlZGlyZWN0b3JzXzJfMEVDbGFzcywgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19VUERBVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX0lOU0VSVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlSZWRpcmVjdG9yc18yXzBFQ2xhc3MsIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fREVMRVRFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJb3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bSA9IGNyZWF0ZUVFbnVtKE9SREVSX0NPUlJFQ1RJT05fVFlQRV8yMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCUVjbGlwc2VMaW5rT3JtUGFja2FnZSB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGVyc0hvbGRlcigpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkpOwotCQl4bWxNYW55VG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGVySG9sZGVyKCkpOwotCQl4bWxNYW55VG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sQ2FjaGVhYmxlXzJfMCgpKTsKLQkJeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQ29udmVydGVySG9sZGVyKCkpOwotCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoeG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wRUNsYXNzLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MsICJYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzBfTWFwS2V5Q29udmVydCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm1hcEtleUNvbnZlcnQiLCBudWxsLCAwLCAxLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMl8wRUNsYXNzLCBYbWxFbnRpdHlfMl8wLmNsYXNzLCAiWG1sRW50aXR5XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV8yXzBfQ2FjaGVJbnRlcmNlcHRvcigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENsYXNzUmVmZXJlbmNlKCksIG51bGwsICJjYWNoZUludGVyY2VwdG9yIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCksIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzKCksIG51bGwsICJxdWVyeVJlZGlyZWN0b3JzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMC5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wRUNsYXNzLCBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcywgIlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCksIG51bGwsICJtYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIG51bGwsIDAsIC0xLCBYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzBfQ2FjaGVJbnRlcmNlcHRvcigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENsYXNzUmVmZXJlbmNlKCksIG51bGwsICJjYWNoZUludGVyY2VwdG9yIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8wRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8wLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MsIFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcywgIlhtbE9yZGVyQ29sdW1uXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9yZGVyQ29sdW1uXzJfMF9Db3JyZWN0aW9uVHlwZSgpLCB0aGlzLmdldE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKCksICJjb3JyZWN0aW9uVHlwZSIsIG51bGwsIDAsIDEsIFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wRUNsYXNzLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImFsbFF1ZXJpZXMiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZEFsbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlYWRBbGwiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVhZE9iamVjdCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlYWRPYmplY3QiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfUmVwb3J0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicmVwb3J0IiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1VwZGF0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9JbnNlcnQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJpbnNlcnQiLCBudWxsLCAwLCAxLCBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVsZXRlIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0sIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmNsYXNzLCAiT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAiKTsKLQkJYWRkRUVudW1MaXRlcmFsKG9yZGVyQ29ycmVjdGlvblR5cGVfMl8wRUVudW0sIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wLlJFQUQpOwotCQlhZGRFRW51bUxpdGVyYWwob3JkZXJDb3JyZWN0aW9uVHlwZV8yXzBFRW51bSwgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAuUkVBRF9XUklURSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChvcmRlckNvcnJlY3Rpb25UeXBlXzJfMEVFbnVtLCBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5FWENFUFRJT04pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09MTEVDVElPTl9NQVBQSU5HXzIwX19NQVBfS0VZX0NPTlZFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wX01hcEtleUNvbnZlcnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wIDxlbT5YbWwgRW50aXR5IDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMF9fQ0FDSEVfSU5URVJDRVBUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9DYWNoZUludGVyY2VwdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5RdWVyeSBSZWRpcmVjdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMF9fUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMCA8ZW0+WG1sIE1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBfS0VZX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzBfTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlIEludGVyY2VwdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjBfX0NBQ0hFX0lOVEVSQ0VQVE9SID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT05FX1RPX01BTllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCA8ZW0+WG1sIE9yZGVyIENvbHVtbiAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1JERVJfQ09MVU1OXzIwID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29ycmVjdGlvbiBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1JERVJfQ09MVU1OXzIwX19DT1JSRUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX0NvcnJlY3Rpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAgPGVtPlhtbCBRdWVyeSBSZWRpcmVjdG9ycyAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19BTExfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9BbGxRdWVyaWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIEFsbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX0FMTCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkQWxsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWFkIE9iamVjdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19SRUFEX09CSkVDVCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fUkVQT1JUID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlcG9ydCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfUkVESVJFQ1RPUlNfMjBfX1VQREFURSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9VcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluc2VydDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX1JFRElSRUNUT1JTXzIwX19JTlNFUlQgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfSW5zZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9SRURJUkVDVE9SU18yMF9fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX0RlbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIDxlbT5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5PcmRlckNvcnJlY3Rpb25UeXBlXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBPUkRFUl9DT1JSRUNUSU9OX1RZUEVfMjAgPSBlSU5TVEFOQ0UuZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKTsKLQotCX0KLQotfSAvL0VjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9PcmRlckNvcnJlY3Rpb25UeXBlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWExZjUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09yZGVyQ29ycmVjdGlvblR5cGVfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPk9yZGVyIENvbHVtbiBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVBRF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVJFQUQoMCwgIlJFQUQiLCAiUkVBRCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVBRCBXUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRUFEX1dSSVRFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JUkVBRF9XUklURSgxLCAiUkVBRF9XUklURSIsICJSRUFEX1dSSVRFIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhDRVBUSU9OKDIsICJFWENFUFRJT04iLCAiRVhDRVBUSU9OIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUFEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFQUQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFQUQgV1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFQUQgV1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVBRF9XUklURQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURfV1JJVEVfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RVhDRVBUSU9OPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FWENFUFRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhDRVBUSU9OCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5PcmRlciBDb3JyZWN0aW9uIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wW10KLQkJewotCQkJUkVBRCwKLQkJCVJFQURfV1JJVEUsCi0JCQlFWENFUFRJT04sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8T3JkZXJDb3JyZWN0aW9uVHlwZV8yXzA+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T3JkZXIgQ29ycmVjdGlvbiBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPk9yZGVyIENvcnJlY3Rpb24gVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIFJFQURfVkFMVUU6IHJldHVybiBSRUFEOwotCQkJY2FzZSBSRUFEX1dSSVRFX1ZBTFVFOiByZXR1cm4gUkVBRF9XUklURTsKLQkJCWNhc2UgRVhDRVBUSU9OX1ZBTFVFOiByZXR1cm4gRVhDRVBUSU9OOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBPcmRlckNvcnJlY3Rpb25UeXBlXzJfMChpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vT3JkZXJDb2x1bW5Db3JyZWN0aW9uVHlwZV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENhY2hlSW50ZXJjZXB0b3JfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZUludGVyY2VwdG9yXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzA5YTU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENhY2hlSW50ZXJjZXB0b3JfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlIEludGVyY2VwdG9yMiAwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZUludGVyY2VwdG9yXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ2FjaGVJbnRlcmNlcHRvcl8yXzBfQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlSW50ZXJjZXB0b3JfMl8wI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxDYWNoZUludGVyY2VwdG9yMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzU1NzY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25NYXBwaW5nXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb2xsZWN0aW9uIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAjZ2V0TWFwS2V5Q29udmVydCA8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMCBleHRlbmRzIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb252ZXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbnZlcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb252ZXJ0KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25NYXBwaW5nXzJfMF9NYXBLZXlDb252ZXJ0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRNYXBLZXlDb252ZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wI2dldE1hcEtleUNvbnZlcnQgPGVtPk1hcCBLZXkgQ29udmVydDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb252ZXJ0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb252ZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXlDb252ZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjMyNjk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBleHRlbmRzIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIFhtbENvbnZlcnRpYmxlTWFwcGluZywgWG1sQ29udmVydGVyc0hvbGRlciwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbnRpdHlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmE3ZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkyIDA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wX0NhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2FjaGVJbnRlcmNlcHRvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0Q2FjaGVJbnRlcmNlcHRvciA8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYWNoZUludGVyY2VwdG9yKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMF9RdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFF1ZXJ5UmVkaXJlY3RvcnMgZ2V0UXVlcnlSZWRpcmVjdG9ycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRRdWVyeVJlZGlyZWN0b3JzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRRdWVyeVJlZGlyZWN0b3JzKFhtbFF1ZXJ5UmVkaXJlY3RvcnMgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eTJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmI5YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFueVRvTWFueV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXJIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE1hbnkgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9NYW55XzJfMCBleHRlbmRzIFhtbENvbnZlcnRlckhvbGRlciwgWG1sQ29sbGVjdGlvbk1hcHBpbmdfMl8wCi17Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1NmNjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wI2dldE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVzIDxlbT5NYXAgS2V5IEFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRNYXBLZXlBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCi19IC8vIFhtbE1hcEtleUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNiMjgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHBlZFN1cGVyY2xhc3NfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wI2dldENhY2hlSW50ZXJjZXB0b3IgPGVtPkNhY2hlIEludGVyY2VwdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzAgZXh0ZW5kcyBYbWxDYWNoZWFibGVfMl8wCi17Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZSBJbnRlcmNlcHRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMF9DYWNoZUludGVyY2VwdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldENhY2hlSW50ZXJjZXB0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMCNnZXRDYWNoZUludGVyY2VwdG9yIDxlbT5DYWNoZSBJbnRlcmNlcHRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgSW50ZXJjZXB0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhY2hlSW50ZXJjZXB0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlSW50ZXJjZXB0b3IoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi19IC8vIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjhmNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9NYW55XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlckhvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb01hbnlfMl8wIGV4dGVuZHMgWG1sQ29udmVydGVySG9sZGVyLCBYbWxDb2xsZWN0aW9uTWFwcGluZ18yXzAKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzVjNzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyIENvbHVtbiAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRDb3JyZWN0aW9uVHlwZSA8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9yZGVyQ29sdW1uXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db3JyZWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29ycmVjdGlvbiBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRDb3JyZWN0aW9uVHlwZShPcmRlckNvcnJlY3Rpb25UeXBlXzJfMCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9Db3JyZWN0aW9uVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCU9yZGVyQ29ycmVjdGlvblR5cGVfMl8wIGdldENvcnJlY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldENvcnJlY3Rpb25UeXBlIDxlbT5Db3JyZWN0aW9uIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvcnJlY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAKLQkgKiBAc2VlICNnZXRDb3JyZWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29ycmVjdGlvblR5cGUoT3JkZXJDb3JyZWN0aW9uVHlwZV8yXzAgdmFsdWUpOwotCi19IC8vIFhtbE9yZGVyQ29sdW1uXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmExMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IFJlZGlyZWN0b3JzMiAwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0QWxsUXVlcmllcyA8ZW0+QWxsIFF1ZXJpZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlYWRPYmplY3QgPGVtPlJlYWQgT2JqZWN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVwb3J0IDxlbT5SZXBvcnQ8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRVcGRhdGUgPGVtPlVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEluc2VydCA8ZW0+SW5zZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0RGVsZXRlIDxlbT5EZWxldGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGwgUXVlcmllczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWxsIFF1ZXJpZXM8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsbFF1ZXJpZXMoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlSZWRpcmVjdG9yc18yXzBfQWxsUXVlcmllcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QWxsUXVlcmllcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEFsbFF1ZXJpZXMgPGVtPkFsbCBRdWVyaWVzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgUXVlcmllczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxsUXVlcmllcyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmVhZCBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgQWxsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRSZWFkQWxsKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wX1JlYWRBbGwoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlYWRBbGwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeVJlZGlyZWN0b3JzXzJfMCNnZXRSZWFkQWxsIDxlbT5SZWFkIEFsbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVhZCBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlYWRBbGwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlYWRBbGwoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlYWQgT2JqZWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZWFkIE9iamVjdDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVhZE9iamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZWFkT2JqZWN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWFkT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlSZWRpcmVjdG9yc18yXzAjZ2V0UmVhZE9iamVjdCA8ZW0+UmVhZCBPYmplY3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlYWQgT2JqZWN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZWFkT2JqZWN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZWFkT2JqZWN0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBvcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcG9ydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlcG9ydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9SZXBvcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFJlcG9ydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFJlcG9ydCA8ZW0+UmVwb3J0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBvcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlcG9ydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwb3J0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9VcGRhdGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldFVwZGF0ZSA8ZW0+VXBkYXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluc2VydChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9JbnNlcnQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEluc2VydCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldEluc2VydCA8ZW0+SW5zZXJ0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlbGV0ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSNnZXRYbWxRdWVyeVJlZGlyZWN0b3JzXzJfMF9EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5UmVkaXJlY3RvcnNfMl8wI2dldERlbGV0ZSA8ZW0+RGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVsZXRlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sUXVlcnlSZWRpcmVjdG9yczJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQmF0Y2hGZXRjaFR5cGVfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkYTkyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9CYXRjaEZldGNoVHlwZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZV8yXzEgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+Sk9JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKT0lOX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSk9JTigwLCAiSk9JTiIsICJKT0lOIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWElTVFM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRVhJU1RTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRVhJU1RTKDEsICJFWElTVFMiLCAiRVhJU1RTIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJTl9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUlOKDIsICJJTiIsICJJTiIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Sk9JTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Sk9JTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNKT0lOCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTl9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FWElTVFM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkVYSVNUUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFWElTVFMKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWElTVFNfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU48L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5fVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoIFR5cGUgMjE8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJhdGNoRmV0Y2hUeXBlXzJfMVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBCYXRjaEZldGNoVHlwZV8yXzFbXQotCQl7Ci0JCQlKT0lOLAotCQkJRVhJU1RTLAotCQkJSU4sCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEJhdGNoRmV0Y2hUeXBlXzJfMT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlIDIxPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQmF0Y2hGZXRjaFR5cGVfMl8xIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlCYXRjaEZldGNoVHlwZV8yXzEgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhdGNoRmV0Y2hUeXBlXzJfMSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJQmF0Y2hGZXRjaFR5cGVfMl8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJhdGNoRmV0Y2hUeXBlXzJfMSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBKT0lOX1ZBTFVFOiByZXR1cm4gSk9JTjsKLQkJCWNhc2UgRVhJU1RTX1ZBTFVFOiByZXR1cm4gRVhJU1RTOwotCQkJY2FzZSBJTl9WQUxVRTogcmV0dXJuIElOOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBCYXRjaEZldGNoVHlwZV8yXzEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0JhdGNoRmV0Y2hUeXBlXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvQ2FjaGVLZXlUeXBlXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDM2NjA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0NhY2hlS2V5VHlwZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRDYWNoZUtleVR5cGVfMl8xKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBDYWNoZUtleVR5cGVfMl8xIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEIFZBTFVFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lEX1ZBTFVFX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSURfVkFMVUUoMCwgIklEX1ZBTFVFIiwgIklEX1ZBTFVFIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DQUNIRSBLRVk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQ0FDSEVfS0VZX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0FDSEVfS0VZKDEsICJDQUNIRV9LRVkiLCAiQ0FDSEVfS0VZIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVVRPKDIsICJBVVRPIiwgIkFVVE8iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEIFZBTFVFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JRCBWQUxVRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJRF9WQUxVRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1ZBTFVFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNBQ0hFIEtFWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0FDSEUgS0VZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NBQ0hFX0tFWQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0tFWV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE8KLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FjaGVLZXlUeXBlXzJfMVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBDYWNoZUtleVR5cGVfMl8xW10KLQkJewotCQkJSURfVkFMVUUsCi0JCQlDQUNIRV9LRVksCi0JCQlBVVRPLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlIDIxPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Q2FjaGVLZXlUeXBlXzJfMT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZSAyMTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENhY2hlS2V5VHlwZV8yXzEgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUNhY2hlS2V5VHlwZV8yXzEgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUtleVR5cGVfMl8xIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlDYWNoZUtleVR5cGVfMl8xIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGUgMjE8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBDYWNoZUtleVR5cGVfMl8xIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIElEX1ZBTFVFX1ZBTFVFOiByZXR1cm4gSURfVkFMVUU7Ci0JCQljYXNlIENBQ0hFX0tFWV9WQUxVRTogcmV0dXJuIENBQ0hFX0tFWTsKLQkJCWNhc2UgQVVUT19WQUxVRTogcmV0dXJuIEFVVE87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENhY2hlS2V5VHlwZV8yXzEoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0NhY2hlS2V5VHlwZV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGluazJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQ1NDRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkVjbGlwc2VMaW5rMl8wOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmsyXzEKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSBFY2xpcHNlTGluay5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8yXzEueHNkIjsKLQlTdHJpbmcgU0NIRU1BX1ZFUlNJT04JPSAiMi4xIjsKLQkKLQkKLQkvLyBFY2xpcHNlTGluayAyLjEgc3BlY2lmaWMgbm9kZXMKLQkKLQlTdHJpbmcgQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7Ci0JU3RyaW5nIEFUVFJJQlVURV9UWVBFID0gImF0dHJpYnV0ZS10eXBlIjsKLQlTdHJpbmcgQkFUQ0hfRkVUQ0ggPSAiYmF0Y2gtZmV0Y2giOwotCQlTdHJpbmcgQkFUQ0hfRkVUQ0hfX1NJWkUgPSAic2l6ZSI7Ci0JCVN0cmluZyBCQVRDSF9GRVRDSF9fVFlQRSA9ICJ0eXBlIjsKLQlTdHJpbmcgQ0FDSEVfS0VZX1RZUEUgPSAiY2FjaGUta2V5LXR5cGUiOwotCVN0cmluZyBDTEFTU19FWFRSQUNUT1IgPSAiY2xhc3MtZXh0cmFjdG9yIjsKLQlTdHJpbmcgRkVUQ0hfR1JPVVAgPSAiZmV0Y2gtZ3JvdXAiOwotCQlTdHJpbmcgRkVUQ0hfR1JPVVBfX0xPQUQgPSAibG9hZCI7Ci0JU3RyaW5nIFBBUkVOVF9DTEFTUyA9ICJwYXJlbnQtY2xhc3MiOwotCVN0cmluZyBSRVRVUk5fSU5TRVJUID0gInJldHVybi1pbnNlcnQiOwotCVN0cmluZyBSRVRVUk5fT05MWSA9ICJyZXR1cm4tb25seSI7Ci0JU3RyaW5nIFJFVFVSTl9VUERBVEUgPSAicmV0dXJuLXVwZGF0ZSI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9FY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDc0Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSBleHRlbmRzIEVGYWN0b3J5SW1wbAotewotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5IGVJTlNUQU5DRSA9IGluaXQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSB0aGVFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5ID0gKEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5lY2xpcHNlbGluay5vcm0udjJfMS54bWkiKTsgCi0JCQlpZiAodGhlRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLkNBQ0hFX0tFWV9UWVBFXzIxOgotCQkJCXJldHVybiBjcmVhdGVDYWNoZUtleVR5cGVfMl8xRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuQkFUQ0hfRkVUQ0hfVFlQRV8yMToKLQkJCQlyZXR1cm4gY3JlYXRlQmF0Y2hGZXRjaFR5cGVfMl8xRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuQ0FDSEVfS0VZX1RZUEVfMjE6Ci0JCQkJcmV0dXJuIGNvbnZlcnRDYWNoZUtleVR5cGVfMl8xVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5CQVRDSF9GRVRDSF9UWVBFXzIxOgotCQkJCXJldHVybiBjb252ZXJ0QmF0Y2hGZXRjaFR5cGVfMl8xVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYWNoZUtleVR5cGVfMl8xIGNyZWF0ZUNhY2hlS2V5VHlwZV8yXzFGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlDYWNoZUtleVR5cGVfMl8xIHJlc3VsdCA9IENhY2hlS2V5VHlwZV8yXzEuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydENhY2hlS2V5VHlwZV8yXzFUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCYXRjaEZldGNoVHlwZV8yXzEgY3JlYXRlQmF0Y2hGZXRjaFR5cGVfMl8xRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJQmF0Y2hGZXRjaFR5cGVfMl8xIHJlc3VsdCA9IEJhdGNoRmV0Y2hUeXBlXzJfMS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0QmF0Y2hGZXRjaFR5cGVfMl8xVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBnZXRFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8xRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM3ODI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL0VjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5YTUxUeXBlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0gKiA8L3VsPgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gInYyXzEiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5lY2xpcHNlbGluay5vcm0udjJfMS54bWkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xIDxlbT5YbWwgQmFzaWMgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXNpY18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfMjEgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmV0dXJuIFVwZGF0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX19SRVRVUk5fVVBEQVRFID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX19BVFRSSUJVVEVfVFlQRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDXzIxX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmF0Y2hGZXRjaF8yXzEgPGVtPlhtbCBCYXRjaCBGZXRjaCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfMjEgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBVENIX0ZFVENIXzIxX19CQVRDSF9GRVRDSF9UWVBFID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFUQ0hfRkVUQ0hfMjFfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIEZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19KT0lOX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9KT0lOX0ZFVENIX19KT0lOX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhdGNoIEZldGNoPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQVRUUklCVVRFX1RZUEUgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0pPSU5fRkVUQ0hfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfSk9JTl9GRVRDSF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xIDxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRhYmxlXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzIE1ldGhvZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFXzIxX19BQ0NFU1NfTUVUSE9EUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX19BQ0NFU1NfTUVUSE9EUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSA8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEXzIxID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEXzIxX19BVFRSSUJVVEVfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEgPGVtPlhtbCBFbWJlZGRlZCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZElkXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfMjEgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfMjFfX0FUVFJJQlVURV9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW1iZWRkZWQgSWQgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSURfMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxID0gMTA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xIDxlbT5YbWwgRW50aXR5IDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMV9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjFfX0ZFVENIX0dST1VQUyA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1MgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5IDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIxID0gNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMV9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQUNDRVNTX01FVEhPRFNfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0FUVFJJQlVURV8yMSA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0FUVFJJQlVURV8yMV9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEZldGNoIEF0dHJpYnV0ZSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF8yMSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0ZFVENIX0dST1VQXzIxX19BVFRSSUJVVEVTID0gMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRmV0Y2ggR3JvdXAgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRkVUQ0hfR1JPVVBfMjFfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfX0ZFVENIX0dST1VQUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEgPGVtPlhtbCBJZCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbElkXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF8yMSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjFfX0FUVFJJQlVURV9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSWQgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIxID0gMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjFfX0JBVENIX0ZFVENIID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9CQVRDSF9GRVRDSF9IT0xERVJfX0JBVENIX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIxX19BVFRSSUJVVEVfVFlQRSA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEgPGVtPlhtbCBNYW55IFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIxID0gMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMV9fQkFUQ0hfRkVUQ0ggPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gT25lIDIxPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2ggR3JvdXBzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fRkVUQ0hfR1JPVVBTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TRVFVRU5DRV9HRU5FUkFUT1IgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1RBQkxFX0dFTkVSQVRPUiA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fTkFNRURfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX05BTUVEX05BVElWRV9RVUVSSUVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFN0b3JlZCBQcm9jZWR1cmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX05BTUVEX1NUT1JFRF9QUk9DRURVUkVfUVVFUklFUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3MgTWV0aG9kczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19BQ0NFU1NfTUVUSE9EUyA9IE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1FVRVJZX1JFRElSRUNUT1JTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19QQVJFTlRfQ0xBU1MgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIxID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMV9fQkFUQ0hfRkVUQ0ggPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9fQkFUQ0hfRkVUQ0g7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEUgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjFfRkVBVFVSRV9DT1VOVCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2g8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxX19CQVRDSF9GRVRDSCA9IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5YTUxfQkFUQ0hfRkVUQ0hfSE9MREVSX19CQVRDSF9GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIxX0ZFQVRVUkVfQ09VTlQgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0JBVENIX0ZFVENIX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMSA9IDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzcyBNZXRob2RzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMV9fQUNDRVNTX01FVEhPRFMgPSBFY2xpcHNlTGlua09ybVBhY2thZ2UuWE1MX0FDQ0VTU19NRVRIT0RTX0hPTERFUl9fQUNDRVNTX01FVEhPRFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMV9GRUFUVVJFX0NPVU5UID0gRWNsaXBzZUxpbmtPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfTUVUSE9EU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xIDxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfMjEgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb25fMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RSQU5TRk9STUFUSU9OXzIxID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSA8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fMjEgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFByaW1hcnlLZXlfMl8xIDxlbT5YbWwgUHJpbWFyeSBLZXkgMjE8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZXzIxID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGUgS2V5IFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8yMV9fQ0FDSEVfS0VZX1RZUEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV8yMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1JFVFVSTl9JTlNFUlRfMjFfX1JFVFVSTl9PTkxZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUmV0dXJuIEluc2VydCAyMTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVRVUk5fSU5TRVJUXzIxX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fMjFfX0FUVFJJQlVURV9UWVBFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVHJhbnNmb3JtYXRpb24gMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFJBTlNGT1JNQVRJT05fMjFfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl8yMV9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEgPGVtPkNhY2hlIEtleSBUeXBlIDIxPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQ2FjaGVLZXlUeXBlXzJfMQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0Q2FjaGVLZXlUeXBlXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0tFWV9UWVBFXzIxID0gMjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEgPGVtPkJhdGNoIEZldGNoIFR5cGUgMjE8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldEJhdGNoRmV0Y2hUeXBlXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJBVENIX0ZFVENIX1RZUEVfMjEgPSAyMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxCYXRjaEZldGNoXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkYWJsZV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW1iZWRkZWRfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5TWFwcGluZ3NfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEZldGNoQXR0cmlidXRlXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZF8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFueVRvT25lXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb01hbnlfMl8xRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvT25lXzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmV0dXJuSW5zZXJ0XzJfMUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxUcmFuc2Zvcm1hdGlvbl8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbl8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleV8yXzFFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBjYWNoZUtleVR5cGVfMl8xRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBiYXRjaEZldGNoVHlwZV8yXzFFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlTlNfVVJJCi0JICogQHNlZSAjaW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSgpCi0JewotCQlzdXBlcihlTlNfVVJJLCBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KLQkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZU5TX1VSSQotCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSBpbml0KCkKLQl7Ci0JCWlmIChpc0luaXRlZCkgcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZQotCQlFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCUNvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lTlNfVVJJKSA6IEVjbGlwc2VMaW5rT3JtUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPSAoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkksIHRoZUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UpOwotCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEgPGVtPlhtbCBCYXNpYyAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzaWMgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY18yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVybkluc2VydCA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJldHVybiBJbnNlcnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVybkluc2VydCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWNfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQmFzaWNfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVyblVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWNfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSA8ZW0+WG1sIEJhdGNoIEZldGNoIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXRjaCBGZXRjaCAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhdGNoRmV0Y2hfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxCYXRjaEZldGNoXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldFNpemUgPGVtPlNpemU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldFNpemUoKQotCSAqIEBzZWUgI2dldFhtbEJhdGNoRmV0Y2hfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfU2l6ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldEJhdGNoRmV0Y2hUeXBlIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkYWJsZV8yXzEgPGVtPlhtbCBFbWJlZGRhYmxlIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRhYmxlIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGFibGVfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSA8ZW0+WG1sIEVtYmVkZGVkIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRlZCAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZF8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVtYmVkZGVkXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxFbWJlZGRlZF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbWJlZGRlZF8yXzFfQXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW1iZWRkZWRfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEgPGVtPlhtbCBFbWJlZGRlZCBJZCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkXzJfMSgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZElkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEVtYmVkZGVkSWRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xIDxlbT5YbWwgRW50aXR5IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSNnZXRDbGFzc0V4dHJhY3RvciA8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfMl8xX0NsYXNzRXh0cmFjdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfMl8xX1BhcmVudENsYXNzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nc18yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xIDxlbT5YbWwgRmV0Y2ggQXR0cmlidXRlIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoQXR0cmlidXRlXzJfMSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzFfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRmV0Y2hBdHRyaWJ1dGVfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoR3JvdXBfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0QXR0cmlidXRlcygpCi0JICogQHNlZSAjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldExvYWQgPGVtPkxvYWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Mb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldExvYWQoKQotCSAqIEBzZWUgI2dldFhtbEZldGNoR3JvdXBfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRmV0Y2hHcm91cF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRmV0Y2ggR3JvdXAgQ29udGFpbmVyIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEjZ2V0RmV0Y2hHcm91cHMgPGVtPkZldGNoIEdyb3VwczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RmV0Y2ggR3JvdXBzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xI2dldEZldGNoR3JvdXBzKCkKLQkgKiBAc2VlICNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEgPGVtPlhtbCBJZCAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSWQgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSWRfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxJZF8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQHNlZSAjZ2V0WG1sSWRfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbElkXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xIDxlbT5YbWwgTWFueSBUbyBNYW55IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMSgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xIDxlbT5YbWwgTWFueSBUbyBPbmUgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb09uZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmVfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9PbmVfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlF1ZXJ5IFJlZGlyZWN0b3JzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFBhcmVudENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1BhcmVudENsYXNzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9NYW55XzJfMSNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxPbmVUb01hbnlfMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT25lVG9NYW55XzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPbmVUb01hbnlfMl8xRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sT25lVG9PbmVfMl8xIDxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE9uZSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb09uZV8yXzEoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lXzJfMUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEgPGVtPlhtbCBSZXR1cm4gSW5zZXJ0IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBSZXR1cm4gSW5zZXJ0IDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFJldHVybkluc2VydF8yXzEjZ2V0UmV0dXJuT25seSA8ZW0+UmV0dXJuIE9ubHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXR1cm4gT25seTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxSZXR1cm5JbnNlcnRfMl8xI2dldFJldHVybk9ubHkoKQotCSAqIEBzZWUgI2dldFhtbFJldHVybkluc2VydF8yXzEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZXR1cm5JbnNlcnRfMl8xX1JldHVybk9ubHkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFJldHVybkluc2VydF8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xIDxlbT5YbWwgVHJhbnNmb3JtYXRpb24gMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JewotCQlyZXR1cm4geG1sVHJhbnNmb3JtYXRpb25fMl8xRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUcmFuc2Zvcm1hdGlvbl8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSA8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb24gMjE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWZXJzaW9uXzJfMSgpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbl8yXzFFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxWZXJzaW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFZlcnNpb25fMl8xKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVmVyc2lvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmVyc2lvbl8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMSA8ZW0+WG1sIFByaW1hcnkgS2V5IDIxPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlfMl8xKCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5XzJfMUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMSNnZXRDYWNoZUtleVR5cGUgPGVtPkNhY2hlIEtleSBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEjZ2V0Q2FjaGVLZXlUeXBlKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5XzJfMSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFByaW1hcnlLZXlfMl8xX0NhY2hlS2V5VHlwZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJpbWFyeUtleV8yXzFFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xIDxlbT5DYWNoZSBLZXkgVHlwZSAyMTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkNhY2hlIEtleSBUeXBlIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldENhY2hlS2V5VHlwZV8yXzEoKQotCXsKLQkJcmV0dXJuIGNhY2hlS2V5VHlwZV8yXzFFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEgPGVtPkJhdGNoIEZldGNoIFR5cGUgMjE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5CYXRjaCBGZXRjaCBUeXBlIDIxPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkJhdGNoRmV0Y2hUeXBlXzJfMQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLQl7Ci0JCXJldHVybiBiYXRjaEZldGNoVHlwZV8yXzFFRW51bTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5IGdldEVjbGlwc2VMaW5rT3JtVjJfMUZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzFGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sQmFzaWNfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVNJQ18yMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQmFzaWNfMl8xRUNsYXNzLCBYTUxfQkFTSUNfMjFfX1JFVFVSTl9JTlNFUlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2ljXzJfMUVDbGFzcywgWE1MX0JBU0lDXzIxX19SRVRVUk5fVVBEQVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY18yXzFFQ2xhc3MsIFhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEJhdGNoRmV0Y2hfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9CQVRDSF9GRVRDSF8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MsIFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmF0Y2hGZXRjaF8yXzFFQ2xhc3MsIFhNTF9CQVRDSF9GRVRDSF8yMV9fQkFUQ0hfRkVUQ0hfVFlQRSk7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMUVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVtYmVkZGFibGVfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERBQkxFXzIxKTsKLQotCQl4bWxFbWJlZGRlZF8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbWJlZGRlZF8yXzFFQ2xhc3MsIFhNTF9FTUJFRERFRF8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVtYmVkZGVkSWRfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRF8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW1iZWRkZWRJZF8yXzFFQ2xhc3MsIFhNTF9FTUJFRERFRF9JRF8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbEVudGl0eV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV8yMSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5XzJfMUVDbGFzcywgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlfMl8xRUNsYXNzLCBYTUxfRU5USVRZXzIxX19QQVJFTlRfQ0xBU1MpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZX01BUFBJTkdTXzIxKTsKLQotCQl4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0ZFVENIX0FUVFJJQlVURV8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRmV0Y2hBdHRyaWJ1dGVfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfQVRUUklCVVRFXzIxX19OQU1FKTsKLQotCQl4bWxGZXRjaEdyb3VwXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRkVUQ0hfR1JPVVBfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfMjFfX0FUVFJJQlVURVMpOwotCi0JCXhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9GRVRDSF9HUk9VUF9DT05UQUlORVJfMjEpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xRUNsYXNzLCBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxX19GRVRDSF9HUk9VUFMpOwotCi0JCXhtbElkXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbElkXzJfMUVDbGFzcywgWE1MX0lEXzIxX19BVFRSSUJVVEVfVFlQRSk7Ci0KLQkJeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fTUFOWV8yMSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFueVRvTWFueV8yXzFFQ2xhc3MsIFhNTF9NQU5ZX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFKTsKLQotCQl4bWxNYW55VG9PbmVfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORV8yMSk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTWFwcGVkU3VwZXJjbGFzc18yXzFFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1BBUkVOVF9DTEFTUyk7Ci0KLQkJeG1sT25lVG9NYW55XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9uZVRvTWFueV8yXzFFQ2xhc3MsIFhNTF9PTkVfVE9fTUFOWV8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCXhtbE9uZVRvT25lXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMSk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIxKTsKLQotCQl4bWxQcmltYXJ5S2V5XzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFByaW1hcnlLZXlfMl8xRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfMjFfX0NBQ0hFX0tFWV9UWVBFKTsKLQotCQl4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9SRVRVUk5fSU5TRVJUXzIxKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZXR1cm5JbnNlcnRfMl8xRUNsYXNzLCBYTUxfUkVUVVJOX0lOU0VSVF8yMV9fUkVUVVJOX09OTFkpOwotCi0JCXhtbFRyYW5zZm9ybWF0aW9uXzJfMUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNGT1JNQVRJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRyYW5zZm9ybWF0aW9uXzJfMUVDbGFzcywgWE1MX1RSQU5TRk9STUFUSU9OXzIxX19BVFRSSUJVVEVfVFlQRSk7Ci0KLQkJeG1sVmVyc2lvbl8yXzFFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZFUlNJT05fMjEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFZlcnNpb25fMl8xRUNsYXNzLCBYTUxfVkVSU0lPTl8yMV9fQVRUUklCVVRFX1RZUEUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQljYWNoZUtleVR5cGVfMl8xRUVudW0gPSBjcmVhdGVFRW51bShDQUNIRV9LRVlfVFlQRV8yMSk7Ci0JCWJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtID0gY3JlYXRlRUVudW0oQkFUQ0hfRkVUQ0hfVFlQRV8yMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNsaXBzZUxpbmtPcm1QYWNrYWdlIHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEpvaW5GZXRjaCgpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkpOwotCQl4bWxFbWJlZGRhYmxlXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQkJeG1sRW50aXR5XzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQkJeG1sRW50aXR5XzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc18yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIoKSk7Ci0JCXhtbE1hbnlUb01hbnlfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkpOwotCQl4bWxNYW55VG9PbmVfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUXVlcnlDb250YWluZXIoKSk7Ci0JCXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKCkpOwotCQl4bWxPbmVUb01hbnlfMl8xRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5nZXRYbWxCYXRjaEZldGNoSG9sZGVyKCkpOwotCQl4bWxPbmVUb09uZV8yXzFFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEJhdGNoRmV0Y2hIb2xkZXIoKSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sQWNjZXNzTWV0aG9kc0hvbGRlcigpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEJhc2ljXzJfMUVDbGFzcywgWG1sQmFzaWNfMl8xLmNsYXNzLCAiWG1sQmFzaWNfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUmV0dXJuSW5zZXJ0KCksIG51bGwsICJyZXR1cm5JbnNlcnQiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljXzJfMV9SZXR1cm5VcGRhdGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAicmV0dXJuVXBkYXRlIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWNfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNpY18yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXRjaEZldGNoXzJfMUVDbGFzcywgWG1sQmF0Y2hGZXRjaF8yXzEuY2xhc3MsICJYbWxCYXRjaEZldGNoXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhdGNoRmV0Y2hfMl8xX1NpemUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzaXplIiwgbnVsbCwgMCwgMSwgWG1sQmF0Y2hGZXRjaF8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhdGNoRmV0Y2hfMl8xX0JhdGNoRmV0Y2hUeXBlKCksIHRoaXMuZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCksICJiYXRjaEZldGNoVHlwZSIsIG51bGwsIDAsIDEsIFhtbEJhdGNoRmV0Y2hfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8xRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRhYmxlXzJfMUVDbGFzcywgWG1sRW1iZWRkYWJsZV8yXzEuY2xhc3MsICJYbWxFbWJlZGRhYmxlXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZF8yXzFFQ2xhc3MsIFhtbEVtYmVkZGVkXzJfMS5jbGFzcywgIlhtbEVtYmVkZGVkXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVtYmVkZGVkXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbEVtYmVkZGVkXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkSWRfMl8xRUNsYXNzLCBYbWxFbWJlZGRlZElkXzJfMS5jbGFzcywgIlhtbEVtYmVkZGVkSWRfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRlZElkXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8yXzFFQ2xhc3MsIFhtbEVudGl0eV8yXzEuY2xhc3MsICJYbWxFbnRpdHlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMV9DbGFzc0V4dHJhY3RvcigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENsYXNzUmVmZXJlbmNlKCksIG51bGwsICJjbGFzc0V4dHJhY3RvciIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eV8yXzFfUGFyZW50Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXJlbnRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc18yXzFFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzXzJfMS5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxGZXRjaEF0dHJpYnV0ZV8yXzFFQ2xhc3MsIFhtbEZldGNoQXR0cmlidXRlXzJfMS5jbGFzcywgIlhtbEZldGNoQXR0cmlidXRlXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbEZldGNoQXR0cmlidXRlXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEZldGNoR3JvdXBfMl8xRUNsYXNzLCBYbWxGZXRjaEdyb3VwXzJfMS5jbGFzcywgIlhtbEZldGNoR3JvdXBfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxGZXRjaEdyb3VwXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJsb2FkIiwgbnVsbCwgMCwgMSwgWG1sRmV0Y2hHcm91cF8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEZldGNoR3JvdXBfMl8xX0F0dHJpYnV0ZXMoKSwgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmdldFhtbEZldGNoQXR0cmlidXRlKCksIG51bGwsICJhdHRyaWJ1dGVzIiwgbnVsbCwgMCwgLTEsIFhtbEZldGNoR3JvdXBfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzFFQ2xhc3MsIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmNsYXNzLCAiWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sRmV0Y2hHcm91cCgpLCBudWxsLCAiZmV0Y2hHcm91cHMiLCBudWxsLCAwLCAtMSwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxJZF8yXzFFQ2xhc3MsIFhtbElkXzJfMS5jbGFzcywgIlhtbElkXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbElkXzJfMV9BdHRyaWJ1dGVUeXBlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYXR0cmlidXRlVHlwZSIsIG51bGwsIDAsIDEsIFhtbElkXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8xRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMS5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxNYW55VG9NYW55XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb09uZV8yXzFFQ2xhc3MsIFhtbE1hbnlUb09uZV8yXzEuY2xhc3MsICJYbWxNYW55VG9PbmVfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xRUNsYXNzLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5jbGFzcywgIlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKSwgdGhlT3JtUGFja2FnZS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCksIG51bGwsICJzcWxSZXN1bHRTZXRNYXBwaW5ncyIsIG51bGwsIDAsIC0xLCBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpLCB0aGVFY2xpcHNlTGlua09ybVBhY2thZ2UuZ2V0WG1sUXVlcnlSZWRpcmVjdG9ycygpLCBudWxsLCAicXVlcnlSZWRpcmVjdG9ycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBhcmVudENsYXNzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8xRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8xLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxPbmVUb01hbnlfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVfMl8xRUNsYXNzLCBYbWxPbmVUb09uZV8yXzEuY2xhc3MsICJYbWxPbmVUb09uZV8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleV8yXzFFQ2xhc3MsIFhtbFByaW1hcnlLZXlfMl8xLmNsYXNzLCAiWG1sUHJpbWFyeUtleV8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKSwgdGhpcy5nZXRDYWNoZUtleVR5cGVfMl8xKCksICJjYWNoZUtleVR5cGUiLCBudWxsLCAwLCAxLCBYbWxQcmltYXJ5S2V5XzJfMS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFJldHVybkluc2VydF8yXzFFQ2xhc3MsIFhtbFJldHVybkluc2VydF8yXzEuY2xhc3MsICJYbWxSZXR1cm5JbnNlcnRfMl8xIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMV9SZXR1cm5Pbmx5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInJldHVybk9ubHkiLCBudWxsLCAwLCAxLCBYbWxSZXR1cm5JbnNlcnRfMl8xLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHJhbnNmb3JtYXRpb25fMl8xRUNsYXNzLCBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEuY2xhc3MsICJYbWxUcmFuc2Zvcm1hdGlvbl8yXzEiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImF0dHJpYnV0ZVR5cGUiLCBudWxsLCAwLCAxLCBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWZXJzaW9uXzJfMUVDbGFzcywgWG1sVmVyc2lvbl8yXzEuY2xhc3MsICJYbWxWZXJzaW9uXzJfMSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFZlcnNpb25fMl8xX0F0dHJpYnV0ZVR5cGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJhdHRyaWJ1dGVUeXBlIiwgbnVsbCwgMCwgMSwgWG1sVmVyc2lvbl8yXzEuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5jbGFzcywgIkNhY2hlS2V5VHlwZV8yXzEiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5JRF9WQUxVRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChjYWNoZUtleVR5cGVfMl8xRUVudW0sIENhY2hlS2V5VHlwZV8yXzEuQ0FDSEVfS0VZKTsKLQkJYWRkRUVudW1MaXRlcmFsKGNhY2hlS2V5VHlwZV8yXzFFRW51bSwgQ2FjaGVLZXlUeXBlXzJfMS5BVVRPKTsKLQotCQlpbml0RUVudW0oYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5jbGFzcywgIkJhdGNoRmV0Y2hUeXBlXzJfMSIpOwotCQlhZGRFRW51bUxpdGVyYWwoYmF0Y2hGZXRjaFR5cGVfMl8xRUVudW0sIEJhdGNoRmV0Y2hUeXBlXzJfMS5KT0lOKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuRVhJU1RTKTsKLQkJYWRkRUVudW1MaXRlcmFsKGJhdGNoRmV0Y2hUeXBlXzJfMUVFbnVtLCBCYXRjaEZldGNoVHlwZV8yXzEuSU4pOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSA8ZW0+WG1sIEJhc2ljIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18yMSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJldHVybiBJbnNlcnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9CQVNJQ18yMV9fUkVUVVJOX0lOU0VSVCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzFfUmV0dXJuSW5zZXJ0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gVXBkYXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfMjFfX1JFVFVSTl9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX1JldHVyblVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ18yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSA8ZW0+WG1sIEJhdGNoIEZldGNoIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFUQ0hfRkVUQ0hfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVRDSF9GRVRDSF8yMV9fU0laRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXRjaEZldGNoXzJfMV9TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CYXRjaCBGZXRjaCBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFUQ0hfRkVUQ0hfMjFfX0JBVENIX0ZFVENIX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfQmF0Y2hGZXRjaFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGFibGVfMl8xIDxlbT5YbWwgRW1iZWRkYWJsZSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRhYmxlXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREFCTEVfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZF8yXzEgPGVtPlhtbCBFbWJlZGRlZCAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZF8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VNQkVEREVEXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZF8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xIDxlbT5YbWwgRW1iZWRkZWQgSWQgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZElkXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERFRF9JRF8yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbWJlZGRlZElkXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTUJFRERFRF9JRF8yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEgPGVtPlhtbCBFbnRpdHkgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZXzIxID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIEV4dHJhY3RvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMV9fQ0xBU1NfRVhUUkFDVE9SID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV8yMV9fUEFSRU5UX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzFfUGFyZW50Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlNYXBwaW5nc18yXzEgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW50aXR5TWFwcGluZ3NfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV9NQVBQSU5HU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEgPGVtPlhtbCBGZXRjaCBBdHRyaWJ1dGUgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0ZFVENIX0FUVFJJQlVURV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEF0dHJpYnV0ZV8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9BVFRSSUJVVEVfMjFfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSA8ZW0+WG1sIEZldGNoIEdyb3VwIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9GRVRDSF9HUk9VUF8yMV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9GRVRDSF9HUk9VUF8yMV9fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRkVUQ0hfR1JPVVBfMjFfX0xPQUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRmV0Y2hHcm91cF8yXzFfTG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xIDxlbT5YbWwgRmV0Y2ggR3JvdXAgQ29udGFpbmVyIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRkVUQ0hfR1JPVVBfQ09OVEFJTkVSXzIxID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaCBHcm91cHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0ZFVENIX0dST1VQX0NPTlRBSU5FUl8yMV9fRkVUQ0hfR1JPVVBTID0gZUlOU1RBTkNFLmdldFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xX0ZldGNoR3JvdXBzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xIDxlbT5YbWwgSWQgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sSWRfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sSWRfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEXzIxID0gZUlOU1RBTkNFLmdldFhtbElkXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JRF8yMV9fQVRUUklCVVRFX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMSA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9NYW55XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX01BTllfVE9fTUFOWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9NYW55XzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQU5ZX1RPX01BTllfMjFfX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYW55VG9PbmVfMl8xIDxlbT5YbWwgTWFueSBUbyBPbmUgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvT25lXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb09uZV8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19PTkVfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIxX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UXVlcnkgUmVkaXJlY3RvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMV9fUVVFUllfUkVESVJFQ1RPUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjFfX1BBUkVOVF9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMV9QYXJlbnRDbGFzcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvTWFueV8yXzEgPGVtPlhtbCBPbmUgVG8gTWFueSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09ORV9UT19NQU5ZXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb09uZV8yXzEgPGVtPlhtbCBPbmUgVG8gT25lIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE9uZVRvT25lXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FXzIxID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjEgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSA8ZW0+WG1sIFJldHVybiBJbnNlcnQgMjE8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVUVVJOX0lOU0VSVF8yMSA9IGVJTlNUQU5DRS5nZXRYbWxSZXR1cm5JbnNlcnRfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFVFVSTl9JTlNFUlRfMjFfX1JFVFVSTl9PTkxZID0gZUlOU1RBTkNFLmdldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSA8ZW0+WG1sIFRyYW5zZm9ybWF0aW9uIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UUkFOU0ZPUk1BVElPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxUcmFuc2Zvcm1hdGlvbl8yXzEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFJBTlNGT1JNQVRJT05fMjFfX0FUVFJJQlVURV9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEgPGVtPlhtbCBWZXJzaW9uIDIxPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzEoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTl8yMSA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9WRVJTSU9OXzIxX19BVFRSSUJVVEVfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEgPGVtPlhtbCBQcmltYXJ5IEtleSAyMTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxQcmltYXJ5S2V5XzJfMQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BSSU1BUllfS0VZXzIxID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYWNoZSBLZXkgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BSSU1BUllfS0VZXzIxX19DQUNIRV9LRVlfVFlQRSA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5XzJfMV9DYWNoZUtleVR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5DYWNoZUtleVR5cGVfMl8xIDxlbT5DYWNoZSBLZXkgVHlwZSAyMTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRDYWNoZUtleVR5cGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBDQUNIRV9LRVlfVFlQRV8yMSA9IGVJTlNUQU5DRS5nZXRDYWNoZUtleVR5cGVfMl8xKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xIDxlbT5CYXRjaCBGZXRjaCBUeXBlIDIxPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuQmF0Y2hGZXRjaFR5cGVfMl8xCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0QmF0Y2hGZXRjaFR5cGVfMl8xKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBCQVRDSF9GRVRDSF9UWVBFXzIxID0gZUlOU1RBTkNFLmdldEJhdGNoRmV0Y2hUeXBlXzJfMSgpOwotCi0JfQotCi19IC8vRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmFzaWNfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXNpY18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlMjZlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxCYXNpY18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJldHVybkluc2VydDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEJhc2ljIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXNpY18yXzEjZ2V0UmV0dXJuSW5zZXJ0IDxlbT5SZXR1cm4gSW5zZXJ0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVyblVwZGF0ZSA8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxCYXNpY18yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UmV0dXJuIEluc2VydDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXR1cm4gSW5zZXJ0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8xX1JldHVybkluc2VydCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxSZXR1cm5JbnNlcnQgZ2V0UmV0dXJuSW5zZXJ0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldFJldHVybkluc2VydCA8ZW0+UmV0dXJuIEluc2VydDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIEluc2VydDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmV0dXJuSW5zZXJ0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSZXR1cm5JbnNlcnQoWG1sUmV0dXJuSW5zZXJ0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJldHVybiBVcGRhdGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIFVwZGF0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXNpY18yXzFfUmV0dXJuVXBkYXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFJldHVyblVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhc2ljXzJfMSNnZXRSZXR1cm5VcGRhdGUgPGVtPlJldHVybiBVcGRhdGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJldHVybiBVcGRhdGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVyblVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmV0dXJuVXBkYXRlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEJhc2ljXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sQmFzaWNfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEJhc2ljXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEJhdGNoRmV0Y2hfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZTliMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sQmF0Y2hGZXRjaF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmF0Y2ggRmV0Y2ggMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldFNpemUgPGVtPlNpemU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRCYXRjaEZldGNoVHlwZSA8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhdGNoRmV0Y2hfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNpemU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2l6ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sQmF0Y2hGZXRjaF8yXzFfU2l6ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlZ2VyIGdldFNpemUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxCYXRjaEZldGNoXzJfMSNnZXRTaXplIDxlbT5TaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRTaXplKEludGVnZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmF0Y2ggRmV0Y2ggVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmF0Y2ggRmV0Y2ggVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEKLQkgKiBAc2VlICNzZXRCYXRjaEZldGNoVHlwZShCYXRjaEZldGNoVHlwZV8yXzEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxCYXRjaEZldGNoXzJfMV9CYXRjaEZldGNoVHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJhdGNoRmV0Y2hUeXBlXzJfMSBnZXRCYXRjaEZldGNoVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEJhdGNoRmV0Y2hfMl8xI2dldEJhdGNoRmV0Y2hUeXBlIDxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5CYXRjaCBGZXRjaCBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5CYXRjaEZldGNoVHlwZV8yXzEKLQkgKiBAc2VlICNnZXRCYXRjaEZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QmF0Y2hGZXRjaFR5cGUoQmF0Y2hGZXRjaFR5cGVfMl8xIHZhbHVlKTsKLQotfSAvLyBYbWxCYXRjaEZldGNoXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxMjIyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXRjaEZldGNoSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqICAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xIGV4dGVuZHMgWG1sSm9pbkZldGNoLCBYbWxCYXRjaEZldGNoSG9sZGVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW1iZWRkYWJsZV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGFibGVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMzZkYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW1iZWRkYWJsZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkYWJsZSAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW1iZWRkYWJsZV8yXzEgZXh0ZW5kcyBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi17Ci19IC8vIFhtbEVtYmVkZGFibGVfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbWJlZGRlZElkXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW1iZWRkZWRJZF8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwZWE1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbWJlZGRlZElkXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCBJZCAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVtYmVkZGVkSWRfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRlZElkXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRJZF8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVtYmVkZGVkSWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEVtYmVkZGVkSWRfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbWJlZGRlZF8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGVkXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzMxNTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVtYmVkZGVkXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbWJlZGRlZCAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRW1iZWRkZWRfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGVkXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbWJlZGRlZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW1iZWRkZWRfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxFbnRpdHlNYXBwaW5nc18yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGQ0MTdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eU1hcHBpbmdzXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlNYXBwaW5nc18yXzEgZXh0ZW5kcyBYbWxBY2Nlc3NNZXRob2RzSG9sZGVyCi17Ci19IC8vIFhtbEVudGl0eU1hcHBpbmdzXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW50aXR5XzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRW50aXR5XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmI5MTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEVudGl0eV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc01ldGhvZHNIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbnRpdHkgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0Q2xhc3NFeHRyYWN0b3IgPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEVudGl0eV8yXzEjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzJfMSBleHRlbmRzIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIsIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgRXh0cmFjdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgRXh0cmFjdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDbGFzc0V4dHJhY3RvcihYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEVudGl0eV8yXzFfQ2xhc3NFeHRyYWN0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0Q2xhc3NFeHRyYWN0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldENsYXNzRXh0cmFjdG9yIDxlbT5DbGFzcyBFeHRyYWN0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIEV4dHJhY3RvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q2xhc3NFeHRyYWN0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsYXNzRXh0cmFjdG9yKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyZW50Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMV9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyZW50Q2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxFbnRpdHlfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRW50aXR5XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEF0dHJpYnV0ZV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjY2I0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEF0dHJpYnV0ZV8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggQXR0cmlidXRlIDIxPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEF0dHJpYnV0ZV8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hBdHRyaWJ1dGVfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxGZXRjaEF0dHJpYnV0ZV8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoQXR0cmlidXRlXzJfMV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hBdHRyaWJ1dGVfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxGZXRjaEF0dHJpYnV0ZV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbEZldGNoR3JvdXBDb250YWluZXJfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U4YmY5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEZldGNoIEdyb3VwIENvbnRhaW5lciAyMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEjZ2V0RmV0Y2hHcm91cHMgPGVtPkZldGNoIEdyb3VwczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoIEdyb3VwczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hHcm91cH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaCBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaCBHcm91cHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwQ29udGFpbmVyXzJfMV9GZXRjaEdyb3VwcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxGZXRjaEdyb3VwPiBnZXRGZXRjaEdyb3VwcygpOwotCi19IC8vIFhtbEZldGNoR3JvdXBDb250YWluZXJfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sRmV0Y2hHcm91cF8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzZTRkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxGZXRjaEdyb3VwXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEZldGNoQXR0cmlidXRlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRmV0Y2ggR3JvdXAgMjE8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxGZXRjaEdyb3VwXzJfMSNnZXRMb2FkIDxlbT5Mb2FkPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0QXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sRmV0Y2hHcm91cF8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEZldGNoR3JvdXBfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sRmV0Y2hHcm91cF8yXzEjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRmV0Y2hBdHRyaWJ1dGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxGZXRjaEdyb3VwXzJfMV9BdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEZldGNoQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2FkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2FkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYWQoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbEZldGNoR3JvdXBfMl8xX0xvYWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0TG9hZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbEZldGNoR3JvdXBfMl8xI2dldExvYWQgPGVtPkxvYWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvYWQoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sRmV0Y2hHcm91cF8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbElkXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sSWRfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmM2VkM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sSWRfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIElkIDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxJZF8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbElkXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWRfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxJZF8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbElkXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZVR5cGUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxJZF8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE1hbnlUb01hbnlfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9NYW55XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FlZmI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE1hbnlUb01hbnlfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gTWFueSAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFueVRvTWFueV8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9NYW55XzJfMSBleHRlbmRzIFhtbEJhdGNoRmV0Y2hIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hbnlUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbE1hbnlUb01hbnlfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9PbmVfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYW55VG9PbmVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjE5ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFueVRvT25lXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhdGNoRmV0Y2hIb2xkZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYW55IFRvIE9uZSAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9PbmVfMl8xIGV4dGVuZHMgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotfSAvLyBYbWxNYW55VG9PbmVfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhNzk0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5UmVkaXJlY3RvcnM7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEjZ2V0UXVlcnlSZWRpcmVjdG9ycyA8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEgZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgWG1sRmV0Y2hHcm91cENvbnRhaW5lcl8yXzEsIFhtbEdlbmVyYXRvckNvbnRhaW5lciwgWG1sUXVlcnlDb250YWluZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIsIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4gZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlF1ZXJ5IFJlZGlyZWN0b3JzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UXVlcnlSZWRpcmVjdG9ycyhYbWxRdWVyeVJlZGlyZWN0b3JzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzFfUXVlcnlSZWRpcmVjdG9ycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxRdWVyeVJlZGlyZWN0b3JzIGdldFF1ZXJ5UmVkaXJlY3RvcnMoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMSNnZXRRdWVyeVJlZGlyZWN0b3JzIDxlbT5RdWVyeSBSZWRpcmVjdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UXVlcnkgUmVkaXJlY3RvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFF1ZXJ5UmVkaXJlY3RvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFF1ZXJ5UmVkaXJlY3RvcnMoWG1sUXVlcnlSZWRpcmVjdG9ycyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcmVudENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xX1BhcmVudENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJlbnRDbGFzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8xI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UGFyZW50Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBhcmVudENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sTWFwcGVkU3VwZXJjbGFzc18yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvTWFueV8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvTWFueV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiNGU5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxPbmVUb01hbnlfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIxPC9iPjwvZW0+Jy4KLSAqICAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb01hbnlfMl8xIGV4dGVuZHMgWG1sQmF0Y2hGZXRjaEhvbGRlcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8xX0F0dHJpYnV0ZVR5cGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5YbWxPbmVUb01hbnlfMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbE9uZVRvTWFueV8yXzEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbE9uZVRvT25lXzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9PbmVfMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2M3NGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sT25lVG9PbmVfMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmF0Y2hGZXRjaEhvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBPbmUgMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb09uZV8yXzEgZXh0ZW5kcyBYbWxCYXRjaEZldGNoSG9sZGVyCi17Ci19IC8vIFhtbE9uZVRvT25lXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlOGU4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NNZXRob2RzSG9sZGVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMSBleHRlbmRzIFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIKLXsKLX0gLy8gWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUHJpbWFyeUtleV8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyN2YzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxQcmltYXJ5S2V5XzJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcmltYXJ5IEtleSAyMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleV8yXzEoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFByaW1hcnlLZXlfMl8xIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlIEtleSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzF9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNzZXRDYWNoZUtleVR5cGUoQ2FjaGVLZXlUeXBlXzJfMSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFByaW1hcnlLZXlfMl8xX0NhY2hlS2V5VHlwZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUNhY2hlS2V5VHlwZV8yXzEgZ2V0Q2FjaGVLZXlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUHJpbWFyeUtleV8yXzEjZ2V0Q2FjaGVLZXlUeXBlIDxlbT5DYWNoZSBLZXkgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGUgS2V5IFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkNhY2hlS2V5VHlwZV8yXzEKLQkgKiBAc2VlICNnZXRDYWNoZUtleVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlS2V5VHlwZShDYWNoZUtleVR5cGVfMl8xIHZhbHVlKTsKLQotfSAvLyBYbWxQcmltYXJ5S2V5XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUmV0dXJuSW5zZXJ0XzJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sUmV0dXJuSW5zZXJ0XzJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGZhNWViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFJldHVybkluc2VydF8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUmV0dXJuIEluc2VydCAyMTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sUmV0dXJuSW5zZXJ0XzJfMSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUmV0dXJuSW5zZXJ0XzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXR1cm4gT25seTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJldHVybk9ubHkoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFJldHVybkluc2VydF8yXzFfUmV0dXJuT25seSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRSZXR1cm5Pbmx5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sUmV0dXJuSW5zZXJ0XzJfMSNnZXRSZXR1cm5Pbmx5IDxlbT5SZXR1cm4gT25seTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmV0dXJuIE9ubHk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJldHVybk9ubHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJldHVybk9ubHkoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sUmV0dXJuSW5zZXJ0XzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVHJhbnNmb3JtYXRpb25fMl8xLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmZGIwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMS9YbWxUcmFuc2Zvcm1hdGlvbl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHJhbnNmb3JtYXRpb24gMjE8L2I+PC9lbT4nLgotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFRyYW5zZm9ybWF0aW9uXzJfMSNnZXRBdHRyaWJ1dGVUeXBlIDxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVHJhbnNmb3JtYXRpb25fMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxUcmFuc2Zvcm1hdGlvbl8yXzEgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVUeXBlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFRyYW5zZm9ybWF0aW9uXzJfMV9BdHRyaWJ1dGVUeXBlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVHJhbnNmb3JtYXRpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFRyYW5zZm9ybWF0aW9uXzJfMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVmVyc2lvbl8yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8xL1htbFZlcnNpb25fMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDM1MjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzEvWG1sVmVyc2lvbl8yXzEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVmVyc2lvbiAyMTwvYj48L2VtPicuCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuWG1sVmVyc2lvbl8yXzEjZ2V0QXR0cmlidXRlVHlwZSA8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlI2dldFhtbFZlcnNpb25fMl8xKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxWZXJzaW9uXzJfMSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZVR5cGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UjZ2V0WG1sVmVyc2lvbl8yXzFfQXR0cmlidXRlVHlwZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLlhtbFZlcnNpb25fMl8xI2dldEF0dHJpYnV0ZVR5cGUgPGVtPkF0dHJpYnV0ZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QXR0cmlidXRlVHlwZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFZlcnNpb25fMl8xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGluazJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvRWNsaXBzZUxpbmsyXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkYjU3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGluazJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rMl8yCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMAotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gRWNsaXBzZUxpbmsuU0NIRU1BX05BTUVTUEFDRTsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OCT0gIjIuMiI7Ci0JCi0JCi0JLy8gRWNsaXBzZUxpbmsgMi4yIHNwZWNpZmljIG5vZGVzCi0JU3RyaW5nIEFERElUSU9OQUxfQ1JJVEVSSUEgPSAiYWRkaXRpb25hbC1jcml0ZXJpYSI7Ci0JU3RyaW5nIENBU0NBREVfT05fREVMRVRFID0gImNhc2NhZGUtb24tZGVsZXRlIjsKLQlTdHJpbmcgQ1JJVEVSSUEgPSAiY3JpdGVyaWEiOwotCVN0cmluZyBDUkVBVElPTl9TVUZGSVggPSAiY3JlYXRpb24tc3VmZml4IjsKLQlTdHJpbmcgSEFTSF9QQVJUSVRJT05JTkcgPSAiaGFzaC1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBJTkRFWCA9ICJpbmRleCI7Ci0JCVN0cmluZyBJTkRFWF9fQ09MVU1OX05BTUUgPSAiY29sdW1uLW5hbWUiOwotCQlTdHJpbmcgSU5ERVhfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBJTkRFWF9fQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQkJU3RyaW5nIElOREVYX19TQ0hFTUEgPSAic2NoZW1hIjsKLQkJU3RyaW5nIElOREVYX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCVN0cmluZyBJTkRFWF9fVU5JUVVFID0gInVuaXF1ZSI7Ci0JU3RyaW5nIFBBUkVOVF9DTEFTUyA9ICJwYXJlbnQtY2xhc3MiOwotCVN0cmluZyBQQVJUSVRJT05JTkcgPSAicGFydGl0aW9uaW5nIjsKLQlTdHJpbmcgUEFSVElUSU9OSU5HX0dST1VQX19QQVJUSVRJT05FRCA9ICJwYXJ0aXRpb25lZCI7Ci0JU3RyaW5nIFBJTk5FRF9QQVJUSVRJT05JTkcgPSAicGlubmVkLXBhcnRpdGlvbmluZyI7Ci0JU3RyaW5nIFJBTkdFX1BBUlRJVElPTklORyA9ICJyYW5nZS1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBSRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSAicmVwbGljYXRpb24tcGFydGl0aW9uaW5nIjsKLQlTdHJpbmcgUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gInJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI7Ci0JU3RyaW5nIFVOSU9OX1BBUlRJVElPTklORyA9ICJ1bmlvbi1wYXJ0aXRpb25pbmciOwotCVN0cmluZyBWQUxVRV9QQVJUSVRJT05JTkcgPSAidmFsdWUtcGFydGl0aW9uaW5nIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL0VjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjOGI0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCUVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkgdGhlRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSA9IChFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQuZWNsaXBzZWxpbmsub3JtLnYyXzIueG1pIik7IAotCQkJaWYgKHRoZUVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIGdldEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYyXzJGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTdlNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAidjJfMiI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0LmVjbGlwc2VsaW5rLm9ybS52Ml8yLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMiI7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIDxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjIgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQURESVRJT05BTF9DUklURVJJQV8yMl9fQ1JJVEVSSUEgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FERElUSU9OQUxfQ1JJVEVSSUFfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIgPGVtPlhtbCBCYXNpYyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMl9fSU5ERVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBCYXNpYyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ18yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIgPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl8yMiA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIENvbGxlY3Rpb24gMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfQ09MTEVDVElPTl8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiA8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljTWFwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfMjIgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfTUFQXzIyX19DQVNDQURFX09OX0RFTEVURSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19NQVBfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjIgPSA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiA8ZW0+WG1sIFBhcnRpdGlvbmluZyBHcm91cCAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjIgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBhcnRpdGlvbmluZyBHcm91cCAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1ZBTFVFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fUEFSVElUSU9ORUQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjJfX05PTl9DQUNIRUFCTEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiA8ZW0+WG1sIEVudGl0eSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyID0gOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yIDxlbT5YbWwgTWFueSBUbyBNYW55IDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjIgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIgPGVtPlhtbCBNYW55IFRvIE9uZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIgPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjIgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIgPGVtPlhtbCBPbmUgVG8gTWFueSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HXzIyID0gMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjIgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjIgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjIgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfMjIgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVtYmVkZGFibGVfMl8yIDxlbT5YbWwgRW1iZWRkYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMiA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMl9fQVRUUklCVVRFX09WRVJSSURFUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFXzIyX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcmVudCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfMjJfX1BBUkVOVF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGFibGUgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV8yMl9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1ZBTFVFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fUEFSVElUSU9ORUQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19BRERJVElPTkFMX0NSSVRFUklBID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIyX19JTkRFWCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BBUlRJVElPTklORyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkFOR0VfUEFSVElUSU9OSU5HID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19IQVNIX1BBUlRJVElPTklORyA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfRkVBVFVSRV9DT1VOVCA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIgPGVtPlhtbCBJZCAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbElkXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF8yMiA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjJfX0lOREVYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSWQgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIgPGVtPlhtbCBJbmRleCAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEluZGV4XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF8yMiA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF8yMl9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjJfX1NDSEVNQSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYXzIyX19DQVRBTE9HID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lOREVYXzIyX19UQUJMRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjJfX1VOSVFVRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JTkRFWF8yMl9fQ09MVU1OX05BTUVTID0gNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSW5kZXggMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSU5ERVhfMjJfRkVBVFVSRV9DT1VOVCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yIDxlbT5YbWwgSm9pbiBUYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxKb2luVGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfMjIgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVggPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKb2luIFRhYmxlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfMjJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmFuZ2UgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fSEFTSF9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIyX19OT05fQ0FDSEVBQkxFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFueSBUbyBNYW55IDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMl9GRUFUVVJFX0NPVU5UID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QaW5uZWQgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX1ZBTFVFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1ZBTFVFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19IQVNIX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9fUEFSVElUSU9ORUQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE9uZSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV8yMl9GRUFUVVJFX0NPVU5UID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyID0gMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fUkFOR0VfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fVU5JT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTXzIyX19BRERJVElPTkFMX0NSSVRFUklBID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3MgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMl9fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1BJTk5FRF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QSU5ORURfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19IQVNIX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYXJ0aXRpb25lZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjJfRkVBVFVSRV9DT1VOVCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fUkFOR0VfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUkFOR0VfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX19WQUxVRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19WQUxVRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fVU5JT05fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVU5JT05fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjJfX1BBUlRJVElPTkVEID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9ORUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMl9fTk9OX0NBQ0hFQUJMRSA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZyAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkFOR0VfUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmcgMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV8yMiA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiA8ZW0+WG1sIFRhYmxlIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFXzIyID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRhYmxlIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFXzIyX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVHZW5lcmF0b3JfMl8yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl8yMiA9IDI2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl8yMl9fQ1JFQVRJT05fU1VGRklYID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGUgR2VuZXJhdG9yIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjIgPSAyNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JT05fUEFSVElUSU9OSU5HXzIyX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVW5pb24gUGFydGl0aW9uaW5nIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFZhbHVlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjIgPSAyODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFMVUVfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yIDxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZSAyMjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYXJpYWJsZU9uZVRvT25lXzJfMgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMiA9IDI5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjJfX1BBUlRJVElPTklORyA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19IQVNIX1BBUlRJVElPTklORzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19VTklPTl9QQVJUSVRJT05JTkc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19QQVJUSVRJT05FRCA9IFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1BBUlRJVElPTkVEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5vbiBDYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFID0gWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmFyaWFibGUgT25lIFRvIE9uZSAyMjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIgPGVtPlhtbCBWZXJzaW9uIDIyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZlcnNpb25fMl8yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OXzIyID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OXzIyX19JTkRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl8yMl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNNYXBfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb01hbnlfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9PbmVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvTWFueV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxSYW5nZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGFibGVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbElkXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJbmRleF8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSm9pblRhYmxlXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxTZWNvbmRhcnlUYWJsZV8yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVGFibGVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFRhYmxlR2VuZXJhdG9yXzJfMkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxVbmlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFZlcnNpb25fMl8yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIDxiPlBhY2thZ2U8L2I+LCByZWdpc3RlcmVkIHdpdGgKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5IEVQYWNrYWdlLlJlZ2lzdHJ5fSBieSB0aGUgcGFja2FnZQotCSAqIHBhY2thZ2UgVVJJIHZhbHVlLgotCSAqIDxwPk5vdGU6IHRoZSBjb3JyZWN0IHdheSB0byBjcmVhdGUgdGhlIHBhY2thZ2UgaXMgdmlhIHRoZSBzdGF0aWMKLQkgKiBmYWN0b3J5IG1ldGhvZCB7QGxpbmsgI2luaXQgaW5pdCgpfSwgd2hpY2ggYWxzbyBwZXJmb3JtcwotCSAqIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlLCBvciByZXR1cm5zIHRoZSByZWdpc3RlcmVkIHBhY2thZ2UsCi0JICogaWYgb25lIGFscmVhZHkgZXhpc3RzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCUVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0JCVhNTFR5cGVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBpbnRlcmRlcGVuZGVuY2llcwotCQlFY2xpcHNlTGlua09ybVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlID0gKEVjbGlwc2VMaW5rT3JtUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVOU19VUkkpIDogRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMV8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8wUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCUVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UgdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA9IChFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjbGlwc2VMaW5rT3JtVjJfMVBhY2thZ2UuZU5TX1VSSSkgOiBFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYxXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzFQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUVjbGlwc2VMaW5rT3JtVjFfMVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY2xpcHNlTGlua09ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNsaXBzZUxpbmtPcm1WMl8xUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlLmZyZWV6ZSgpOwotCi0gIAotCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKLQkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KEVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UuZU5TX1VSSSwgdGhlRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSk7Ci0JCXJldHVybiB0aGVFY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIjZ2V0Q3JpdGVyaWEgPGVtPkNyaXRlcmlhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JpdGVyaWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiNnZXRDcml0ZXJpYSgpCi0JICogQHNlZSAjZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJfQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNfMl8yIDxlbT5YbWwgQmFzaWMgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEJhc2ljIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEJhc2ljXzJfMigpCi0JewotCQlyZXR1cm4geG1sQmFzaWNfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY18yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbEJhc2ljXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEJhc2ljXzJfMl9JbmRleCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQmFzaWNfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIgPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY0NvbGxlY3Rpb25fMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2ljQ29sbGVjdGlvbl8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yIDxlbT5YbWwgQmFzaWMgTWFwIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYyBNYXAgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQmFzaWNNYXBfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNpY01hcF8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpY01hcF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY01hcF8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY01hcF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQ29sbGVjdGlvblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbGxlY3Rpb25UYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIgPGVtPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yIDxlbT5YbWwgRW50aXR5IDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eV8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5XzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRJbmRleCgpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV8yXzJfSW5kZXgoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIgPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3MgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBhcnRpdGlvbmluZyA8ZW0+UGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1BhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZyA8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9SYW5nZVBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRWYWx1ZVBhcnRpdGlvbmluZyA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFVuaW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgSGFzaCBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEhhc2ggUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxIYXNoUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eV8yXzIjZ2V0QWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5XzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIgPGVtPlhtbCBNYW55IFRvIE1hbnkgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb01hbnlfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55XzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAc2VlICNnZXRYbWxNYW55VG9NYW55XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hbnlUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTWFueVRvTWFueV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUoKQotCSAqIEBzZWUgI2dldFhtbE1hbnlUb01hbnlfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFueVRvTWFueV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYW55VG9NYW55XzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIgPGVtPlhtbCBNYW55IFRvIE9uZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFueSBUbyBPbmUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvT25lXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hbnlUb09uZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb09uZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxNYW55VG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hbnlUb09uZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIgPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvT25lXzJfMigpCi0JewotCQlyZXR1cm4geG1sT25lVG9PbmVfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sT25lVG9PbmVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT25lVG9PbmVfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT25lVG9PbmVfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIjaXNOb25DYWNoZWFibGUoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9uZVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9uZVRvT25lXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIgPGVtPlhtbCBPbmUgVG8gTWFueSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT25lIFRvIE1hbnkgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9uZVRvTWFueV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueV8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPbmVUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT25lVG9NYW55XzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUoKQotCSAqIEBzZWUgI2dldFhtbE9uZVRvTWFueV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPbmVUb01hbnlfMl8yX05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT25lVG9NYW55XzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGFydGl0aW9uaW5nXzJfMigpCi0JewotCQlyZXR1cm4geG1sUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yIDxlbT5YbWwgUGFydGl0aW9uaW5nIEdyb3VwIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQYXJ0aXRpb25pbmcgR3JvdXAgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSYW5nZVBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRWYWx1ZVBhcnRpdGlvbmluZyA8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRWYWx1ZVBhcnRpdGlvbmluZygpCi0JICogQHNlZSAjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRIYXNoUGFydGl0aW9uaW5nKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0VW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBzZWUgI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uZWQgPGVtPlBhcnRpdGlvbmVkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UGFydGl0aW9uZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFBhcnRpdGlvbmVkKCkKLQkgKiBAc2VlICNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBQaW5uZWQgUGFydGl0aW9uaW5nIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQaW5uZWQgUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVwbGljYXRpb24gUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpCi0JewotCQlyZXR1cm4geG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBSb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFJvdW5kIFJvYmluIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMiA8ZW0+WG1sIEVtYmVkZGFibGUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGFibGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW1iZWRkYWJsZV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRhYmxlXzJfMigpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW1iZWRkYWJsZV8yXzIjZ2V0UGFyZW50Q2xhc3MgPGVtPlBhcmVudCBDbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcmVudCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMiNnZXRQYXJlbnRDbGFzcygpCi0JICogQHNlZSAjZ2V0WG1sRW1iZWRkYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbWJlZGRhYmxlXzJfMl9QYXJlbnRDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSWRfMl8yIDxlbT5YbWwgSWQgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkXzJfMigpCi0JewotCQlyZXR1cm4geG1sSWRfMl8yRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbElkXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JbmRleDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbElkXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbElkXzJfMl9JbmRleCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSWRfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiA8ZW0+WG1sIEluZGV4IDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJbmRleCAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJbmRleF8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEluZGV4XzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEluZGV4XzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEluZGV4XzJfMl9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1NjaGVtYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxJbmRleF8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxJbmRleF8yXzJfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRUYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1RhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VbmlxdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldFVuaXF1ZSgpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX1VuaXF1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sSW5kZXhfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0Q29sdW1uTmFtZXMgPGVtPkNvbHVtbiBOYW1lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRDb2x1bW5OYW1lcygpCi0JICogQHNlZSAjZ2V0WG1sSW5kZXhfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxJbmRleF8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiA8ZW0+WG1sIEpvaW4gVGFibGUgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGUgMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEpvaW5UYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSm9pblRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sSm9pblRhYmxlXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzcyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMiA8ZW0+WG1sIFNlY29uZGFyeSBUYWJsZSAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFNlY29uZGFyeVRhYmxlXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFNlY29uZGFyeVRhYmxlXzJfMigpCi0JewotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4KCkKLQkgKiBAc2VlICNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlY29uZGFyeVRhYmxlXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiA8ZW0+WG1sIFRhYmxlIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZSAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3IgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvciAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFRhYmxlR2VuZXJhdG9yXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFVuaW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFZhbHVlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpCi0JewotCQlyZXR1cm4geG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIgPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWYXJpYWJsZSBPbmUgVG8gT25lIDIyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzIoKQotCXsKLQkJcmV0dXJuIHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVmFyaWFibGVPbmVUb09uZV8yXzJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiA8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxWZXJzaW9uXzJfMigpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbl8yXzJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+SW5kZXg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIjZ2V0SW5kZXgoKQotCSAqIEBzZWUgI2dldFhtbFZlcnNpb25fMl8yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sVmVyc2lvbl8yXzJfSW5kZXgoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFZlcnNpb25fMl8yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkgZ2V0RWNsaXBzZUxpbmtPcm1WMl8yRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rT3JtVjJfMkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9BRERJVElPTkFMX0NSSVRFUklBXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yRUNsYXNzLCBYTUxfQURESVRJT05BTF9DUklURVJJQV8yMl9fQ1JJVEVSSUEpOwotCi0JCXhtbEJhc2ljXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEJhc2ljXzJfMkVDbGFzcywgWE1MX0JBU0lDXzIyX19JTkRFWCk7Ci0KLQkJeG1sQmFzaWNDb2xsZWN0aW9uXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTSUNfQ09MTEVDVElPTl8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNDb2xsZWN0aW9uXzJfMkVDbGFzcywgWE1MX0JBU0lDX0NPTExFQ1RJT05fMjJfX0NBU0NBREVfT05fREVMRVRFKTsKLQotCQl4bWxCYXNpY01hcF8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDX01BUF8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNNYXBfMl8yRUNsYXNzLCBYTUxfQkFTSUNfTUFQXzIyX19DQVNDQURFX09OX0RFTEVURSk7Ci0KLQkJeG1sQ29sbGVjdGlvblRhYmxlXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9UQUJMRV8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sbGVjdGlvblRhYmxlXzJfMkVDbGFzcywgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCk7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OX0NBQ0hFQUJMRSk7Ci0KLQkJeG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREFCTEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVtYmVkZGFibGVfMl8yRUNsYXNzLCBYTUxfRU1CRUREQUJMRV8yMl9fUEFSRU5UX0NMQVNTKTsKLQotCQl4bWxFbnRpdHlfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eV8yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eV8yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfMjJfX0NBU0NBREVfT05fREVMRVRFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlfMl8yRUNsYXNzLCBYTUxfRU5USVRZXzIyX19JTkRFWCk7Ci0KLQkJeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1NfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUElOTkVEX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NfMl8yRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19SQU5HRV9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzXzJfMkVDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVkFMVUVfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX0hBU0hfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1VOSU9OX1BBUlRJVElPTklORyk7Ci0KLQkJeG1sSGFzaFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxIYXNoUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyX19OQU1FKTsKLQotCQl4bWxJZF8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0lEXzIyKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxJZF8yXzJFQ2xhc3MsIFhNTF9JRF8yMl9fSU5ERVgpOwotCi0JCXhtbEluZGV4XzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSU5ERVhfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEluZGV4XzJfMkVDbGFzcywgWE1MX0lOREVYXzIyX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJbmRleF8yXzJFQ2xhc3MsIFhNTF9JTkRFWF8yMl9fU0NIRU1BKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJbmRleF8yXzJFQ2xhc3MsIFhNTF9JTkRFWF8yMl9fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sSW5kZXhfMl8yRUNsYXNzLCBYTUxfSU5ERVhfMjJfX1RBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJbmRleF8yXzJFQ2xhc3MsIFhNTF9JTkRFWF8yMl9fVU5JUVVFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxJbmRleF8yXzJFQ2xhc3MsIFhNTF9JTkRFWF8yMl9fQ09MVU1OX05BTUVTKTsKLQotCQl4bWxKb2luVGFibGVfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxKb2luVGFibGVfMl8yRUNsYXNzLCBYTUxfSk9JTl9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYKTsKLQotCQl4bWxNYW55VG9NYW55XzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFOWV9UT19NQU5ZXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYW55VG9NYW55XzJfMkVDbGFzcywgWE1MX01BTllfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLCBYTUxfTUFOWV9UT19NQU5ZXzIyX19OT05fQ0FDSEVBQkxFKTsKLQotCQl4bWxNYW55VG9PbmVfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORV8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFueVRvT25lXzJfMkVDbGFzcywgWE1MX01BTllfVE9fT05FXzIyX19OT05fQ0FDSEVBQkxFKTsKLQotCQl4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjJfX0FERElUSU9OQUxfQ1JJVEVSSUEpOwotCi0JCXhtbE9uZVRvT25lXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sT25lVG9PbmVfMl8yRUNsYXNzLCBYTUxfT05FX1RPX09ORV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9uZVRvT25lXzJfMkVDbGFzcywgWE1MX09ORV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUpOwotCi0JCXhtbE9uZVRvTWFueV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19NQU5ZXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb01hbnlfMl8yRUNsYXNzLCBYTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPbmVUb01hbnlfMl8yRUNsYXNzLCBYTUxfT05FX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEUpOwotCi0JCXhtbFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BBUlRJVElPTklOR18yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR18yMl9fTkFNRSk7Ci0KLQkJeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JFUExJQ0FUSU9OX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19ST1VORF9ST0JJTl9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SQU5HRV9QQVJUSVRJT05JTkcpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMkVDbGFzcywgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQYXJ0aXRpb25pbmdHcm91cF8yXzJFQ2xhc3MsIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRCk7Ci0KLQkJeG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUElOTkVEX1BBUlRJVElPTklOR18yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX1BJTk5FRF9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUkFOR0VfUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSYW5nZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9SQU5HRV9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhNTF9SRVBMSUNBVElPTl9QQVJUSVRJT05JTkdfMjJfX05BTUUpOwotCi0JCXhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9ST1VORF9ST0JJTl9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX19OQU1FKTsKLQotCQl4bWxTZWNvbmRhcnlUYWJsZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1NFQ09OREFSWV9UQUJMRV8yMik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzLCBYTUxfU0VDT05EQVJZX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVgpOwotCi0JCXhtbFRhYmxlXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRhYmxlXzJfMkVDbGFzcywgWE1MX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVgpOwotCi0JCXhtbFRhYmxlR2VuZXJhdG9yXzJfMkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVEFCTEVfR0VORVJBVE9SXzIyKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfMjJfX0NSRUFUSU9OX1NVRkZJWCk7Ci0KLQkJeG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRSk7Ci0KLQkJeG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMl9fTkFNRSk7Ci0KLQkJeG1sVmFyaWFibGVPbmVUb09uZV8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZBUklBQkxFX09ORV9UT19PTkVfMjIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzLCBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRSk7Ci0KLQkJeG1sVmVyc2lvbl8yXzJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZFUlNJT05fMjIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFZlcnNpb25fMl8yRUNsYXNzLCBYTUxfVkVSU0lPTl8yMl9fSU5ERVgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCQlPcm1QYWNrYWdlIHRoZU9ybVBhY2thZ2UgPSAoT3JtUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sRW1iZWRkYWJsZV8yXzJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlfMl8yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkpOwotCQl4bWxNYW55VG9NYW55XzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sTWFueVRvT25lXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc18yXzJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKSk7Ci0JCXhtbE9uZVRvT25lXzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sT25lVG9NYW55XzJfMkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpKTsKLQkJeG1sVmFyaWFibGVPbmVUb09uZV8yXzJFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yRUNsYXNzLCBYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yLmNsYXNzLCAiWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzJfQ3JpdGVyaWEoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjcml0ZXJpYSIsIG51bGwsIDAsIDEsIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY18yXzJFQ2xhc3MsIFhtbEJhc2ljXzJfMi5jbGFzcywgIlhtbEJhc2ljXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEJhc2ljXzJfMl9JbmRleCgpLCB0aGlzLmdldFhtbEluZGV4XzJfMigpLCBudWxsLCAiaW5kZXgiLCBudWxsLCAwLCAxLCBYbWxCYXNpY18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY0NvbGxlY3Rpb25fMl8yRUNsYXNzLCBYbWxCYXNpY0NvbGxlY3Rpb25fMl8yLmNsYXNzLCAiWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljQ29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbEJhc2ljQ29sbGVjdGlvbl8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNpY01hcF8yXzJFQ2xhc3MsIFhtbEJhc2ljTWFwXzJfMi5jbGFzcywgIlhtbEJhc2ljTWFwXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljTWFwXzJfMl9DYXNjYWRlT25EZWxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAiY2FzY2FkZU9uRGVsZXRlIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWNNYXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29sbGVjdGlvblRhYmxlXzJfMkVDbGFzcywgWG1sQ29sbGVjdGlvblRhYmxlXzJfMi5jbGFzcywgIlhtbENvbGxlY3Rpb25UYWJsZV8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY3JlYXRpb25TdWZmaXgiLCBudWxsLCAwLCAxLCBYbWxDb2xsZWN0aW9uVGFibGVfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8yRUNsYXNzLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuY2xhc3MsICJYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX05vbkNhY2hlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJub25DYWNoZWFibGUiLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRhYmxlXzJfMkVDbGFzcywgWG1sRW1iZWRkYWJsZV8yXzIuY2xhc3MsICJYbWxFbWJlZGRhYmxlXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVtYmVkZGFibGVfMl8yX1BhcmVudENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicGFyZW50Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxFbWJlZGRhYmxlXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eV8yXzJFQ2xhc3MsIFhtbEVudGl0eV8yXzIuY2xhc3MsICJYbWxFbnRpdHlfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5XzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKSwgdGhpcy5nZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKCksIG51bGwsICJhZGRpdGlvbmFsQ3JpdGVyaWEiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYXNjYWRlT25EZWxldGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfMl8yX0luZGV4KCksIHRoaXMuZ2V0WG1sSW5kZXhfMl8yKCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIDEsIFhtbEVudGl0eV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlNYXBwaW5nc18yXzJFQ2xhc3MsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJwYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicm91bmRSb2JpblBhcnRpdGlvbmluZyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5nc18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJwaW5uZWRQYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJhbmdlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJ2YWx1ZVBhcnRpdGlvbmluZyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5nc18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9IYXNoUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgImhhc2hQYXJ0aXRpb25pbmciLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInVuaW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbElkXzJfMkVDbGFzcywgWG1sSWRfMl8yLmNsYXNzLCAiWG1sSWRfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sSWRfMl8yX0luZGV4KCksIHRoaXMuZ2V0WG1sSW5kZXhfMl8yKCksIG51bGwsICJpbmRleCIsIG51bGwsIDAsIDEsIFhtbElkXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEluZGV4XzJfMkVDbGFzcywgWG1sSW5kZXhfMl8yLmNsYXNzLCAiWG1sSW5kZXhfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSW5kZXhfMl8yX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxJbmRleF8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEluZGV4XzJfMl9UYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxJbmRleF8yXzJfVW5pcXVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgInVuaXF1ZSIsIG51bGwsIDAsIDEsIFhtbEluZGV4XzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uTmFtZXMiLCBudWxsLCAwLCAtMSwgWG1sSW5kZXhfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEpvaW5UYWJsZV8yXzJFQ2xhc3MsIFhtbEpvaW5UYWJsZV8yXzIuY2xhc3MsICJYbWxKb2luVGFibGVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSm9pblRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNyZWF0aW9uU3VmZml4IiwgbnVsbCwgMCwgMSwgWG1sSm9pblRhYmxlXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8yRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMi5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFueVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb01hbnlfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYW55VG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAibm9uQ2FjaGVhYmxlIiwgbnVsbCwgMCwgMSwgWG1sTWFueVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYW55VG9PbmVfMl8yRUNsYXNzLCBYbWxNYW55VG9PbmVfMl8yLmNsYXNzLCAiWG1sTWFueVRvT25lXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE1hbnlUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbkNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbE1hbnlUb09uZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxNYXBwZWRTdXBlcmNsYXNzXzJfMkVDbGFzcywgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yX0FkZGl0aW9uYWxDcml0ZXJpYSgpLCB0aGlzLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKSwgbnVsbCwgImFkZGl0aW9uYWxDcml0ZXJpYSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9PbmVfMl8yRUNsYXNzLCBYbWxPbmVUb09uZV8yXzIuY2xhc3MsICJYbWxPbmVUb09uZV8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvT25lXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJub25DYWNoZWFibGUiLCBudWxsLCAwLCAxLCBYbWxPbmVUb09uZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8yRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8yLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImNhc2NhZGVPbkRlbGV0ZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9uZVRvTWFueV8yXzJfTm9uQ2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbkNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbE9uZVRvTWFueV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxQYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yRUNsYXNzLCBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIuY2xhc3MsICJYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpLCB0aGlzLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJyb3VuZFJvYmluUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCksIHRoaXMuZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpLCBudWxsLCAicGlubmVkUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInJhbmdlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInZhbHVlUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpLCB0aGlzLmdldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCksIG51bGwsICJoYXNoUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKSwgdGhpcy5nZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKSwgbnVsbCwgInVuaW9uUGFydGl0aW9uaW5nIiwgbnVsbCwgMCwgMSwgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYXJ0aXRpb25lZCIsIG51bGwsIDAsIDEsIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICJYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxSYW5nZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMkVDbGFzcywgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAiWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVfMl8yRUNsYXNzLCBYbWxTZWNvbmRhcnlUYWJsZV8yXzIuY2xhc3MsICJYbWxTZWNvbmRhcnlUYWJsZV8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjcmVhdGlvblN1ZmZpeCIsIG51bGwsIDAsIDEsIFhtbFNlY29uZGFyeVRhYmxlXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlXzJfMkVDbGFzcywgWG1sVGFibGVfMl8yLmNsYXNzLCAiWG1sVGFibGVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY3JlYXRpb25TdWZmaXgiLCBudWxsLCAwLCAxLCBYbWxUYWJsZV8yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxUYWJsZUdlbmVyYXRvcl8yXzJFQ2xhc3MsIFhtbFRhYmxlR2VuZXJhdG9yXzJfMi5jbGFzcywgIlhtbFRhYmxlR2VuZXJhdG9yXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yXzJfMl9DcmVhdGlvblN1ZmZpeCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNyZWF0aW9uU3VmZml4IiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3JfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yRUNsYXNzLCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICJYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJFQ2xhc3MsIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDAsIDEsIFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFZhcmlhYmxlT25lVG9PbmVfMl8yRUNsYXNzLCBYbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5jbGFzcywgIlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgIm5vbkNhY2hlYWJsZSIsIG51bGwsIDAsIDEsIFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sVmVyc2lvbl8yXzJFQ2xhc3MsIFhtbFZlcnNpb25fMl8yLmNsYXNzLCAiWG1sVmVyc2lvbl8yXzIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpLCB0aGlzLmdldFhtbEluZGV4XzJfMigpLCBudWxsLCAiaW5kZXgiLCBudWxsLCAwLCAxLCBYbWxWZXJzaW9uXzJfMi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIDxlbT5YbWwgQWRkaXRpb25hbCBDcml0ZXJpYSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BRERJVElPTkFMX0NSSVRFUklBXzIyID0gZUlOU1RBTkNFLmdldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyaXRlcmlhPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQURESVRJT05BTF9DUklURVJJQV8yMl9fQ1JJVEVSSUEgPSBlSU5TVEFOQ0UuZ2V0WG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMl9Dcml0ZXJpYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMiA8ZW0+WG1sIEJhc2ljIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNJQ18yMiA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQkFTSUNfMjJfX0lOREVYID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljXzJfMl9JbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIgPGVtPlhtbCBCYXNpYyBDb2xsZWN0aW9uIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0JBU0lDX0NPTExFQ1RJT05fMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19DT0xMRUNUSU9OXzIyX19DQVNDQURFX09OX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY0NvbGxlY3Rpb25fMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiA8ZW0+WG1sIEJhc2ljIE1hcCAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxCYXNpY01hcF8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY01hcF8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUNfTUFQXzIyID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljTWFwXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNJQ19NQVBfMjJfX0NBU0NBREVfT05fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljTWFwXzJfMl9DYXNjYWRlT25EZWxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIyID0gZUlOU1RBTkNFLmdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTExFQ1RJT05fVEFCTEVfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMl9fTk9OX0NBQ0hFQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfTm9uQ2FjaGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiA8ZW0+WG1sIEVudGl0eSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfMjJfX0NBU0NBREVfT05fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMl9fSU5ERVggPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5XzJfMl9JbmRleCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiA8ZW0+WG1sIEVudGl0eSBNYXBwaW5ncyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZX01BUFBJTkdTXzIyID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fUkVQTElDQVRJT05fUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19QSU5ORURfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19SQU5HRV9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU18yMl9fSEFTSF9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX0hhc2hQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTXzIyX19VTklPTl9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1VuaW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBIYXNoIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxIYXNoUGFydGl0aW9uaW5nXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0hBU0hfUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSEFTSF9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV8yMl9fQURESVRJT05BTF9DUklURVJJQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8yX0FkZGl0aW9uYWxDcml0ZXJpYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yIDxlbT5YbWwgTWFueSBUbyBNYW55IDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFOWV9UT19NQU5ZXzIyID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BTllfVE9fTUFOWV8yMl9fQ0FTQ0FERV9PTl9ERUxFVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFOWV9UT19NQU5ZXzIyX19OT05fQ0FDSEVBQkxFID0gZUlOU1RBTkNFLmdldFhtbE1hbnlUb01hbnlfMl8yX05vbkNhY2hlYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb09uZV8yXzIgPGVtPlhtbCBNYW55IFRvIE9uZSAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvT25lXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX09ORV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFOWV9UT19PTkVfMjJfX05PTl9DQUNIRUFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb09uZV8yXzIgPGVtPlhtbCBPbmUgVG8gT25lIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvT25lXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FXzIyID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PTkVfVE9fT05FXzIyX19DQVNDQURFX09OX0RFTEVURSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT05FX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiA8ZW0+WG1sIE9uZSBUbyBNYW55IDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19NQU5ZXzIyID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT05FX1RPX01BTllfMjJfX0NBU0NBREVfT05fREVMRVRFID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT05FX1RPX01BTllfMjJfX05PTl9DQUNIRUFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BBUlRJVElPTklOR18yMiA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiA8ZW0+WG1sIFBhcnRpdGlvbmluZyBHcm91cCAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19SRVBMSUNBVElPTl9QQVJUSVRJT05JTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JPVU5EX1JPQklOX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fUElOTkVEX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGlubmVkUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SYW5nZSBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1JBTkdFX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BBUlRJVElPTklOR19HUk9VUF8yMl9fVkFMVUVfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9WYWx1ZVBhcnRpdGlvbmluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SGFzaCBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX0hBU0hfUEFSVElUSU9OSU5HID0gZUlOU1RBTkNFLmdldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9IYXNoUGFydGl0aW9uaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QQVJUSVRJT05JTkdfR1JPVVBfMjJfX1VOSU9OX1BBUlRJVElPTklORyA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVW5pb25QYXJ0aXRpb25pbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEFSVElUSU9OSU5HX0dST1VQXzIyX19QQVJUSVRJT05FRCA9IGVJTlNUQU5DRS5nZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfUGFydGl0aW9uZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUGlubmVkIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QSU5ORURfUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFBpbm5lZFBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJhbmdlIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkFOR0VfUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JBTkdFX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiA8ZW0+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUkVQTElDQVRJT05fUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1JFUExJQ0FUSU9OX1BBUlRJVElPTklOR18yMl9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIDxlbT5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyID0gZUlOU1RBTkNFLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUk9VTkRfUk9CSU5fUEFSVElUSU9OSU5HXzIyX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMiA8ZW0+WG1sIEVtYmVkZGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW1iZWRkYWJsZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERBQkxFXzIyID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYXJlbnQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTUJFRERBQkxFXzIyX19QQVJFTlRfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZV8yXzJfUGFyZW50Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIgPGVtPlhtbCBJZCAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJZF8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSURfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEXzIyX19JTkRFWCA9IGVJTlNUQU5DRS5nZXRYbWxJZF8yXzJfSW5kZXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIgPGVtPlhtbCBJbmRleCAyMjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSU5ERVhfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSU5ERVhfMjJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lOREVYXzIyX19TQ0hFTUEgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX1NjaGVtYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lOREVYXzIyX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9DYXRhbG9nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lOREVYXzIyX19UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxJbmRleF8yXzJfVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0lOREVYXzIyX19VTklRVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSW5kZXhfMl8yX1VuaXF1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9JTkRFWF8yMl9fQ09MVU1OX05BTUVTID0gZUlOU1RBTkNFLmdldFhtbEluZGV4XzJfMl9Db2x1bW5OYW1lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEpvaW5UYWJsZV8yXzIgPGVtPlhtbCBKb2luIFRhYmxlIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEpvaW5UYWJsZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxKb2luVGFibGVfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fVEFCTEVfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlXzJfMigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfSk9JTl9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMiA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hcHBlZFN1cGVyY2xhc3NfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU18yMl9fQURESVRJT05BTF9DUklURVJJQSA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMl9BZGRpdGlvbmFsQ3JpdGVyaWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxTZWNvbmRhcnlUYWJsZV8yXzIgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NFQ09OREFSWV9UQUJMRV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NFQ09OREFSWV9UQUJMRV8yMl9fQ1JFQVRJT05fU1VGRklYID0gZUlOU1RBTkNFLmdldFhtbFNlY29uZGFyeVRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiA8ZW0+WG1sIFRhYmxlIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFRhYmxlXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UQUJMRV8yMiA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZV8yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNyZWF0aW9uIFN1ZmZpeDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RBQkxFXzIyX19DUkVBVElPTl9TVUZGSVggPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVHZW5lcmF0b3JfMl8yIDxlbT5YbWwgVGFibGUgR2VuZXJhdG9yIDIyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlR2VuZXJhdG9yXzJfMgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9UQUJMRV9HRU5FUkFUT1JfMjIgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfMjJfX0NSRUFUSU9OX1NVRkZJWCA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzJfQ3JlYXRpb25TdWZmaXgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBVbmlvbiBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSU9OX1BBUlRJVElPTklOR18yMiA9IGVJTlNUQU5DRS5nZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9VTklPTl9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIgPGVtPlhtbCBWYWx1ZSBQYXJ0aXRpb25pbmcgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1ZBTFVFX1BBUlRJVElPTklOR18yMiA9IGVJTlNUQU5DRS5nZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9WQUxVRV9QQVJUSVRJT05JTkdfMjJfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYXJpYWJsZU9uZVRvT25lXzJfMiA8ZW0+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmUgMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFyaWFibGVPbmVUb09uZV8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WQVJJQUJMRV9PTkVfVE9fT05FXzIyID0gZUlOU1RBTkNFLmdldFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVkFSSUFCTEVfT05FX1RPX09ORV8yMl9fTk9OX0NBQ0hFQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxWYXJpYWJsZU9uZVRvT25lXzJfMl9Ob25DYWNoZWFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiA8ZW0+WG1sIFZlcnNpb24gMjI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9WRVJTSU9OXzIyID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb25fMl8yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1ZFUlNJT05fMjJfX0lOREVYID0gZUlOU1RBTkNFLmdldFhtbFZlcnNpb25fMl8yX0luZGV4KCk7Ci0KLQl9Ci0KLX0gLy9FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTMxZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBZGRpdGlvbmFsIENyaXRlcmlhIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMiNnZXRDcml0ZXJpYSA8ZW0+Q3JpdGVyaWE8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JpdGVyaWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNyaXRlcmlhPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcml0ZXJpYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yX0NyaXRlcmlhKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcml0ZXJpYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIjZ2V0Q3JpdGVyaWEgPGVtPkNyaXRlcmlhPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Dcml0ZXJpYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyaXRlcmlhKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNDb2xsZWN0aW9uXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjhmOTlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljQ29sbGVjdGlvbl8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgQ29sbGVjdGlvbiAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljQ29sbGVjdGlvbl8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNDb2xsZWN0aW9uXzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzaWNDb2xsZWN0aW9uXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sQmFzaWNNYXBfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY01hcF8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjY2M5Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY01hcF8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzaWMgTWFwIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sQmFzaWNNYXBfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljTWFwXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzaWNNYXBfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxCYXNpY01hcF8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljTWFwXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzaWNNYXBfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxCYXNpY18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWIyZTI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEJhc2ljXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNpYyAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEJhc2ljXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzaWNfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoWG1sSW5kZXhfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sQmFzaWNfMl8yX0luZGV4KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEluZGV4XzJfMiBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEJhc2ljXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5kZXgoWG1sSW5kZXhfMl8yIHZhbHVlKTsKLQotfSAvLyBYbWxCYXNpY18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbENvbGxlY3Rpb25UYWJsZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbENvbGxlY3Rpb25UYWJsZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkYWIwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxDb2xsZWN0aW9uVGFibGVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbGxlY3Rpb24gVGFibGUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxDb2xsZWN0aW9uVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbGxlY3Rpb25UYWJsZV8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbENvbGxlY3Rpb25UYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxDb2xsZWN0aW9uVGFibGVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDljM2U3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8yX05vbkNhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIHZhbHVlKTsKLQotfSAvLyBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVtYmVkZGFibGVfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbWJlZGRhYmxlXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDA3M2QxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVtYmVkZGFibGVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkYWJsZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVtYmVkZGFibGVfMl8yI2dldFBhcmVudENsYXNzIDxlbT5QYXJlbnQgQ2xhc3M8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVtYmVkZGFibGVfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbWJlZGRhYmxlXzJfMiBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFyZW50IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyZW50IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQYXJlbnRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlXzJfMl9QYXJlbnRDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFyZW50Q2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbWJlZGRhYmxlXzJfMiNnZXRQYXJlbnRDbGFzcyA8ZW0+UGFyZW50IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJlbnQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhcmVudENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJlbnRDbGFzcyhTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEVtYmVkZGFibGVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxFbnRpdHlNYXBwaW5nc18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjMwM2I1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVudGl0eU1hcHBpbmdzXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IE1hcHBpbmdzIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBhcnRpdGlvbmluZyA8ZW0+UGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nIDxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFBpbm5lZFBhcnRpdGlvbmluZyA8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEVudGl0eU1hcHBpbmdzXzJfMiNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5TWFwcGluZ3NfMl8yI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0SGFzaFBhcnRpdGlvbmluZyA8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlNYXBwaW5nc18yXzIjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnRpdHlNYXBwaW5nc18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1BhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQYXJ0aXRpb25pbmdfMl8yPiBnZXRQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JlcGxpY2F0aW9uUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMj4gZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfUm91bmRSb2JpblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMj4gZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBpbm5lZCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1Bpbm5lZFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yPiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMj4gZ2V0UmFuZ2VQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfMl8yX1ZhbHVlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMj4gZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhhc2ggUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxIYXNoUGFydGl0aW9uaW5nXzJfMj4gZ2V0SGFzaFBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pb24gUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc18yXzJfVW5pb25QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yPiBnZXRVbmlvblBhcnRpdGlvbmluZygpOwotCi19IC8vIFhtbEVudGl0eU1hcHBpbmdzXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW50aXR5XzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sRW50aXR5XzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDI3MDYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEVudGl0eV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW50aXR5IDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW50aXR5XzJfMiBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXNjYWRlT25EZWxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluZGV4PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SW5kZXgoWG1sSW5kZXhfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sRW50aXR5XzJfMl9JbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxJbmRleF8yXzIgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxFbnRpdHlfMl8yI2dldEluZGV4IDxlbT5JbmRleDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEluZGV4KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRJbmRleChYbWxJbmRleF8yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWRkaXRpb25hbCBDcml0ZXJpYTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWRkaXRpb25hbCBDcml0ZXJpYTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBZGRpdGlvbmFsQ3JpdGVyaWEoWG1sQWRkaXRpb25hbENyaXRlcmlhXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEVudGl0eV8yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgZ2V0QWRkaXRpb25hbENyaXRlcmlhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sRW50aXR5XzJfMiNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEgPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEFkZGl0aW9uYWxDcml0ZXJpYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWRkaXRpb25hbENyaXRlcmlhKFhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxIYXNoUGFydGl0aW9uaW5nXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTUzNTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEhhc2hQYXJ0aXRpb25pbmdfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEhhc2ggUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSGFzaFBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxIYXNoUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEhhc2hQYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxJZF8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbElkXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGUyYjcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbElkXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBYbWxJZF8yXzIuamF2YSx2IDEuMSAyMDExLzAyLzA2IDAyOjEzOjAwIGttb29yZSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIElkIDIyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJZF8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElkXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbmRleDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5kZXg8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEluZGV4KFhtbEluZGV4XzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbElkXzJfMl9JbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxJbmRleF8yXzIgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJZF8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JbmRleDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5kZXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluZGV4KFhtbEluZGV4XzJfMiB2YWx1ZSk7Ci0KLX0gLy8gWG1sSWRfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxJbmRleF8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEluZGV4XzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGQyNTkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEluZGV4XzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEluZGV4IDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxJbmRleF8yXzIjZ2V0Q29sdW1uTmFtZXMgPGVtPkNvbHVtbiBOYW1lczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxJbmRleF8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEluZGV4XzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEluZGV4XzJfMl9TY2hlbWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjaGVtYShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXRhbG9nKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEluZGV4XzJfMl9DYXRhbG9nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sSW5kZXhfMl8yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX1RhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pcXVlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxJbmRleF8yXzJfVW5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFVuaXF1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEluZGV4XzJfMiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFVuaXF1ZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIE5hbWVzPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sSW5kZXhfMl8yX0NvbHVtbk5hbWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKTsKLQotfSAvLyBYbWxJbmRleF8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEpvaW5UYWJsZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbEpvaW5UYWJsZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYjk2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxKb2luVGFibGVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEpvaW4gVGFibGUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxKb2luVGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbEpvaW5UYWJsZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEpvaW5UYWJsZV8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxKb2luVGFibGVfMl8yX0NyZWF0aW9uU3VmZml4KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDcmVhdGlvblN1ZmZpeCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbEpvaW5UYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxKb2luVGFibGVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYW55VG9NYW55XzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sTWFueVRvTWFueV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4YzBkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYW55VG9NYW55XzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hbnkgVG8gTWFueSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE1hbnlUb01hbnlfMl8yI2dldENhc2NhZGVPbkRlbGV0ZSA8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBPbiBEZWxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8yX0Nhc2NhZGVPbkRlbGV0ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRDYXNjYWRlT25EZWxldGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTm9uQ2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROb25DYWNoZWFibGUoYm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sTWFueVRvTWFueV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hbnlUb09uZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE1hbnlUb09uZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllZDZiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYW55VG9PbmVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBPbmUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxNYW55VG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYW55VG9PbmVfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYW55VG9PbmVfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25DYWNoZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE1hbnlUb09uZV8yXzJfTm9uQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzTm9uQ2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFueVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIHZhbHVlKTsKLQotfSAvLyBYbWxNYW55VG9PbmVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0OWFhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxNYXBwZWRTdXBlcmNsYXNzXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcHBlZCBTdXBlcmNsYXNzIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIjZ2V0QWRkaXRpb25hbENyaXRlcmlhIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIgZXh0ZW5kcyBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BZGRpdGlvbmFsIENyaXRlcmlhPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFkZGl0aW9uYWwgQ3JpdGVyaWE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc18yXzJfQWRkaXRpb25hbENyaXRlcmlhKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbEFkZGl0aW9uYWxDcml0ZXJpYV8yXzIgZ2V0QWRkaXRpb25hbENyaXRlcmlhKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sTWFwcGVkU3VwZXJjbGFzc18yXzIjZ2V0QWRkaXRpb25hbENyaXRlcmlhIDxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BZGRpdGlvbmFsIENyaXRlcmlhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBZGRpdGlvbmFsQ3JpdGVyaWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEFkZGl0aW9uYWxDcml0ZXJpYShYbWxBZGRpdGlvbmFsQ3JpdGVyaWFfMl8yIHZhbHVlKTsKLQotfSAvLyBYbWxNYXBwZWRTdXBlcmNsYXNzXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9NYW55XzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9NYW55XzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmJmN2M1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE9uZVRvTWFueV8yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPbmUgVG8gTWFueSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjZ2V0Q2FzY2FkZU9uRGVsZXRlIDxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvTWFueV8yXzIjaXNOb25DYWNoZWFibGUgPGVtPk5vbiBDYWNoZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvTWFueV8yXzIgZXh0ZW5kcyBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIE9uIERlbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBPbiBEZWxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVPbkRlbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMl9DYXNjYWRlT25EZWxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0Q2FzY2FkZU9uRGVsZXRlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9NYW55XzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMl9Ob25DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNOb25DYWNoZWFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxPbmVUb01hbnlfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbE9uZVRvTWFueV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbE9uZVRvT25lXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9PbmVfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNzQ1YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sT25lVG9PbmVfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT25lIFRvIE9uZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvT25lXzJfMiBleHRlbmRzIFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgT24gRGVsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZU9uRGVsZXRlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzJfQ2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldENhc2NhZGVPbkRlbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNnZXRDYXNjYWRlT25EZWxldGUgPGVtPkNhc2NhZGUgT24gRGVsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE9uIERlbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2FzY2FkZU9uRGVsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlT25EZWxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Ob24gQ2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5vbiBDYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5vbkNhY2hlYWJsZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbE9uZVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNOb25DYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5vbkNhY2hlYWJsZShib29sZWFuIHZhbHVlKTsKLQotfSAvLyBYbWxPbmVUb09uZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFBhcnRpdGlvbmluZ0dyb3VwXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZGJkMzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQYXJ0aXRpb25pbmcgR3JvdXAyIDI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSb3VuZFJvYmluUGFydGl0aW9uaW5nIDxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFJhbmdlUGFydGl0aW9uaW5nIDxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0VmFsdWVQYXJ0aXRpb25pbmcgPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRIYXNoUGFydGl0aW9uaW5nIDxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRVbmlvblBhcnRpdGlvbmluZyA8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFBhcnRpdGlvbmVkIDxlbT5QYXJ0aXRpb25lZDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUGFydGl0aW9uaW5nXzJfMiBnZXRQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGFydGl0aW9uaW5nIDxlbT5QYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJ0aXRpb25pbmcoWG1sUGFydGl0aW9uaW5nXzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXBsaWNhdGlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nKFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9SZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIgZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcgPGVtPlJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVwbGljYXRpb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRSZXBsaWNhdGlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UmVwbGljYXRpb25QYXJ0aXRpb25pbmcoWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJvdW5kIFJvYmluIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyhYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9Sb3VuZFJvYmluUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGdldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0Um91bmRSb2JpblBhcnRpdGlvbmluZyA8ZW0+Um91bmQgUm9iaW4gUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Sb3VuZCBSb2JpbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJvdW5kUm9iaW5QYXJ0aXRpb25pbmcoWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGlubmVkIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGlubmVkIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQaW5uZWRQYXJ0aXRpb25pbmcoWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9QaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiBnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0UGlubmVkUGFydGl0aW9uaW5nIDxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QaW5uZWQgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQaW5uZWRQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBpbm5lZFBhcnRpdGlvbmluZyhYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJhbmdlIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJhbmdlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmFuZ2VQYXJ0aXRpb25pbmcoWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1JhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMiBnZXRSYW5nZVBhcnRpdGlvbmluZygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRSYW5nZVBhcnRpdGlvbmluZyA8ZW0+UmFuZ2UgUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SYW5nZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFJhbmdlUGFydGl0aW9uaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRSYW5nZVBhcnRpdGlvbmluZyhYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWUgUGFydGl0aW9uaW5nPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWUgUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRWYWx1ZVBhcnRpdGlvbmluZyhYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfVmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGdldFZhbHVlUGFydGl0aW9uaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldFZhbHVlUGFydGl0aW9uaW5nIDxlbT5WYWx1ZSBQYXJ0aXRpb25pbmc8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VmFsdWVQYXJ0aXRpb25pbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFZhbHVlUGFydGl0aW9uaW5nKFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IYXNoIFBhcnRpdGlvbmluZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzaCBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEhhc2hQYXJ0aXRpb25pbmcoWG1sSGFzaFBhcnRpdGlvbmluZ18yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdHcm91cF8yXzJfSGFzaFBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiBnZXRIYXNoUGFydGl0aW9uaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yI2dldEhhc2hQYXJ0aXRpb25pbmcgPGVtPkhhc2ggUGFydGl0aW9uaW5nPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXNoIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SGFzaFBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SGFzaFBhcnRpdGlvbmluZyhYbWxIYXNoUGFydGl0aW9uaW5nXzJfMiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlvbiBQYXJ0aXRpb25pbmc8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlvbiBQYXJ0aXRpb25pbmc8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFVuaW9uUGFydGl0aW9uaW5nKFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMl9VbmlvblBhcnRpdGlvbmluZygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIgZ2V0VW5pb25QYXJ0aXRpb25pbmcoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdHcm91cF8yXzIjZ2V0VW5pb25QYXJ0aXRpb25pbmcgPGVtPlVuaW9uIFBhcnRpdGlvbmluZzwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pb24gUGFydGl0aW9uaW5nPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRVbmlvblBhcnRpdGlvbmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VW5pb25QYXJ0aXRpb25pbmcoWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcnRpdGlvbmVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJ0aXRpb25lZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFydGl0aW9uZWQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yX1BhcnRpdGlvbmVkKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRQYXJ0aXRpb25lZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFBhcnRpdGlvbmluZ0dyb3VwXzJfMiNnZXRQYXJ0aXRpb25lZCA8ZW0+UGFydGl0aW9uZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcnRpdGlvbmVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQYXJ0aXRpb25lZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFydGl0aW9uZWQoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxQYXJ0aXRpb25pbmdHcm91cDJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGFydGl0aW9uaW5nXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTE4MjZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxQYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjBkMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQaW5uZWQgUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUGlubmVkUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxQaW5uZWRQYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjZhOTM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFJhbmdlUGFydGl0aW9uaW5nXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSYW5nZSBQYXJ0aXRpb25pbmcgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFJhbmdlUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUmFuZ2VQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxSYW5nZVBhcnRpdGlvbmluZ18yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNmRkMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFJlcGxpY2F0aW9uIFBhcnRpdGlvbmluZyAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUmVwbGljYXRpb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxSZXBsaWNhdGlvblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFJlcGxpY2F0aW9uUGFydGl0aW9uaW5nXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmJiMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUm91bmQgUm9iaW4gUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxSb3VuZFJvYmluUGFydGl0aW9uaW5nXzJfMl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sUm91bmRSb2JpblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFJvdW5kUm9iaW5QYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxTZWNvbmRhcnlUYWJsZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBlODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFNlY29uZGFyeVRhYmxlXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTZWNvbmRhcnkgVGFibGUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxTZWNvbmRhcnlUYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sU2Vjb25kYXJ5VGFibGVfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxTZWNvbmRhcnlUYWJsZV8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZV8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sU2Vjb25kYXJ5VGFibGVfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uU3VmZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sU2Vjb25kYXJ5VGFibGVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxUYWJsZUdlbmVyYXRvcl8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmRlNTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlR2VuZXJhdG9yXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUYWJsZSBHZW5lcmF0b3IgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZUdlbmVyYXRvcl8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfMl8yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxUYWJsZUdlbmVyYXRvcl8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q3JlYXRpb24gU3VmZml4PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDcmVhdGlvblN1ZmZpeChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl8yXzJfQ3JlYXRpb25TdWZmaXgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENyZWF0aW9uU3VmZml4KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVGFibGVHZW5lcmF0b3JfMl8yI2dldENyZWF0aW9uU3VmZml4IDxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q3JlYXRpb25TdWZmaXgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENyZWF0aW9uU3VmZml4KFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sVGFibGVHZW5lcmF0b3JfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxUYWJsZV8yXzIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlXzJfMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTYyMDE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFRhYmxlXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBUYWJsZSAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFRhYmxlXzJfMiNnZXRDcmVhdGlvblN1ZmZpeCA8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxUYWJsZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRhYmxlXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DcmVhdGlvbiBTdWZmaXg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DcmVhdGlvbiBTdWZmaXg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENyZWF0aW9uU3VmZml4KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFRhYmxlXzJfMl9DcmVhdGlvblN1ZmZpeCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q3JlYXRpb25TdWZmaXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxUYWJsZV8yXzIjZ2V0Q3JlYXRpb25TdWZmaXggPGVtPkNyZWF0aW9uIFN1ZmZpeDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q3JlYXRpb24gU3VmZml4PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDcmVhdGlvblN1ZmZpeCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q3JlYXRpb25TdWZmaXgoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxUYWJsZV8yXzIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Jlc291cmNlL29ybS92Ml8yL1htbFVuaW9uUGFydGl0aW9uaW5nXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTI2MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFVuaW9uIFBhcnRpdGlvbmluZyAyMjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxVbmlvblBhcnRpdGlvbmluZ18yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVW5pb25QYXJ0aXRpb25pbmdfMl8yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxVbmlvblBhcnRpdGlvbmluZ18yXzIjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFVuaW9uUGFydGl0aW9uaW5nXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3MTg2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVmFsdWUgUGFydGl0aW9uaW5nIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWYWx1ZVBhcnRpdGlvbmluZ18yXzJfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhbHVlUGFydGl0aW9uaW5nXzJfMiNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sVmFsdWVQYXJ0aXRpb25pbmdfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVmFyaWFibGVPbmVUb09uZV8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxMDk5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWYXJpYWJsZU9uZVRvT25lXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFZhcmlhYmxlIE9uZSBUbyBPbmUgMjI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWYXJpYWJsZU9uZVRvT25lXzJfMiNpc05vbkNhY2hlYWJsZSA8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLkVjbGlwc2VMaW5rT3JtVjJfMlBhY2thZ2UjZ2V0WG1sVmFyaWFibGVPbmVUb09uZV8yXzIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yIGV4dGVuZHMgWG1sUGFydGl0aW9uaW5nR3JvdXBfMl8yCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uIENhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uIENhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25DYWNoZWFibGUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5FY2xpcHNlTGlua09ybVYyXzJQYWNrYWdlI2dldFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yX05vbkNhY2hlYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc05vbkNhY2hlYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8yLlhtbFZhcmlhYmxlT25lVG9PbmVfMl8yI2lzTm9uQ2FjaGVhYmxlIDxlbT5Ob24gQ2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gQ2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc05vbkNhY2hlYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm9uQ2FjaGVhYmxlKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbFZhcmlhYmxlT25lVG9PbmVfMl8yCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWZXJzaW9uXzJfMi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzIvWG1sVmVyc2lvbl8yXzIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5MjUyMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9vcm0vdjJfMi9YbWxWZXJzaW9uXzJfMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBWZXJzaW9uIDIyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuWG1sVmVyc2lvbl8yXzIjZ2V0SW5kZXggPGVtPkluZGV4PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmVyc2lvbl8yXzIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5kZXg8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmRleChYbWxJbmRleF8yXzIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmtPcm1WMl8yUGFja2FnZSNnZXRYbWxWZXJzaW9uXzJfMl9JbmRleCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxJbmRleF8yXzIgZ2V0SW5kZXgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMi5YbWxWZXJzaW9uXzJfMiNnZXRJbmRleCA8ZW0+SW5kZXg8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluZGV4PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRJbmRleCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5kZXgoWG1sSW5kZXhfMl8yIHZhbHVlKTsKLQotfSAvLyBYbWxWZXJzaW9uXzJfMgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhNTRjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzllMWUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMTptIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMCAKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZywgT25lVG9NYW55TWFwcGluZzJfMAotewotCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDljYzIyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMi4wIDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJCU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcxZWFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZywgT25lVG9PbmVNYXBwaW5nMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzMxNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLQotLyoqCi0gKiBFY2xpcHNlTGluayAyLjAgSmF2YSAxOm0gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAsCi0JCQlFY2xpcHNlTGlua0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NDI5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rT3JtT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgMi4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLAotCQkJRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NmYWM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci0KLS8qKgotICogIENvbm5lY3Rpb24yXzAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uMl8wIGV4dGVuZHMgQ29ubmVjdGlvbiwgSnBhQ29ubmVjdGlvbjJfMAotewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWVlZWU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci0vKioKLSAqICBMb2dnaW5nMl8wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTG9nZ2luZzJfMCBleHRlbmRzIExvZ2dpbmcKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9QUkVGSVhfID0gImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwuIjsgLy8kTk9OLU5MUy0xJAotCi0JQm9vbGVhbiBnZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCUJvb2xlYW4gZ2V0Q29ubmVjdGlvbigpOwotCXZvaWQgc2V0Q29ubmVjdGlvbihCb29sZWFuIGNvbm5lY3Rpb24pOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fUFJPUEVSVFkgPSAiY29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gRWNsaXBzZUxpbmsga2V5IHN0cmluZwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NPTk5FQ1RJT04gPSAiZWNsaXBzZWxpbmsubG9nZ2luZy5jb25uZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX0NPTk5FQ1RJT04gPSBCb29sZWFuLlRSVUU7Ci0JCQotCUxvZ2dpbmdMZXZlbCBnZXRDYXRlZ29yaWVzRGVmYXVsdExldmVsKCk7Ci0JTG9nZ2luZ0xldmVsIGdldExldmVsKFN0cmluZyBjYXRlZ29yeSk7Ci0Jdm9pZCBzZXRMZXZlbChTdHJpbmcgY2F0ZWdvcnksIExvZ2dpbmdMZXZlbCBsZXZlbCk7Ci0Jdm9pZCBzZXREZWZhdWx0TGV2ZWwoTG9nZ2luZ0xldmVsIGxldmVsKTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JJRVNfREVGQVVMVF9MT0dHSU5HX1BST1BFUlRZID0gImNhdGVnb3JpZXNEZWZhdWx0TG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAic3FsTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NRTF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJzcWwiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJ0cmFuc2FjdGlvbkxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJ0cmFuc2FjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gImV2ZW50TG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VWRU5UX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgImV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJjb25uZWN0aW9uTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiY29ubmVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInF1ZXJ5TG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1FVRVJZX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAotCQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiY2FjaGVMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAiY2FjaGUiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSA9ICJwcm9wYWdhdGlvbkxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJwcm9wYWdhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAic2VxdWVuY2luZ0xvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19TRVFVRU5DSU5HX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUwgPSBDQVRFR09SWV9QUkVGSVhfICsgInNlcXVlbmNpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiZWpiTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJlamIiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRE1TX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiZG1zTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJkbXMiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAiZWpiX29yX21ldGFkYXRhTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJlamJfb3JfbWV0YWRhdGEiOyAvLyROT04tTkxTLTEkCi0JCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAianBhX21ldGFtb2RlbExvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAianBhX21ldGFtb2RlbCI7IC8vJE5PTi1OTFMtMSQKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gIndlYXZlckxvZ2dpbmdMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19XRUFWRVJfQ0FURUdPUllfTE9HR0lOR19MRVZFTCA9IENBVEVHT1JZX1BSRUZJWF8gKyAid2VhdmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZID0gInByb3BlcnRpZXNMb2dnaW5nTGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJwcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkgPSAic2VydmVyTG9nZ2luZ0xldmVsIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX1NFUlZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMID0gQ0FURUdPUllfUFJFRklYXyArICJzZXJ2ZXIiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjI2M2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvT3B0aW9uczJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLQotLyoqCi0gKiAgT3B0aW9uczJfMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wdGlvbnMyXzAgZXh0ZW5kcyBPcHRpb25zLCBKcGFPcHRpb25zMl8wCi17Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfMS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rMl8xLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDI2ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdjJfMC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rMl8xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSmF2YS1yZWxhdGVkIHN0dWZmIChhbm5vdGF0aW9ucyBldGMuKQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGluazJfMSB7Ci0KLQkvLyBFY2xpcHNlTGluayBwYWNrYWdlCi0JU3RyaW5nIFBBQ0tBR0UgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICIuIjsKLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLy8gRWNsaXNwZUxpbmsgMi4xIGFubm90YXRpb25zCi0JU3RyaW5nIENMQVNTX0VYVFJBQ1RPUiA9IFBBQ0tBR0VfICsgIkNsYXNzRXh0cmFjdG9yIjsKLQkJU3RyaW5nIENMQVNTX0VYVFJBQ1RPUl9fVkFMVUUgPSAidmFsdWUiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS92Ml8wL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtDbGFzc0V4dHJhY3RvckFubm90YXRpb24yXzEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY3ZWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3YyXzAvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgRWNsaXBzZUxpbmsgYW5ub3RhdGlvbgotICogPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2xhc3NFeHRyYWN0b3I8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBFY2xpcHNlTGlua0NsYXNzRXh0cmFjdG9yQW5ub3RhdGlvbjJfMQotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBFY2xpcHNlTGluazJfMS5DTEFTU19FWFRSQUNUT1I7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBDbGFzc0V4dHJhY3RvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtDbGFzc0V4dHJhY3Rvcih2YWx1ZT1NeUV4dHJhY3Rvci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiTXlFeHRyYWN0b3IiCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENsYXNzRXh0cmFjdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDbGFzc0V4dHJhY3RvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZQotCSAqIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7Q2xhc3NFeHRyYWN0b3IoTXlFeHRyYWN0b3IuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gPGNvZGU+Im1vZGVsLk15RXh0cmFjdG9yIjwvY29kZT4gaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvcgotCSAqIDxjb2RlPm1vZGVsLk15RXh0cmFjdG9yPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2YzZlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNjQ0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzczMTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGIyYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjU5IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZDRjMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gRmViIDI0IDIxOjI3OjAxIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmQ1YWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZm9ybXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRkbGdlbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGRsZ2VuLndpemFyZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlsczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMi5kZXRhaWxzLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMi5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkczt4LWludGVybmFsOj10cnVlCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNhMmUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGE4MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotZWNsaXBzZUxpbmtXaXphcmRDYXRlZ29yeU5hbWU9RWNsaXBzZUxpbmsKLW5ld0VjbGlwc2VMaW5rTWFwcGluZ0ZpbGVXaXphcmROYW1lPUVjbGlwc2VMaW5rIE9STSBNYXBwaW5nIEZpbGUKLW5ld0VjbGlwc2VMaW5rSnBhTWFwcGluZ0ZpbGVXaXphcmREZXNjPUNyZWF0ZSBhbiBFY2xpcHNlTGluayBPUk0gbWFwcGluZyBmaWxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE5ODEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhNjdiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2VjbGlwc2VsaW5rX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLU1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlPU5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlPUVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfZGVzYz1TcGVjaWZ5IEVjbGlwc2VMaW5rIG1hcHBpbmcgZmlsZSBuYW1lIGFuZCBsb2NhdGlvbgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGU9RWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc19kZXNjPVNwZWNpZnkgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlIG9wdGlvbnMKLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWUgPSBOYW1lOgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3Byb3ZpZGVyID0gUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfYnJvd3NlID0gQnJvd3NlLi4uCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb24gPSBEZXNjcmlwdGlvbjoKLQotIyBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfdGl0bGUgPSBHZW5lcmFsCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZ2VuZXJhbFNlY3Rpb25UaXRsZSA9IEdlbmVyYWwKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvblRpdGxlID0gTWFuYWdlZCBDbGFzc2VzCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc1NlY3Rpb25EZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzU2VjdGlvblRpdGxlID0gWE1MIE1hcHBpbmcgRmlsZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uRGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX25hbWVMYWJlbCA9IE5hbWU6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcGVyc2lzdGVuY2VQcm92aWRlckxhYmVsID0gUGVyc2lzdGVuY2UgUHJvdmlkZXI6Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb25MYWJlbCA9IERlc2NyaXB0aW9uOgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlcz1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMKLVBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzV2l0aERlZmF1bHQ9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc05vTmFtZT08bmFtZSBub3Qgc2V0PgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX29wZW49T3BlbgotCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX3RpdGxlPUpQQSBYTUwgTWFwcGluZyBGaWxlIFNlbGVjdGlvbgotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc0RpYWxvZ19tZXNzYWdlPUNob29zZSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3JtTm9OYW1lPTxuYW1lIG5vdCBzZXQ+Ci1QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtPUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZQotUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0PUV4Y2x1ZGUgdW5saXN0ZWQgRWNsaXBzZUxpbmsgWE1MIG1hcHBpbmcgZmlsZSAoezB9KQotCi0jIENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZSA9IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENvbm5lY3Rpb24KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIGRhdGEgc291cmNlIG9yIEpEQkMgY29ubmVjdGlvbiBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwgPSBUcmFuc2FjdGlvbiB0eXBlOgotCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfanRhID0gSlRBCi1UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWwgPSBSZXNvdXJjZSBMb2NhbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWwgPSBOYXRpdmUgU1FMCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWxEZWZhdWx0ID0gTmF0aXZlIFNRTCAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwgPSBCYXRjaCB3cml0aW5nOgotCi1CYXRjaFdyaXRpbmdDb21wb3NpdGVfbm9uZSA9IE5vbmUKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjID0gSkRCQwotQmF0Y2hXcml0aW5nQ29tcG9zaXRlX2J1ZmZlcmVkID0gQnVmZmVyZWQKLUJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9vcmFjbGVfamRiYyA9IE9yYWNsZSBKREJDCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9jYWNoZVN0YXRlbWVudHNMYWJlbCA9IFN0YXRlbWVudCBjYWNoaW5nOgotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsID0gSlRBIGRhdGEgc291cmNlOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25vbkp0YURhdGFTb3VyY2VMYWJlbCA9IE5vbi1KVEEgZGF0YSBzb3VyY2U6Ci0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9kcml2ZXJMYWJlbCA9IERyaXZlcjoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91cmxMYWJlbCA9IFVSTDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWwgPSBVc2VyOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwgPSBQYXNzd29yZDoKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsID0gQmluZCBwYXJhbWV0ZXJzCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmluZFBhcmFtZXRlcnNMYWJlbERlZmF1bHQgPSBCaW5kIHBhcmFtZXRlcnMgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsID0gU2hhcmVkCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gUmVhZCBDb25uZWN0aW9uCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWwgPSBNaW5pbXVtOgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlID0gV3JpdGUgQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNaW5MYWJlbCA9IE1pbmltdW06Ci1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01heExhYmVsID0gTWF4aW11bToKLQotQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3ggPSBEYXRhYmFzZQotCi1KZGJjUHJvcGVydGllc0NvbXBvc2l0ZV9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Qb29sX0dyb3VwQm94ID0gRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sCi0KLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UgPSAmRW50ZXIgY29ubmVjdGlvbiBuYW1lIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUgPSBDb25uZWN0aW9uIFNlbGVjdGlvbgotCi1KZGJjRXhjbHVzaXZlQ29ubmVjdGlvbnNQcm9wZXJ0aWVzQ29tcG9zaXRlX0dyb3VwQm94ID0gRXhjbHVzaXZlIGNvbm5lY3Rpb25zCi0KLVBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9leGNsdXNpdmVDb25uZWN0aW9uTW9kZUxhYmVsID0gRXhjbHVzaXZlIGNvbm5lY3Rpb24gbW9kZToKLQotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2Fsd2F5cyA9IEFsd2F5cwotSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2lzb2xhdGVkID0gSXNvbGF0ZWQKLUpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZV90cmFuc2FjdGlvbmFsID0gVHJhbnNhY3Rpb25hbAotCi1QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbCA9IExhenkgY29ubmVjdGlvbiBhY3F1aXNpdGlvbgotUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWxEZWZhdWx0ID0gTGF6eSBjb25uZWN0aW9uIGFjcXVpc2l0aW9uICh7MH0pCi0KLSMgU2NoZW1hR2VuZXJhdGlvbgotUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlID0gU2NoZW1hIEdlbmVyYXRpb24KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IFNjaGVtYSBHZW5lcmF0aW9uCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBzY2hlbWEgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLgotCi1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdERvdCA9IERlZmF1bHQgKC4pCi0KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uVHlwZUxhYmVsID0gRERMIGdlbmVyYXRpb24gdHlwZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9vdXRwdXRNb2RlTGFiZWwgPSBPdXRwdXQgbW9kZToKLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9jcmVhdGVEZGxGaWxlTmFtZUxhYmVsID0gQ3JlYXRlIERETCBmaWxlIG5hbWU6Ci1QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWwgPSBEcm9wIERETCBmaWxlIG5hbWU6Ci0KLU91dHB1dE1vZGVDb21wb3NpdGVfYm90aCA9IEJvdGgKLU91dHB1dE1vZGVDb21wb3NpdGVfc3FsX3NjcmlwdCA9IFNxbC1zY3JpcHQKLU91dHB1dE1vZGVDb21wb3NpdGVfZGF0YWJhc2UgPSBEYXRhYmFzZQotCi1EZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfY3JlYXRlX3RhYmxlcyA9IENyZWF0ZSBUYWJsZXMKLURkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXMgPSBEcm9wIGFuZCBDcmVhdGUgVGFibGVzCi0KLVBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9kZGxHZW5lcmF0aW9uTG9jYXRpb25MYWJlbCA9IERETCBnZW5lcmF0aW9uIGxvY2F0aW9uOgotCQotRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlID0gR2VuZXJhdGlvbiBMb2NhdGlvbgotRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2UgPSBDaG9vc2UgYSBmb2xkZXIgZm9yIHRoZSBnZW5lcmF0ZWQgRERMIGZpbGVzOgotCi0jIENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZSA9IENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIHNlc3Npb24gb3IgZW50aXR5IHNwZWNpZmljIEVjbGlwc2VMaW5rIGNhY2hpbmcgcHJvcGVydGllcy4KLQotQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZV9ncm91cFRpdGxlID0gRGVmYXVsdHMKLQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRDYWNoZVR5cGVMYWJlbCA9IERlZmF1bHQgY2FjaGUgdHlwZToKLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9jYWNoZVR5cGVMYWJlbCA9IENhY2hlIHR5cGU6Ci0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCA9IFNoYXJlZCBjYWNoZSAoezB9KQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlTGFiZWwgPSBTaGFyZWQgY2FjaGUKLQotUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbCA9IERlZmF1bHQgc2hhcmVkIGNhY2hlICh7MH0pCi1QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWwgPSBEZWZhdWx0IHNoYXJlZCBjYWNoZQotCi1DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplPUNhY2hlIHNpemU6Ci0KLUNhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotQ2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhayA9IFdlYWsgd2l0aCBIYXJkIFN1YmNhY2hlCi1DYWNoZVR5cGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLUNhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0ID0gU29mdAotQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhayA9IFdlYWsgd2l0aCBTb2Z0IFN1YmNhY2hlCi1DYWNoZVR5cGVDb21wb3NpdGVfd2VhayA9IFdlYWsKLQotRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZV9kZWZhdWx0Q2FjaGVTaXplPURlZmF1bHQgY2FjaGUgc2l6ZToKLQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWsgPSBXZWFrIFdpdGggSGFyZCBTdWJjYWNoZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0ID0gU29mdAotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV93ZWFrID0gV2VhawotCi1FbnRpdHlEaWFsb2dfc2VsZWN0RW50aXR5ID0gU2VsZWN0IGFuIEVudGl0eQotRW50aXR5RGlhbG9nX25hbWUgPSBOYW1lOgotCi1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlID0gRW50aXR5IGNhY2hpbmcKLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b24gPSBFZGl0Li4uCi0KLUNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHR5cGUgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dUaXRsZT1FbnRpdHkgU2VsZWN0aW9uCi0KLVBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9GbHVzaENsZWFyQ2FjaGVMYWJlbCA9IEZsdXNoIGNsZWFyIGNhY2hlOgotCi1GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGVfZHJvcCA9IERyb3AKLUZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wX2ludmFsaWRhdGUgPSBEcm9wIEludmFsaWRhdGUKLUZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9tZXJnZSA9IE1lcmdlCi0KLSMgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3RpdGxlID0gQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZSA9IFBlcnNpc3RlbmNlIFVuaXQgQ3VzdG9taXphdGlvbgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25EZXNjcmlwdGlvbiA9IFNldCBkZWZhdWx0IG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjdXN0b21pemF0aW9uIGFuZCB2YWxpZGF0aW9uIHByb3BlcnRpZXMuCi0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nUHJvcGVydGllc0dyb3VwQm94ID0gV2VhdmluZwotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbCA9IFdlYXZpbmc6Ci0KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdCA9IExhenkgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsID0gTGF6eQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWxEZWZhdWx0ID0gRmV0Y2ggZ3JvdXBzICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWwgPSBGZXRjaCBncm91cHMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdJbnRlcm5hbExhYmVsID0gSW50ZXJuYWwKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbERlZmF1bHQgPSBJbnRlcm5hbCAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0VhZ2VyTGFiZWwgPSBFYWdlcgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsRGVmYXVsdCA9IEVhZ2VyICh7MH0pCi0JCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWxEZWZhdWx0ID0gQ2hhbmdlIHRyYWNraW5nICh7MH0pCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWwgPSBDaGFuZ2UgdHJhY2tpbmcKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWwgPSBWYWxpZGF0aW9uIG9ubHkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsRGVmYXVsdCA9IFZhbGlkYXRpb24gb25seSAoezB9KQotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbCA9IE1hcHBpbmcgZmlsZXMgc2NoZW1hIHZhbGlkYXRpb24KLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsRGVmYXVsdCA9IE1hcHBpbmcgZmlsZXMgc2NoZW1hIHZhbGlkYXRpb24gKHswfSkKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsRGVmYXVsdCA9IFRocm93IGV4Y2VwdGlvbnMgKHswfSkKLVBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbCA9IFRocm93IGV4Y2VwdGlvbnMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2V4Y2VwdGlvbkhhbmRsZXJMYWJlbCA9IEV4Y2VwdGlvbiBoYW5kbGVyOgotCi1XZWF2aW5nQ29tcG9zaXRlX3RydWVfID0gV2VhdmUgRHluYW1pY2FsbHkKLVdlYXZpbmdDb21wb3NpdGVfZmFsc2VfID0gTm8gV2VhdmluZwotV2VhdmluZ0NvbXBvc2l0ZV9zdGF0aWNfID0gV2VhdmUgU3RhdGljYWxseQotCi1DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlID0gRGVzY3JpcHRvciBjdXN0b21pemVycwotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbiA9IEVkaXQuLi4KLQotQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nTWVzc2FnZT0mRW50ZXIgdHlwZSBuYW1lIHByZWZpeCBvciBwYXR0ZXJuICgqLCA/LCBvciBjYW1lbCBjYXNlKToKLUN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlPUVudGl0eSBTZWxlY3Rpb24KLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbCA9IEN1c3RvbWl6ZXI6Ci1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbCA9IFNlc3Npb24gY3VzdG9taXplcnMKLQotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZT08bmFtZSBub3Qgc2V0PgotCi1QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbCA9IFByb2ZpbGVyOgotUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2Jyb3dzZSA9IEJyb3dzZS4uLgotCi1Qcm9maWxlckNvbXBvc2l0ZV9wZXJmb3JtYW5jZV9wcm9maWxlciA9IFBlcmZvcm1hbmNlIFByb2ZpbGVyCi1Qcm9maWxlckNvbXBvc2l0ZV9xdWVyeV9tb25pdG9yID0gUXVlcnkgTW9uaXRvciAKLVByb2ZpbGVyQ29tcG9zaXRlX25vX3Byb2ZpbGVyID0gTm8gUHJvZmlsZXIKLQotIyBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGl0bGUgPSBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvblRpdGxlID0gUGVyc2lzdGVuY2UgVW5pdCBMb2dnaW5nCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uID0gQ29uZmlndXJlIHRoZSBFY2xpcHNlTGluayBsb2dnaW5nIHByb3BlcnRpZXMuCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZGVmYXVsdFN0ZG91dCA9IERlZmF1bHQgKHN0ZG91dCkKLQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2NhdGVnb3J5TG9nZ2luZ0xldmVsU2VjdGlvblRpdGxlID0gTG9nZ2luZyBDYXRlZ29yaWVzCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0xldmVsTGFiZWwgPSBMb2dnaW5nIGxldmVsOgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc3FsTG9nZ2luZ0xldmVsTGFiZWwgPSBTUUw6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdHJhbnNhY3Rpb25Mb2dnaW5nTGV2ZWxMYWJlbCA9IFRyYW5zYWN0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V2ZW50TG9nZ2luZ0xldmVsTGFiZWwgPSBFdmVudDoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTG9nZ2luZ0xldmVsTGFiZWwgPSBDb25uZWN0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3F1ZXJ5TG9nZ2luZ0xldmVsTGFiZWwgPSBRdWVyeToKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYWNoZUxvZ2dpbmdMZXZlbExhYmVsID0gQ2FjaGU6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWxMYWJlbCA9IFByb3BhZ2F0aW9uOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcXVlbmNpbmdMb2dnaW5nTGV2ZWxMYWJlbCA9IFNlcXVlbmNpbmc6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiTG9nZ2luZ0xldmVsTGFiZWwgPSBFSkI6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZG1zTG9nZ2luZ0xldmVsTGFiZWwgPSBETVM6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZWpiX29yX21ldGFkYXRhTG9nZ2luZ0xldmVsTGFiZWwgPSBFSkIgb3IgbWV0YWRhdGE6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfanBhX21ldGFtb2RlbExvZ2dpbmdMZXZlbExhYmVsID0gSlBBIG1ldGFtb2RlbDoKLQlQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfd2VhdmVyTG9nZ2luZ0xldmVsTGFiZWwgPSBXZWF2aW5nOgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Byb3BlcnRpZXNMb2dnaW5nTGV2ZWxMYWJlbCA9IFByb3BlcnRpZXM6Ci1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VydmVyTG9nZ2luZ0xldmVsTGFiZWwgPSBTZXJ2ZXI6Ci0KLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmYgPSBPZmYKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmUgPSBTZXZlcmUKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nID0gV2FybmluZwotTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm8gPSBJbmZvCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfY29uZmlnID0gQ29uZmlnCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZSA9IEZpbmUKLUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lciA9IEZpbmVyCi1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXN0ID0gRmluZXN0Ci1Mb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsID0gQWxsCi0KLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmID0gT2ZmCi1FY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX3NldmVyZSA9IFNldmVyZQotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nID0gV2FybmluZwotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9pbmZvID0gSW5mbwotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9jb25maWcgPSBDb25maWcKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZSA9IEZpbmUKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXIgPSBGaW5lcgotRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lc3QgPSBGaW5lc3QKLUVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsID0gQWxsCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbCA9IExvZ2dlcjoKLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9icm93c2UgPSBCcm93c2UuLi4KLUxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlciA9IERlZmF1bHQgTG9nZ2VyCi1Mb2dnZXJDb21wb3NpdGVfamF2YV9sb2dnZXIgPSBKYXZhIExvZ2dlcgotTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXIgPSBTZXJ2ZXIgTG9nZ2VyCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbCA9IFRpbWVzdGFtcAotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RpbWVzdGFtcExhYmVsRGVmYXVsdCA9IFRpbWVzdGFtcCAoezB9KQotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsID0gVGhyZWFkCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0ID0gVGhyZWFkICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsID0gU2Vzc2lvbgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbERlZmF1bHQgPSBTZXNzaW9uICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsID0gRXhjZXB0aW9ucwotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQgPSBFeGNlcHRpb25zICh7MH0pCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsID0gQ29ubmVjdGlvbgotUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbERlZmF1bHQgPSBDb25uZWN0aW9uICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWwgPSBMb2dnZXJzOgotCi1QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbCA9IExvZyBmaWxlOgotCi1Mb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlID0gQ2hvb3NlIGEgbG9nIGZpbGUKLQotIyBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGl0bGUgPSBPcHRpb25zCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfc2Vzc2lvblNlY3Rpb25UaXRsZSA9IEVjbGlwc2VMaW5rIFNlc3Npb24gT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25TZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gb3B0aW9ucy4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lID0gU2Vzc2lvbiBuYW1lOgotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25zWG1sID0gU2Vzc2lvbnMgWE1MOgotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWwgPSBJbmNsdWRlIGRlc2NyaXB0b3IgcXVlcmllcwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2luY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xhYmVsRGVmYXVsdCA9IEluY2x1ZGUgZGVzY3JpcHRvciBxdWVyaWVzICh7MH0pCi0KLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWwgPSBFdmVudCBsaXN0ZW5lcjoKLVBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXREYXRhYmFzZUxhYmVsID0gVGFyZ2V0IGRhdGFiYXNlOgotCi1QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZSA9IE1pc2NlbGxhbmVvdXMgT3B0aW9ucwotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIG1pc2NlbGxhbmVvdXMgb3B0aW9ucy4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsID0gVGVtcG9yYWwgbXV0YWJsZQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsRGVmYXVsdCA9IFRlbXBvcmFsIG11dGFibGUgKHswfSkKLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX25vTmFtZT08bmFtZSBub3Qgc2V0PgotCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdHR1bml0eSA9IEF0dHVuaXR5Ci1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9hdXRvID0gQXV0bwotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfY2xvdWRzY2FwZSA9IENsb3Vkc2NhcGUKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RhdGFiYXNlID0gRGF0YWJhc2UKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiMiA9IERCMgotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGIybWFpbmZyYW1lID0gREIyTWFpbmZyYW1lCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYmFzZSA9IERCYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kZXJieSA9IERlcmJ5Ci1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9oc3FsID0gSFNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaW5mb3JtaXggPSBJbmZvcm1peAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfamF2YWRiID0gSmF2YURCCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9teXNxbCA9IE15U1FMCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUgPSBPcmFjbGUKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTExID0gT3JhY2xlMTEKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTEwID0gT3JhY2xlMTBnCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU5ID0gT3JhY2xlOWkKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTggPSBPcmFjbGU4aQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlID0gUG9pbnRCYXNlCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9wb3N0Z3Jlc3FsID0gUG9zdGdyZVNRTAotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmUgPSBTUUxBbnl3aGVyZQotVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyID0gU1FMU2VydmVyCi1UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9zeWJhc2UgPSBTeWJhc2UKLVRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3RpbWVzdGVuID0gVGltZXNUZW4KLQotUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldFNlcnZlckxhYmVsID0gVGFyZ2V0IHNlcnZlcjoKLQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX25vbmUgPSBOb25lCi1UYXJnZXRTZXJ2ZXJDb21wb3NpdGVfb2M0aiA9IE9DNEoKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9zdW5hczkgPSBTdW5BUzkKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmUgPSBXZWJTcGhlcmUKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJzcGhlcmVfNl8xID0gV2ViU3BoZXJlIDYuMQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljID0gV2ViTG9naWMKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV93ZWJsb2dpY185ID0gV2ViTG9naWMgOQotVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwID0gV2ViTG9naWMgMTAKLVRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zcyA9IEpCb3NzCi0KLSMgRERMR2VuZXJhdGlvbgotRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlID0gR2VuZXJhdGluZyBEREwKLUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlID0gV2FybmluZzogIEdlbmVyYXRpbmcgRERMIHdpbGwgRFJPUCBleGlzdGluZyB0YWJsZXMgYW5kezB9Q1JFQVRFIG5ldyB0YWJsZXMgYmFzZWQgb24gdGhlIEVudGl0aWVzIGluIHlvdXIgcHJvamVjdC57MX1BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/Ci1FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2Vycm9yID0gRXJyb3IKLUVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19KT0IgPSBHZW5lcmF0aW5nIFRhYmxlcyBmcm9tIEVudGl0aWVzCi1FQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfVEFTSyA9IEdlbmVyYXRpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvcHJvcGVydHlfZmlsZXMvZWNsaXBzZWxpbmtfdWlfZGV0YWlscy5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9kZXRhaWxzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTgyODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9lY2xpcHNlbGlua191aV9kZXRhaWxzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBCYXNpYyBDb2xsZWN0aW9uCi1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbCA9IGJhc2ljIGNvbGxlY3Rpb24KLQotRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsID0gQmFzaWMgTWFwCi1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gYmFzaWMgbWFwCi0KLUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbCA9IFRyYW5zZm9ybWF0aW9uCi1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsID0gdHJhbnNmb3JtYXRpb24KLQotRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWwgPSBWYXJpYWJsZSBPbmUgdG8gT25lCi1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWwgPSB2YXJpYWJsZSBvbmUgdG8gb25lCi0KLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsID0gVHlwZToJCi1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsID0gRnVsbAotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfd2VhayA9IFdlYWsKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQgPSBTb2Z0Ci1FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWsgPSBXZWFrIHdpdGggU29mdCBTdWJjYWNoZQotRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrID0gV2VhayB3aXRoIEhhcmQgU3ViY2FjaGUKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2NhY2hlID0gQ2FjaGUKLUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmUgPSAgTm9uZQotCi1FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplID0gU2l6ZToKLQotRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWwgPSBDb29yZGluYXRpb24gdHlwZToKLUVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlX3NlbmRfb2JqZWN0X2NoYW5nZXMgPSBTZW5kIE9iamVjdCBDaGFuZ2VzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9pbnZhbGlkYXRlX2NoYW5nZWRfb2JqZWN0cyA9IEludmFsaWRhdGUgQ2hhbmdlZCBPYmplY3RzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX25ld19vYmplY3RzX3dpdGhfY2hhbmdlcyA9IFNlbmQgTmV3IE9iamVjdHMgd2l0aCBDaGFuZ2VzCi1FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotCi1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWxEZWZhdWx0ID0gU2hhcmVkICh7MH0pCi1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWwgPSBTaGFyZWQKLUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCA9IEFkdmFuY2VkCi0KLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfbGFiZWwgPSBDaGFuZ2UgdHJhY2tpbmc6Ci1FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2F0dHJpYnV0ZSA9IEF0dHJpYnV0ZQotRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9vYmplY3QgPSBPYmplY3QKLUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfZGVmZXJyZWQgPSBEZWZlcnJlZAotRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdXRvID0gQXV0bwotCi1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY29udmVydGVyTmFtZUxhYmVsID0gQ29udmVydGVyIG5hbWU6Ci1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfZGVmaW5lQ29udmVydGVyU2VjdGlvbiA9IERlZmluZSBDb252ZXJ0ZXIKLUVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9kZWZhdWx0ID0gRGVmYXVsdAotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2N1c3RvbSA9IEN1c3RvbQotRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX3R5cGUgPSBUeXBlCi1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfb2JqZWN0VHlwZSA9IE9iamVjdCB0eXBlCi1FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfc3RydWN0ID0gU3RydWN0Ci0KLUVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwgPSBOYW1lOgotRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfY2xhc3NMYWJlbCA9IENsYXNzOgotCi1FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGVfY2xhc3NMYWJlbCA9IEN1c3RvbWl6ZXIgY2xhc3M6Ci0KLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9jdXN0b21Db252ZXJ0ZXIgPSBDdXN0b20KLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyID0gT2JqZWN0IHR5cGUKLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXIgPSBTdHJ1Y3QKLUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyID0gVHlwZQotCi1FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaERlZmF1bHQgPSBBbHdheXMgcmVmcmVzaCAoezB9KQotRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbCA9IEFsd2F5cyByZWZyZXNoCi1FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0ID0gUmVmcmVzaCBvbmx5IGlmIG5ld2VyICh7MH0pCi1FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCA9IFJlZnJlc2ggb25seSBpZiBuZXdlcgotRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQgPSBEaXNhYmxlIGhpdHMgKHswfSkKLUVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbCA9IERpc2FibGUgaGl0cwotCi1UeXBlU2VjdGlvbl9jb252ZXJ0ZWQgPSBDb252ZXJ0ZWQKLQotRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCA9IEFkdmFuY2VkCi1FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcgPSBDYWNoaW5nCi1FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMgPSBDb252ZXJ0ZXJzCi0KLUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfbGFiZWwgPSBFeGlzdGVuY2UgY2hlY2tpbmc6Ci1KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZSA9IENoZWNrIENhY2hlCi1KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZSA9IENoZWNrIENhY2hlIHRoZW4gRGF0YWJhc2UKLUphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9leGlzdGVuY2UgPSBBc3N1bWUgRXhpc3RlbmNlCi1KYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZSA9IEFzc3VtZSBOb24tRXhpc3RlbmNlCi1Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2NoZWNrX2NhY2hlID0gQ2hlY2sgQ2FjaGUKLU9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfZGF0YWJhc2UgPSBDaGVjayBDYWNoZSB0aGVuIERhdGFiYXNlCi1Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9leGlzdGVuY2UgPSBBc3N1bWUgRXhpc3RlbmNlCi1Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlID0gQXNzdW1lIE5vbi1FeGlzdGVuY2UKLQotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZXhwaXJ5U2VjdGlvbiA9IEV4cGlyeQotCi1FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9ub0V4cGlyeSA9IE5vIGV4cGlyeQotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeSA9IFRpbWUgdG8gbGl2ZSBleHBpcnkKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlFeHBpcmVBZnRlciA9IEV4cGlyZSBhZnRlcgotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeU1pbGxpc2Vjb25kcyA9IG1pbGxpc2Vjb25kcwotRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZGFpbHlFeHBpcnkgPSBEYWlseSBleHBpcnkKLUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVPZkRheUV4cGlyeUV4cGlyZUF0ID0gRXhwaXJlIGF0Ci0KLQotRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfbGFiZWwgPSBKb2luIGZldGNoOgotRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfaW5uZXIgPSBJbm5lcgotRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfb3V0ZXIgPSBPdXRlcgotCi1FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsPU11dGFibGUKLUVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWxEZWZhdWx0PU11dGFibGUgKHswfSkKLUVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV90cnVlPVRydWUKLUVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9mYWxzZT1GYWxzZQotCi1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbCA9IERhdGEgdHlwZToKLUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWwgPSBPYmplY3QgdHlwZToKLUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVFZGl0ID0gRWRpdC4uLgotRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNEYXRhVmFsdWVDb2x1bW4gPSBEYXRhIFZhbHVlCi1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfY29udmVyc2lvblZhbHVlc09iamVjdFZhbHVlQ29sdW1uID0gT2JqZWN0IFZhbHVlCi1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGVmYXVsdE9iamVjdFZhbHVlTGFiZWwgPSBEZWZhdWx0IG9iamVjdCB2YWx1ZToKLUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzR3JvdXBUaXRsZSA9IENvbnZlcnNpb24gdmFsdWVzCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19hZGRDb252ZXJzaW9uVmFsdWUgPSBBZGQgQ29udmVyc2lvbiBWYWx1ZQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZSA9IEVkaXQgQ29udmVyc2lvbiBWYWx1ZQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZSA9IENyZWF0ZSBuZXcgY29udmVyc2lvbiB2YWx1ZQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb24gPSBDcmVhdGUgYSBuZXcgY29udmVyc2lvbiB2YWx1ZSBzZXR0aW5nIGJvdGggdGhlICdkYXRhIHZhbHVlJyBhbmQgdGhlICdvYmplY3QgdmFsdWUnCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZSA9IEVkaXQgY29udmVyc2lvbiB2YWx1ZQotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uID0gRWRpdCB0aGUgY29udmVyc2lvbiB2YWx1ZSwgY2hhbmdpbmcgdGhlICdkYXRhIHZhbHVlJyBvciAnb2JqZWN0IHZhbHVlJwotCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19kYXRhVmFsdWUgPSBEYXRhIHZhbHVlOgotRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfb2JqZWN0VmFsdWUgPSBPYmplY3QgdmFsdWU6Ci1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZU11c3RCZVNwZWNpZmllZCA9IEEgZGF0YSB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4KLUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Rfb2JqZWN0VmFsdWVNdXN0QmVTcGVjaWZpZWQgPSBBbiBvYmplY3QgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZUFscmVhZHlFeGlzdHMgPSBUaGlzIGRhdGEgdmFsdWUgaXMgYWxyZWFkeSBzcGVjaWZpZWQsIGNhbm5vdCBtYXAgbXVsdGlwbGUgb2JqZWN0IHZhbHVlcyB0byB0aGUgc2FtZSBkYXRhIHZhbHVlLgotCi0KLUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlX3ByaXZhdGVPd25lZExhYmVsID0gUHJpdmF0ZSBvd25lZAotRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsID0gUmVhZC1vbmx5Ci1FY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5V2l0aERlZmF1bHQgPSBSZWFkLW9ubHkgKHswfSkKLUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kYXRhVHlwZUxhYmVsID0gRGF0YSB0eXBlOgotRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbCA9IE9iamVjdCB0eXBlOgotCi1EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPURlZmF1bHQgKE9uZSB0byBPbmUpCi1EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoVmFyaWFibGUgT25lIHRvIE9uZSkKLURlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPURlZmF1bHQgKE9uZSB0byBNYW55KQotRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAob25lIHRvIG9uZSkKLURlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9ZGVmYXVsdCAodmFyaWFibGUgb25lIHRvIG9uZSkKLURlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChvbmUgdG8gbWFueSkKLQotCQotRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfbmFtZT1OYW1lOgotRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfY29udmVydGVyVHlwZT1UeXBlOgotRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyPUFkZCBDb252ZXJ0ZXIKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlckRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIG5ldyBjb252ZXJ0ZXIKLUVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlckRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBjb252ZXJ0ZXIgc2V0dGluZyBib3RoIHRoZSAnbmFtZScgYW5kIHRoZSAndHlwZScKLUVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfbmFtZUV4aXN0cyA9VGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBleGlzdHMuIFRoaXMgY29udmVydGVyIG1heSBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb25lKHMpIHdpdGggdGhlIHNhbWUgbmFtZS4KLUVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCA9IEEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLUVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZCA9IEEgY29udmVydGVyIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQuCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTY1ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aSI7Ci0KLQkKLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWVmZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIERhbGkgRWNsaXBzZUxpbmsgVUkuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcyB7Ci0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7Ci0KLQkvL1BlcnNpc3RlbnQgVHlwZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19BTFdBWVNfUkVGUkVTSCA9IFBSRUZJWCArICJjYWNoaW5nX2Fsd2F5c1JlZnJlc2giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfQ09PUkRJTkFUSU9OX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19jYWNoZUNvb3JkaW5hdGlvblR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfQ0FDSEVfVFlQRSA9IFBSRUZJWCArICJjYWNoaW5nX2NhY2hlVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19ESVNBQkxFX0hJVFMgPSBQUkVGSVggKyAiY2FjaGluZ19kaXNhYmxlSGl0cyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSElOR19SRUZSRVNIX09OTFlfSUZfTkVXRVIgPSBQUkVGSVggKyAiY2FjaGluZ19yZWZyZXNoT25seUlmTmV3ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hJTkdfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfc2hhcmVkIjsKLQotCS8vUGVyc2lzdGVuY2UgWG1sIEVkaXRvcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0NBQ0hJTkcgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfY2FjaGluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTiA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZV9jdXN0b21pemF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HID0gUFJFRklYICsgInBlcnNpc3RlbmNlX2xvZ2dpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlMgPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfb3B0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04gPSBQUkVGSVggKyAicGVyc2lzdGVuY2Vfc2NoZW1hR2VuZXJhdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0hBUkVEID0gUFJFRklYICsgImNhY2hpbmdfZGVmYXVsdFNoYXJlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1NJWkUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0U2l6ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1RZUEUgPSBQUkVGSVggKyAiY2FjaGluZ19kZWZhdWx0VHlwZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TID0gUFJFRklYICsgImxvZ2dpbmdfZXhjZXB0aW9ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19MRVZFTCA9IFBSRUZJWCArICJsb2dnaW5nX2xldmVsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1NFU1NJT04gPSBQUkVGSVggKyAibG9nZ2luZ19zZXNzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9MT0dHSU5HX1RIUkVBRCA9IFBSRUZJWCArICJsb2dnaW5nX3RocmVhZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTE9HR0lOR19USU1FU1RBTVAgPSBQUkVGSVggKyAibG9nZ2luZ190aW1lU3RhbXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTl9OQU1FID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbk5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTlNfWE1MID0gUFJFRklYICsgIm9wdGlvbnNfc2Vzc2lvbnNYbWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX0RBVEFCQVNFID0gUFJFRklYICsgIm9wdGlvbnNfdGFyZ2V0RGF0YWJhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX1NFUlZFUiA9IFBSRUZJWCArICJvcHRpb25zX3RhcmdldFNlcnZlciI7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VjbGlwc2VMaW5rVWlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmUxNDk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRWxpcHNlTGluayBVSS4KLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVWlNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfcHJvdmlkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Jyb3dzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZGVzY3JpcHRpb247Ci0KLQkvLyBHZW5lcmFsCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9nZW5lcmFsU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9tYXBwZWRDbGFzc2VzU2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNTZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX3htbE1hcHBpbmdGaWxlc1NlY3Rpb25EZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbmFtZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9wZXJzaXN0ZW5jZVByb3ZpZGVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2Rlc2NyaXB0aW9uTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfbWFwcGVkQ2xhc3Nlc05vTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3BlbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfeG1sTWFwcGluZ0ZpbGVzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl94bWxNYXBwaW5nRmlsZXNEaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfb3JtTm9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxHZW5lcmFsVGFiX2V4Y2x1ZGVFY2xpcHNlbGlua09ybVdpdGhEZWZhdWx0OwotCi0JLy8gQ29ubmVjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0VjbGlwc2VMaW5rQ29ubmVjdGlvblBvb2xfR3JvdXBCb3g7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX2p0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iYXRjaFdyaXRpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9qZGJjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZV9idWZmZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXRjaFdyaXRpbmdDb21wb3NpdGVfb3JhY2xlX2pkYmM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfY2FjaGVTdGF0ZW1lbnRzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfanRhRGF0YVNvdXJjZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9ub25KdGFEYXRhU291cmNlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl91c2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NoYXJlZExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3JlYWRDb25uZWN0aW9uc01heExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3dyaXRlQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGVfR3JvdXBCb3g7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX2Fsd2F5czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGVfaXNvbGF0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlX3RyYW5zYWN0aW9uYWw7Ci0JCi0JLy8gU2NoZW1hR2VuZXJhdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RlZmF1bHREb3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfb3V0cHV0TW9kZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2NyZWF0ZURkbEZpbGVOYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2Ryb3BEZGxGaWxlTmFtZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3V0cHV0TW9kZUNvbXBvc2l0ZV9ib3RoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE91dHB1dE1vZGVDb21wb3NpdGVfc3FsX3NjcmlwdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdXRwdXRNb2RlQ29tcG9zaXRlX2RhdGFiYXNlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGVfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZV9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlX2Ryb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvbkxvY2F0aW9uTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0KLQkvLyBDYWNoaW5nCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZURlZmF1bHRzQ29tcG9zaXRlX2dyb3VwVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdENhY2hlVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9jYWNoZVR5cGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NoYXJlZENhY2hlRGVmYXVsdExhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVTaXplQ29tcG9zaXRlX2NhY2hlU2l6ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hlVHlwZUNvbXBvc2l0ZV9oYXJkX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FjaGVUeXBlQ29tcG9zaXRlX3NvZnRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoZVR5cGVDb21wb3NpdGVfd2VhazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVNpemVDb21wb3NpdGVfZGVmYXVsdENhY2hlU2l6ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfZnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX2hhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGVfd2VhazsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eURpYWxvZ19zZWxlY3RFbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGlhbG9nX25hbWU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2VkaXRCdXR0b247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX0ZsdXNoQ2xlYXJDYWNoZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZV9kcm9wX2ludmFsaWRhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlX21lcmdlOwotCQotCS8vIEN1c3RvbWl6YXRpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdQcm9wZXJ0aWVzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ZldGNoR3JvdXBzTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9leGNlcHRpb25IYW5kbGVyTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXZWF2aW5nQ29tcG9zaXRlX3RydWVfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYXZpbmdDb21wb3NpdGVfZmFsc2VfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYXZpbmdDb21wb3NpdGVfc3RhdGljXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2dyb3VwVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZWRpdEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3VzdG9taXphdGlvbkVudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2Vzc2lvbkN1c3RvbWl6ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfbm9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRlU2NoZW1hTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRlU2NoZW1hTGFiZWxEZWZhdWx0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9wcm9maWxlckxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9icm93c2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXJDb21wb3NpdGVfcGVyZm9ybWFuY2VfcHJvZmlsZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXJDb21wb3NpdGVfcXVlcnlfbW9uaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlckNvbXBvc2l0ZV9ub19wcm9maWxlcjsKLQotCS8vIExvZ2dpbmcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9kZWZhdWx0U3Rkb3V0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2NhdGVnb3J5TG9nZ2luZ0xldmVsU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc3FsTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RyYW5zYWN0aW9uTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V2ZW50TG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25Mb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcXVlcnlMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY2FjaGVMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfcHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2VxdWVuY2luZ0xvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9lamJMb2dnaW5nTGV2ZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZG1zTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2VqYl9vcl9tZXRhZGF0YUxvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9qcGFfbWV0YW1vZGVsTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3dlYXZlckxvZ2dpbmdMZXZlbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9wcm9wZXJ0aWVzTG9nZ2luZ0xldmVsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlcnZlckxvZ2dpbmdMZXZlbExhYmVsOwotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfb2ZmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX3dhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2luZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfZmluZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nTGV2ZWxDb21wb3NpdGVfYWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9vZmY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV93YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGVfaW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZV9maW5lcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2ZpbmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlX2FsbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfYnJvd3NlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9nZ2VyQ29tcG9zaXRlX2RlZmF1bHRfbG9nZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvZ2dlckNvbXBvc2l0ZV9qYXZhX2xvZ2dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnZXJDb21wb3NpdGVfc2VydmVyX2xvZ2dlcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aHJlYWRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWxEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZXNzaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfZXhjZXB0aW9uc0xhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfY29ubmVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTGFiZWxEZWZhdWx0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2xvZ2dpbmdGaWxlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCi0JLy8gU2Vzc2lvbiBPcHRpb25zCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uc1htbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWxEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX2V2ZW50TGlzdGVuZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGFyZ2V0RGF0YWJhc2VMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25EZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfdGVtcG9yYWxNdXRhYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsRGVmYXVsdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F0dHVuaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2F1dG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfY2xvdWRzY2FwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYXRhYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9kYjI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfZGIybWFpbmZyYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2RlcmJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX2hzcWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfaW5mb3JtaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfamF2YWRiOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX215c3FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUxMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGUxMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV9vcmFjbGU5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX29yYWNsZTg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfcG9pbnRiYXNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3Bvc3RncmVzcWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3FsYW55d2hlcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGVfc3Fsc2VydmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldERhdGFiYXNlQ29tcG9zaXRlX3N5YmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZV90aW1lc3RlbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbm9OYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9vYzRqOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9zdW5hczk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYnNwaGVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2Vic3BoZXJlXzZfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRTZXJ2ZXJDb21wb3NpdGVfd2VibG9naWM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlX3dlYmxvZ2ljXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhcmdldFNlcnZlckNvbXBvc2l0ZV9qYm9zczsKLQotCS8vIERETCBHZW5lcmF0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRERMV2FybmluZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUNMSVBTRUxJTktfR0VORVJBVEVfVEFCTEVTX0pPQjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFQ0xJUFNFTElOS19HRU5FUkFURV9UQUJMRVNfVEFTSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJlY2xpcHNlbGlua191aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1VpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjZlZDQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGRsZ2VuL0VjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmRkbGdlbi5FY2xpcHNlTGlua0RETEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLkpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4ud2l6YXJkcy5HZW5lcmF0ZURETFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0RMTEdlbmVyYXRvclVpIGlzIHVzZWQgYnkgdGhlIEVjbGlwc2VMaW5rUGxhdGZvcm1VaSB0byBpbml0aWF0ZSAKLSAqICB0aGUgZXhlY3V0aW9uIG9mIEVjbGlwc2VMaW5rIERETCBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3RyaW5nVG9vbHMuQ1I7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotCQluZXcgRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaShwcm9qZWN0KS5nZW5lcmF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpKEpwYVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsgLy8gVGFrZSB0aGUgZmlyc3QgcGVyc2lzdGVuY2VVbml0Ci0JCVN0cmluZyBwdU5hbWUgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpOwotCQlpZiggISB0aGlzLmRpc3BsYXlHZW5lcmF0aW5nRERMV2FybmluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUdlbmVyYXRlRERMV2l6YXJkIHdpemFyZCA9IG5ldyBHZW5lcmF0ZURETFdpemFyZCh0aGlzLnByb2plY3QpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWlmKHdpemFyZC5nZXRQYWdlQ291bnQoKSA+IDApIHsKLQkJCWludCByZXR1cm5Db2RlID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChyZXR1cm5Db2RlID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJV29ya3NwYWNlSm9iIGpvYiA9IHRoaXMuYnVpbGRHZW5lcmF0ZURETEpvYihwdU5hbWUsIHRoaXMucHJvamVjdCk7Ci0JCWpvYi5zY2hlZHVsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV29ya3NwYWNlSm9iIGJ1aWxkR2VuZXJhdGVERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGVERExKb2IocHVOYW1lLCBwcm9qZWN0KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTaGVsbCBnZXRDdXJyZW50U2hlbGwoKSB7Ci0JICAgIHJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5R2VuZXJhdGluZ0RETFdhcm5pbmcoKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUy5iaW5kKAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0RETFdhcm5pbmdNZXNzYWdlLAotCQkJQ1IsICBDUiArIENSKTsKLQkJCQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQl0aGlzLmdldEN1cnJlbnRTaGVsbCgpLCAKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5FY2xpcHNlTGlua0RETEdlbmVyYXRvclVpX2dlbmVyYXRpbmdERExXYXJuaW5nVGl0bGUsIAotCQkJbWVzc2FnZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW5jZSBVbml0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogcnVubmFibGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBHZW5lcmF0ZURETEpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHB1TmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IHByb2plY3Q7Ci0KLQkJcHVibGljIEdlbmVyYXRlRERMSm9iKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCkgewotCQkJc3VwZXIoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkVDTElQU0VMSU5LX0dFTkVSQVRFX1RBQkxFU19KT0IpOwotCQkJdGhpcy5wdU5hbWUgPSBwdU5hbWU7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRUNMSVBTRUxJTktfR0VORVJBVEVfVEFCTEVTX1RBU0ssIDEpOwotCQkJdHJ5IHsKLQkJCQl0aGlzLmRkbEdlbmVyYXRvckdlbmVyYXRlKHRoaXMucHVOYW1lLCB0aGlzLnByb2plY3QsIHNtLm5ld0NoaWxkKDEpKTsKLQkJCX0gCi0JCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7CQkJCQotCQkJCXRoaXMubG9nRXhjZXB0aW9uKHJlKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZGRsR2VuZXJhdG9yR2VuZXJhdGUoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUVjbGlwc2VMaW5rRERMR2VuZXJhdG9yLmdlbmVyYXRlKHB1TmFtZSwgcHJvamVjdCwgbW9uaXRvcik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBsb2dFeGNlcHRpb24oUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJU3RyaW5nIG1zZyA9IHJlLmdldE1lc3NhZ2UoKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gKG1zZyA9PSBudWxsKSA/IHJlLnRvU3RyaW5nKCkgOiBtc2c7Ci0JCQl0aGlzLmRpc3BsYXlFcnJvcihtZXNzYWdlKTsKLQkJCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKHJlKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQkJU1dUVXRpbC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaV9lcnJvciwKLQkJCQkJCW1lc3NhZ2UKLQkJCQkJKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJCVNoZWxsIHNoZWxsID0gKGRpc3BsYXkgPT0gbnVsbCkgPyBudWxsIDogZGlzcGxheS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJaWYgKHNoZWxsID09IG51bGwgJiYgZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJU2hlbGxbXSBzaGVsbHMgPSBkaXNwbGF5LmdldFNoZWxscygpOwotCQkJCWlmIChzaGVsbHMubGVuZ3RoID4gMCkKLQkJCQkJc2hlbGwgPSBzaGVsbHNbMF07Ci0JCQl9Ci0JCQlyZXR1cm4gc2hlbGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi93aXphcmRzL0dlbmVyYXRlRERMV2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RkbGdlbi93aXphcmRzL0dlbmVyYXRlRERMV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZWY5ZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZGxnZW4vd2l6YXJkcy9HZW5lcmF0ZURETFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2U7Ci0KLS8qKgotICogIEdlbmVyYXRlRERMV2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZURETFdpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSBkYlNldHRpbmdzUGFnZTsKLQotCXB1YmxpYyBHZW5lcmF0ZURETFdpemFyZChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkdlbmVyYXRlRERMV2l6YXJkX3RpdGxlKTsgCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlzdXBlci5hZGRQYWdlcygpOwotCQlpZiAodGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSA9PSBudWxsKSB7Ci0JCQl0aGlzLmRiU2V0dGluZ3NQYWdlID0gbmV3IERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSh0aGlzLmpwYVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMuZGJTZXR0aW5nc1BhZ2UpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiAodGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSAhPSBudWxsKTsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgICAgICByZXR1cm4gdGhpcy5kYlNldHRpbmdzUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLSAgICAKLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0YmZlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODRlZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4NGIwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfQ09OVEVOVCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTdhNTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17CQotCXByb3RlY3RlZCBBYnN0cmFjdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3MDMwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIEFsd2F5cyBSZWZyZXNoIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDYWNoaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3B0aW9uYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoTGFiZWwsCi0JCQlidWlsZEFsd2F5c1JlZnJlc2hIb2xkZXIoKSwKLQkJCWJ1aWxkQWx3YXlzUmVmcmVzaFN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX0FMV0FZU19SRUZSRVNICi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRBbHdheXNSZWZyZXNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQWx3YXlzUmVmcmVzaFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEFsd2F5c1JlZnJlc2hIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlX2Fsd2F5c1JlZnJlc2hMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0QWx3YXlzUmVmcmVzaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfQUxXQVlTX1JFRlJFU0hfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9BTFdBWVNfUkVGUkVTSF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNGUyOGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlNjFlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjFlZjBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVudW1UeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGVtcG9yYWxUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEJhc2ljTWFwcGluZz4gZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0KLQkJLy8gTm8gY29udmVydGVyCi0JCUJ1dHRvbiBub0NvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2RlZmF1bHQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKG51bGwpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCS8vIExvYgotCQlCdXR0b24gbG9iQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fbG9iLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihMb2JDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBsb2JCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0JCQotCQkKLQkJLy8gRW51bWVyYXRlZAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9lbnVtZXJhdGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKSwgCi0JCQludWxsKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKG5ldyBFbnVtVHlwZUNvbXBvc2l0ZShidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQotCQkvLyBFY2xpcHNlTGluayBDb252ZXJ0ZXIKLQkJQnV0dG9uIGVsQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9jb252ZXJ0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIGVsQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCi0JCVBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0Q29tcG9zaXRlID0gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua011dGFibGU+IGJ1aWxkTXV0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBFY2xpcHNlTGlua011dGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldE11dGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyA/IChFY2xpcHNlTGlua0NvbnZlcnQpIGNvbnZlcnRlciA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0Y2I1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvb3JkaW5hdGlvbiBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZT4gYWRkQ2FjaGVDb29yZGluYXRpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9DT09SRElOQVRJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZygKLQkJCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5jbGFzcywKLQkJCQkJRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUudGhpcywKLQkJCQkJdmFsdWUKLQkJCQkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWwsCi0JCQlhZGRDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21ibyhjb250YWluZXIpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX0NBQ0hFX0NPT1JESU5BVElPTl9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0MDk0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgU2l6ZTogICAgICAgICAgICAgIHwgSSAgICAgICAgIHxJfCAgRGVmYXVsdCAoWFhYKSAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVNpemVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRTaXplQ29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88RWNsaXBzZUxpbmtDYWNoaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hlU2l6ZUNvbXBvc2l0ZV9zaXplOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ly9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSVpFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkU2l6ZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkU2l6ZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhYjcyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2FjaGVUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBFY2xpcHNlTGlua0NhY2hlVHlwZT4gYWRkQ2FjaGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rQ2FjaGVUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ2FjaGVUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0VHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0NhY2hlVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoZVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDYWNoZVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2xhYmVsLAotCQkJYWRkQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19DQUNIRV9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGJjYzBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vU2hhcmVkIENoZWNrIGJveCwgdW5jaGVjayB0aGlzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGFuZWwgaXMgZGlzYWJsZWQKLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWwsCi0JCQlidWlsZFNwZWNpZmllZFNoYXJlZEhvbGRlcigpLAotCQkJYnVpbGRTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19TSEFSRUQKLQkJKTsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNik7Ci0KLQkJQ29sbGVjdGlvbjxQYW5lPD8+PiBwYW5lcyA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKLQkJCi0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlKHRoaXMsIHN1YlBhbmUpKTsKLQkJCi0JCS8vIEFkdmFuY2VkIHN1Yi1wYW5lCi0JCUNvbXBvc2l0ZSBhZHZhbmNlZFNlY3Rpb24gPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQlzdWJQYW5lLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfYWR2YW5jZWQsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShhZGRTdWJQYW5lKGFkdmFuY2VkU2VjdGlvbiwgMCwgMTYpLCBwYW5lcyk7Ci0JCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCksIHBhbmVzKTsKLQkJCi0JCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIENvbGxlY3Rpb248UGFuZTw/Pj4gcGFuZXMpIHsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCi0JCQkJRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9TSEFSRURfUFJPUEVSVFksIAotCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1NoYXJlZCgpKTsKLQkJCX0KLQkJfTsKLQl9CQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTcGVjaWZpZWRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFNoYXJlZCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFNoYXJlZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX1NIQVJFRF9QUk9QRVJUWSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNoYXJlZCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MjAwMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgCQkJICAJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDaGFuZ2UgVHJhY2tpbmcgOiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAJCQkJCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoIAotICAgICAgICAgICAgY29udGFpbmVyLAotICAgICAgICAgICAgYWRkTGFiZWwoIAotICAgICAgICAgICAgICAgICBjb250YWluZXIsIAotICAgICAgICAgICAgICAgICBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfbGFiZWwpLCAKLSAgICAgICAgICAgIGFkZENoYW5nZVRyYWNraW5nVHlwZUNvbWJvKGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpLCAKLSAgICAgICAgICAgIG51bGwgCi0gICAgICAgKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZywgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU+IGFkZENoYW5nZVRyYWNraW5nVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZywgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcuREVGQVVMVF9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nLlNQRUNJRklFRF9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTdlYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlZhbGlkYXRpbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ2xpZW50cyBjYW4gdXNlIHRoaXMgZGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciBmb3IgU2Vjb25kYXJ5VGFibGUgc2V0dGluZ3MuCi0gKiBVc2UgdGhlIGZvbGxvd2luZyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkOgotICogICAgIEBzZWUgI2dldFNlbGVjdGVkVGFibGUoKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkQ2F0YWxvZygpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRTY2hlbWEoKQotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdD4gewotCi0JLyoqCi0JICogd2hlbiBjcmVhdGluZyBhIG5ldyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgJ2NvbnZlcnNpb25WYWx1ZScgd2lsbCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWU7Ci0KLQlwcml2YXRlIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvYmplY3RUeXBlQ29udmVydGVyOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBjb252ZXJzaW9uIHZhbHVlCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKFNoZWxsIHBhcmVudCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIpIHsKLQkJdGhpcyhwYXJlbnQsb2JqZWN0VHlwZUNvbnZlcnRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgdG8gZWRpdCBhbiBleGlzdGluZyBjb252ZXJzaW9uIHZhbHVlCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKFNoZWxsIHBhcmVudCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9iamVjdFR5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvYmplY3RUeXBlQ29udmVydGVyOwotCQl0aGlzLmNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlTdHJpbmcgZGF0YVZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIG9iamVjdFZhbHVlID0gbnVsbDsKLQkJU2V0PFN0cmluZz4gZGF0YVZhbHVlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5vYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFWYWx1ZXMoKSwgdGhpcy5vYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFWYWx1ZXNTaXplKCkpOwotCQlpZiAoaXNFZGl0RGlhbG9nKCkpIHsKLQkJCWRhdGFWYWx1ZSA9IHRoaXMuY29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpOwotCQkJb2JqZWN0VmFsdWUgPSB0aGlzLmNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpOwotCQkJLy9yZW1vdmUgKnRoaXMqIGRhdGFWYWx1ZSwgZG9uJ3Qgd2FudCBhIGR1cGxpY2F0ZSBkYXRhIHZhbHVlIGVycm9yCi0JCQlkYXRhVmFsdWVzLnJlbW92ZShkYXRhVmFsdWUpOwotCQl9Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCgKLQkJCWRhdGFWYWx1ZSwgCi0JCQlvYmplY3RWYWx1ZSwgCi0JCQlkYXRhVmFsdWVzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmlzQWRkRGlhbG9nKCkpID8KLQkJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlCi0JCQkJCToKLQkJCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiAodGhpcy5pc0FkZERpYWxvZygpKSA/Ci0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGUKLQkJOgotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICh0aGlzLmlzQWRkRGlhbG9nKCkpID8KLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb24KLQkJOgotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlRGVzY3JpcHRpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSBwYW5lID0gKENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWRkRGlhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJzaW9uVmFsdWUgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VkaXREaWFsb2coKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNBZGREaWFsb2coKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGEgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYXRhVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0T2JqZWN0VmFsdWUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lIGV4dGVuZHMgRGlhbG9nUGFuZTxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0PiB7Ci0KLQkJcHJpdmF0ZSBUZXh0IGRhdGFWYWx1ZVRleHQ7Ci0JCXByaXZhdGUgVGV4dCBvYmplY3RWYWx1ZVRleHQ7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCXRoaXMuZGF0YVZhbHVlVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2RhdGFWYWx1ZSwKLQkJCQlidWlsZERhdGFWYWx1ZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQl0aGlzLm9iamVjdFZhbHVlVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX29iamVjdFZhbHVlLAotCQkJCWJ1aWxkT2JqZWN0VmFsdWVIb2xkZXIoKQotCQkJKTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFWYWx1ZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0LkRBVEFfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERhdGFWYWx1ZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldERhdGFWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE9iamVjdFZhbHVlSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3QuT0JKRUNUX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RWYWx1ZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE9iamVjdFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RBbGwoKSB7Ci0JCQl0aGlzLmRhdGFWYWx1ZVRleHQuc2VsZWN0QWxsKCk7Ci0JCQl0aGlzLm9iamVjdFZhbHVlVGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFmZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuTmV3TmFtZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYmplY3QgdXNlZCBieSB0aGUgPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBOZXdOYW1lRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotZmluYWwgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0Tm9kZQotewotCS8qKgotCSAqIFRoZSBpbml0aWFsIGRhdGFWYWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRhdGFWYWx1ZTsKLQkKLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBkYXRhIHZhbHVlcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGFWYWx1ZXM7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBvYmplY3RWYWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG9iamVjdFZhbHVlOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgZGF0YSB2YWx1ZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfVkFMVUVfUFJPUEVSVFkgPSAiZGF0YVZhbHVlIjsKLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgb2JqZWN0IHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUX1ZBTFVFX1BST1BFUlRZID0gIm9iamVjdFZhbHVlIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCi0JICogYmUgc3BlY2lmaWVkCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQotCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCi0JICovCi0JRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdChTdHJpbmcgZGF0YVZhbHVlLCBTdHJpbmcgb2JqZWN0VmFsdWUsIENvbGxlY3Rpb248U3RyaW5nPiBkYXRhVmFsdWVzKSB7Ci0JCXN1cGVyKG51bGwpOwotCi0JCXRoaXMuZGF0YVZhbHVlICA9IGRhdGFWYWx1ZTsKLQkJdGhpcy5vYmplY3RWYWx1ZSA9IG9iamVjdFZhbHVlOwotCQl0aGlzLmRhdGFWYWx1ZXMgPSBkYXRhVmFsdWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhVmFsdWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZGF0YVZhbHVlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZGF0YVZhbHVlcy5jb250YWlucyh0aGlzLmRhdGFWYWx1ZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVTdGF0ZU9iamVjdF9kYXRhVmFsdWVBbHJlYWR5RXhpc3RzLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkT2JqZWN0VmFsdWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMub2JqZWN0VmFsdWUpKSB7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3Rfb2JqZWN0VmFsdWVNdXN0QmVTcGVjaWZpZWQsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGREYXRhVmFsdWVQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZE9iamVjdFZhbHVlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCQkvL25vdCBwYXJlbnQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXREYXRhVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFWYWx1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0T2JqZWN0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm9iamVjdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFWYWx1ZShTdHJpbmcgZGF0YVZhbHVlKSB7Ci0JCVN0cmluZyBvbGREYXRhVmFsdWUgPSB0aGlzLmRhdGFWYWx1ZTsKLQkJdGhpcy5kYXRhVmFsdWUgPSBkYXRhVmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREFUQV9WQUxVRV9QUk9QRVJUWSwgb2xkRGF0YVZhbHVlLCBkYXRhVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9iamVjdFZhbHVlKFN0cmluZyBvYmplY3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkT2JqZWN0VmFsdWUgPSB0aGlzLm9iamVjdFZhbHVlOwotCQl0aGlzLm9iamVjdFZhbHVlID0gb2JqZWN0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoT0JKRUNUX1ZBTFVFX1BST1BFUlRZLCBvbGRPYmplY3RWYWx1ZSwgb2JqZWN0VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYxZjY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnQKLSAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4KLXsKLQotCS8qKgotCSAqIEEga2V5IHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQKLQkgKiB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIGEgY29tYm8gdG8gYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiBhbiBlbXB0eSBzdHJpbmcgd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2NvbnZlcnRlck5hbWVMYWJlbCwKLQkJCWJ1aWxkQ29udmVydE5hbWVMaXN0SG9sZGVyKCksCi0JCQlidWlsZENvbnZlcnROYW1lSG9sZGVyKCksCi0JCQlidWlsZE5hbWVDb252ZXJ0ZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQkJCi0JCUNvbXBvc2l0ZSBzdWJTZWN0aW9uID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmluZUNvbnZlcnRlclNlY3Rpb24sIAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKSk7Ci0JCQotCQkvLyBObyBDb252ZXJ0ZXIKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlzdWJTZWN0aW9uLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2RlZmF1bHQsIAotCQkJYnVpbGROb0NvbnZlcnRlckhvbGRlcigpLCAKLQkJCW51bGwpOwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIEN1c3RvbUNvbnZlcnRlcgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCXN1YlNlY3Rpb24sIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY3VzdG9tLCAKLQkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSwgCi0JCQludWxsKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgY29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoY29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCS8vIFR5cGUgQ29udmVydGVyCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJc3ViU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV90eXBlLCAKLQkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSB0eXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZShidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgc3ViU2VjdGlvbiwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSAoR3JpZERhdGEpIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUodHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0KLQkJLy8gT2JqZWN0IFR5cGUgQ29udmVydGVyCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJc3ViU2VjdGlvbiwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9vYmplY3RUeXBlLCAKLQkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZShidWlsZE9iamVjdFR5cGVDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgc3ViU2VjdGlvbiwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJZ3JpZERhdGEgPSAoR3JpZERhdGEpIG9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUob2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0KLQkJLy8gU3RydWN0IENvbnZlcnRlcgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCXN1YlNlY3Rpb24sIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfc3RydWN0LCAKLQkJCWJ1aWxkQ29udmVydGVySG9sZGVyKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzKSwgCi0JCQludWxsKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgc3RydWN0Q29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlKGJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIHN1YlNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBzdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5TUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSB0byBhbiBlbXB0eSBzdHJpbmcKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSkpIHsKLQkJCQkJdmFsdWUgPSAiIjsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkU29ydGVkQ29udmVydGVyTmFtZXNNb2RlbCgpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGxpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5ERUZBVUxUX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkTmFtZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpOwotCi0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7Ci0KLQkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQkJZGVmYXVsdE5hbWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVzZXJ2ZWRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KEVjbGlwc2VMaW5rQ29udmVydC5SRVNFUlZFRF9DT05WRVJURVJfTkFNRVMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNvcnRlZENvbnZlcnRlck5hbWVzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZENvbnZlcnRlck5hbWVzTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydGVyTmFtZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPigKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5DT05WRVJURVJTX0NPTExFQ1RJT04pLy9UT0RPIG5lZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgaW50ZXJmYWNlCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVbmlxdWVDb252ZXJ0ZXJOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCkgPT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUVjbGlwc2VMaW5rQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCQlib29sZWFuIHJlc3VsdCA9ICgoY29udmVydGVyICE9IG51bGwpICYmIChjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGNvbnZlcnRlclR5cGUpKTsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHJlc3VsdCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBFY2xpcHNlTGlua0NvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnQuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gYnVpbGRDdXN0b21Db252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3MpID8gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgPyAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIChjb252ZXJ0ZXIgIT0gbnVsbCAmJiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcykgPyAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gKGNvbnZlcnRlciAhPSBudWxsICYmIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpID8gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFY2xpcHNlTGlua0NvbnZlcnQgdmFsdWUpIHsKLQkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVjODRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydGVyCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnZlcnRlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBTdHJpbmc+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0ZXIuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gYWRkQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLkNPTlZFUlRFUl9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyQ2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldENvbnZlcnRlckNsYXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfY2xhc3NMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0Q29udmVydGVyQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFN1cGVySW50ZXJmYWNlTmFtZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuRUNMSVBTRUxJTktfQ09OVkVSVEVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHZhbHVlKSB7Ci0vLwkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotLy8JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotLy8JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFmNmY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ3VzdG9taXplcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DdXN0b21pemVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUKLQkJZXh0ZW5kcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8RWNsaXBzZUxpbmtDdXN0b21pemVyPgotCXsKLQkJcHVibGljIEN1c3RvbWl6ZXJDbGFzc0Nob29zZXJDb21ib1BhbmUoUGFuZTxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JCX0JCQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJcmV0dXJuIEVjbGlwc2VMaW5rQ3VzdG9taXplci5FQ0xJUFNFTElOS19ERVNDUklQVE9SX0NVU1RPTUlaRVJfQ0xBU1NfTkFNRTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDdXN0b21pemVyQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDdXN0b21pemVyLCBTdHJpbmc+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIuU1BFQ0lGSUVEX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFksCi0JCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXplci5ERUZBVUxUX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkpIHsKLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKTsKLQkJCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkgOiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZSA9PSBudWxsIAotCQkJCQkJCXx8IHZhbHVlLmxlbmd0aCgpID09IDAgCi0JCQkJCQkJfHwgdmFsdWUuZXF1YWxzKGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkpKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRleHQoRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2xhc3NOYW1lID0gY3VzdG9taXplci5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCk7Ci0JCQlyZXR1cm4gKGRlZmF1bHRDbGFzc05hbWUgPT0gbnVsbCkgPwotCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLk5vbmVTZWxlY3RlZAotCQkJCQk6IE5MUy5iaW5kKEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwgZGVmYXVsdENsYXNzTmFtZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0N1c3RvbWl6ZXIsIFN0cmluZz4oCi0JCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ3VzdG9taXplci5ERUZBVUxUX0NVU1RPTUlaRVJfQ0xBU1NfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gZGVmYXVsdFRleHQodGhpcy5zdWJqZWN0KTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzRkNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIERpc2FibGUgSGl0cyBvcHRpb24uCi0gKiAKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbCwKLQkJCWJ1aWxkRGlzYWJsZUhpdHNIb2xkZXIoKSwKLQkJCWJ1aWxkRGlzYWJsZUhpdHNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuQ0FDSElOR19ESVNBQkxFX0hJVFMKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2FibGVIaXRzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9ESVNBQkxFX0hJVFNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZERpc2FibGVIaXRzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGlzYWJsZUhpdHNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHREaXNhYmxlSGl0c0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGVfZGlzYWJsZUhpdHNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RGlzYWJsZUhpdHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuU1BFQ0lGSUVEX0RJU0FCTEVfSElUU19QUk9QRVJUWSwKLQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5ERUZBVUxUX0RJU0FCTEVfSElUU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGI2Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbWJlZGRhYmxlPiB7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgRW1iZWRkYWJsZT4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZAotCQkpOwotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBidWlsZEN1c3RvbWl6ZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUodGhpcywgYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IGJ1aWxkQ3VzdG9taXplckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkYWJsZSwgRWNsaXBzZUxpbmtDdXN0b21pemVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbWJlZGRhYmxlLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSB0aGlzLnN1YmplY3QpLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMjYyYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PiB7Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfYWR2YW5jZWQKLQkJKTsKLQkJCi0JCW5ldyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlKHRoaXMsIGJ1aWxkUmVhZE9ubHlIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZSh0aGlzLCBidWlsZEN1c3RvbWl6ZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUodGhpcywgYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1JlYWRPbmx5PiBidWlsZFJlYWRPbmx5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEVjbGlwc2VMaW5rUmVhZE9ubHk+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtSZWFkT25seSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eSkgdGhpcy5zdWJqZWN0KS5nZXRSZWFkT25seSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IGJ1aWxkQ3VzdG9taXplckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBFY2xpcHNlTGlua0N1c3RvbWl6ZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21pemVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZz4gYnVpbGRDaGFuZ2VUcmFja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZhZWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gRXhwaXJ5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vIGV4cGlyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAJCQkJCS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gVGltZSB0byBsaXZlIGV4cGlyeSAgIEV4cGlyZSBhZnRlciB8IEkgICAgICAgICAgfEl8IG1pbGxpc2Vjb25kcyAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAJCQkJICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgIHwgfAotICogfCB8IG8gRGFpbHkgZXhwaXJ5ICAgICAgICAgIEV4cGlyZSBhdCAgICB8IEhIOk1NOlNTOkFNL1BNIHxJfCAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBFY2xpcHNlTGlua1RpbWVPZkRheQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdHRsRW5hYmxlZDsKLQotCXB1YmxpYyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBsYXp5IGluaXQgYmVjYXVzZSB3ZSBuZWVkIGl0IHdoaWxlIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIGlzCi0JICogZXhlY3V0aW5nCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBnZXRUdGxFbmFibGVkKCkgewotCQlpZiAodGhpcy50dGxFbmFibGVkID09IG51bGwpIHsKLQkJCXRoaXMudHRsRW5hYmxlZCA9IHRoaXMuYnVpbGRUaW1lVG9MaXZlRXhwaXJ5RW5hYmxlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLnR0bEVuYWJsZWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIEV4cGlyeSBncm91cCBwYW5lCi0JCUdyb3VwIGV4cGlyeUdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9leHBpcnlTZWN0aW9uLAotCQkJMiwKLQkJCW51bGwKLQkJKTsKLQkJCQkKLQkJLy8gTm8gRXhwaXJ5IHJhZGlvIGJ1dHRvbgotCQlCdXR0b24gYnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQlleHBpcnlHcm91cFBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX25vRXhwaXJ5LAotCQkJYnVpbGROb0V4cGlyeUhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkKLQkJLy8gVGltZSBUbyBMaXZlIEV4cGlyeSByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlleHBpcnlHcm91cFBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnksCi0JCQlidWlsZEV4cGlyeUhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCQkKLQkJYWRkVGltZVRvTGl2ZUNvbXBvc2l0ZShleHBpcnlHcm91cFBhbmUpOwotCQkKLQkJLy8gRGFpbHkgRXhwaXJ5IHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWV4cGlyeUdyb3VwUGFuZSwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZGFpbHlFeHBpcnksCi0JCQlidWlsZFRpbWVPZkRheUV4cGlyeUJvb2xlYW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJCi0JCWFkZFRpbWVPZkRheUNvbXBvc2l0ZShleHBpcnlHcm91cFBhbmUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lVG9MaXZlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShwYXJlbnQsIDMsIDAsIDEwLCAwLCAwKTsKLQotCQlhZGRMYWJlbCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeUV4cGlyZUFmdGVyLAotCQkJdGhpcy5nZXRUdGxFbmFibGVkKCkKLQkJKTsKLQkKLQkJSW50ZWdlckNvbWJvPD8+IGNvbWJvID0gYWRkVGltZVRvTGl2ZUV4cGlyeUNvbWJvKGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJY29tYm8uZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkKLQkJYWRkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlNaWxsaXNlY29uZHMsCi0JCQl0aGlzLmdldFR0bEVuYWJsZWQoKQotCQkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRUaW1lT2ZEYXlDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMiwgMCwgMTAsIDAsIDApOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0b2RFbmFibGVkID0gdGhpcy5idWlsZFRpbWVPZkRheUV4cGlyeUVuYWJsZXIoKTsKLQkJYWRkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVPZkRheUV4cGlyeUV4cGlyZUF0LAotCQkJdG9kRW5hYmxlZAotCQkpOwotCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIgPSBidWlsZFRpbWVPZkRheUV4cGlyeUhvbGRlcigpOwotCQlhZGREYXRlVGltZSgKLQkJCWNvbnRhaW5lciwgCi0JCQlidWlsZFRpbWVPZkRheUV4cGlyeUhvdXJIb2xkZXIodGltZU9mRGF5RXhwaXJ5SG9sZGVyKSwgCi0JCQlidWlsZFRpbWVPZkRheUV4cGlyeU1pbnV0ZUhvbGRlcih0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpLAotCQkJYnVpbGRUaW1lT2ZEYXlFeHBpcnlTZWNvbmRIb2xkZXIodGltZU9mRGF5RXhwaXJ5SG9sZGVyKSwKLQkJCW51bGwsCi0JCQl0b2RFbmFibGVkCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0V4cGlyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBCb29sZWFuPigKLQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCAKLQkJCQkJRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSwgCi0JCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5KCkgPT0gbnVsbCAmJiB0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgPT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXhwaXJ5KG51bGwpOwotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCkgIT0gbnVsbCkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeHBpcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQm9vbGVhbj4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgCi0JCQkJCUVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5KCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCQlFY2xpcHNlTGlua0NhY2hpbmcuRVhQSVJZX1RJTUVfT0ZfREFZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldEV4cGlyeVRpbWVPZkRheSgpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIEludGVnZXJDb21ibzxFY2xpcHNlTGlua0NhY2hpbmc+IGFkZFRpbWVUb0xpdmVFeHBpcnlDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSW50ZWdlckNvbWJvPEVjbGlwc2VMaW5rQ2FjaGluZz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29tYm8gYWRkSW50ZWdlckNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCQlyZXR1cm4gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJCQkJY29udGFpbmVyLAotCQkJCQkJYnVpbGREZWZhdWx0TGlzdEhvbGRlcigpLAotCQkJCQkJYnVpbGRTZWxlY3RlZEl0ZW1TdHJpbmdIb2xkZXIoKSwKLQkJCQkJCVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxTdHJpbmc+aW5zdGFuY2UoKSwKLQkJCQkJCUVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlLnRoaXMuZ2V0VHRsRW5hYmxlZCgpCi0JCQkJCSk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCi0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKDApOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldEV4cGlyeSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVUb0xpdmVFeHBpcnlFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnkoKSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlFbmFibGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLkVYUElSWV9USU1FX09GX0RBWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRFeHBpcnlUaW1lT2ZEYXkoKSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUaW1lT2ZEYXk+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rVGltZU9mRGF5PihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ2FjaGluZy5FWFBJUllfVElNRV9PRl9EQVlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rVGltZU9mRGF5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFRpbWVPZkRheUV4cGlyeUhvdXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUaW1lT2ZEYXksIEludGVnZXI+KAotCQkJCQl0aW1lT2ZEYXlFeHBpcnlIb2xkZXIsIAotCQkJCQlFY2xpcHNlTGlua1RpbWVPZkRheS5IT1VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SG91cigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIGhvdXIpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SG91cihob3VyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVGltZU9mRGF5RXhwaXJ5TWludXRlSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1RpbWVPZkRheT4gdGltZU9mRGF5RXhwaXJ5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rVGltZU9mRGF5LCBJbnRlZ2VyPigKLQkJCQkJdGltZU9mRGF5RXhwaXJ5SG9sZGVyLCAKLQkJCQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkuTUlOVVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWludXRlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgbWludXRlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE1pbnV0ZShtaW51dGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRUaW1lT2ZEYXlFeHBpcnlTZWNvbmRIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVGltZU9mRGF5PiB0aW1lT2ZEYXlFeHBpcnlIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUaW1lT2ZEYXksIEludGVnZXI+KAotCQkJCQl0aW1lT2ZEYXlFeHBpcnlIb2xkZXIsIAotCQkJCQlFY2xpcHNlTGlua1RpbWVPZkRheS5TRUNPTkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZWNvbmQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciBzZWNvbmQpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2Vjb25kKHNlY29uZCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODY4ZDM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UZW1wb3JhbFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdElkTWFwcGluZ0NvbXBvc2l0ZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIobnVsbCksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0KLQkJLy8gRWNsaXBzZUxpbmsgQ29udmVydGVyCi0JCUJ1dHRvbiBlbENvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCVBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0Q29tcG9zaXRlID0gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnZlcnRDb21wb3NpdGUuZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMjA7Ci0JCXJlZ2lzdGVyU3ViUGFuZShjb252ZXJ0Q29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBhbmU8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZENvbnZlcnRDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydEhvbGRlciwgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZShjb252ZXJ0SG9sZGVyLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlciwgRWNsaXBzZUxpbmtDb252ZXJ0Pihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVydCB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MgPyAoRWNsaXBzZUxpbmtDb252ZXJ0KSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXV0YWJsZT4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua011dGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldE11dGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ4OGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEpvaW4gRmV0Y2g6ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBGZXRjaGFibGVNYXBwaW5nCi0gKiBAc2VlIEJhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIEphdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0pvaW5GZXRjaD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luRmV0Y2hDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtKb2luRmV0Y2g+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKCAKLSAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICBhZGRMYWJlbCggCi0gICAgICAgICAgICAgICAgIGNvbnRhaW5lciwgCi0gICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfbGFiZWwpLCAKLSAgICAgICAgICAgIGFkZEpvaW5GZXRjaFR5cGVDb21ibyhjb250YWluZXIpLmdldENvbnRyb2woKSwKLSAgICAgICAgICAgIG51bGwgCi0gICAgICAgKTsKLQl9Ci0JCi0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtKb2luRmV0Y2gsIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZT4gYWRkSm9pbkZldGNoVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8RWNsaXBzZUxpbmtKb2luRmV0Y2gsIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtKb2luRmV0Y2guVkFMVUVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoCi0JCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MsCi0JCQkJCUVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIG51bGxEaXNwbGF5U3RyaW5nKCkgewotCQkJCXJldHVybiBKcHRDb3JlTWVzc2FnZXMuTk9ORTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0VmFsdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0VmFsdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNkMTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiAKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8VCwgTWFueVRvTWFueVJlbGF0aW9uc2hpcD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYW55VG9NYW55TWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDJmOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nPiAKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxULCBNYW55VG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCQotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZGFjN2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE1hcHBlZFN1cGVyY2xhc3M+IHsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2FkdmFuY2VkCi0JCSk7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZSh0aGlzLCBidWlsZFJlYWRPbmx5SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0N1c3RvbWl6ZXJDb21wb3NpdGUodGhpcywgYnVpbGRDdXN0b21pemVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtSZWFkT25seT4gYnVpbGRSZWFkT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtSZWFkT25seT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1JlYWRPbmx5IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgdGhpcy5zdWJqZWN0KS5nZXRSZWFkT25seSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0N1c3RvbWl6ZXI+IGJ1aWxkQ3VzdG9taXplckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkU3VwZXJjbGFzcywgRWNsaXBzZUxpbmtDdXN0b21pemVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ3VzdG9taXplciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q3VzdG9taXplcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPiBidWlsZENoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwZWRTdXBlcmNsYXNzLCBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnN1YmplY3QpLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDJlMDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgTXV0YWJsZSBvcHRpb24uCi0gKgotICogQHNlZSBFY2xpcHNlTGlua011dGFibGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtNdXRhYmxlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TXV0YWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtNdXRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbCwKLQkJCWJ1aWxkTXV0YWJsZUhvbGRlcigpLAotCQkJYnVpbGRNdXRhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rTXV0YWJsZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua011dGFibGUuU1BFQ0lGSUVEX01VVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRNdXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTXV0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTXV0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE11dGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGVfbXV0YWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua011dGFibGUsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLlNQRUNJRklFRF9NVVRBQkxFX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtNdXRhYmxlLkRFRkFVTFRfTVVUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE11dGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMDNlNzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVUYWJsZVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGREYXRhVHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJYWRkT2JqZWN0VHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCWFkZENvbnZlcnNpb25WYWx1ZXNUYWJsZShjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGVmYXVsdE9iamVjdFZhbHVlTGFiZWwsCi0JCQlidWlsZERlZmF1bHRPYmplY3RWYWx1ZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlSG9sZGVyKCksCi0JCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYWRkRGF0YVR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLkRBVEFfVFlQRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0RGF0YVR5cGUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERhdGFUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2RhdGFUeXBlTGFiZWw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldERhdGFUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBhZGRPYmplY3RUeXBlQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5PQkpFQ1RfVFlQRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0T2JqZWN0VHlwZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRPYmplY3RUeXBlKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRPYmplY3RUeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX29iamVjdFR5cGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0T2JqZWN0VHlwZShjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgZ2V0VHlwZURpYWxvZ1N0eWxlKCkgewotCQkJCXJldHVybiBJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFU19BTkRfRU5VTVM7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVyc2lvblZhbHVlc1RhYmxlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCS8vIEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGNvbnZlcnNpb25WYWx1ZXNHcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNHcm91cFRpdGxlCi0JCSk7Ci0KLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnZlcnNpb25WYWx1ZUhvbGRlciA9Ci0JCQlidWlsZENvbnZlcnNpb25WYWx1ZUhvbGRlcigpOwotCQkvLyBDb252ZXJzaW9uIFZhbHVlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlVGFibGVQYW5lPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oCi0JCQl0aGlzLAotCQkJY29udmVyc2lvblZhbHVlc0dyb3VwUGFuZSwKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpLAotCQkJY29udmVyc2lvblZhbHVlSG9sZGVyLAotCQkJYnVpbGRDb252ZXJzaW9uVmFsdWVzTGFiZWxQcm92aWRlcigpLAotCQkJbnVsbC8vVE9ETyBuZWVkIGEgaGVscCBjb250ZXh0IGlkIGZvciB0aGlzCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQkJCXJldHVybiBuZXcgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlcigpOwotCQkJfQotCQl9OwotCi0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBidWlsZENvbnZlcnNpb25WYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRDb252ZXJzaW9uVmFsdWVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGRpYWxvZyA9IGJ1aWxkQ29udmVyc2lvblZhbHVlRGlhbG9nRm9yQWRkKCk7Ci0JCQkJYWRkQ29udmVyc2lvblZhbHVlRnJvbURpYWxvZyhkaWFsb2csIGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZUVkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IChFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSkgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2cgPSBuZXcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2coZ2V0U2hlbGwoKSwgZ2V0U3ViamVjdCgpLCBjb252ZXJzaW9uVmFsdWUpOwotCQkJCWVkaXRDb252ZXJzaW9uVmFsdWVGcm9tRGlhbG9nKGRpYWxvZywgY29udmVyc2lvblZhbHVlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGdldFN1YmplY3QoKTsKLQkJCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nIGJ1aWxkQ29udmVyc2lvblZhbHVlRGlhbG9nRm9yQWRkKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nKGdldFNoZWxsKCksIGdldFN1YmplY3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udmVyc2lvblZhbHVlRnJvbURpYWxvZyhFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZyBkaWFsb2csIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRDb252ZXJzaW9uVmFsdWUoKTsKLQkJY29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZShkaWFsb2cuZ2V0RGF0YVZhbHVlKCkpOwotCQljb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoZGlhbG9nLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNvbnZlcnNpb25WYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdENvbnZlcnNpb25WYWx1ZUZyb21EaWFsb2coRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2cgZGlhbG9nLCBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKGRpYWxvZy5nZXREYXRhVmFsdWUoKSk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZShkaWFsb2cuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+KGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RIb2xkZXIoKSwgCi0JCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5EQVRBX1ZBTFVFX1BST1BFUlRZLAotCQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUuT0JKRUNUX1ZBTFVFX1BST1BFUlRZKTsKLQl9CQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gYnVpbGRDb252ZXJzaW9uVmFsdWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5DT05WRVJTSU9OX1ZBTFVFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNvbnZlcnNpb25WYWx1ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkQ29udmVyc2lvblZhbHVlc0xhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlLCBTdHJpbmc+KGJ1aWxkQ29udmVyc2lvblZhbHVlc0xpc3RNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtSXRlbShFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUpIHsKLQkJCQlyZXR1cm4gY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE9iamVjdFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuREVGQVVMVF9PQkpFQ1RfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0RGVmYXVsdE9iamVjdFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkKLQkJCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IChFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSkgZWxlbWVudDsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQkKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIENvbnZlcnNpb25WYWx1ZUNvbHVtbkFkYXB0ZXIuREFUQV9WQUxVRV9DT0xVTU46IHsKLQkJCQkJdmFsdWUgPSBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQotCQkJCWNhc2UgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlci5PQkpFQ1RfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXZhbHVlID0gY29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSAyOwotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRBX1ZBTFVFX0NPTFVNTiA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9CSkVDVF9WQUxVRV9DT0xVTU4gPSAxOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFWYWx1ZUhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5EQVRBX1ZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRPYmplY3RWYWx1ZUhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSwgU3RyaW5nPihFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZS5PQkpFQ1RfVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9iamVjdFZhbHVlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0T2JqZWN0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltDT0xVTU5fQ09VTlRdOwotCQkJLy9ob2xkZXJzW1NFTEVDVElPTl9DT0xVTU5dID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCQlob2xkZXJzW0RBVEFfVkFMVUVfQ09MVU1OXSAgICAgID0gYnVpbGREYXRhVmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW09CSkVDVF9WQUxVRV9DT0xVTU5dICAgICA9IGJ1aWxkT2JqZWN0VmFsdWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlyZXR1cm4gaG9sZGVyczsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29sdW1uQ291bnQoKSB7Ci0JCQlyZXR1cm4gQ09MVU1OX0NPVU5UOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCi0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBDb252ZXJzaW9uVmFsdWVDb2x1bW5BZGFwdGVyLkRBVEFfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzRGF0YVZhbHVlQ29sdW1uOwotCQkJCX0KLQotCQkJCWNhc2UgQ29udmVyc2lvblZhbHVlQ29sdW1uQWRhcHRlci5PQkpFQ1RfVkFMVUVfQ09MVU1OOiB7Ci0JCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9jb252ZXJzaW9uVmFsdWVzT2JqZWN0VmFsdWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2I5ZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lIAotCWV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcD4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pbkNvbHVtbkpvaW5pbmdMYWJlbCwKLQkJCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLgotCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbCwKLQkJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmYyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb09uZU1hcHBpbmcKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIE9yZGVyaW5nQ29tcG9zaXRlCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPiAKLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxULCBFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcD4KLSAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZWxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE2NGMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8VCwgT25lVG9PbmVSZWxhdGlvbnNoaXA+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VsaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKXRoaXMuc3ViamVjdCkuZ2V0Sm9pbkZldGNoKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQcml2YXRlT3duZWQ+IGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKXRoaXMuc3ViamVjdCkuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmM5NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tcG9zaXRlIHNpbXBseSBzaG93cyB0aGUgTG9iIGNoZWNrIGJveC4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJpdmF0ZU93bmVkQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkLCBCb29sZWFuPiBidWlsZFByaXZhdGVPd25lZEhvbGRlcigpIHsKLQotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1ByaXZhdGVPd25lZCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZC5QUklWQVRFX09XTkVEX1BST1BFUlRZKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UHJpdmF0ZU93bmVkKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlX3ByaXZhdGVPd25lZExhYmVsLAotCQkJYnVpbGRQcml2YXRlT3duZWRIb2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0MWZjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIHRoZSBSZWFkIE9ubHkgY2hlY2sgYm94LgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtSZWFkT25seQotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtSZWFkT25seT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlJlYWRPbmx5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtSZWFkT25seT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyByZWFkLW9ubHkgY2hlY2sgYm94Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsLAotCQkJYnVpbGRTcGVjaWZpZWRSZWFkT25seUhvbGRlcigpLAotCQkJYnVpbGRSZWFkT25seVN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU3BlY2lmaWVkUmVhZE9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUmVhZE9ubHksIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtSZWFkT25seS5TUEVDSUZJRURfUkVBRF9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWFkT25seSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlYWRPbmx5U3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0UmVhZE9ubHlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rUmVhZE9ubHlDb21wb3NpdGVfcmVhZE9ubHlXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRSZWFkT25seUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtSZWFkT25seSwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LlNQRUNJRklFRF9SRUFEX09OTFlfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua1JlYWRPbmx5LkRFRkFVTFRfUkVBRF9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGEyNjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbXBvc2l0ZSBzaW1wbHkgc2hvd3MgYSB0cmktc3RhdGUgY2hlY2sgYm94IGZvciB0aGUgUmVmcmVzaCBPbmx5IElmIE5ld2VyIG9wdGlvbi4KLSAqIAotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbCwKLQkJCWJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCksCi0JCQlidWlsZFJlZnJlc2hPbmx5SWZOZXdlclN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5DQUNISU5HX1JFRlJFU0hfT05MWV9JRl9ORVdFUgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZyZXNoT25seUlmTmV3ZXJTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlckhvbGRlcigpKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZV9yZWZyZXNoT25seUlmTmV3ZXJMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtDYWNoaW5nLlNQRUNJRklFRF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFksCi0JCQlFY2xpcHNlTGlua0NhY2hpbmcuREVGQVVMVF9SRUZSRVNIX09OTFlfSUZfTkVXRVJfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTM2MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtDb252ZXJ0ZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RydWN0Q29udmVydGVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlhZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwgCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyQ29tcG9zaXRlX25hbWVUZXh0TGFiZWwsIAotCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKLQkJCi0JCWFkZENsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCQkKLQkJbmV3IFBhbmVFbmFibGVyKGJ1aWxkQm9vbGVhbkhvbGRlcigpLCB0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIsIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBhZGRDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuQ09OVkVSVEVSX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDbGFzcygpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDb252ZXJ0ZXJDbGFzcyh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRDb252ZXJ0ZXJDbGFzcyhjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5FQ0xJUFNFTElOS19TVFJVQ1RfQ09OVkVSVEVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiMzhhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTIwOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlcgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlR5cGVDb252ZXJ0ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsIAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLCAKLQkJCWJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0JCQotCQlhZGREYXRhVHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJYWRkT2JqZWN0VHlwZUNob29zZXIoY29udGFpbmVyKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciwgU3RyaW5nPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkKLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBhZGREYXRhVHlwZUNob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuREFUQV9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREYXRhVHlwZSgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREYXRhVHlwZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGF0YVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGF0YVR5cGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0RGF0YVR5cGUoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IGFkZE9iamVjdFR5cGVDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLk9CSkVDVF9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldE9iamVjdFR5cGUodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE9iamVjdFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGVfb2JqZWN0VHlwZUxhYmVsOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRPYmplY3RUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGNoYXIgZ2V0RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL0VjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI2OGVkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFRoZSBsb2NhbGl6ZWQgc3RyaW5ncyB1c2VkIGJ5IHRoZSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9mdWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfc29mdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZV9zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGVfaGFyZF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX2NhY2hlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9hZHZhbmNlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlX3NpemU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGVfc2VuZF9vYmplY3RfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9pbnZhbGlkYXRlX2NoYW5nZWRfb2JqZWN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9zZW5kX25ld19vYmplY3RzX3dpdGhfY2hhbmdlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZV9ub25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX3NoYXJlZExhYmVsRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGVfc2hhcmVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlX2FkdmFuY2VkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZV9hbHdheXNSZWZyZXNoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGVfYWx3YXlzUmVmcmVzaExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlX3JlZnJlc2hPbmx5SWZOZXdlckRlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGVfcmVmcmVzaE9ubHlJZk5ld2VyTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZV9kaXNhYmxlSGl0c0xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9vYmplY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZV9kZWZlcnJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlX2F1dG87Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0Q29tcG9zaXRlX2NvbnZlcnRlck5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfZGVmaW5lQ29udmVydGVyU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGVfY3VzdG9tOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV90eXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9vYmplY3RUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9zdHJ1Y3Q7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb21wb3NpdGVfbmFtZVRleHRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfc3RydWN0Q29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ3VzdG9taXplckNvbXBvc2l0ZV9jbGFzc0xhYmVsOwotCQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlU2VjdGlvbl9jb252ZXJ0ZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19jYWNoZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfZXhpc3RlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9ub25fZXhpc3RlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGVfY2hlY2tfY2FjaGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9jaGVja19kYXRhYmFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2Fzc3VtZV9leGlzdGVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZV9hc3N1bWVfbm9uX2V4aXN0ZW5jZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZV9leHBpcnlTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX25vRXhwaXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZVRvTGl2ZUV4cGlyeUV4cGlyZUFmdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rRXhwaXJ5Q29tcG9zaXRlX3RpbWVUb0xpdmVFeHBpcnlNaWxsaXNlY29uZHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfZGFpbHlFeHBpcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGVfdGltZU9mRGF5RXhwaXJ5RXhwaXJlQXQ7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfaW5uZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGVfb3V0ZXI7CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZV9tdXRhYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX211dGFibGVMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX3RydWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlX2ZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kYXRhVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZUVkaXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNEYXRhVmFsdWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNPYmplY3RWYWx1ZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGVfZGVmYXVsdE9iamVjdFZhbHVlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlX2NvbnZlcnNpb25WYWx1ZXNHcm91cFRpdGxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19lZGl0Q29udmVyc2lvblZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2FkZENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfYWRkQ29udmVyc2lvblZhbHVlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVEaWFsb2dfZWRpdENvbnZlcnNpb25WYWx1ZURlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlRGlhbG9nX2RhdGFWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZURpYWxvZ19vYmplY3RWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X2RhdGFWYWx1ZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZVN0YXRlT2JqZWN0X29iamVjdFZhbHVlTXVzdEJlU3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlU3RhdGVPYmplY3RfZGF0YVZhbHVlQWxyZWFkeUV4aXN0czsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZV9wcml2YXRlT3duZWRMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua1JlYWRPbmx5Q29tcG9zaXRlX3JlYWRPbmx5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtSZWFkT25seUNvbXBvc2l0ZV9yZWFkT25seVdpdGhEZWZhdWx0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9kYXRhVHlwZUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZV9vYmplY3RUeXBlTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2FkZENvbnZlcnRlckRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2dfYWRkQ29udmVydGVyRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQ7Ci0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcygiZWNsaXBzZWxpbmtfdWlfZGV0YWlscyIsIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDkxNGVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQwYjBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UZW1wb3JhbFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE11dGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKLSAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIobnVsbCksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0KLQkJLy8gRWNsaXBzZUxpbmsgQ29udmVydGVyCi0JCUJ1dHRvbiBlbENvbnZlcnRlckJ1dHRvbiA9IGFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fY29udmVydGVkLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBlbENvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQotCQlQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gY29udmVydENvbXBvc2l0ZSA9IGJ1aWxkQ29udmVydENvbXBvc2l0ZShidWlsZEVjbGlwc2VMaW5rQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lcik7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gKEdyaWREYXRhKSBjb252ZXJ0Q29tcG9zaXRlLmdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDIwOwotCQlyZWdpc3RlclN1YlBhbmUoY29udmVydENvbXBvc2l0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4gYnVpbGRDb252ZXJ0Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGNvbnZlcnRIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0NvbnZlcnRDb21wb3NpdGUoY29udmVydEhvbGRlciwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpOwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFY2xpcHNlTGlua0NvbnZlcnQ+KGNvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0IHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiAoY29udmVydGVyICE9IG51bGwgJiYgY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpID8gKEVjbGlwc2VMaW5rQ29udmVydCkgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbENvbnZlcnRlcj4gYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIFRlbXBvcmFsQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IFRlbXBvcmFsQ29udmVydGVyLmNsYXNzID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rTXV0YWJsZT4gYnVpbGRNdXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBFY2xpcHNlTGlua011dGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtNdXRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHRoaXMuc3ViamVjdCkuZ2V0TXV0YWJsZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDc5MjM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VtYmVkZGFibGVBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBFbWJlZGRhYmxlCi0gKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxKYXZhRW1iZWRkYWJsZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzCi0JCSk7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIHRoaXMuYnVpbGRDb252ZXJ0ZXJIb2xkZXJWYWx1ZU1vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9CQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbWJlZGRhYmxlQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MmVkYjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW50aXR5QWR2YW5jZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU8VCBleHRlbmRzIEphdmFFbnRpdHk+Ci0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nKTsKLQkJaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRDYWNoaW5nSG9sZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUodGhpcywgY2FjaGluZ0hvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NhY2hpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9CQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg2NzM0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9BYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwLCBGb3JtIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0FkdmFuY2VkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBNYXBwZWQgU3VwZXJjbGFzcy4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8SmF2YU1hcHBlZFN1cGVyY2xhc3M+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7CQkKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENhY2hpbmdIb2xkZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NvbnZlcnRlcnMpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ29udmVydGVySG9sZGVyVmFsdWVNb2RlbCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBidWlsZENvbnZlcnRlckhvbGRlclZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFNYXBwZWRTdXBlcmNsYXNzLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHRoaXMuc3ViamVjdCkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQl9CQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI4ZGRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YU9uZVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXREZWZhdWx0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk4NThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRGVmYXVsdEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0RGVmYXVsdEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTRiMjYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0S2V5KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9CQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSlBBX0NPTlRFTlQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyZWIzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLk51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9FY2xpcHNlTGlua0phdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWJlOTVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeSBleHRlbmRzIEJhc2VKYXZhVWlGYWN0b3J5Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSBhdHRyaWJ1dGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTVkY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5MjJjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTUxNGNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcyXzAKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmIzM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgWCBDdXN0b21Db252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBYIFR5cGUgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IFggT2plY3QgVHlwZSBDb252ZXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgWCBTdHJ1Y3QgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBTdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udmVyc2lvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVDb252ZXJ0ZXJQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udmVydGVyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIEN1c3RvbSBDb252ZXJ0ZXIgY2hlY2sgYm94Ci0JCUJ1dHRvbiBjdXN0b21Db252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfY3VzdG9tQ29udmVydGVyLAotCQkJYnVpbGRDdXN0b21Db252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlIGN1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgY3VzdG9tQ29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUoY3VzdG9tQ29udmVydGVyQ29tcG9zaXRlKTsKLQkKLQkJCi0JCS8vIFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAotCQlCdXR0b24gdHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV90eXBlQ29udmVydGVyLAotCQkJYnVpbGRUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIFR5cGUgQ29udmVydGVyIHBhbmUKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlIHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgPSBuZXcgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQ29tcG9zaXRlKAotCQkJYnVpbGRUeXBlQ29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgdHlwZUNvbnZlcnRlckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNiksCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHR5cGVDb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJLy8gT2JqZWN0IFR5cGUgQ29udmVydGVyIGNoZWNrIGJveAotCQlCdXR0b24gb2JqZWN0VHlwZUNvbnZlcnRlckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSksCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9vYmplY3RUeXBlQ29udmVydGVyLAotCQkJYnVpbGRPYmplY3RUeXBlQ29udmVydGVyQm9vbGVhbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIE9iamVjdCBUeXBlIENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSBvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIG9iamVjdFR5cGVDb252ZXJ0ZXJDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpLAotCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShvYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlKTsKLQkJCi0JCS8vIFN0cnVjdCBDb252ZXJ0ZXIgY2hlY2sgYm94Ci0JCUJ1dHRvbiBzdHJ1Y3RDb252ZXJ0ZXJDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfc3RydWN0Q29udmVydGVyLAotCQkJYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gU3RydWN0IENvbnZlcnRlciBwYW5lCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlIHN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKCksCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgc3RydWN0Q29udmVydGVyQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUoc3RydWN0Q29udmVydGVyQ29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEN1c3RvbUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuQ1VTVE9NX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRDdXN0b21Db252ZXJ0ZXIoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRDdXN0b21Db252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0Q3VzdG9tQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZUN1c3RvbUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5DVVNUT01fQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEN1c3RvbUNvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuVFlQRV9DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRUeXBlQ29udmVydGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlVHlwZUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5UWVBFX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gYnVpbGRPYmplY3RUeXBlQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLlNUUlVDVF9DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U3RydWN0Q29udmVydGVyKCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkU3RydWN0Q29udmVydGVyKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFN0cnVjdENvbnZlcnRlcigpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuU1RSVUNUX0NPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNTMwYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjRhYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgZW50aXR5LgotICoKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0N2NjOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgeCBFeGlzdGVuY2UgQ2hlY2tpbmc6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoIAotICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgIGFkZENoZWNrQm94KCAKLSAgICAgICAgICAgICAgICAgY29udGFpbmVyLCAKLSAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsLCAKLSAgICAgICAgICAgICAgICAgYnVpbGRFeGlzdGVuY2VDaGVja2luZ0hvbGRlcigpLCAKLSAgICAgICAgICAgICAgICAgbnVsbCAKLSAgICAgICAgICAgICksIAotICAgICAgICAgICAgYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksIAotICAgICAgICAgICAgbnVsbCAKLSAgICAgICApOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4gYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS50aGlzLAotCQkJCQl2YWx1ZQotCQkJCSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRXhpc3RlbmNlQ2hlY2tpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFY2xpcHNlTGlua0NhY2hpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSmF2YUVjbGlwc2VMaW5rQ2FjaGluZy5FWElTVEVOQ0VfQ0hFQ0tJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGlzdGVuY2VDaGVja2luZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2IwYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rIEphdmEgTWFwcGVkIFN1cGVyY2xhc3MuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgRWNsaXBzZWxpbmtKcGFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODM1MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWVkMzNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2UwMWQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBhY2thZ2VDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb252ZXJ0ZXJzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QYWNrYWdlQ2hvb3NlcgotICogQHNlZSBPcm1RdWVyaWVzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplRW50aXR5TWFwcGluZ3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTQxODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0VudGl0eUFkdmFuY2VkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jYWNoaW5nKTsKLQkJaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRDYWNoaW5nSG9sZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1FY2xpcHNlTGlua0NhY2hpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckNvbnRhaW5lck1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBidWlsZENvbnZlcnRlckNvbnRhaW5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1FbnRpdHksIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSB0aGlzLnN1YmplY3QpLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtFbnRpdHlBZHZhbmNlZENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhYmM4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NBZHZhbmNlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSmF2YUNsYXNzQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzPiAKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUPiAKLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua1R5cGVNYXBwaW5nQ29tcG9zaXRlX2NhY2hpbmcpOwotCQl0aGlzLmluaXRpYWxpemVDYWNoaW5nU2VjdGlvbihjb250YWluZXIsIGJ1aWxkQ2FjaGluZ0hvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGNhY2hpbmdIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSh0aGlzLCBjYWNoaW5nSG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBPcm1FY2xpcHNlTGlua0NhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgT3JtRWNsaXBzZUxpbmtDYWNoaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybUVjbGlwc2VMaW5rQ2FjaGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtUeXBlTWFwcGluZ0NvbXBvc2l0ZV9jb252ZXJ0ZXJzKTsKLQkJdGhpcy5pbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCBidWlsZENvbnZlcnRlckNvbnRhaW5lck1vZGVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZSh0aGlzLCBjb252ZXJ0ZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPiBidWlsZENvbnZlcnRlckNvbnRhaW5lck1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQWR2YW5jZWRDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlOTM4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Jhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5CYXNlT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSBleHRlbmRzIEJhc2VPcm1YbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlOTE0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuVmFsaWRhdGluZ0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nCi0JZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+Ci17Ci0JLyoqCi0JICogVGhlIGFzc29jaWF0ZWQgcGVyc2lzdGVuY2UgdW5pdAotCSAqLwotCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBVbml0OwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGVkaXQgYW4gZXhpc3RpbmcgY29udmVyc2lvbiB2YWx1ZQotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyhTaGVsbCBwYXJlbnQsIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucFVuaXQgPSBwVW5pdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QocFVuaXQpOwotCX0KLQotCS8vICoqKioqKioqKiogb3BlbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JCXNoZWxsLnNldFRleHQodGhpcy5nZXRUaXRsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvblRpdGxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19hZGRDb252ZXJ0ZXJEZXNjcmlwdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQotCQlDb252ZXJzaW9uVmFsdWVEaWFsb2dQYW5lIHBhbmUgPSAoQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZSkgZ2V0UGFuZSgpOwotCQlwYW5lLnNlbGVjdEFsbCgpOwotCi0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZChmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHZhbHVlIHNldCBpbiB0aGUgdGV4dCB3aWRnZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q29udmVydGVyVHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIENvbnZlcnNpb25WYWx1ZURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQkJQ29udmVyc2lvblZhbHVlRGlhbG9nUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZy50aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCXRoaXMubmFtZVRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZ19uYW1lLAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nX2NvbnZlcnRlclR5cGUsIAotCQkJCWJ1aWxkQ29udmVydGVyVHlwZUxpc3RIb2xkZXIoKSwgCi0JCQkJYnVpbGRDb252ZXJ0ZXJUeXBlSG9sZGVyKCksIAotCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8Q2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4gYnVpbGRDb252ZXJ0ZXJUeXBlTGlzdEhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8Q2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4oRWNsaXBzZUxpbmtDb252ZXJ0ZXIuVFlQRVMpOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+PiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4gdmFsdWUpIHsKLQkJCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJCWlmICh2YWx1ZSA9PSBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX2N1c3RvbUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGVfb2JqZWN0VHlwZUNvbnZlcnRlcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJCXJldHVybiBFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZV9zdHJ1Y3RDb252ZXJ0ZXI7Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbHVlID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlX3R5cGVDb252ZXJ0ZXI7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlLmdldFNpbXBsZU5hbWUoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+IGJ1aWxkQ29udmVydGVyVHlwZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVyU3RhdGVPYmplY3QsIENsYXNzPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4+KGdldFN1YmplY3RIb2xkZXIoKSwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5DT05WRVJURVJfVFlQRV9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlclR5cGUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyVHlwZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5uYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWY0YzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5FY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZzwvY29kZT4sIHdoaWNoIHN0b3JlcwotICogdGhlIGN1cnJlbnQgbmFtZSBhbmQgdmFsaWRhdGVzIGl0IHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gKgotICogQHNlZSBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1maW5hbCBjbGFzcyBFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBjb252ZXJ0ZXJUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQkKLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBwZXJzaXN0ZW5jZSB1bml0Ci0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwVW5pdDsKLQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBkYXRhIHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBvYmplY3QgdmFsdWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfVFlQRV9QUk9QRVJUWSA9ICJjb252ZXJ0ZXJUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlFY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0KEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBVbml0KSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnBVbml0ID0gcFVuaXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5hbWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXMuRWNsaXBzZUxpbmtDb252ZXJ0ZXJTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSk7Ci0JCX0gCi0JCWVsc2UgaWYgKG5hbWVzKCkuY29udGFpbnModGhpcy5uYW1lKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X25hbWVFeGlzdHMsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORykpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnZlcnRlclR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlclR5cGUgPT0gbnVsbCkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0NvbnZlcnRlclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGROYW1lUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGRDb252ZXJ0ZXJUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBuYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVydGVyPiBjb252ZXJ0ZXJzID0gdGhpcy5wVW5pdC5hbGxDb252ZXJ0ZXJzKCk7IGNvbnZlcnRlcnMuaGFzTmV4dCgpOyl7Ci0JCQlTdHJpbmcgbmFtZSA9IGNvbnZlcnRlcnMubmV4dCgpLmdldE5hbWUoKTsKLQkJCW5hbWVzLmFkZChuYW1lKTsKLQkJfQotCQlyZXR1cm4gbmFtZXMgOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCQkvL25vIHBhcmVudAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXJUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyVHlwZShDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IG5ld0NvbnZlcnRlclR5cGUpIHsKLQkJQ2xhc3M8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPiBvbGRDb252ZXJ0ZXJUeXBlID0gdGhpcy5jb252ZXJ0ZXJUeXBlOwotCQl0aGlzLmNvbnZlcnRlclR5cGUgPSBuZXdDb252ZXJ0ZXJUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9UWVBFX1BST1BFUlRZLCBvbGRDb252ZXJ0ZXJUeXBlLCBuZXdDb252ZXJ0ZXJUeXBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTM5NDQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QYWNrYWdlQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVBhY2thZ2VDaG9vc2VyCi0gKiBAc2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUKLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYwYmYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUge0BsaW5rIEpwYURldGFpbHNQYWdlfQotICogd2hlbiB0aGUgaW5mb3JtYXRpb24gY29tZXMgZnJvbSB0aGUgWE1MIGZpbGUgKGVpdGhlciBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotICogY29uZmlndXJhdGlvbiBvciBmcm9tIHRoZSBNYXBwaW5ncyBEZXNjcmlwdG9yKS4KLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFKQotCQkJCXx8IHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUpCi0JCQkJfHwgcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjJhYTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmUzMDBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkKLXsKLQkvL25vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGQ3ZWI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMWJlNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YTI1ZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vL1JlbW92ZSB0aGUgQ29udmVydGVycyBzZWN0aW9uIGZyb20gMS4wIG9ybSBiYXNpYyBtYXBwaW5ncy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZTxCYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgYWRkU3ViUGFuZShjb250YWluZXIsIDQpKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvL2V2ZXJ5dGhpbmcgYnV0IHRoZSAnRGVmaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZGQyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxPcm1FY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZmE4MjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY0xpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ29udmVydGVyOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ29udmVydAotICogQHNlZSBFY2xpcHNlTGlua0Jhc2ljTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLQotLy9SZW1vdmVzIHRoZSBEZWZpbmUgQ29udmVydGVycyBzZWN0aW9uIGZyb20gb3JtIGJhc2ljLCBpZCwgdmVyc2lvbiBtYXBwaW5nLgotLy9UaGlzIGlzIHN1cHBvcnRlZCBpbiBFY2xpcHNlTGluayBpbiB2ZXJzaW9uIDEuMSwgYnV0IG5vdCAxLjAKLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnQxXzBDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ29udmVydD4KLXsKLQotCS8qKgotCSAqIEEga2V5IHVzZWQgdG8gcmVwcmVzZW50IHRoZSBkZWZhdWx0IHZhbHVlLCB0aGlzIGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQKLQkgKiB0aGUgc2VsZWN0ZWQgaXRlbSBmcm9tIGEgY29tYm8gdG8gPGNvZGU+bnVsbDwvY29kZT4uIFRoaXMga2V5IGlzIG1vc3QKLQkgKiBsaWtlbHkgbmV2ZXIgdHlwZWQgdGhlIHVzZXIgYW5kIGl0IHdpbGwgaGVscCB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0bwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQncyB0aW1lIHRvIHNldCB0aGUgbmV3IHNlbGVjdGVkIHZhbHVlIGludG8gdGhlCi0JICogbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9LRVkgPSAiPyEjIT8jPyM/ZGVmYXVsdD8jPyEjPyEjPyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ29udmVydENvbXBvc2l0ZV9jb252ZXJ0ZXJOYW1lTGFiZWwsCi0JCQlidWlsZENvbnZlcnROYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRDb252ZXJ0TmFtZUhvbGRlcigpLAotCQkJYnVpbGROYW1lQ29udmVydGVyKCksCi0JCQludWxsCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JCQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZEJvb2xlYW5Ib2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5TUEVDSUZJRURfQ09OVkVSVEVSX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb252ZXJ0TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCWphdmEudXRpbC5MaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlsaXN0LmFkZChidWlsZFJlc2VydmVkQ29udmVydGVyTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkU29ydGVkQ29udmVydGVyTmFtZXNNb2RlbCgpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGxpc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdE5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVjbGlwc2VMaW5rQ29udmVydC5ERUZBVUxUX0NPTlZFUlRFUl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmFtZSA9IERFRkFVTFRfS0VZICsgbmFtZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkTmFtZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpOwotCi0JCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZICsgdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IERFRkFVTFRfS0VZOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0TmFtZSA9IHZhbHVlLnN1YnN0cmluZyhERUZBVUxUX0tFWS5sZW5ndGgoKSk7Ci0KLQkJCQkJaWYgKGRlZmF1bHROYW1lLmxlbmd0aCgpID4gMCkgewotCQkJCQkJdmFsdWUgPSBOTFMuYmluZCgKLQkJCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQkJZGVmYXVsdE5hbWUKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2YWx1ZSA9IEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUmVzZXJ2ZWRDb252ZXJ0ZXJOYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KEVjbGlwc2VMaW5rQ29udmVydC5SRVNFUlZFRF9DT05WRVJURVJfTkFNRVMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNvcnRlZENvbnZlcnRlck5hbWVzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZENvbnZlcnRlck5hbWVzTW9kZWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29udmVydGVyTmFtZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPigKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdC5DT05WRVJURVJTX0NPTExFQ1RJT04pLy9UT0RPIG5lZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgaW50ZXJmYWNlCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVbmlxdWVDb252ZXJ0ZXJOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtDb252ZXJ0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBnZXRTdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVjbGlwc2VMaW5rQ29udmVydCB2YWx1ZSkgewotCQkJCWlmIChnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEzMjJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2hvd3MgdGhlIGxpc3Qgb2YgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29udmVydGVyQ29tcG9zaXRlIG9yIE9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG9yIFN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBvciBUeXBlQ29udmVydGVyQ29tcG9zaXRlICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKLSAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyPgotewotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IGxpc3RQYW5lOwotCXByaXZhdGUgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXJDb21wb3NpdGUgY29udmVydGVyQ29tcG9zaXRlOwotCXByaXZhdGUgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlIG9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGU7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSBzdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGU7Ci0JcHJpdmF0ZSBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJDb21wb3NpdGUgdHlwZUNvbnZlcnRlckNvbXBvc2l0ZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBzZWxlY3RlZENvbnZlcnRlckhvbGRlcjsKLQotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUoCi0JCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyID0gYnVpbGRTZWxlY3RlZENvbnZlcnRlckhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGJ1aWxkU2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIExpc3QgcGFuZQotCQl0aGlzLmxpc3RQYW5lID0gYWRkTGlzdFBhbmUoY29udGFpbmVyKTsKLQotCQkvLyBQcm9wZXJ0eSBwYW5lCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQl0aGlzLmNvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUodGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJdGhpcy5vYmplY3RUeXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMub2JqZWN0VHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0JCQotCQl0aGlzLnN0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSA9IG5ldyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkU3RydWN0Q29udmVydGVySG9sZGVyKCksCi0JCQlwYWdlQm9vaywKLQkJCWdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCQlyZWdpc3RlclN1YlBhbmUodGhpcy5zdHJ1Y3RDb252ZXJ0ZXJDb21wb3NpdGUpOwotCQkKLQkJdGhpcy50eXBlQ29udmVydGVyQ29tcG9zaXRlID0gbmV3IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckNvbXBvc2l0ZSgKLQkJCWJ1aWxkVHlwZUNvbnZlcnRlckhvbGRlcigpLAotCQkJcGFnZUJvb2ssCi0JCQlnZXRXaWRnZXRGYWN0b3J5KCkKLQkJKTsKLQkJcmVnaXN0ZXJTdWJQYW5lKHRoaXMudHlwZUNvbnZlcnRlckNvbXBvc2l0ZSk7Ci0KLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8T3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkQ29udmVydGVyc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkRGlzcGxheWFibGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciwKLQkJCWJ1aWxkQ29udmVydGVyc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQludWxsLy9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX05BTUVEX1FVRVJJRVMKLQkJKSB7Ci0JCQkvL1RPRE8geWVhaCwgdGhpcyBpcyB3ZWlyZCwgYnV0IGkgZG9uJ3Qgd2FudCB0aGlzIHRvIGJlIGRpc2FibGVkIGp1c3QKLQkJCS8vYmVjYXVzZSB0aGUgc3ViamVjdCBpcyBudWxsLiBpIGhhdmUgbm8gbmVlZCBmb3IgdGhhdCBhbmQgdGhhdCBpcwotCQkJLy9jdXJyZW50bHkgaG93IEFkZFJlbW92ZVBhbmUgd29ya3MuICBTZWUgT3JtUXVlcmllc0NvbXBvc2l0ZSB3aGVyZQotCQkJLy90aGUgd29yayBhcm91bmQgdGhlcmUgaXMgeWV0IGFub3RoZXIgcGFuZSBlbmFibGVyLiAgSSB3YW50IHRvIGNoYW5nZQotCQkJLy9ob3cgdGhpcyB3b3JrcyBpbiAyLjIKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJCQlzdXBlci5lbmFibGVXaWRnZXRzKHRydWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZVN3aXRjaGVyKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIodGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlciwgYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwgcGFnZUJvb2spOwotCX0KLQkKLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRDb252ZXJ0ZXJzQWRhcHRlcigpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkQ29udmVydGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlQ3VzdG9tQ29udmVydGVyKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlU3RydWN0Q29udmVydGVyKChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKChFY2xpcHNlTGlua0NvbnZlcnRlcikgaXRlbSkuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVR5cGVDb252ZXJ0ZXIoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbnZlcnRlcigpIHsKLQkJYWRkRWNsaXBzZUxpbmtDb252ZXJ0ZXJGcm9tRGlhbG9nKGJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJEaWFsb2coKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnZlcnRlckRpYWxvZyBidWlsZEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nKGdldFNoZWxsKCksIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCl0aGlzLmdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWNsaXBzZUxpbmtDb252ZXJ0ZXJGcm9tRGlhbG9nKEVjbGlwc2VMaW5rQ29udmVydGVyRGlhbG9nIGRpYWxvZykgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQlDbGFzczw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUgPSBkaWFsb2cuZ2V0Q29udmVydGVyVHlwZSgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JCWlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRDdXN0b21Db252ZXJ0ZXIoZ2V0U3ViamVjdCgpLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnZlcnRlclR5cGUgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQljb252ZXJ0ZXIgPSB0aGlzLmdldFN1YmplY3QoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKGdldFN1YmplY3QoKS5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udmVydGVyVHlwZSA9PSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcykgewotCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU3RydWN0Q29udmVydGVyKGdldFN1YmplY3QoKS5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJfQotCQllbHNlIGlmIChjb252ZXJ0ZXJUeXBlID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcykgewotCQkJY29udmVydGVyID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVHlwZUNvbnZlcnRlcihnZXRTdWJqZWN0KCkudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCWNvbnZlcnRlci5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQl0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyLnNldFZhbHVlKGNvbnZlcnRlcik7Ly9zbyB0aGF0IGl0IGdldHMgc2VsZWN0ZWQgaW4gdGhlIExpc3QgZm9yIHRoZSB1c2VyIHRvIGVkaXQKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEVjbGlwc2VMaW5rQ29udmVydGVyLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxFY2xpcHNlTGlua0NvbnZlcnRlciwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy5jb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MpIHsKLQkJCQkJcmV0dXJuIE9ybUVjbGlwc2VMaW5rQ29udmVydGVyc0NvbXBvc2l0ZS50aGlzLm9iamVjdFR5cGVDb252ZXJ0ZXJDb21wb3NpdGUuZ2V0Q29udHJvbCgpOwotCQkJCX0KLQkJCQlpZiAoY29udmVydGVyLmdldFR5cGUoKSA9PSBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcykgewotCQkJCQlyZXR1cm4gT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJzQ29tcG9zaXRlLnRoaXMuc3RydWN0Q29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKLQkJCQl9Ci0JCQkJaWYgKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKSB7Ci0JCQkJCXJldHVybiBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUudGhpcy50eXBlQ29udmVydGVyQ29tcG9zaXRlLmdldENvbnRyb2woKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyPiBidWlsZERpc3BsYXlhYmxlQ29udmVydGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEVjbGlwc2VMaW5rQ29udmVydGVyPigKLQkJCWJ1aWxkRWNsaXBzZUxpbmtDb252ZXJ0ZXJzSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0NvbnZlcnRlci5OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlcj4gYnVpbGRFY2xpcHNlTGlua0NvbnZlcnRlcnNIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVydGVyPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRDdXN0b21Db252ZXJ0ZXJzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRPYmplY3RUeXBlQ29udmVydGVyc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkU3RydWN0Q29udmVydGVyc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkVHlwZUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnZlcnRlcj4sIEVjbGlwc2VMaW5rQ29udmVydGVyPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBidWlsZEN1c3RvbUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lci5DVVNUT01fQ09OVkVSVEVSU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmN1c3RvbUNvbnZlcnRlcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlcnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuT0JKRUNUX1RZUEVfQ09OVkVSVEVSU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Qub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Qub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gYnVpbGRTdHJ1Y3RDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIuU1RSVUNUX0NPTlZFUlRFUlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc3RydWN0Q29udmVydGVycygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyLlRZUEVfQ09OVkVSVEVSU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudHlwZUNvbnZlcnRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudHlwZUNvbnZlcnRlcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IGJ1aWxkQ3VzdG9tQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rQ29udmVydGVyLCBFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4odGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3MgPyAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IGJ1aWxkT2JqZWN0VHlwZUNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPih0aGlzLnNlbGVjdGVkQ29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgdHJhbnNmb3JtXyhFY2xpcHNlTGlua0NvbnZlcnRlciB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRUeXBlKCkgPT0gRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzID8gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBidWlsZFN0cnVjdENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0NvbnZlcnRlciwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+KHRoaXMuc2VsZWN0ZWRDb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzID8gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSB2YWx1ZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBidWlsZFR5cGVDb252ZXJ0ZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0ZXIsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4odGhpcy5zZWxlY3RlZENvbnZlcnRlckhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0VHlwZSgpID09IEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcyA/IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkQ29udmVydGVyc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rQ29udmVydGVyKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5hYmxlV2lkZ2V0cyhib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdGhpcy5saXN0UGFuZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCX0KLQotCS8vVE9ETyBuZWVkIHRvIGNoZWNrIHRoZSBjb252ZXJ0ZXIgcmVwb3NpdG9yeSBmb3IgdGhpcywgc2hvdWxkIGNoZWNrIGFsbCBjb252ZXJ0ZXJzLCBleGNlcHQgZm9yIHRoZSBvdmVycmlkZSBjYXNlLCBobW0KLQkvL3dlIGF0IGxlYXN0IG5lZWQgdG8gY2hlY2sgdHlwZWNvbnZlcnRlcnMsIGNvbnZlcnRlcnMsIHN0cnVjdGNvbnZlcnRlcnMsIGFuZCBvYmplY3R5cGVjb252ZXJ0ZXJzLCBvbiB0aGlzIHBhcnRpY3VsYXIKLQkvL29iamVjdC4gIG9yIHdlIG5lZWQgdG8gZ2l2ZSBhIHdhcm5pbmcgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgeW91IGFyZSBvdmVycmlkaW5nIG9yIGFuIGVycm9yIGlmIGl0J3Mgbm90IGFuIG92ZXJyaWRlPwotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjb252ZXJ0ZXJOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLCBTdHJpbmc+KGdldFN1YmplY3QoKS5jdXN0b21Db252ZXJ0ZXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzA2NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1KYXZhQ2xhc3NDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlPiAKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVBZHZhbmNlZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEFjY2Vzc0hvbGRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb252ZXJ0ZXJzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rVHlwZU1hcHBpbmdDb21wb3NpdGVfY29udmVydGVycwotCQkpOwotCQlpbml0aWFsaXplQ29udmVydGVyc1NlY3Rpb24oY29udGFpbmVyLCB0aGlzLmJ1aWxkQ29udmVydGVyQ29udGFpbmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNvbnZlcnRlcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCW5ldyBPcm1FY2xpcHNlTGlua0NvbnZlcnRlcnNDb21wb3NpdGUodGhpcywgY29udmVydGVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcj4gYnVpbGRDb252ZXJ0ZXJDb250YWluZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rRW1iZWRkYWJsZUFkdmFuY2VkQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2OTQ3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTM2Yjk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgIAkJCSAgCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgeCBFeGlzdGVuY2UgQ2hlY2tpbmc6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgCQkJCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rQ2FjaGluZwotICogQHNlZSBDYWNoaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVjbGlwc2VMaW5rQ2FjaGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSggCi0gICAgICAgICAgICBjb250YWluZXIsIAotICAgICAgICAgICAgRWNsaXBzZUxpbmtVaURldGFpbHNNZXNzYWdlcy5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlX2xhYmVsLAotICAgICAgICAgICAgYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksIAotICAgICAgICAgICAgbnVsbCAKLSAgICAgICApOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4gYWRkRXhpc3RlbmNlQ2hlY2tpbmdUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFY2xpcHNlTGlua0NhY2hpbmcsIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRWNsaXBzZUxpbmtDYWNoaW5nLkRFRkFVTFRfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVjbGlwc2VMaW5rQ2FjaGluZy5TUEVDSUZJRURfRVhJU1RFTkNFX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLmNsYXNzLAotCQkJCQlPcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlLnRoaXMsCi0JCQkJCXZhbHVlCi0JCQkJKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKHZhbHVlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhM2VkMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vL1JlbW92ZSB0aGUgQ29udmVydGVycyBzZWN0aW9uIGZyb20gMS4wIG9ybSBpZCBtYXBwaW5ncy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rSWRNYXBwaW5nQ29tcG9zaXRlPElkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQkvL2V2ZXJ5dGhpbmcgYnV0IHRoZSAnRGVmaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmYzNGQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcmRlcmluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9NYW55TWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDFmYjZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8TWFueVRvT25lTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPk1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CQkKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFueVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQwYWZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8VD4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmZmYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb01hbnlNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2U5ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hcHBlZEJ5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFjY2Vzc1R5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZwotICogQHNlZSBBY2Nlc3NUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIE1hcHBlZEJ5UGFuZQotICogQHNlZSBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUKLSAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZQotZXh0ZW5kcyBFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxPbmVUb09uZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlbGluazFfMU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklPbmVUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmJhNzhmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmM2IwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODZhMzhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLy9SZW1vdmUgdGhlIENvbnZlcnRlcnMgc2VjdGlvbiBmcm9tIDEuMCBvcm0gdmVyc2lvbiBtYXBwaW5ncy4KLS8vVGhpcyBpcyBzdXBwb3J0ZWQgaW4gRWNsaXBzZUxpbmsgaW4gdmVyc2lvbiAxLjEsIGJ1dCBub3QgMS4wCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxWZXJzaW9uTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5WZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWZXJzaW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQkvL2V2ZXJ5dGhpbmcgYnV0IHRoZSAnRGVmaW5lIENvbnZlcnRlcicgc2VjdGlvbi4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBpbiBlY2xpcHNlbGluayAxLjAsIGJ1dCBpcyBpbiAxLjEKLQlwcm90ZWN0ZWQgUGFuZTxFY2xpcHNlTGlua0NvbnZlcnQ+IGJ1aWxkQ29udmVydENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtDb252ZXJ0PiBjb252ZXJ0SG9sZGVyLCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtDb252ZXJ0MV8wQ29tcG9zaXRlKGNvbnZlcnRIb2xkZXIsIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2Y2FmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgYnVpbGRQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODI0YTBmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlBcnJheUxpc3Q8SnBhUGFnZUNvbXBvc2l0ZT4gcGFnZXMgPSBuZXcgQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+KDgpOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlwYWdlcy5hZGQodGhpcy5idWlsZEdlbmVyYWxUYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZCh0aGlzLmJ1aWxkQ29ubmVjdGlvblRhYihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRDdXN0b21pemF0aW9uVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRDYWNoaW5nVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRMb2dnaW5nVGFiKGVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKHRoaXMuYnVpbGRPcHRpb25zVGFiKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQodGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb25UYWIoZWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQodGhpcy5idWlsZFByb3BlcnRpZXNUYWIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0KLQkJcmV0dXJuIHBhZ2VzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCB0YWJzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIGJ1aWxkR2VuZXJhbFRhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjw/IGV4dGVuZHMgQ29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb24+IGNvbm5lY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYjxDb25uZWN0aW9uPihjb25uZWN0aW9uSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBidWlsZEN1c3RvbWl6YXRpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gdGhpcy5idWlsZEN1c3RvbWl6YXRpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI8Q3VzdG9taXphdGlvbj4oY3VzdG9taXphdGlvbkhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjw/IGV4dGVuZHMgQ2FjaGluZz4gYnVpbGRDYWNoaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlciA9IHRoaXMuYnVpbGRDYWNoaW5nSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPENhY2hpbmc+KGNhY2hpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI8PyBleHRlbmRzIExvZ2dpbmc+IGJ1aWxkTG9nZ2luZ1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSB0aGlzLmJ1aWxkTG9nZ2luZ0hvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjxMb2dnaW5nPihsb2dnaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPD8gZXh0ZW5kcyBPcHRpb25zPiBidWlsZE9wdGlvbnNUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9ucz4gb3B0aW9uc0hvbGRlciA9IHRoaXMuYnVpbGRPcHRpb25zSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPE9wdGlvbnM+KG9wdGlvbnNIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIgYnVpbGRTY2hlbWFHZW5lcmF0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc2NoZW1hR2VuSG9sZGVyID0gdGhpcy5idWlsZFNjaGVtYUdlbmVyYXRpb25Ib2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoc2NoZW1hR2VuSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZSBidWlsZFByb3BlcnRpZXNUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gYnVpbGRFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvbj4gYnVpbGRDb25uZWN0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIENvbm5lY3Rpb24+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbm5lY3Rpb24gdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KXZhbHVlKS5nZXRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBDdXN0b21pemF0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDdXN0b21pemF0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q3VzdG9taXphdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgQ2FjaGluZz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGluZyB0cmFuc2Zvcm1fKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhY2hpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZz4gYnVpbGRMb2dnaW5nSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBMb2dnaW5nPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0TG9nZ2luZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBidWlsZE9wdGlvbnNIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgT3B0aW9ucz4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3B0aW9ucyB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCi0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpdmFsdWUpLmdldE9wdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gYnVpbGRTY2hlbWFHZW5lcmF0aW9uSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBTY2hlbWFHZW5lcmF0aW9uPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFHZW5lcmF0aW9uIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyNjk1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENhY2hlRGVmYXVsdHNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRGVmYXVsdHNDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBDYWNoZURlZmF1bHRzQ29tcG9zaXRlKFBhbmU8VD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZUNhY2hlRGVmYXVsdHNQYW5lKHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoZURlZmF1bHRzUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRQYW5lID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCXBhcmVudCwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZURlZmF1bHRzQ29tcG9zaXRlX2dyb3VwVGl0bGUKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVDYWNoZURlZmF1bHRzQ29tcG9zaXRlcyhkZWZhdWx0UGFuZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoZURlZmF1bHRzQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gRGVmYXVsdCBDYWNoZSBUeXBlCi0JCW5ldyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gRGVmYXVsdCBDYWNoZSBTaXplCi0JCW5ldyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlPFQ+KHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gRGVmYXVsdCBTaGFyZWQgQ2FjaGUKLQkJbmV3IERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyY2QzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVTaXplQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIENhY2hlU2l6ZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVTaXplQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmFkZENhY2hlU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkQ2FjaGVTaXplQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPEVudGl0eT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoZVNpemVDb21wb3NpdGVfY2FjaGVTaXplOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihidWlsZENhY2hpbmdIb2xkZXIoKSwgQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJSW50ZWdlciB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0Q2FjaGVTaXplT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXRDYWNoZVNpemVPZihnZXRTdWJqZWN0TmFtZSgpLCB2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRTdWJqZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwcml2YXRlIENhY2hpbmcgZ2V0U3ViamVjdFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmdldFZhbHVlKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIENhY2hpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZVR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MjYyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGVUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIENhY2hlVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGVUeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2FjaGVUeXBlQ29tcG9zaXRlKFBhbmU8RW50aXR5PiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfY2FjaGVUeXBlTGFiZWwsCi0JCQluZXcgQ2FjaGVUeXBlQ29tYm8oY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQ2FjaGVUeXBlQ29tYm8gZXh0ZW5kcyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudGl0eSwgQ2FjaGVUeXBlPiB7Ci0KLQkJcHJpdmF0ZSBDYWNoZVR5cGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihDYWNoZVR5cGVDb21wb3NpdGUudGhpcywgcGFyZW50KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gYnVpbGRDYWNoaW5nSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIENhY2hpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJCXJldHVybiB2YWx1ZS5nZXRQYXJlbnQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZERlZmF1bHRDYWNoZVR5cGVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KGJ1aWxkQ2FjaGluZ0hvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCUNhY2hlVHlwZSBjYWNoZVR5cGUgPSBzdWJqZWN0LmdldENhY2hlVHlwZURlZmF1bHQoKTsKLQkJCQkJaWYgKGNhY2hlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQljYWNoZVR5cGUgPSBzdWJqZWN0LmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIGNhY2hlVHlwZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpCi0JCQkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGVmYXVsdENhY2hpbmdUeXBlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCQlpZiAoKGUuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSAmJiAhZ2V0Q29tYm8oKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCUNhY2hlVHlwZUNvbWJvLnRoaXMuZG9Qb3B1bGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCXJldHVybiBDYWNoZVR5cGUudmFsdWVzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldERlZmF1bHRDYWNoZVR5cGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQlyZXR1cm4gYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywKLQkJCQlDYWNoZVR5cGVDb21wb3NpdGUudGhpcywKLQkJCQl2YWx1ZQotCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQkJLy8gVGhpcyBpcyByZXF1aXJlZCB0byBhbGxvdyB0aGUgY2xhc3MgbG9hZGVyIHRvIGxldCB0aGUgbGlzdGVuZXIKLQkJCS8vIHdyaXR0ZW4gYWJvdmUgdG8gYWNjZXNzIHRoaXMgbWV0aG9kCi0JCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENhY2hlVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0Q2FjaGVUeXBlT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoKTsKLQotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gZGVmYXVsdENhY2hlVHlwZUhvbGRlciA9Ci0JCQkJYnVpbGREZWZhdWx0Q2FjaGVUeXBlSG9sZGVyKCk7Ci0KLQkJCWRlZmF1bHRDYWNoZVR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJYnVpbGREZWZhdWx0Q2FjaGluZ1R5cGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJCSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoQ2FjaGVUeXBlIHZhbHVlKSB7Ci0JCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0Q2FjaGVUeXBlT2YoZ2V0U3ViamVjdE5hbWUoKSwgdmFsdWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBDYWNoaW5nIGdldFN1YmplY3RQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5nZXRWYWx1ZSgpLmdldFBhcmVudCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVNpemVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5ZDM1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQ2FjaGVTaXplQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlPFQgZXh0ZW5kcyBDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNhY2hlVHlwZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGREZWZhdWx0Q2FjaGVTaXplQ29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZERlZmF1bHRDYWNoZVNpemVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q2FjaGluZz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlX2RlZmF1bHRDYWNoZVNpemU7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DQUNISU5HX0RFRkFVTFRfU0laRTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q2FjaGVTaXplRGVmYXVsdCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlU2l6ZURlZmF1bHQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsJCQkKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1MmUxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRDYWNoZVR5cGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIENhY2hpbmc+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlciggcGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBDYWNoZVR5cGU+IGJ1aWxkRGVmYXVsdENhY2hlVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENhY2hpbmcsIENhY2hlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gQ2FjaGVUeXBlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKENhY2hlVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKENhY2hlVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRDYWNoZVR5cGVEZWZhdWx0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfZGVmYXVsdENhY2hlVHlwZUxhYmVsLAotCQkJdGhpcy5idWlsZERlZmF1bHRDYWNoZVR5cGVDb21ibyggY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1RZUEUJCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0RlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTFhMjdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9EZWZhdWx0U2hhcmVkQ2FjaGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRGVmYXVsdFNoYXJlQ2FjaGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q2FjaGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlZmF1bHRTaGFyZUNhY2hlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERlZmF1bHRTaGFyZWRDYWNoZUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zaGFyZWRDYWNoZURlZmF1bHRMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElOR19ERUZBVUxUX1NIQVJFRAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZURlZmF1bHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHREZWZhdWx0U2hhcmVkQ2FjaGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX2RlZmF1bHRTaGFyZWRDYWNoZURlZmF1bHRMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVEZWZhdWx0TGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yjk4NGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBFY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGUoUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0aGlzLmFkZFNlY3Rpb24oCi0JCQlwYXJlbnQsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJLy8gRGVmYXVsdHMKLQkJbmV3IENhY2hlRGVmYXVsdHNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRW50aXRpZXNMaXN0Ci0JCW5ldyBFbnRpdHlMaXN0Q29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIEZsdXNoIENsZWFyIENhY2hlCi0JCW5ldyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWI0MjIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eT4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlDYWNoaW5nUHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudGl0eUNhY2hpbmdQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDYWNoZSBUeXBlCi0JCW5ldyBDYWNoZVR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBDYWNoZSBTaXplCi0JCW5ldyBDYWNoZVNpemVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBTaGFyZSBDYWNoZQotCQluZXcgU2hhcmVkQ2FjaGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VudGl0eUxpc3RDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyMzNiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLkpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLS8qKgotICogIEVudGl0eUxpc3RDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUxpc3RDb21wb3NpdGU8VCBleHRlbmRzIENhY2hpbmc+IGV4dGVuZHMgUGFuZTxUPgotewotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyOwotCQotCXB1YmxpYyBFbnRpdHlMaXN0Q29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5lbnRpdHlIb2xkZXIgPSB0aGlzLmJ1aWxkRW50aXR5SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DYWNoaW5nRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlCi0JCSk7Ci0KLQkJLy8gRW50aXRpZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPENhY2hpbmc+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORwotCQkpOwotCi0JCS8vIEVudGl0eSBDYWNoaW5nIHByb3BlcnR5IHBhbmUKLQkJRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKHRoaXMuZW50aXR5SG9sZGVyLCBwYW5lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkRW50aXRpZXNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUVudGl0eUxpc3RDb21wb3NpdGUudGhpcy5hZGRFbnRpdGllcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlDYWNoaW5nIGNhY2hpbmcgPSBnZXRTdWJqZWN0KCk7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCUVudGl0eSBlbnRpdHlDYWNoaW5nID0gKEVudGl0eSkgaXRlbTsKLQkJCQkJY2FjaGluZy5yZW1vdmVFbnRpdHkoZW50aXR5Q2FjaGluZy5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEVudGl0aWVzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VFbnRpdHkoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgZW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZSh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWlmIChlbnRpdHlOYW1lID09IG51bGwpIHsKLQkJCQllbnRpdHlOYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQkJfQotCQkJCi0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS5lbnRpdHlFeGlzdHMoZW50aXR5TmFtZSkpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5hZGRFbnRpdHkoZW50aXR5TmFtZSk7Ci0JCQkJaW50IGluZGV4ID0gQ29sbGVjdGlvblRvb2xzLmluZGV4T2YodGhpcy5nZXRTdWJqZWN0KCkuZW50aXR5TmFtZXMoKSwgZW50aXR5TmFtZSk7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGxpc3RTZWxlY3Rpb25Nb2RlbC5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGVudGl0eSk7Ci0JCQkJdGhpcy5lbnRpdHlIb2xkZXIuc2V0VmFsdWUoZW50aXR5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVudGl0eU5hbWUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJcmV0dXJuIChlbnRpdHkgIT0gbnVsbCkgPyBlbnRpdHkuZ2V0TmFtZSgpIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VFbnRpdHkoKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KCk7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgamF2YVByb2plY3QgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQkiIgotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ2FjaGluZ0VudGl0eUxpc3RDb21wb3NpdGVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkNhY2hpbmdFbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJRW50aXR5IGVudGl0eUNhY2hpbmcgPSAoRW50aXR5KSBlbGVtZW50OwotCQkJCXJldHVybiBlbnRpdHlDYWNoaW5nLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gYnVpbGRFbnRpdHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVudGl0eT4gYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgRW50aXR5PigKLQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIENhY2hpbmcuRU5USVRJRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVudGl0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q2FjaGluZ1Byb3BlcnR5Q29tcG9zaXRlIHBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoZW50aXR5SG9sZGVyKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBCb29sZWFuPihlbnRpdHlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFbnRpdHkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZW50aXR5TmFtZUlzVmFsaWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MTNkYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuRmx1c2hDbGVhckNhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRmx1c2hDbGVhckNhY2hlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENhY2hpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZSgKLQkJCQlQYW5lPD8gZXh0ZW5kcyBDYWNoaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCXBhcmVudCwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiX0ZsdXNoQ2xlYXJDYWNoZUxhYmVsLAotCQkJCXRoaXMuYWRkRmx1c2hDbGVhckNhY2hlQ29tYm8ocGFyZW50KSwKLQkJCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkcKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q2FjaGluZywgRmx1c2hDbGVhckNhY2hlPiBhZGRGbHVzaENsZWFyQ2FjaGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDYWNoaW5nLCBGbHVzaENsZWFyQ2FjaGU+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDYWNoaW5nLkZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmx1c2hDbGVhckNhY2hlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gRmx1c2hDbGVhckNhY2hlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmx1c2hDbGVhckNhY2hlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEZsdXNoQ2xlYXJDYWNoZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhGbHVzaENsZWFyQ2FjaGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBGbHVzaENsZWFyQ2FjaGVDb21wb3NpdGUuY2xhc3MsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmx1c2hDbGVhckNhY2hlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRGbHVzaENsZWFyQ2FjaGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShGbHVzaENsZWFyQ2FjaGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRGbHVzaENsZWFyQ2FjaGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzYzY3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiPFQgZXh0ZW5kcyBDYWNoaW5nPgotCQkJCQkJCQlleHRlbmRzIFBhbmU8VD4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJbmV3IEVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ0FDSElORzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2NhY2hpbmcvU2hhcmVkQ2FjaGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdiYzIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY2FjaGluZy9TaGFyZWRDYWNoZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBTaGFyZWRDYWNoZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2hhcmVkQ2FjaGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eT4KLXsKLQlwcml2YXRlIFRyaVN0YXRlQ2hlY2tCb3ggc2hhcmVkQ2FjaGVDaGVja0JveDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2hhcmVDYWNoZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlciBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2hhcmVkQ2FjaGVDb21wb3NpdGUoUGFuZTxFbnRpdHk+IHBhcmVudENvbXBvc2l0ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IGJ1aWxkQ2FjaGluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHksIENhY2hpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoaW5nIHRyYW5zZm9ybV8oRW50aXR5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFBhcmVudCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkRGVmYXVsdEFuZE5vbkRlZmF1bHRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKQotCQkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQkvLyBJZiB0aGUgbnVtYmVyIG9mIExpc3RWYWx1ZU1vZGVsIGVxdWFscyAxLCB0aGF0IG1lYW5zIHRoZSBzaGFyZWQKLQkJCQkvLyBDYWNoZSBwcm9wZXJ0aWVzIGlzIG5vdCBzZXQgKHBhcnRpYWxseSBzZWxlY3RlZCksIHdoaWNoIG1lYW5zIHdlCi0JCQkJLy8gd2FudCB0byBzZWUgdGhlIGRlZmF1bHQgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAodGhpcy5saXN0SG9sZGVyLnNpemUoKSA9PSAxKSB7Ci0JCQkJCXJldHVybiAoQm9vbGVhbikgdGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLm5leHQoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRBbmROb25EZWZhdWx0U2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8Qm9vbGVhbj4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+PigyKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRTaGFyZWRDYWNoZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpKTsKLQotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+LCBCb29sZWFuPigKLQkJCWhvbGRlcnMKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTaGFyZWRDYWNoZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oYnVpbGRDYWNoaW5nSG9sZGVyKCksIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJQm9vbGVhbiB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCQkJfQotCQkJCXJldHVybiB2YWx1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPigKLQkJCWJ1aWxkRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQm9vbGVhbj4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldFNoYXJlZENhY2hlT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0U2hhcmVkQ2FjaGVPZihnZXRTdWJqZWN0TmFtZSgpLCB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCQotCXByaXZhdGUgQ2FjaGluZyBnZXRTdWJqZWN0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+KAotCQkJYnVpbGRTaGFyZWRDYWNoZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0QW5kTm9uRGVmYXVsdFNoYXJlZENhY2hlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9kZWZhdWx0U2hhcmVkQ2FjaGVMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3guc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLnNoYXJlZENhY2hlQ2hlY2tCb3ggPSB0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2hhcmVkQ2FjaGVMYWJlbCwKLQkJCXRoaXMuYnVpbGRTaGFyZWRDYWNoZUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNoYXJlZENhY2hlU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NBQ0hJTkcKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0JhdGNoV3JpdGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNiOTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9CYXRjaFdyaXRpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQmF0Y2hXcml0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBCYXRjaFdyaXRpbmdDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQkJZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXRjaFdyaXRpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEJhdGNoV3JpdGluZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8Q29ubmVjdGlvbiwgQmF0Y2hXcml0aW5nPiBhZGRCYXRjaFdyaXRpbmdDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDb25uZWN0aW9uLCBCYXRjaFdyaXRpbmc+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmdbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBCYXRjaFdyaXRpbmcudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJhdGNoV3JpdGluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0QmF0Y2hXcml0aW5nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKEJhdGNoV3JpdGluZyB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBCYXRjaFdyaXRpbmdDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCYXRjaFdyaXRpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRCYXRjaFdyaXRpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShCYXRjaFdyaXRpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0QmF0Y2hXcml0aW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfYmF0Y2hXcml0aW5nTGFiZWwsCi0JCQl0aGlzLmFkZEJhdGNoV3JpdGluZ0NvbWJvKCBjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0NhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkYzhhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlU3RhdGVtZW50c1Byb3BlcnRpZXNDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCXB1YmxpYyBDYWNoZVN0YXRlbWVudHNQcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIgPSBidWlsZENhY2hlU3RhdGVtZW50c0hvbGRlcigpOwotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDMsIDUsIDAsIDAsIDApOwotCQkKLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9jYWNoZVN0YXRlbWVudHNMYWJlbCwKLQkJCWNhY2hlU3RhdGVtZW50c0hvbGRlciwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JCUludGVnZXJDb21ibzw/PiBjb21ibyA9IGFkZENhY2hlU3RhdGVtZW50c1NpemVDb21ibyhjb250YWluZXIpOwotCi0JCXRoaXMuaW5zdGFsbENvbnRyb2xFbmFibGVyKGNhY2hlU3RhdGVtZW50c0hvbGRlciwgY29tYm8pOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYWNoZVN0YXRlbWVudHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVTdGF0ZW1lbnRzKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzdWJqZWN0Q2hhbmdlZCgpIHsKLQkJCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCQkJc3VwZXIuc3ViamVjdENoYW5nZWQoKTsKLQkJCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgYXBwZW5kZWQgdG8gdGhlIHRleHQKLQkJCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgJiYgbmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCQl0aGlzLmZpcmVBc3BlY3RDaGFuZ2VkKEJvb2xlYW4uVFJVRSwgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4gYWRkQ2FjaGVTdGF0ZW1lbnRzU2l6ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbWJvIGFkZEludGVnZXJDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYWRkRWRpdGFibGVDb21ibygKLQkJCQkJCWNvbnRhaW5lciwKLQkJCQkJCWJ1aWxkRGVmYXVsdExpc3RIb2xkZXIoKSwKLQkJCQkJCWJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCksCi0JCQkJCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdENhY2hlU3RhdGVtZW50c1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRDYWNoZVN0YXRlbWVudHNTaXplKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxDb250cm9sRW5hYmxlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjYWNoZVN0YXRlbWVudHNIb2xkZXIsIEludGVnZXJDb21ibzw/PiBjb21ibykgewotCi0JCW5ldyBQYW5lRW5hYmxlcihjYWNoZVN0YXRlbWVudHNIb2xkZXIsIGNvbWJvKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwZWEwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBEYXRhIHNvdXJjZQotCQluZXcgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQkJLy8gRWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sCi0JCW5ldyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkvLyBFeGNsdXNpdmUgQ29ubmVjdGlvbnMKLQkJbmV3IEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYTI4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZSgKLQkJCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEp0YURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy50cmFuc2Zvcm0yKHZhbHVlKSk7Ci0JCQl9Ci0JCQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtMihQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIAotCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKLQotCQljb250YWluZXIgPSBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQotCQkvLyBKVEEgRGF0YSBTb3VyY2UKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGp0YUVuYWJsZWQgPSB0aGlzLmJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpOwotCQlMYWJlbCBqdGFMYWJlbCA9IGFkZExhYmVsKGNvbnRhaW5lciwgRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9qdGFEYXRhU291cmNlTGFiZWwsIGp0YUVuYWJsZWQpOwotCQlUZXh0IGp0YVRleHQgPSBhZGRUZXh0KGNvbnRhaW5lciwgdGhpcy5idWlsZEp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSwganRhRW5hYmxlZCk7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIGp0YUxhYmVsLCBqdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKLQotCQkvLyBOb24tSlRBIERhdGEgU291cmNlCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub25KdGFFbmFibGVkID0gdGhpcy5idWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKTsKLQkJTGFiZWwgbm9uSnRhTGFiZWwgPSBhZGRMYWJlbChjb250YWluZXIsIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbm9uSnRhRGF0YVNvdXJjZUxhYmVsLCBub25KdGFFbmFibGVkKTsKLQkJVGV4dCBub25KdGFUZXh0ID0gYWRkVGV4dChjb250YWluZXIsIGJ1aWxkTm9uSnRhRGF0YVNvdXJjZUhvbGRlcigpLCB0aGlzLmdldEhlbHBJRCgpLCBub25KdGFFbmFibGVkKTsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKGNvbnRhaW5lciwgbm9uSnRhTGFiZWwsIG5vbkp0YVRleHQsIHRoaXMuZ2V0SGVscElEKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyZmJhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtDb25uZWN0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCkgKiAyOwotCi0JCWNvbnRhaW5lciA9IGFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3NlY3Rpb25UaXRsZSwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbgotCQkpOwotCi0JCW5ldyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8VD4odGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IEJhdGNoV3JpdGluZ0NvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgQ2FjaGVTdGF0ZW1lbnRzUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBzdWJQYW5lKTsKLQotCQluZXcgTmF0aXZlU3FsQ29tcG9zaXRlPFQ+KHRoaXMsIHN1YlBhbmUpOwotCi0JCW5ldyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzU4MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPENvbm5lY3Rpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjQmluZFBhcmFtZXRlcnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0JpbmRQYXJhbWV0ZXJzQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDb25uZWN0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWwsCi0JCQl0aGlzLmJ1aWxkQmluZFBhcmFtZXRlcnNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRCaW5kUGFyYW1ldGVyc1N0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEJpbmRQYXJhbWV0ZXJzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmluZFBhcmFtZXRlcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaW5kUGFyYW1ldGVycyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEJpbmRQYXJhbWV0ZXJzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0QmluZFBhcmFtZXRlcnNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2JpbmRQYXJhbWV0ZXJzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9iaW5kUGFyYW1ldGVyc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRCaW5kUGFyYW1ldGVyc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEJpbmRQYXJhbWV0ZXJzKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0QmluZFBhcmFtZXRlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNTM2ZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiAgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvbnN0YW50IElEIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRpYWxvZyBzZXR0aW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuZGlhbG9ncy5Db25uZWN0aW9uRGlhbG9nIjsKLQotCXB1YmxpYyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoCi0JCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQYXNzd29yZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYXNzd29yZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0UGFzc3dvcmQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcmxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFVybCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VXJsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VXNlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VXNlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUG9wdWxhdGUgZnJvbSBDb25uZWN0aW9uIGh5cGVybGluawotCQl0aGlzLmFkZEh5cGVybGluaygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcG9wdWxhdGVGcm9tQ29ubmVjdGlvbkh5cGVyTGluaywKLQkJCWJ1aWxkUG9wdWxhdGVGcm9tQ29ubmVjdGlvbkFjdGlvbigpCi0JCSk7Ci0KLQkJLy8gRHJpdmVyCi0JCW5ldyBKZGJjRHJpdmVyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gVXJsCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3VybExhYmVsLAotCQkJYnVpbGRVcmxIb2xkZXIoKQotCQkpOwotCi0JCS8vIFVzZXIKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdXNlckxhYmVsLAotCQkJYnVpbGRVc2VySG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQYXNzd29yZAotCQl0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3Bhc3N3b3JkTGFiZWwsCi0JCQlidWlsZFBhc3N3b3JkSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBCaW5kIFBhcmFtZXRlcnMKLQkJbmV3IEpkYmNCaW5kUGFyYW1ldGVyc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXZvaWQgcHJvbXB0Q29ubmVjdGlvbigpIHsKLQotCQlDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOwotCi0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldFN1YmplY3QoKTsKLQkJY29ubmVjdGlvbi5zZXRVcmwoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7Ci0JCWNvbm5lY3Rpb24uc2V0VXNlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJOYW1lKCkpOwotCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlclBhc3N3b3JkKCkpOwotCQljb25uZWN0aW9uLnNldERyaXZlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQkvLyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW55IGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQgc2ltcGx5Ci0JCS8vIHRha2UgdGhlIHNldHRpbmdzIGZyb20gaXQgKHVzZXIsIHBhc3N3b3JkLCBldGMuKSBhbmQgZ2l2ZSB0aGVtCi0JCS8vIHRvIHRoZSBFY2xpcHNlTGluayBjb25uZWN0aW9uLCBzbyB3ZSBnbwotCQkvLyB0byB0aGUgZGIgcGx1Zy1pbiBkaXJlY3RseSB0byBnZXQgdGhlIGZhY3RvcnkKLQkJcmV0dXJuIEpwdEpwYURiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCS8vIGJyb2FkZW4gYWNjZXNzIGEgYml0Ci0JU2hlbGwgZ2V0U2hlbGxfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlhbG9nIHNob3dzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb24gbmFtZXMgYW5kIGxldHMgdGhlIHVzZXIKLQkgKiB0aGUgb3B0aW9uIHRvIGZpbHRlciB0aGVtIHVzaW5nIGEgc2VhcmNoIGZpZWxkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZyB7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1NlbGVjdGlvbkRpYWxvZzwvY29kZT4uCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZygpIHsKLQkJCXN1cGVyKEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldFNoZWxsXygpLCBmYWxzZSk7Ci0JCQlzZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19NZXNzYWdlKTsKLQkJCXNldFRpdGxlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZSk7Ci0JCQlzZXRMaXN0TGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCQlzZXREZXRhaWxzTGFiZWxQcm92aWRlcihidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChlbGVtZW50ID09IG51bGwpID8gIiIgOiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVFeHRlbmRlZENvbnRlbnRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVtc0ZpbHRlciBjcmVhdGVGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25JdGVtc0ZpbHRlcigpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbXNGaWx0ZXIgaXRlbXNGaWx0ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCUl0ZXJhYmxlPFN0cmluZz4gcHJvZmlsZU5hbWVzID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7Ci0JCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIENvbGxlY3Rpb25Ub29scy5zaXplKHByb2ZpbGVOYW1lcykpOwotCi0JCQkvLyBBZGQgdGhlIGNvbm5lY3Rpb24gbmFtZXMgdG8gdGhlIGRpYWxvZwotCQkJZm9yIChTdHJpbmcgbmFtZSA6IHByb2ZpbGVOYW1lcykgewotCQkJCXByb3ZpZGVyLmFkZChuYW1lLCBpdGVtc0ZpbHRlcik7Ci0JCQkJc20ud29ya2VkKDEpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0KLQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXREaWFsb2dTZXR0aW5ncygpOwotCQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuZ2V0U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCi0JCQlpZiAoc2V0dGluZ3MgPT0gbnVsbCkgewotCQkJCXNldHRpbmdzID0gZGlhbG9nU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihESUFMT0dfU0VUVElOR1MpOwotCQkJfQotCi0JCQlyZXR1cm4gc2V0dGluZ3M7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbXBhcmF0b3I8U3RyaW5nPiBnZXRJdGVtc0NvbXBhcmF0b3IoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGl0ZW0xLCBTdHJpbmcgaXRlbTIpIHsKLQkJCQkJcmV0dXJuIGl0ZW0xLmNvbXBhcmVUbyhpdGVtMik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgY29ubmVjdGlvbiBuYW1lIGJhc2VkIG9uCi0JCSAqIHRoZSBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIENvbm5lY3Rpb25JdGVtc0ZpbHRlciBleHRlbmRzIEl0ZW1zRmlsdGVyIHsKLQotCQkJLyoqCi0JCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25JdGVtc0ZpbHRlcjwvY29kZT4uCi0JCQkgKi8KLQkJCUNvbm5lY3Rpb25JdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiAobm9uLUphdmFkb2MpCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiBtYXRjaGVzKGl0ZW0udG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjRHJpdmVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OGQ0MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q29ubmVjdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV2ZW50TGlzdGVuZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjRHJpdmVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIENvbm5lY3Rpb24+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8Q29ubmVjdGlvbj4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPENvbm5lY3Rpb24+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RHJpdmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREcml2ZXIodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RHJpdmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfZHJpdmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RHJpdmVyKGNsYXNzTmFtZSk7CQkJCQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFsbG93VHlwZUNyZWF0aW9uKCkgewotCQkJCS8vRG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgRHJpdmVyIGNsYXNzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzVmZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4KLQkJZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2V4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlTGFiZWwsCi0JCQl0aGlzLmFkZEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlPiBhZGRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPENvbm5lY3Rpb24sIEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ29ubmVjdGlvbi5FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBKZGJjRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU4MWJkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uc1Byb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY0V4Y2x1c2l2ZUNvbm5lY3Rpb25zUHJvcGVydGllc0NvbXBvc2l0ZV9Hcm91cEJveAotCQkpOwotCi0JCS8vIEV4Y2x1c2l2ZSBjb25uZWN0aW9uIG1vZGUKLQkJbmV3IEpkYmNFeGNsdXNpdmVDb25uZWN0aW9uTW9kZUNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCi0JCS8vIExhenkgQ29ubmVjdGlvbgotCQluZXcgSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIodGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPih0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXQ+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZjVmNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjTGF6eUNvbm5lY3Rpb25Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY0xhenlDb25uZWN0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpkYmNMYXp5Q29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9sYXp5Q29ubmVjdGlvbkxhYmVsLAotCQkJdGhpcy5idWlsZExhenlDb25uZWN0aW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGF6eUNvbm5lY3Rpb25TdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRMYXp5Q29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TGF6eUNvbm5lY3Rpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRMYXp5Q29ubmVjdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExhenlDb25uZWN0aW9uU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4odGhpcy5idWlsZERlZmF1bHRMYXp5Q29ubmVjdGlvbkhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbGF6eUNvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX2xhenlDb25uZWN0aW9uTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdExhenlDb25uZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPigKLQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRMYXp5Q29ubmVjdGlvbigpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdExhenlDb25uZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5YTU5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlKFBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuSmRiY1Byb3BlcnRpZXNDb21wb3NpdGVfRWNsaXBzZUxpbmtDb25uZWN0aW9uUG9vbF9Hcm91cEJveAotCQkpOwotCi0JCS8vIENvbm5lY3Rpb24gUHJvcGVydGllcwotCQluZXcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKGNvbnRhaW5lciwgbmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCi0JCS8vIFJlYWQgQ29ubmVjdGlvbgotCQluZXcgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkvLyBXcml0ZSBDb25uZWN0aW9uCi0JCW5ldyBKZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCQkKLQkJdGhpcy5pbnN0YWxsUGFuZUVuYWJsZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIodGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPih0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBQZXJzaXN0ZW5jZVVuaXQ+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjBjOWFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSoKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2VjdGlvblRpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpIC8vZXhhcGFuZGVkCi0JCSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJZGF0YSA9IChHcmlkRGF0YSkgZ2V0Q29udHJvbCgpLmdldExheW91dERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0KLQkJLy8gUmVhZCBDb25uZWN0aW9ucyBTaGFyZWQKLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb25zIE1pbmltdW0KLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBSZWFkIENvbm5lY3Rpb25zIE1heGltdW0KLQkJbmV3IEpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZWE2NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjUmVhZENvbm5lY3Rpb25zTWF4Q29tcG9zaXRlPFQgZXh0ZW5kcyBDb25uZWN0aW9uPiAKLQlleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNSZWFkQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc01heENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkUmVhZENvbm5lY3Rpb25zTWF4Q29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFJlYWRDb25uZWN0aW9uc01heENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNNYXhMYWJlbDsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRSZWFkQ29ubmVjdGlvbnNNYXgoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldFJlYWRDb25uZWN0aW9uc01heCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjNDE1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNSZWFkQ29ubmVjdGlvbnNNaW5Db21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+IAotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmRiY1JlYWRDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjUmVhZENvbm5lY3Rpb25zTWluQ29tcG9zaXRlKAotCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFJlYWRDb25uZWN0aW9uc01pbkNvbWJvKGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRSZWFkQ29ubmVjdGlvbnNNaW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zTWluTGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFJlYWRDb25uZWN0aW9uc01pbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRSZWFkQ29ubmVjdGlvbnNNaW4odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUmVhZENvbm5lY3Rpb25zU2hhcmVkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOWY3MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNSZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFJlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SZWFkQ29ubmVjdGlvbnNTaGFyZWRDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmRiY1JlYWRDb25uZWN0aW9uc1NoYXJlZENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbCwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRSZWFkQ29ubmVjdGlvbnNTaGFyZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFJlYWRDb25uZWN0aW9uc1NoYXJlZCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlYWRDb25uZWN0aW9uc1NoYXJlZFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFJlYWRDb25uZWN0aW9uc1NoYXJlZEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfcmVhZENvbm5lY3Rpb25zU2hhcmVkTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9yZWFkQ29ubmVjdGlvbnNTaGFyZWRMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0UmVhZENvbm5lY3Rpb25zU2hhcmVkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUNvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmZhYTJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBKZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEpkYmNXcml0ZUNvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKAotCQkJCQkJCVBhbmU8VD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc1NlY3Rpb25UaXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSAvL2V4YXBhbmRlZAotCQkpOwotCi0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCWRhdGEgPSAoR3JpZERhdGEpIGdldENvbnRyb2woKS5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuVE9QOwotCi0JCS8vIFRoaXMgd2lsbCBhZGQgc3BhY2UgdG8gaGF2ZSB0aGUgc2FtZSBsYXlvdXQgdGhhbiByZWFkIGNvbm5lY3Rpb24gcG9vbAotCQlCdXR0b24gc3BhY2UgPSB0aGlzLmdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDaGVja0JveChjb250YWluZXIsICJtIik7Ci0JCVBvaW50IHNpemUgPSBzcGFjZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQljb250YWluZXIgPSB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCBzaXplLnkgKyA1KTsKLQkJc3BhY2UuZGlzcG9zZSgpOwotCi0JCS8vIFdyaXRlIENvbm5lY3Rpb25zIE1pbmltdW0KLQkJbmV3IEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlPFQ+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gV3JpdGUgQ29ubmVjdGlvbnMgTWF4aW11bQotCQluZXcgSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNYXhDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQ2OTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWF4Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjV3JpdGVDb25uZWN0aW9uc01heENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRXcml0ZUNvbm5lY3Rpb25zTWF4Q29tYm8oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFdyaXRlQ29ubmVjdGlvbnNNYXhDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88Q29ubmVjdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfd3JpdGVDb25uZWN0aW9uc01heExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIEpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb25uZWN0aW9uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQl0aGlzLnN1YmplY3Quc2V0V3JpdGVDb25uZWN0aW9uc01heCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1dyaXRlQ29ubmVjdGlvbnNNaW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk0MDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEpkYmNXcml0ZUNvbm5lY3Rpb25zTWluQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjV3JpdGVDb25uZWN0aW9uc01pbkNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTxUPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFdyaXRlQ29ubmVjdGlvbnNNaW5Db21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkV3JpdGVDb25uZWN0aW9uc01pbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxDb25uZWN0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl93cml0ZUNvbm5lY3Rpb25zTWluTGFiZWw7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlbHBJZCgpIHsKLQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdyaXRlQ29ubmVjdGlvbnNNaW4oKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXcml0ZUNvbm5lY3Rpb25zTWluKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OYXRpdmVTcWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ5OWJlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vTmF0aXZlU3FsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBOYXRpdmVTcWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIE5hdGl2ZVNxbENvbXBvc2l0ZTxUIGV4dGVuZHMgQ29ubmVjdGlvbj4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYXRpdmVTcWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTmF0aXZlU3FsQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYl9uYXRpdmVTcWxMYWJlbCwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGROYXRpdmVTcWxTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9DT05ORUNUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROYXRpdmVTcWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENvbm5lY3Rpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmF0aXZlU3FsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmF0aXZlU3FsKHZhbHVlKTsKLQkJCX0KLQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYXRpdmVTcWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHROYXRpdmVTcWxIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX25hdGl2ZVNxbExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfbmF0aXZlU3FsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE5hdGl2ZVNxbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXROYXRpdmVTcWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHROYXRpdmVTcWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MjllM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1BlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sQ29ubmVjdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiPFQgZXh0ZW5kcyBDb25uZWN0aW9uPgotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25Db21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDb25uZWN0aW9uVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjNjQ3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8VCBleHRlbmRzIENvbm5lY3Rpb24+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKCBwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENvbm5lY3Rpb25UYWJfdHJhbnNhY3Rpb25UeXBlTGFiZWwsCi0JCQl0aGlzLmFkZFRyYW5zYWN0aW9uVHlwZUNvbWJvKCBjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04KLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGFkZFRyYW5zYWN0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPih0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUodmFsdWUpOwotCi0JCQkJaWYgKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCkgewotCQkJCQljbGVhckpUQVByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNsZWFyUmVzb3VyY2VMb2NhbFByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q29ubmVjdGlvbiwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJKVEFQcm9wZXJ0aWVzKCkgewotCQlnZXRTdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpIHsKLQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKG51bGwpOwotCQljb25uZWN0aW9uLnNldFVzZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UGFzc3dvcmQobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0QmluZFBhcmFtZXRlcnMobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01heChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKG51bGwpOwotCQljb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01heChudWxsKTsKLQkJY29ubmVjdGlvbi5zZXRSZWFkQ29ubmVjdGlvbnNNaW4obnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKG51bGwpOwotCQljb25uZWN0aW9uLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKG51bGwpOwotCQljb25uZWN0aW9uLnNldExhenlDb25uZWN0aW9uKG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXplckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTU1MWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ3VzdG9taXplckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXplckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q3VzdG9taXplckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEN1c3RvbWl6ZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPEVudGl0eT4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEVudGl0eT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgU3RyaW5nPigKLQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gZ2V0U3ViamVjdFBhcmVudCgpLmdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZ2V0U3ViamVjdE5hbWUoKSk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWdldFN1YmplY3RQYXJlbnQoKS5zZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCksIHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3RQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGdldFN1YmplY3ROYW1lKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2N1c3RvbWl6ZXJMYWJlbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0UGFyZW50KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0UGFyZW50KCkuc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihnZXRTdWJqZWN0TmFtZSgpLCBjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua0N1c3RvbWl6ZXIuRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFN1YmplY3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXROYW1lKCk7Ci0JfQotCQotCXByaXZhdGUgQ3VzdG9taXphdGlvbiBnZXRTdWJqZWN0UGFyZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuZ2V0VmFsdWUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTJmMGM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlVW5pdEN1c3RvbWl6YXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZTxUIGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZShQYW5lPFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJc2VjdGlvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTdWJQYW5lKHNlY3Rpb24pOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCi0JCS8vIERlZmF1bHQgcGFuZQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSB0aGlzLmdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIGRlZmF1bHRQYW5lID0gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29tcG9zaXRlLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luCi0JCSk7Ci0KLQkJLy8gV2VhdmluZyBHcm91cAotCQluZXcgV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIFZhbGlkYXRpb24gT25seQotCQluZXcgVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUodGhpcywgZGVmYXVsdFBhbmUpOwotCi0JCS8vIE1hcHBpbmcgRmlsZXMgVmFsaWRhdGUgU2NoZW1hCi0JCW5ldyBWYWxpZGF0ZVNjaGVtYUNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gVGhyb3cgRXhjZXB0aW9ucwotCQluZXcgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIGRlZmF1bHRQYW5lKTsKLQotCQkvLyBFeGNlcHRpb24gSGFuZGxlcgotCQluZXcgRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZSh0aGlzLCBkZWZhdWx0UGFuZSk7Ci0KLQkJLy8gU2Vzc2lvbiBDdXN0b21pemVyCi0JCW5ldyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQotCQl0aGlzLmJ1aWxkRW50aXR5TGlzdENvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCS8vIFByb2ZpbGVyOgotCQluZXcgUHJvZmlsZXJDb21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlMaXN0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IEVudGl0eUxpc3RDb21wb3NpdGUodGhpcywgcGFyZW50KTsgCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhY2QwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVudGl0eUN1c3RvbWl6YXRpb25Qcm9wZXJ0eUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlDdXN0b21pemF0aW9uUHJvcGVydHlDb21wb3NpdGUoUGFuZTxDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBDdXN0b21pemVyCi0JCW5ldyBDdXN0b21pemVyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRW50aXR5TGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzliOGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FbnRpdHlMaXN0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgRW50aXR5TGlzdENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TGlzdENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyOwotCi0JcHVibGljIEVudGl0eUxpc3RDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5lbnRpdHlIb2xkZXIgPSB0aGlzLmJ1aWxkRW50aXR5SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9ncm91cFRpdGxlCi0JCSk7Ci0KLQkJLy8gRW50aXRpZXMgYWRkL3JlbW92ZSBsaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEN1c3RvbWl6YXRpb24+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRFbnRpdGllc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJdGhpcy5idWlsZEVudGl0eUxhYmVsUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCi0JCS8vIEVudGl0eSBDdXN0b21pemF0aW9uIHByb3BlcnR5IHBhbmUKLQkJRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUgPSBuZXcgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXRoaXMuZW50aXR5SG9sZGVyLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKHRoaXMuZW50aXR5SG9sZGVyLCBwYW5lKTsKLQl9Ci0KLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lLkFkYXB0ZXIgYnVpbGRFbnRpdGllc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJRW50aXR5TGlzdENvbXBvc2l0ZS50aGlzLmFkZEVudGl0aWVzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IGdldFN1YmplY3QoKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJRW50aXR5IGVudGl0eUN1c3RvbWl6YXRpb24gPSAoRW50aXR5KSBpdGVtOwotCQkJCQljdXN0b21pemF0aW9uLnJlbW92ZUVudGl0eShlbnRpdHlDdXN0b21pemF0aW9uLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZUVudGl0eSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJaWYgKGVudGl0eU5hbWUgPT0gbnVsbCkgewotCQkJCWVudGl0eU5hbWUgPSB0eXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLmVudGl0eUV4aXN0cyhlbnRpdHlOYW1lKSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLmFkZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZih0aGlzLmdldFN1YmplY3QoKS5lbnRpdHlOYW1lcygpLCBlbnRpdHlOYW1lKTsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbGlzdFNlbGVjdGlvbk1vZGVsLmdldExpc3RNb2RlbCgpLmdldEVsZW1lbnRBdChpbmRleCk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZW50aXR5KTsKLQkJCQl0aGlzLmVudGl0eUhvbGRlci5zZXRWYWx1ZShlbnRpdHkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVudGl0eU5hbWUoU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eShmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJcmV0dXJuIGVudGl0eSAhPSBudWxsID8gZW50aXR5LmdldE5hbWUoKSA6IG51bGw7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgY2hvb3NlRW50aXR5KCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkN1c3RvbWl6YXRpb25FbnRpdHlMaXN0Q29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5DdXN0b21pemF0aW9uRW50aXR5TGlzdENvbXBvc2l0ZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRFbnRpdHlMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUVudGl0eSBlbnRpdHlDdXN0b21pemF0aW9uID0gKEVudGl0eSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZW50aXR5Q3VzdG9taXphdGlvbi5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXR5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHk+KCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxFbnRpdHk+IGJ1aWxkRW50aXRpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEVudGl0eT4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVudGl0eT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmVudGl0aWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5lbnRpdGllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5Q3VzdG9taXphdGlvblByb3BlcnR5Q29tcG9zaXRlIHBhbmUpIHsKLQotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoZW50aXR5SG9sZGVyKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVudGl0eT4gZW50aXR5SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5LCBCb29sZWFuPihlbnRpdHlIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhFbnRpdHkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZW50aXR5TmFtZUlzVmFsaWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0V4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1OWRkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGVyQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RXhjZXB0aW9uSGFuZGxlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbkhhbmRsZXJDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxDdXN0b21pemF0aW9uPiBpbml0aWFsaXplQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8Q3VzdG9taXphdGlvbj4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIFN0cmluZz4oCi0JCQkJCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uRVhDRVBUSU9OX0hBTkRMRVJfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJdGhpcy5zdWJqZWN0LnNldEV4Y2VwdGlvbkhhbmRsZXIodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RXhjZXB0aW9uSGFuZGxlcigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX2V4Y2VwdGlvbkhhbmRsZXJMYWJlbDsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRFeGNlcHRpb25IYW5kbGVyKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfRVhDRVBUSU9OX0hBTkRMRVJfQ0xBU1NfTkFNRTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplQ2xhc3NDaG9vc2VyKGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk1YmMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiSXRlbQotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPFQgZXh0ZW5kcyBDdXN0b21pemF0aW9uPgotCQkJCQkJCQlleHRlbmRzIFBhbmU8VD4KLQkJCQkJCQkJaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJdGhpcy5idWlsZEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZShjb250YWluZXIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT047Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdGl0bGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXlvdXQgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQlsYXlvdXQubWFyZ2luTGVmdCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbkNvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9Qcm9maWxlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlY2QxZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Byb2ZpbGVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogIFByb2ZpbGVyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlckNvbXBvc2l0ZSBleHRlbmRzIENsYXNzQ2hvb3NlckNvbWJvUGFuZTxDdXN0b21pemF0aW9uPgotewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcm9maWxlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUHJvZmlsZXJDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBQcm9maWxlci5nZXRQcm9maWxlckNsYXNzTmFtZSh0aGlzLmdldFN1YmplY3QoKS5nZXRQcm9maWxlcigpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfcHJvZmlsZXJMYWJlbDsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXRQcm9maWxlcigpOwotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFByb2ZpbGVyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5ERUZBVUxUX1BST0ZJTEVSKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFByb2ZpbGVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRQcm9maWxlckhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREaXNwbGF5U3RyaW5nKFN0cmluZyBwcm9maWxlck5hbWUpIHsKLQotCQlzd2l0Y2ggKFByb2ZpbGVyLnZhbHVlT2YocHJvZmlsZXJOYW1lKSkgewotCQkJY2FzZSBub19wcm9maWxlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfbm9fcHJvZmlsZXI7Ci0JCQl9Ci0JCQljYXNlIHBlcmZvcm1hbmNlX3Byb2ZpbGVyOiB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5Qcm9maWxlckNvbXBvc2l0ZV9wZXJmb3JtYW5jZV9wcm9maWxlcjsKLQkJCX0KLQkJCWNhc2UgcXVlcnlfbW9uaXRvcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUHJvZmlsZXJDb21wb3NpdGVfcXVlcnlfbW9uaXRvcjsKLQkJCX0KLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgcHJvZmlsZXIxLCBTdHJpbmcgcHJvZmlsZXIyKSB7Ci0JCQkJcHJvZmlsZXIxID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMSk7Ci0JCQkJcHJvZmlsZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHByb2ZpbGVyMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShwcm9maWxlcjEsIHByb2ZpbGVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkQ2xhc3NDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0cnkgewotCQkJCQlQcm9maWxlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBQcm9maWxlcgotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQodGhpcy5idWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQcm9maWxlcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQcm9maWxlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoUHJvZmlsZXIudmFsdWVzKCkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFByb2ZpbGVyIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5idWlsZFByb2ZpbGVycygpKQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByb2ZpbGVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkUHJvZmlsZXJzQ29sbGVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZFByb2ZpbGVyQ29tcGFyYXRvcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKEN1c3RvbWl6YXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0UHJvZmlsZXIoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0UHJvZmlsZXIoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0JCXJldHVybiBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1NFU1NJT05fUFJPRklMRVJfQ0xBU1NfTkFNRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Nlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Nlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDVjYzhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9TZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuSnB0SnBhRWNsaXBzZUxpbmtVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLS8qKgotICogIFNlc3Npb25DdXN0b21pemVyc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2Vzc2lvbkN1c3RvbWl6ZXJzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbkN1c3RvbWl6ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ3VzdG9taXplcnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFNlc3Npb25DdXN0b21pemVyQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTZXNzaW9uQ3VzdG9taXplcigoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX25vTmFtZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5zZXNzaW9uQ3VzdG9taXplcnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnNlc3Npb25DdXN0b21pemVyc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0Q29tbW9uVWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gRGVzY3JpcHRpb24KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Nlc3Npb25DdXN0b21pemVyTGFiZWwKLQkJKTsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEN1c3RvbWl6YXRpb24+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkQWRhcHRlcigpLAotCQkJYnVpbGRMaXN0SG9sZGVyKCksCi0JCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCQkJCXN1cGVyLmluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0KLQkJCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGFibGUuZ2V0UGFyZW50KCk7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1Rocm93RXhjZXB0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTZhMGJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UaHJvd0V4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGhyb3dFeGNlcHRpb25zQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZFRocm93RXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyb3dFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGhyb3dFeGNlcHRpb25zU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGhyb3dFeGNlcHRpb25zSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl90aHJvd0V4Y2VwdGlvbnNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3Rocm93RXhjZXB0aW9uc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUaHJvd0V4Y2VwdGlvbnNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1ZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjM2NmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRlU2NoZW1hQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGVTY2hlbWFDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGVTY2hlbWFDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGVTY2hlbWFMYWJlbCwKLQkJCXRoaXMuYnVpbGRWYWxpZGF0ZVNjaGVtYUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFZhbGlkYXRlU2NoZW1hU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0NVU1RPTUlaQVRJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFZhbGlkYXRlU2NoZW1hSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uVkFMSURBVEVfU0NIRU1BX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGVTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRWYWxpZGF0ZVNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbGlkYXRlU2NoZW1hU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VmFsaWRhdGVTY2hlbWFIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRlU2NoZW1hTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0ZVNjaGVtYUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRWYWxpZGF0ZVNjaGVtYUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFZhbGlkYXRlU2NoZW1hKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VmFsaWRhdGVTY2hlbWEoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9WYWxpZGF0aW9uT25seUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWE1OTczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9WYWxpZGF0aW9uT25seUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbi5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk9ubHlDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uT25seUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uT25seUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl92YWxpZGF0aW9uT25seUxhYmVsLAotCQkJdGhpcy5idWlsZFZhbGlkYXRpb25Pbmx5SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVmFsaWRhdGlvbk9ubHlTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVmFsaWRhdGlvbk9ubHlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWxpZGF0aW9uT25seSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFZhbGlkYXRpb25Pbmx5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVmFsaWRhdGlvbk9ubHlTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRWYWxpZGF0aW9uT25seUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfdmFsaWRhdGlvbk9ubHlMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3ZhbGlkYXRpb25Pbmx5TGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFZhbGlkYXRpb25Pbmx5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VmFsaWRhdGlvbk9ubHkoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRWYWxpZGF0aW9uT25seSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ2hhbmdlVHJhY2tpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNWIwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdDaGFuZ2VUcmFja2luZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nQ2hhbmdlVHJhY2tpbmdMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0NoYW5nZVRyYWNraW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRXZWF2aW5nQ2hhbmdlVHJhY2tpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRXZWF2aW5nQ2hhbmdlVHJhY2tpbmdIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdDaGFuZ2VUcmFja2luZ0xhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0NoYW5nZVRyYWNraW5nTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFdlYXZpbmdDaGFuZ2VUcmFja2luZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjAxNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLldlYXZpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBXZWF2aW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKCBwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEN1c3RvbWl6YXRpb24sIFdlYXZpbmc+IGFkZFdlYXZpbmdDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxDdXN0b21pemF0aW9uLCBXZWF2aW5nPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZ1tdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFdlYXZpbmcudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdlYXZpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFdlYXZpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoV2VhdmluZyB2YWx1ZSkgewotCQkJCXJldHVybiBidWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBXZWF2aW5nQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV2VhdmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFdlYXZpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShXZWF2aW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFdlYXZpbmcodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KCBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGFiZWwsCi0JCQl0aGlzLmFkZFdlYXZpbmdDb21ibyggY29udGFpbmVyKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdFYWdlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTE2YzljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRWFnZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0VhZ2VyQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nRWFnZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nRWFnZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0VhZ2VyQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdFYWdlckhvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdFYWdlclN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nRWFnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0VhZ2VyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0V2VhdmluZ0VhZ2VyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0VhZ2VyU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0V2VhdmluZ0VhZ2VySG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRWFnZXJMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdFYWdlckxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nRWFnZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0VhZ2VyKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0V2VhdmluZ0VhZ2VyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdGZXRjaEdyb3Vwc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRjMzgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5XZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgV2VhdmluZ0ZldGNoR3JvdXBzQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsLAotCQkJdGhpcy5idWlsZFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZFdlYXZpbmdGZXRjaEdyb3Vwc1N0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFdlYXZpbmdGZXRjaEdyb3Vwc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0V2VhdmluZ0ZldGNoR3JvdXBzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0V2VhdmluZ0ZldGNoR3JvdXBzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkV2VhdmluZ0ZldGNoR3JvdXBzU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0V2VhdmluZ0ZldGNoR3JvdXBzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nRmV0Y2hHcm91cHNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdGZXRjaEdyb3Vwc0xhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRXZWF2aW5nRmV0Y2hHcm91cHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFdlYXZpbmdGZXRjaEdyb3VwcygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlNGQxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ0ludGVybmFsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDdXN0b21pemF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V2VhdmluZ0ludGVybmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdJbnRlcm5hbENvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgQ3VzdG9taXphdGlvbj4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbCwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nSW50ZXJuYWxIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nSW50ZXJuYWxTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfQ1VTVE9NSVpBVElPTgotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkV2VhdmluZ0ludGVybmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdJbnRlcm5hbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFdlYXZpbmdJbnRlcm5hbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFdlYXZpbmdJbnRlcm5hbFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdJbnRlcm5hbEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0ludGVybmFsTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nSW50ZXJuYWxMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0V2VhdmluZ0ludGVybmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFdlYXZpbmdJbnRlcm5hbCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdJbnRlcm5hbCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9XZWF2aW5nTGF6eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdMYXp5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmY2VkNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdMYXp5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFdlYXZpbmdMYXp5Q29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8Q3VzdG9taXphdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldlYXZpbmdMYXp5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFdlYXZpbmdMYXp5Q29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBDdXN0b21pemF0aW9uPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdMYXp5TGFiZWwsCi0JCQl0aGlzLmJ1aWxkV2VhdmluZ0xhenlIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRXZWF2aW5nTGF6eVN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9DVVNUT01JWkFUSU9OCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRXZWF2aW5nTGF6eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFdlYXZpbmdMYXp5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0V2VhdmluZ0xhenkodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRXZWF2aW5nTGF6eVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFdlYXZpbmdMYXp5SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYl93ZWF2aW5nTGF6eUxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWJfd2VhdmluZ0xhenlMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0V2VhdmluZ0xhenlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRXZWF2aW5nTGF6eSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFdlYXZpbmdMYXp5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1dlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkMzhiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBXZWF2aW5nUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgV2VhdmluZ1Byb3BlcnRpZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEN1c3RvbWl6YXRpb24+Ci17Ci0JcHVibGljIFdlYXZpbmdQcm9wZXJ0aWVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIHdlYXZpbmdHcm91cCA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCi0JCQl0aGlzLmFkZFN1YlBhbmUocGFyZW50LCAxMCksCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiX3dlYXZpbmdQcm9wZXJ0aWVzR3JvdXBCb3gKLQkJKTsKLQotCQkvLyBXZWF2aW5nCi0JCW5ldyBXZWF2aW5nQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQkJLy8gV2VhdmluZyBMYXp5Ci0JCW5ldyBXZWF2aW5nTGF6eUNvbXBvc2l0ZSh0aGlzLCB3ZWF2aW5nR3JvdXApOwotCi0JCS8vIFdlYXZpbmcgRmV0Y2ggR3JvdXBzCi0JCW5ldyBXZWF2aW5nRmV0Y2hHcm91cHNDb21wb3NpdGUodGhpcywgd2VhdmluZ0dyb3VwKTsKLQotCQkvLyBXZWF2aW5nIEludGVybmFsCi0JCW5ldyBXZWF2aW5nSW50ZXJuYWxDb21wb3NpdGUodGhpcywgd2VhdmluZ0dyb3VwKTsKLQotCQkvLyBXZWF2aW5nIEVhZ2VyCi0JCW5ldyBXZWF2aW5nRWFnZXJDb21wb3NpdGUodGhpcywgd2VhdmluZ0dyb3VwKTsKLQotCQkvLyBXZWF2aW5nIENoYW5nZSBUcmFja2luZwotCQluZXcgV2VhdmluZ0NoYW5nZVRyYWNraW5nQ29tcG9zaXRlKHRoaXMsIHdlYXZpbmdHcm91cCk7Ci0KLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODNhNGIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZQotCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplSlBBTWFwcGluZ0Rlc2NyaXB0b3JzUGFuZShjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVKYXJGaWxlc1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpQQU1hcHBpbmdEZXNjcmlwdG9yc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9ycywKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9yc19kZXNjcmlwdGlvbgotCQkpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKYXJGaWxlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phckZpbGVzCi0JCSk7Ci0JCQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCQkKLQkJbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YTc0MTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5EZXBsb3ltZW50UGF0aENhbGN1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQotCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yIGJ1aWxkSmFyRmlsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcigpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFY2xpcHNlTGlua0RlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCQlleHRlbmRzIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLk1vZHVsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSkgewotCQkJU3RyaW5nIGJhc2VEZXBsb3ltZW50UGF0aCA9IHN1cGVyLmNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKGZpbGUpOwotCQkJaWYgKEpwdEpwYUNvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KGZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCXJldHVybiAiLi4vIiArIGJhc2VEZXBsb3ltZW50UGF0aDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBiYXNlRGVwbG95bWVudFBhdGg7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2dlbmVyYWwvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWViY2YxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZ2VuZXJhbC9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmdlbmVyYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYWRkTWFwcGluZ0ZpbGVzTGlzdChjb250YWluZXIpOwotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtLAotCQkJdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcigpLAotCQkJdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwKLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmFsUHJvcGVydGllcz4gYnVpbGRHZW5lcmFsUHJvcGVydGllc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIEdlbmVyYWxQcm9wZXJ0aWVzPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEdlbmVyYWxQcm9wZXJ0aWVzIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBwZXJzaXN0ZW5jZVVuaXQpLmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPigKLQkJCWJ1aWxkR2VuZXJhbFByb3BlcnRpZXNIb2xkZXIoKSwKLQkJCUdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sR2VuZXJhbFRhYl9leGNsdWRlRWNsaXBzZWxpbmtPcm1XaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbEdlbmVyYWxUYWJfZXhjbHVkZUVjbGlwc2VsaW5rT3JtOwotCQkJfQotCQl9OwotCX0JCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4oCi0JCQlidWlsZEdlbmVyYWxQcm9wZXJ0aWVzSG9sZGVyKCksCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OGU5ZWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogRWNsaXBzZUxpbmtMb2dnaW5nQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU8VCBleHRlbmRzIExvZ2dpbmc+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQkJQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU2VjdGlvbiBzZWN0aW9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVNlY3Rpb24ocGFyZW50LCBTV1QuRkxBVCB8IEV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSIHwgU2VjdGlvbi5ERVNDUklQVElPTik7Ci0JCXNlY3Rpb24uc2V0VGV4dChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3NlY3Rpb25UaXRsZSk7Ci0JCXNlY3Rpb24uc2V0RGVzY3JpcHRpb24oRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9zZWN0aW9uRGVzY3JpcHRpb24pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShzZWN0aW9uKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCQlzZWN0aW9uLnNldENsaWVudChjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQkJCi0JCS8vIExvZ2dpbmdMZXZlbDoKLQkJbmV3IExvZ2dpbmdMZXZlbENvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCi0JCS8vIEJvb2xlYW4gcHJvcGVydGllcyBncm91cAotCQl0aGlzLmxvZ1Byb3BlcnRpZXNDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQkvLyBMb2dnaW5nRmlsZToKLQkJbmV3IExvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCS8vIExvZ2dlcjoKLQkJbmV3IExvZ2dlckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dQcm9wZXJ0aWVzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBUaW1lc3RhbXA6Ci0JCW5ldyBUaW1lc3RhbXBDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBUaHJlYWQ6Ci0JCW5ldyBUaHJlYWRDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQotCQkvLyBTZXNzaW9uOgotCQluZXcgU2Vzc2lvbkNvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCi0JCS8vIEV4Y2VwdGlvbnM6Ci0JCW5ldyBFeGNlcHRpb25zQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9FeGNlcHRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWEzOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0V4Y2VwdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRXhjZXB0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRXhjZXB0aW9uc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkV4Y2VwdGlvbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRXhjZXB0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9leGNlcHRpb25zTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRXhjZXB0aW9uc0hvbGRlcigpLAotCQkJdGhpcy5idWlsZEV4Y2VwdGlvbnNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19FWENFUFRJT05TCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNlcHRpb25zSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuRVhDRVBUSU9OU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRFeGNlcHRpb25zKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRXhjZXB0aW9uc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEV4Y2VwdGlvbnNIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2V4Y2VwdGlvbnNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RXhjZXB0aW9uc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRFeGNlcHRpb25zKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0RXhjZXB0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnZXJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0MGM1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2VyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogIExvZ2dlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyQ29tcG9zaXRlIGV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dlckNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCWlmICh0aGlzLmdldFN1YmplY3QoKS5nZXRMb2dnZXIoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTG9nZ2VyLkRFRkFVTFRfTE9HR0VSX0NMQVNTX05BTUU7Ci0JCX0KLQkJcmV0dXJuIExvZ2dlci5nZXRMb2dnZXJDbGFzc05hbWUodGhpcy5nZXRTdWJqZWN0KCkuZ2V0TG9nZ2VyKCkpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotICAgIAlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnZXJMYWJlbDsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdXBlckludGVyZmFjZU5hbWUoKSB7Ci0gICAgCXJldHVybiBMb2dnaW5nLkVDTElQU0VMSU5LX0xPR0dFUl9DTEFTU19OQU1FOwotICAgIH0KLSAgICAKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHRoaXMuc3ViamVjdC5nZXRMb2dnZXIoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBMb2dnZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0TG9nZ2VyKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExvZ2dlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5ERUZBVUxUX0xPR0dFUikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBMb2dnZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TG9nZ2VyTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRMb2dnZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhTdHJpbmcgbG9nZ2VyTmFtZSkgewotCi0JCXN3aXRjaCAoTG9nZ2VyLnZhbHVlT2YobG9nZ2VyTmFtZSkpIHsKLQkJCWNhc2UgZGVmYXVsdF9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9kZWZhdWx0X2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2UgamF2YV9sb2dnZXI6IHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dlckNvbXBvc2l0ZV9qYXZhX2xvZ2dlcjsKLQkJCX0KLQkJCWNhc2Ugc2VydmVyX2xvZ2dlcjogewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuTG9nZ2VyQ29tcG9zaXRlX3NlcnZlcl9sb2dnZXI7Ci0JCQl9Ci0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZExvZ2dlckNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBsb2dnZXIxLCBTdHJpbmcgbG9nZ2VyMikgewotCQkJCWxvZ2dlcjEgPSBidWlsZERpc3BsYXlTdHJpbmcobG9nZ2VyMSk7Ci0JCQkJbG9nZ2VyMiA9IGJ1aWxkRGlzcGxheVN0cmluZyhsb2dnZXIyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGxvZ2dlcjEsIGxvZ2dlcjIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZENsYXNzQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJTG9nZ2VyLnZhbHVlT2YodmFsdWUpOwotCQkJCQl2YWx1ZSA9IGJ1aWxkRGlzcGxheVN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBJZ25vcmUgc2luY2UgdGhlIHZhbHVlIGlzIG5vdCBhIExvZ2dlcgotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCUFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBob2xkZXJzID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigyKTsKLQkJaG9sZGVycy5hZGQodGhpcy5idWlsZERlZmF1bHRMb2dnZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZCh0aGlzLmJ1aWxkTG9nZ2Vyc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMb2dnZXJzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8TG9nZ2VyLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihMb2dnZXIudmFsdWVzKCkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKExvZ2dlciBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExvZ2dlcnNDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkTG9nZ2VycygpKQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExvZ2dlcnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZExvZ2dlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTG9nZ2VyQ29tcGFyYXRvcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKExvZ2dpbmcgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0TG9nZ2VyKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMuZ2V0U3ViamVjdCgpLnNldExvZ2dlcihjbGFzc05hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2ZWMwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRmlsZUNob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBMb2dnaW5nRmlsZUxvY2F0aW9uQ29tcG9zaXRlIAotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQlwdWJsaWMgTG9nZ2luZ0ZpbGVMb2NhdGlvbkNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRmlsZUNob29zZXJDb21ib1BhbmU8TG9nZ2luZz4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIFN0cmluZz4oCi0JCQkJCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0TG9nRmlsZUxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRMb2dGaWxlTG9jYXRpb24odmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKExvZ2dpbmcgc3ViamVjdCkgewotCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRMb2dGaWxlTG9jYXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJCQlkZWZhdWx0VmFsdWUKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldERlZmF1bHRTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2RlZmF1bHRTdGRvdXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREaWFsb2dUaXRsZSgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLkxvZ2dpbmdGaWxlTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nVGl0bGU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfbG9nZ2luZ0ZpbGVMYWJlbDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RQYXRoKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ0xldmVsQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMTA0ODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5sb2dnaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZ0xldmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogTG9nZ2luZ0xldmVsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnaW5nTGV2ZWxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPExvZ2dpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2dnaW5nTGV2ZWxDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvZ2dpbmdMZXZlbENvbXBvc2l0ZSgKLQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZywgTG9nZ2luZ0xldmVsPiBhZGRMb2dnaW5nTGV2ZWxDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxMb2dnaW5nLCBMb2dnaW5nTGV2ZWw+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nLkxFVkVMX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gTG9nZ2luZ0xldmVsLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9nZ2luZ0xldmVsIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdExldmVsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKExvZ2dpbmdMZXZlbCB2YWx1ZSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkRGlzcGxheVN0cmluZyhFY2xpcHNlTGlua1VpTWVzc2FnZXMuY2xhc3MsIExvZ2dpbmdMZXZlbENvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvZ2dpbmdMZXZlbCBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0TGV2ZWwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShMb2dnaW5nTGV2ZWwgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRMZXZlbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9sb2dnaW5nTGV2ZWxMYWJlbCwKLQkJCQl0aGlzLmFkZExvZ2dpbmdMZXZlbENvbWJvKGNvbnRhaW5lciksCi0JCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX0xFVkVMCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1BlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2IyN2Q4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiPFQgZXh0ZW5kcyBMb2dnaW5nPgotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU8VD4odGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkc7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aXRsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1Nlc3Npb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q5OGUwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvU2Vzc2lvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBTZXNzaW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBMb2dnaW5nPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3Nlc3Npb25MYWJlbCwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvblN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX1NFU1NJT04KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlc3Npb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2Vzc2lvbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNlc3Npb24odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZXNzaW9uU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0U2Vzc2lvbkhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfc2Vzc2lvbkxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRTZXNzaW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUxvZ2dpbmcuU0VTU0lPTl9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNlc3Npb24oKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlZmF1bHRTZXNzaW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGhyZWFkQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzJjN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9sb2dnaW5nL1RocmVhZENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaHJlYWRDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRocmVhZENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRocmVhZENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUaHJlYWRDb21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmc+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQl0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGhyZWFkSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGhyZWFkU3RyaW5nSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX0xPR0dJTkdfVEhSRUFECi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJlYWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaHJlYWQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRUaHJlYWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUaHJlYWRTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRUaHJlYWRIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX3RocmVhZExhYmVsRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGhyZWFkTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFRocmVhZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nLlRIUkVBRF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFRocmVhZCgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFRocmVhZCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvbG9nZ2luZy9UaW1lc3RhbXBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlODNiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2xvZ2dpbmcvVGltZXN0YW1wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRpbWVzdGFtcENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGltZXN0YW1wQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGltZXN0YW1wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRpbWVzdGFtcENvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbCwKLQkJCXRoaXMuYnVpbGRUaW1lc3RhbXBIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUaW1lc3RhbXBTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfTE9HR0lOR19USU1FU1RBTVAKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFRpbWVzdGFtcCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpbWVzdGFtcFN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFRpbWVzdGFtcEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWJfdGltZXN0YW1wTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl90aW1lc3RhbXBMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0VGltZXN0YW1wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxMb2dnaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUxvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGltZXN0YW1wKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGltZXN0YW1wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTM3MmZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlPFQgZXh0ZW5kcyBPcHRpb25zPiBleHRlbmRzIFBhbmU8VD4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlKAotCQkJCQlQYW5lPFQ+IHN1YmplY3RIb2xkZXIsIAotCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlc3Npb25PcHRpb25zUGFuZShwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlc3Npb25PcHRpb25zUGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLmFkZFNlY3Rpb24ocGFyZW50LCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3Nlc3Npb25TZWN0aW9uVGl0bGUsCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uU2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJCi0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBTZXNzaW9uTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCi0JCW5ldyBTZXNzaW9uc1htbENvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IFRhcmdldERhdGFiYXNlQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgVGFyZ2V0U2VydmVyQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQluZXcgRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJbmV3IEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7CQotCQkKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lci5nZXRQYXJlbnQoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gdGhpcy5hZGRTZWN0aW9uKGNvbnRhaW5lciwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfbWlzY2VsbGFuZW91c1NlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCQotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZSk7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29tcG9zaXRlLmdldFBhcmVudCgpKTsKLQotCQluZXcgVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI5ZDgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FdmVudExpc3RlbmVyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEV2ZW50TGlzdGVuZXJDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FdmVudExpc3RlbmVyQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRXZlbnRMaXN0ZW5lckNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc0Nob29zZXJQYW5lPE9wdGlvbnM+IGluaXRpYWxpemVDbGFzc0Nob29zZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2xhc3NDaG9vc2VyUGFuZTxPcHRpb25zPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPigKLQkJCQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5TRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFdmVudExpc3RlbmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRFdmVudExpc3RlbmVyKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9ldmVudExpc3RlbmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RXZlbnRMaXN0ZW5lcihjbGFzc05hbWUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQkJCXJldHVybiBPcHRpb25zLkVDTElQU0VMSU5LX0VWRU5UX0xJU1RFTkVSX0NMQVNTX05BTUU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9JbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjM2MwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbCwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNTdHJpbmdIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUwotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc1N0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWJfaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRmYTlmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxUIGV4dGVuZHMgT3B0aW9ucz4KLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwgCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTxUPih0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogSnBhUGFnZUNvbXBvc2l0ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHBJRCgpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OUzsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RpdGxlOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzk3ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1Nlc3Npb25OYW1lQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2Vzc2lvbk5hbWVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25OYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vzc2lvbk5hbWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFNlc3Npb25OYW1lQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX05BTUUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbk5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRTZXNzaW9uTmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbk5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uTmFtZSwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbk5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2Vzc2lvbk5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfT1BUSU9OU19TRVNTSU9OX05BTUUKLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvU2Vzc2lvbnNYbWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE5OWI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TZXNzaW9uc1htbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFNlc3Npb25zWG1sQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uc1htbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlc3Npb25zWG1sQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBTZXNzaW9uc1htbENvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgT3B0aW9ucz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OU19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gU2Vzc2lvbnNYbWxDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlc3Npb25zWG1sRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMuU0VTU0lPTlNfWE1MX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0U2Vzc2lvbnNYbWwoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBTZXNzaW9uc1htbENvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRTZXNzaW9uc1htbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKE9wdGlvbnMgc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0U2Vzc2lvbnNYbWwoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl9zZXNzaW9uc1htbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0U2Vzc2lvbnNYbWxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZXNzaW9uc1htbEZpbGVOYW1lSG9sZGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlNfU0VTU0lPTlNfWE1MCi0JCSk7Ci0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldERhdGFiYXNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhMzg5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL29wdGlvbnMvVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXREYXRhYmFzZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIE9wdGlvbnM+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5ERUZBVUxUX1RBUkdFVF9EQVRBQkFTRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXREYXRhYmFzZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdFRhcmdldERhdGFiYXNlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldERhdGFiYXNlTmFtZSkgewotCQkKLQkJcmV0dXJuIFNXVFV0aWwuYnVpbGREaXNwbGF5U3RyaW5nKAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCAKLQkJCXRoaXMuZ2V0Q2xhc3MoKSwgCi0JCQlUYXJnZXREYXRhYmFzZS52YWx1ZU9mKHRhcmdldERhdGFiYXNlTmFtZSkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgdGFyZ2V0RGF0YWJhc2UxLCBTdHJpbmcgdGFyZ2V0RGF0YWJhc2UyKSB7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UxID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMSk7Ci0JCQkJdGFyZ2V0RGF0YWJhc2UyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldERhdGFiYXNlMik7Ci0JCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0YXJnZXREYXRhYmFzZTEsIHRhcmdldERhdGFiYXNlMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGFyZ2V0RGF0YWJhc2UudmFsdWVPZih2YWx1ZSk7Ci0JCQkJCXZhbHVlID0gYnVpbGREaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElnbm9yZSBzaW5jZSB0aGUgdmFsdWUgaXMgbm90IGEgVGFyZ2V0RGF0YWJhc2UKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSBzdWJqZWN0LmdldFRhcmdldERhdGFiYXNlKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0RGF0YWJhc2VDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0VGFyZ2V0RGF0YWJhc2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXREYXRhYmFzZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFyZ2V0RGF0YWJhc2VzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGhvbGRlcnMpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldERhdGFiYXNlLCBTdHJpbmc+KENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihUYXJnZXREYXRhYmFzZS52YWx1ZXMoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oVGFyZ2V0RGF0YWJhc2UgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXREYXRhYmFzZXNDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQlDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihidWlsZFRhcmdldERhdGFiYXNlcygpKQotCQkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldERhdGFiYXNlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZFRhcmdldERhdGFiYXNlc0NvbGxlY3Rpb25Ib2xkZXIoKSwKLQkJCWJ1aWxkVGFyZ2V0RGF0YWJhc2VDb21wYXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoT3B0aW9ucyBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRUYXJnZXREYXRhYmFzZSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RhcmdldERhdGFiYXNlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0RGF0YWJhc2VIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRUYXJnZXREYXRhYmFzZUNvbnZlcnRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TX1RBUkdFVF9EQVRBQkFTRQotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RhcmdldFNlcnZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTMxNjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UYXJnZXRTZXJ2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqICBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldFNlcnZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3B0aW9ucz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhcmdldFNlcnZlckNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGFyZ2V0U2VydmVyQ29tcG9zaXRlKAotCQkJCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zLkRFRkFVTFRfVEFSR0VUX1NFUlZFUikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBUYXJnZXRTZXJ2ZXJDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFRhcmdldFNlcnZlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0U2VydmVySG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERpc3BsYXlTdHJpbmcoU3RyaW5nIHRhcmdldFNlcnZlck5hbWUpIHsKLQkJCi0JCXJldHVybiBTV1RVdGlsLmJ1aWxkRGlzcGxheVN0cmluZygKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgCi0JCQl0aGlzLmdldENsYXNzKCksIAotCQkJVGFyZ2V0U2VydmVyLnZhbHVlT2YodGFyZ2V0U2VydmVyTmFtZSkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHRhcmdldFNlcnZlcjEsIFN0cmluZyB0YXJnZXRTZXJ2ZXIyKSB7Ci0JCQkJdGFyZ2V0U2VydmVyMSA9IGJ1aWxkRGlzcGxheVN0cmluZyh0YXJnZXRTZXJ2ZXIxKTsKLQkJCQl0YXJnZXRTZXJ2ZXIyID0gYnVpbGREaXNwbGF5U3RyaW5nKHRhcmdldFNlcnZlcjIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodGFyZ2V0U2VydmVyMSwgdGFyZ2V0U2VydmVyMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQkJCXRyeSB7Ci0JCQkJCVRhcmdldFNlcnZlci52YWx1ZU9mKHZhbHVlKTsKLQkJCQkJdmFsdWUgPSBidWlsZERpc3BsYXlTdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gSWdub3JlIHNpbmNlIHRoZSB2YWx1ZSBpcyBub3QgYSBUYXJnZXRTZXJ2ZXIKLQkJCQl9Ci0JCQkJcmV0dXJuIHZhbHVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhcmdldFNlcnZlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9ucywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0VGFyZ2V0U2VydmVyKCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0U2VydmVyQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHN1YmplY3QpLmVxdWFscyh2YWx1ZSkpIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldFRhcmdldFNlcnZlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZFRhcmdldFNlcnZlcnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRhcmdldFNlcnZlciwgU3RyaW5nPihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoVGFyZ2V0U2VydmVyLnZhbHVlcygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShUYXJnZXRTZXJ2ZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUYXJnZXRTZXJ2ZXJzQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYnVpbGRUYXJnZXRTZXJ2ZXJzKCkpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFyZ2V0U2VydmVyc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQlidWlsZFRhcmdldFNlcnZlcnNDb2xsZWN0aW9uSG9sZGVyKCksCi0JCQlidWlsZFRhcmdldFNlcnZlckNvbXBhcmF0b3IoKQotCQkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShPcHRpb25zIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldFNlcnZlcigpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90YXJnZXRTZXJ2ZXJMYWJlbCwKLQkJCXRoaXMuYnVpbGRUYXJnZXRTZXJ2ZXJMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0U2VydmVySG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkVGFyZ2V0U2VydmVyQ29udmVydGVyKCksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX09QVElPTlNfVEFSR0VUX1NFUlZFUgotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihjb21ibyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9vcHRpb25zL1RlbXBvcmFsTXV0YWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkzYTgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvb3B0aW9ucy9UZW1wb3JhbE11dGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBUZW1wb3JhbE11dGFibGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnM+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZW1wb3JhbE11dGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVGVtcG9yYWxNdXRhYmxlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBPcHRpb25zPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsLAotCQkJdGhpcy5idWlsZFRlbXBvcmFsTXV0YWJsZUhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRlbXBvcmFsTXV0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9PUFRJT05TCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUZW1wb3JhbE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGVtcG9yYWxNdXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGVtcG9yYWxNdXRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGVtcG9yYWxNdXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0VGVtcG9yYWxNdXRhYmxlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYl90ZW1wb3JhbE11dGFibGVMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX3RlbXBvcmFsTXV0YWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRUZW1wb3JhbE11dGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0VGVtcG9yYWxNdXRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0VGVtcG9yYWxNdXRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9DcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWM5Y2MzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vQ3JlYXRlRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNyZWF0ZURkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgU2NoZW1hR2VuZXJhdGlvbj4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fQ1JFQVRFX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdENyZWF0ZURkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDcmVhdGVEZGxGaWxlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQlTdHJpbmcgbmFtZSA9IHN1YmplY3QuZ2V0Q3JlYXRlRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldERlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDcmVhdGVGaWxlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKFNjaGVtYUdlbmVyYXRpb24gc3ViamVjdCkgewotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0Q3JlYXRlRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfY3JlYXRlRGRsRmlsZU5hbWVMYWJlbCwKLQkJCXRoaXMuYnVpbGREZWZhdWx0Q3JlYXRlRGRsRmlsZU5hbWVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkQ3JlYXRlRGRsRmlsZU5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxZmUwMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkZvbGRlckNob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci17Ci0JcHVibGljIERkbEdlbmVyYXRpb25Mb2NhdGlvbkNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZTxTY2hlbWFHZW5lcmF0aW9uPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hR2VuZXJhdGlvbiwgU3RyaW5nPigKLQkJCQkJCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0KLQkJCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCk7Ci0JCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZShzdWJqZWN0KTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuYW1lOwotCQkJCQl9Ci0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCQkJaWYgKGRlZmF1bHRWYWx1ZShzdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCQkJfQotCQkJCQkJc3ViamVjdC5zZXRBcHBsaWNhdGlvbkxvY2F0aW9uKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZShTY2hlbWFHZW5lcmF0aW9uIHN1YmplY3QpIHsKLQkJCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gc3ViamVjdC5nZXREZWZhdWx0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCWRlZmF1bHRWYWx1ZQotCQkJCQkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFN0cmluZygpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGVmYXVsdERvdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ01lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5EZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGVfZGlhbG9nTWVzc2FnZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuRGRsR2VuZXJhdGlvbkxvY2F0aW9uQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX2RkbEdlbmVyYXRpb25Mb2NhdGlvbkxhYmVsOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwNjdiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0RkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZQotCWV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERkbEdlbmVyYXRpb25UeXBlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPiBhZGREZGxHZW5lcmF0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFNjaGVtYUdlbmVyYXRpb24sIERkbEdlbmVyYXRpb25UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBEZGxHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRGRsR2VuZXJhdGlvblR5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRGRsR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBEZGxHZW5lcmF0aW9uVHlwZUNvbXBvc2l0ZS50aGlzLCB2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERkbEdlbmVyYXRpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZGxHZW5lcmF0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKERkbEdlbmVyYXRpb25UeXBlIHZhbHVlKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RGRsR2VuZXJhdGlvblR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZGRsR2VuZXJhdGlvblR5cGVMYWJlbCwKLQkJCWFkZERkbEdlbmVyYXRpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlFY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1NDSEVNQV9HRU5FUkFUSU9OCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTlmY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9Ecm9wRGRsRmlsZU5hbWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIERyb3BEZGxGaWxlTmFtZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RHJvcERkbEZpbGVOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUoCi0JCQkJCQkJCVBhbmU8PyBleHRlbmRzIFNjaGVtYUdlbmVyYXRpb24+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uREVGQVVMVF9TQ0hFTUFfR0VORVJBVElPTl9EUk9QX0ZJTEVfTkFNRSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0RHJvcERkbEZpbGVOYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gc3ViamVjdC5nZXREcm9wRmlsZU5hbWUoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUudGhpcy5nZXREZWZhdWx0VmFsdWUoc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXN1YmplY3Quc2V0RHJvcEZpbGVOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoU2NoZW1hR2VuZXJhdGlvbiBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHREcm9wRmlsZU5hbWUoKTsKLQotCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCQl9Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tYm8gY29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfZHJvcERkbEZpbGVOYW1lTGFiZWwsCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdERyb3BEZGxGaWxlTmFtZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGREcm9wRGRsRmlsZU5hbWVIb2xkZXIoKSwKLQkJCUVjbGlwc2VMaW5rSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfU0NIRU1BX0dFTkVSQVRJT04KLQkJKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKGNvbWJvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9FY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhM2Q0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0VjbGlwc2VMaW5rU2NoZW1hR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1NjaGVtYUdlbmVyYXRpb25Db21wb3NpdGUKLQlleHRlbmRzIFBhbmU8U2NoZW1hR2VuZXJhdGlvbj4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWJfc2VjdGlvblRpdGxlLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYl9zZWN0aW9uRGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBEREwgR2VuZXJhdGlvbiBUeXBlOgotCQluZXcgRGRsR2VuZXJhdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gT3V0cHV0IE1vZGU6Ci0JCW5ldyBPdXRwdXRNb2RlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCS8vIERETCBHZW5lcmF0aW9uIExvY2F0aW9uCi0JCW5ldyBEZGxHZW5lcmF0aW9uTG9jYXRpb25Db21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJLy8gQ3JlYXRlIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBDcmVhdGVEZGxGaWxlTmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQkvLyBEcm9wIERETCBGaWxlIE5hbWU6Ci0JCW5ldyBEcm9wRGRsRmlsZU5hbWVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9PdXRwdXRNb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllY2RkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL091dHB1dE1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua0hlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBPdXRwdXRNb2RlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBPdXRwdXRNb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxTY2hlbWFHZW5lcmF0aW9uPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3V0cHV0TW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3V0cHV0TW9kZUNvbXBvc2l0ZSgKLQkJCQlQYW5lPD8gZXh0ZW5kcyBTY2hlbWFHZW5lcmF0aW9uPiBwYXJlbnRDb21wb3NpdGUsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4gYWRkQnVpbGRPdXRwdXRNb2RlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8U2NoZW1hR2VuZXJhdGlvbiwgT3V0cHV0TW9kZT4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPdXRwdXRNb2RlW10gZ2V0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gT3V0cHV0TW9kZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKE91dHB1dE1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERpc3BsYXlTdHJpbmcoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBPdXRwdXRNb2RlQ29tcG9zaXRlLnRoaXMsIHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3V0cHV0TW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0T3V0cHV0TW9kZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKE91dHB1dE1vZGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRPdXRwdXRNb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX291dHB1dE1vZGVMYWJlbCwKLQkJCQl0aGlzLmFkZEJ1aWxkT3V0cHV0TW9kZUNvbWJvKGNvbnRhaW5lciksCi0JCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1BlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NjZjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFBlcnNpc3RlbmNlWG1sU2NoZW1hR2VuZXJhdGlvblRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiCi0JZXh0ZW5kcyBQYW5lPFNjaGVtYUdlbmVyYXRpb24+Ci0JaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFNjaGVtYUdlbmVyYXRpb25UYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtTY2hlbWFHZW5lcmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9TQ0hFTUFfR0VORVJBVElPTjsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxTY2hlbWFHZW5lcmF0aW9uVGFiX3RpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViNDc1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BlcnNpc3RlbmNleG1sL2RldGFpbHMvRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZXhtbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWV4dGVuZHMgR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciA9IAotCQkJKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQkKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIAotCQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVuY2VVbml0LCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJTGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+PigpOwotCQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRPcm1YbWxDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZEltcGxpZWRNYXBwaW5nRmlsZUN2bSgpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZFBlcnNpc3RlbnRUeXBlQ3ZtKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRKYXJGaWxlQ3ZtKCkpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+LCBKcGFDb250ZXh0Tm9kZT4obGlzdCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWFwcGluZ0ZpbGU+IGJ1aWxkSW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlPigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBpbmdGaWxlUmVmLCBNYXBwaW5nRmlsZT4oCi0JCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LklNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKLQkJCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTWFwcGluZ0ZpbGVSZWYuTUFQUElOR19GSUxFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRNYXBwaW5nRmlsZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2V4bWwvZGV0YWlscy9FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwODA3ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZXhtbC9kZXRhaWxzL0VjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNleG1sLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBFY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlleHRlbmRzIEdlbmVyaWNOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2N2RmM2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGRsZ2VuLkVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpCi0JZXh0ZW5kcyBCYXNlSnBhUGxhdGZvcm1VaQotewotCXB1YmxpYyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWkoCi0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyLAotCQlKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgcGxhdGZvcm1VaVByb3ZpZGVyKSAKLQl7Ci0JCXN1cGVyKG5hdmlnYXRvclByb3ZpZGVyLCBwbGF0Zm9ybVVpUHJvdmlkZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaS5nZW5lcmF0ZShwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MmUyMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9wbGF0Zm9ybS9FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYxNDUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua0pwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3BsYXRmb3JtL0VjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGM1NzU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvcGxhdGZvcm0vRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlscy5FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2V4bWwuZGV0YWlscy5FY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotLyoqCi0gKiBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyIGltcGxlbWVudHMgSnBhTmF2aWdhdG9yUHJvdmlkZXIKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE2NzkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgotCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IE9ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDQxMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWV4dGVuZHMgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCUBPdmVycmlkZQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0KSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsJCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIAotCQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVuY2VVbml0LCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVDdm0gPSAKLQkJCQluZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxNYXBwaW5nRmlsZVJlZj4oCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNULAotCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxNYXBwaW5nRmlsZVJlZj4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3Quc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBpbXBsaWVkTWFwcGluZ0ZpbGVDdm0gPSAKLQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAotCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlQ3ZtID0gCi0JCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LklNUExJRURfRUNMSVBTRUxJTktfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwKLQkJCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJKTsKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc0N2bSA9IAotCQkJCW5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPigKLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX0NMQVNTX1JFRlNfTElTVCwKLQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LnNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+IGltcGxpZWRDbGFzc0N2bSA9IAotCQkJCW5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIENsYXNzUmVmPigKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX0NMQVNTX1JFRlNfQ09MTEVDVElPTiwKLQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxDbGFzc1JlZj4gaXRlcmF0b3JfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuaW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pig0KTsKLQkJCWxpc3QuYWRkKHNwZWNpZmllZE1hcHBpbmdGaWxlQ3ZtKTsKLQkJCWxpc3QuYWRkKGltcGxpZWRNYXBwaW5nRmlsZUN2bSk7Ci0JCQlsaXN0LmFkZChpbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZUN2bSk7Ci0JCQlsaXN0LmFkZChzcGVjaWZpZWRDbGFzc0N2bSk7Ci0JCQlsaXN0LmFkZChpbXBsaWVkQ2xhc3NDdm0pOwotCQkJCi0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiwgSnBhU3RydWN0dXJlTm9kZT4obGlzdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3N0cnVjdHVyZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzNlNmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFTdHJ1Y3R1cmVQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVN0cnVjdHVyZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNmE2MzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1JZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmI2MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDFfMVVpRmFjdG9yeSBleHRlbmRzIEJhc2VFY2xpcHNlTGlua09ybVhtbFVpRmFjdG9yeQotewotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE1M2YxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklNYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM1ZGIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nMV8xQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3NGU2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzFfMUNvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nQ29tcG9zaXRlPEJhc2ljTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rMV8xT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2ljTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzMjJjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJCXRoaXMsCi0JCQkJY29udGFpbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRJZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkMTdjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZE1hcHBpbmcxXzFDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUwNTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxJZE1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMV8xQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCQotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkTXV0YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPElkTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1YjUzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3JkZXJpbmdDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWNhNWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgVGFyZ2V0RW50aXR5Q29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9wdGlvbmFsQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5NYW55VG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwkJCi0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMV8xQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDIyMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzFfMUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb01hbnlNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcxXzFDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM2ZmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNhc2NhZGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFwcGVkQnlQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgQ2FzY2FkZUNvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZQotICogQHNlZSBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTWFwcGVkQnlQYW5lCi0gKiBAc2VlIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMV8xQ29tcG9zaXRlCi1leHRlbmRzIEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VsaW5rMV8xT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU9uZVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzFfMUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGUodGhpcywgYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9PbmVNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmMmZiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzFfMUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua011dGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcxXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmVyc2lvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVyc2lvbk1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGY3N2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua0pwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBFY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM5YmEwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzEvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGQ4NjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsxXzJKYXZhVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NjYyZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySmF2YVVpRmFjdG9yeSBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVVpRmFjdG9yeQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8yQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NjZmNhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VtYmVkZGFibGUxXzJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBFbWJlZGRhYmxlVWlQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZTFfMkNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlMV8yQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbnZlcnRlcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplQWR2YW5jZWRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBBY2Nlc3NIb2xkZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3NjkzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VudGl0eTFfMkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluazEuMiBKYXZhIGVudGl0eS4KLSAqCi0gKiBAc2VlIEphdmFFY2xpcHNlTGlua0VudGl0eQotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rRW50aXR5MV8yQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua0VudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtKYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkxXzJDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXR5U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYWJsZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRW50aXR5TmFtZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwkKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsJCi0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MxXzJDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMjRhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MxXzJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBFY2xpcHNlTGluayBKYXZhIE1hcHBlZCBTdXBlcmNsYXNzLgotICoKLSAqIEBzZWUgRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMV8yQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczFfMkNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjVlMjUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDFfMlVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZS5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sVWlGYWN0b3J5IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMzgxZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92MV8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBsYXRmb3JtLkVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YxXzIvcGxhdGZvcm0vRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzMxYThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjFfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIucGxhdGZvcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMi5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsxXzJKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMV8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazFfMkpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMV8ySmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGRsZ2VuL3dpemFyZHMvRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RkbGdlbi93aXphcmRzL0VjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEzNWU3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGRsZ2VuL3dpemFyZHMvRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZGxnZW4ud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMC5kZGxnZW4uRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZGxnZW4uRWNsaXBzZUxpbmtERExHZW5lcmF0b3JVaTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaSBleHRlbmRzIEVjbGlwc2VMaW5rRERMR2VuZXJhdG9yVWkKLXsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCW5ldyBFY2xpcHNlTGluazJfMERETEdlbmVyYXRvclVpKHByb2plY3QpLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaShKcGFQcm9qZWN0IHByb2plY3QpIHsKLQkJc3VwZXIocHJvamVjdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV29ya3NwYWNlSm9iIGJ1aWxkR2VuZXJhdGVERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdGUyXzBERExKb2IocHVOYW1lLCBwcm9qZWN0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJ1bm5hYmxlICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR2VuZXJhdGUyXzBERExKb2IgZXh0ZW5kcyBFY2xpcHNlTGlua0RETEdlbmVyYXRvclVpLkdlbmVyYXRlRERMSm9iIHsKLQotCQlwdWJsaWMgR2VuZXJhdGUyXzBERExKb2IoU3RyaW5nIHB1TmFtZSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlzdXBlcihwdU5hbWUsIHByb2plY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRkbEdlbmVyYXRvckdlbmVyYXRlKFN0cmluZyBwdU5hbWUsIEpwYVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlFY2xpcHNlTGluazJfMERETEdlbmVyYXRvci5nZW5lcmF0ZShwdU5hbWUsIHByb2plY3QsIG1vbml0b3IpOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODY2MTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0V4cGlyeUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rVWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlciA9IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCk7Ci0JCQotCQkvL1NoYXJlZCBDaGVjayBib3gsIHVuY2hlY2sgdGhpcyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBhbmVsIGlzIGRpc2FibGVkCi0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA4KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbCwKLQkJCWJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlSG9sZGVyKGNhY2hlYWJsZUhvbGRlciksCi0JCQlidWlsZENhY2hlYWJsZVN0cmluZ0hvbGRlcihjYWNoZWFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0NBQ0hFQUJMRQotCQkpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KTsKLQotCQlDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQkKLQkJcGFuZXMuYWRkKG5ldyBFY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZSh0aGlzLCBzdWJQYW5lKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUodGhpcywgc3ViUGFuZSkpOwotCQkKLQkJLy8gQWR2YW5jZWQgc3ViLXBhbmUKLQkJQ29tcG9zaXRlIGFkdmFuY2VkU2VjdGlvbiA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCXN1YlBhbmUsCi0JCQlFY2xpcHNlTGlua1VpRGV0YWlsc01lc3NhZ2VzLkVjbGlwc2VMaW5rQ2FjaGluZ0NvbXBvc2l0ZV9hZHZhbmNlZCwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQotCQlpbml0aWFsaXplQWR2YW5jZWRQYW5lKGFkZFN1YlBhbmUoYWR2YW5jZWRTZWN0aW9uLCAwLCAxNiksIHBhbmVzKTsKLQkJCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRDYWNoZWFibGVFbmFibGVyKGNhY2hlYWJsZUhvbGRlciksIHBhbmVzKTsKLQkJCi0JCWluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShhZGRTdWJQYW5lKGNvbnRhaW5lciwgOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gYnVpbGRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVjbGlwc2VMaW5rQ2FjaGluZywgQ2FjaGVhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlYWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUFkdmFuY2VkUGFuZShDb21wb3NpdGUgY29udGFpbmVyLCBDb2xsZWN0aW9uPFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtFeHBpcnlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikpOwotCQlwYW5lcy5hZGQobmV3IEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JCXBhbmVzLmFkZChuZXcgRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KTsKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhY2hlYWJsZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gY2FjaGVhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQkJY2FjaGVhYmxlSG9sZGVyLAotCQkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLCAKLQkJCQlDYWNoZWFibGUyXzAuREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNDYWNoZWFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQkKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoZWFibGUyXzAsIEJvb2xlYW4+KGNhY2hlYWJsZUhvbGRlciwgQ2FjaGVhYmxlMl8wLlNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRDYWNoZWFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDYWNoZWFibGVTdHJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlYWJsZTJfMD4gY2FjaGVhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoY2FjaGVhYmxlSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbnRpdHlfY2FjaGVhYmxlV2l0aERlZmF1bHRMYWJlbCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0Q2FjaGVhYmxlSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGNhY2hlYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoZWFibGUyXzAsIEJvb2xlYW4+KAotCQkJY2FjaGVhYmxlSG9sZGVyLAotCQkJQ2FjaGVhYmxlMl8wLlNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFksCi0JCQlDYWNoZWFibGUyXzAuREVGQVVMVF9DQUNIRUFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxNzgwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVWlGYWN0b3J5IGJ1aWxkSmF2YVVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtCYXNpY0NvbGxlY3Rpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0KLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248Pz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0SmF2YUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9FY2xpcHNlTGluazJfMEphdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3ZDEwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazFfMkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYTIuZGV0YWlscy5qYXZhLkphdmFVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMEpwYVVpRmFjdG9yeQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5Ci0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMkphdmFVaUZhY3RvcnkKLQlpbXBsZW1lbnRzIEphdmFVaUZhY3RvcnkyXzAKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YmFiZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Fsd2F5c1JlZnJlc2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVTaXplQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0NhY2hlVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtEaXNhYmxlSGl0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGU8SmF2YUVjbGlwc2VMaW5rQ2FjaGluZz4KLXsKLQotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFY2xpcHNlTGlua0NhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0NvbXBvc2l0ZSh0aGlzLCBwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkOTYwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlRhcmdldENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0Q2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSh0aGlzLCBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDk3YTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5HZW5lcmF0aW9uMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGFuIEVjbGlwc2VMaW5rMS4xIEphdmEgZW50aXR5LgotICoKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Ci0gKiBAc2VlIEVjbGlwc2VsaW5rSnBhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGlua0phdmFFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5KYXZhRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7CQotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRvcnNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckNvbnRhaW5lckhvbGRlcikgewotCQluZXcgR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IFF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMmE1NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0lkTWFwcGluZ0NvbXBvc2l0ZTxKYXZhSWRNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rTXV0YWJsZUNvbXBvc2l0ZSh0aGlzLCBidWlsZE11dGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmY2UzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFJZE1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24KLQlleHRlbmRzIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUlkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFY2xpcHNlTGlua0lkTWFwcGluZzJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkRm9yKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBtYXBwYWJsZU9iamVjdCkgewotCQkvLyBhIGRlZmF1bHQgZWNsaXBzZWxpbmsgMS0xIG1hcHBpbmcgY2FuIG5vdCBiZSBtYXBwZWQgYXMgYW4gaWQsIGFzIG1hcHBpbmcgaXQKLQkJLy8gdGhhdCB3YXkgd2lsbCBhY3R1YWxseSByZXN1bHQgaW4gYSBkZWZhdWx0IDEtMSB3aXRoIGFuIGlkIGRlcml2ZWQgaWRlbnRpdHkKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCgKLQkJCQltYXBwYWJsZU9iamVjdC5nZXREZWZhdWx0TWFwcGluZ0tleSgpLCAKLQkJCQlNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDRmYWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlSZWxhdGlvbnNoaXA+IGJ1aWxkRWNsaXBzZUxpbmtKb2luaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE1hbnlUb01hbnlNYXBwaW5nLCBNYW55VG9NYW55UmVsYXRpb25zaGlwPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTWFueVRvTWFueVJlbGF0aW9uc2hpcCB0cmFuc2Zvcm1fKE1hbnlUb01hbnlNYXBwaW5nIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdlOTIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YU1hbnlUb09uZU1hcHBpbmcsIEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIEphdmFFY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFueVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YjU3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9qYXZhL0phdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gRWNsaXBzZUxpbmsgSmF2YSBNYXBwZWQgU3VwZXJjbGFzcy4KLSAqCi0gKiBAc2VlIEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcwotICogQHNlZSBFY2xpcHNlbGlua0pwYVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhY2hpbmdTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWNsaXBzZUxpbmtDYWNoaW5nPiBjYWNoaW5nSG9sZGVyKSB7Ci0JCW5ldyBKYXZhRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4OTBmMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxKYXZhT25lVG9NYW55TWFwcGluZz4KLXsKLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCB0aGlzLmJ1aWxkQ2FzY2FkZUhvbGRlcigpLCB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU9uZVRvTWFueU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL2phdmEvSmF2YUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiY2JkZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvamF2YS9KYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YU9uZVRvT25lTWFwcGluZywgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wPgotewotCXB1YmxpYyBKYXZhRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZSh0aGlzLCBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZSh0aGlzLCBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9PbmVNYXBwaW5nLCBFY2xpcHNlTGlua1ByaXZhdGVPd25lZD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldFByaXZhdGVPd25lZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFPbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTNiYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QYWNrYWdlQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb252ZXJ0ZXJzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlIGV4dGVuZHMgQWJzdHJhY3RFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1RdWVyaWVzMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmMxYTUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSkgfHwKLQkJCXJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMl8xX1JFU09VUkNFX1RZUEUpIHx8Ci0JCQlyZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMl9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZERldGFpbHNQYWdlKAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjk0MjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRW50aXR5VWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtWG1sVWlGYWN0b3J5IGJ1aWxkT3JtWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVmFyaWFibGVPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDk4YzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5CYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8xLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nMV8xQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhMi5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzBVaUZhY3RvcnkgCi0JZXh0ZW5kcyBCYXNlRWNsaXBzZUxpbmtPcm1YbWxVaUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeTJfMAotewotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUlkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1CYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcxXzFDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nMV8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE3MDcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0NhY2hpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQWx3YXlzUmVmcmVzaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGVUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0Rpc2FibGVIaXRzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1JlZnJlc2hPbmx5SWZOZXdlckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLkVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBjYWNoaW5nIG9wdGlvbnMuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgeCBTaGFyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgIENhY2hlVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICBDYWNoZVNpemVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgPiBBZHZhbmNlZCAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRXhwaXJ5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUFsd2F5c1JlZnJlc2hDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgCQlSZWZyZXNoT25seUlmTmV3ZXJDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAJRGlzYWJsZUhpdHNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgCUNhY2hlQ29vcmRpbmF0aW9uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEV4aXN0ZW5jZVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBFY2xpcHNlTGlua0NhY2hpbmcKLSAqIEBzZWUgSmF2YUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtDYWNoZVNpemVDb21wb3NpdGUKLSAqIEBzZWUgRWNsaXBzZUxpbmtBbHdheXNSZWZyZXNoQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rUmVmcmVzaE9ubHlJZk5ld2VyQ29tcG9zaXRlCi0gKiBAc2VlIEVjbGlwc2VMaW5rRGlzYWJsZUhpdHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZTxPcm1FY2xpcHNlTGlua0NhY2hpbmc+Ci17Ci0KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUV4aXN0ZW5jZUNoZWNraW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IE9ybUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdDb21wb3NpdGUodGhpcywgcGFyZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTg2YjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMV8xQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgT3JtRWNsaXBzZUxpbmtFbWJlZGRlZElkTWFwcGluZzFfMUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0VtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZElkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCQkKLQkJbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0VudGl0eTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWQ0NWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5BYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5HZW5lcmF0aW9uMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlF1ZXJpZXMyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRWNsaXBzZUxpbmtFbnRpdHkyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdE9ybUVjbGlwc2VMaW5rRW50aXR5Q29tcG9zaXRlCi17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rRW50aXR5Ml8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdG9yc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGdlbmVyYXRvckNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IFF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmRlZjQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtNdXRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzFfMUNvbXBvc2l0ZQotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua0lkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUlkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7CQkKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFY2xpcHNlTGlua011dGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRNdXRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2NTlmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUgCi0JZXh0ZW5kcyBFY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9ybU1hbnlUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1NYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NGZiNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxNYW55VG9PbmVNYXBwaW5nLCBNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksICBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hbnlUb09uZU1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtKb2luRmV0Y2g+IGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFueVRvT25lTWFwcGluZywgRWNsaXBzZUxpbmtKb2luRmV0Y2g+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKb2luRmV0Y2ggYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhNGU4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzID4KLQlleHRlbmRzIEFic3RyYWN0T3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPFQ+Ci17Ci0JcHVibGljIE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ2FjaGluZ1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVjbGlwc2VMaW5rQ2FjaGluZz4gY2FjaGluZ0hvbGRlcikgewotCQluZXcgT3JtRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNhY2hpbmdIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjJkZDg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxPbmVUb01hbnlNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZEpvaW5GZXRjaGFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRQcml2YXRlT3duYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCB0aGlzLmJ1aWxkQ2FzY2FkZUhvbGRlcigpLCB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvTWFueU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVjNTk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9kZXRhaWxzL29ybS9Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLkVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua1ByaXZhdGVPd25lZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxPbmVUb09uZU1hcHBpbmcsIE9uZVRvT25lUmVsYXRpb25zaGlwMl8wPgotewotCXB1YmxpYyBPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rSm9pbkZldGNoQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSm9pbkZldGNoYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQ29tcG9zaXRlKHRoaXMsIGJ1aWxkUHJpdmF0ZU93bmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua0pvaW5GZXRjaD4gYnVpbGRKb2luRmV0Y2hhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rSm9pbkZldGNoPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rSm9pbkZldGNoIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldEpvaW5GZXRjaCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPiBidWlsZFByaXZhdGVPd25hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB0aGlzLnN1YmplY3QpLmdldFByaXZhdGVPd25lZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvT25lTWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczOGRmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmxvZ2dpbmcuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2Uub3B0aW9ucy5QZXJzaXN0ZW5jZVhtbE9wdGlvbnNUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLm9wdGlvbnMuUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCB0YWJzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbEN1c3RvbWl6YXRpb25UYWI8Q3VzdG9taXphdGlvbj4gYnVpbGRDdXN0b21pemF0aW9uVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gY3VzdG9taXphdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDdXN0b21pemF0aW9uSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiKGN1c3RvbWl6YXRpb25Ib2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYjxDYWNoaW5nPiBidWlsZENhY2hpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyID0gdGhpcy5idWlsZENhY2hpbmdIb2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIoY2FjaGluZ0hvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiPD8gZXh0ZW5kcyBMb2dnaW5nMl8wPiBidWlsZExvZ2dpbmdUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nMl8wPiBsb2dnaW5nMl8wSG9sZGVyID0gdGhpcy5idWlsZExvZ2dpbmcyXzBIb2xkZXIoc3ViamVjdEhvbGRlcik7Ci0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIobG9nZ2luZzJfMEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjxPcHRpb25zMl8wPiBidWlsZE9wdGlvbnNUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3B0aW9uczJfMD4gb3B0aW9uczJfMEhvbGRlciA9IHRoaXMuYnVpbGRPcHRpb25zMl8wSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCi0JCXJldHVybiBuZXcgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiKG9wdGlvbnMyXzBIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8TG9nZ2luZzJfMD4gYnVpbGRMb2dnaW5nMl8wSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0LCBMb2dnaW5nMl8wPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMb2dnaW5nMl8wIHRyYW5zZm9ybV8oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQotCQkJCXJldHVybiAoTG9nZ2luZzJfMCkgdmFsdWUuZ2V0TG9nZ2luZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzA+IGJ1aWxkT3B0aW9uczJfMEhvbGRlcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LCBPcHRpb25zMl8wPihzdWJqZWN0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcHRpb25zMl8wIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0IHZhbHVlKSB7Ci0KLQkJCQlyZXR1cm4gKE9wdGlvbnMyXzApICgoUGVyc2lzdGVuY2VVbml0Ml8wKXZhbHVlKS5nZXRPcHRpb25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYjIyNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbDJfMFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0NhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjZjc1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoZURlZmF1bHRzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVEZWZhdWx0c0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuRGVmYXVsdENhY2hlU2l6ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuRGVmYXVsdENhY2hlVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUgZXh0ZW5kcyBDYWNoZURlZmF1bHRzQ29tcG9zaXRlPENhY2hpbmc+Ci17Ci0JcHVibGljIENhY2hlRGVmYXVsdHMyXzBDb21wb3NpdGUoUGFuZTxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVDYWNoZURlZmF1bHRzQ29tcG9zaXRlcyhwYXJlbnQpOwotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDYWNoZURlZmF1bHRzQ29tcG9zaXRlcyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gRGVmYXVsdCBDYWNoZSBUeXBlCi0JCW5ldyBEZWZhdWx0Q2FjaGVUeXBlQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQkJLy8gRGVmYXVsdCBDYWNoZSBTaXplCi0JCW5ldyBEZWZhdWx0Q2FjaGVTaXplQ29tcG9zaXRlPENhY2hpbmc+KHRoaXMsIHBhcmVudCk7Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIodGhpcy5idWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFNoYXJlZENhY2hlTW9kZSwgQm9vbGVhbj4odGhpcy5idWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgIT0gU2hhcmVkQ2FjaGVNb2RlLk5PTkU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlPiBidWlsZFNoYXJlZENhY2hlTW9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0Ml8wLCBTaGFyZWRDYWNoZU1vZGU+KAotCQkJCQkJCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZLCAKLQkJCQkJCQkJUGVyc2lzdGVuY2VVbml0Ml8wLkRFRkFVTFRfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlTW9kZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0VjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzlmZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5FY2xpcHNlTGlua0NhY2hpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRXhwYW5kYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtDYWNoaW5nQ29tcG9zaXRlPENhY2hpbmc+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rQ2FjaGluZzJfMENvbXBvc2l0ZSgKLQkJCVBhbmU8Q2FjaGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNlY3Rpb24gc2VjdGlvbiA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUiB8IFNlY3Rpb24uREVTQ1JJUFRJT04pOwotCQlzZWN0aW9uLnNldFRleHQoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sQ2FjaGluZ1RhYl9zZWN0aW9uVGl0bGUpOwotCQlzZWN0aW9uLnNldERlc2NyaXB0aW9uKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5QZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWJfc2VjdGlvbkRlc2NyaXB0aW9uKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUoc2VjdGlvbik7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoY29tcG9zaXRlKTsKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0KLQkJLy8gU2hhcmVkQ2FjaGVNb2RlCi0JCW5ldyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBjb21wb3NpdGUpOwotCQkvLyBEZWZhdWx0cwotCQluZXcgQ2FjaGVEZWZhdWx0czJfMENvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQkvLyBGbHVzaCBDbGVhciBDYWNoZQotCQluZXcgRmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9GbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjkzNGE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jYWNoaW5nL0ZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZy5DYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuY2FjaGluZy5GbHVzaENsZWFyQ2FjaGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEZsdXNoQ2xlYXJDYWNoZTJfMENvbXBvc2l0ZSBleHRlbmRzIEZsdXNoQ2xlYXJDYWNoZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rmx1c2hDbGVhckNhY2hlMl8wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGbHVzaENsZWFyQ2FjaGUyXzBDb21wb3NpdGUoCi0JCQkJUGFuZTw/IGV4dGVuZHMgQ2FjaGluZz4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVMYXlvdXQocGFyZW50KTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcih0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8U2hhcmVkQ2FjaGVNb2RlLCBCb29sZWFuPih0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFNoYXJlZENhY2hlTW9kZSB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZSAhPSBTaGFyZWRDYWNoZU1vZGUuTk9ORTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTaGFyZWRDYWNoZU1vZGU+IGJ1aWxkU2hhcmVkQ2FjaGVNb2RlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4oCi0JCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSwgCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFksIAotCQkJCQkJCQlQZXJzaXN0ZW5jZVVuaXQyXzAuREVGQVVMVF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBidWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgUGVyc2lzdGVuY2VVbml0Ml8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0Ml8wKSB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2NhY2hpbmcvUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlYWUzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY2FjaGluZy9QZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmNhY2hpbmcuUGVyc2lzdGVuY2VYbWxDYWNoaW5nVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbENhY2hpbmcyXzBUYWIgZXh0ZW5kcyBQZXJzaXN0ZW5jZVhtbENhY2hpbmdUYWI8Q2FjaGluZz4KLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDYWNoaW5nMl8wVGFiKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQluZXcgRWNsaXBzZUxpbmtDYWNoaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyYzQ5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24yXzBDb21wb3NpdGUgZXh0ZW5kcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGU8Q3VzdG9taXphdGlvbj4KLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlKAotCQlQYW5lPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsIAotCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFbnRpdHlMaXN0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL1BlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWZmNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxDdXN0b21pemF0aW9uVGFiPEN1c3RvbWl6YXRpb24+Ci17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sQ3VzdG9taXphdGlvbjJfMFRhYigKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNhNWQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0Nvbm5lY3Rpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVjbGlwc2VMaW5rVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgQ29ubmVjdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TG9nZ2luZzJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgTG9nZ2luZzJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jb25uZWN0aW9uTGFiZWwsCi0JCQl0aGlzLmJ1aWxkQ29ubmVjdGlvbkhvbGRlcigpLAotCQkJdGhpcy5idWlsZENvbm5lY3Rpb25TdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwKLS8vCQkJRWNsaXBzZUxpbmtIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9MT0dHSU5HX0NPTk5FQ1RJT04JLy8gVE9ETwotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZzJfMCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBMb2dnaW5nMl8wLkNPTk5FQ1RJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29ubmVjdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbm5lY3Rpb25TdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPih0aGlzLmJ1aWxkRGVmYXVsdENvbm5lY3Rpb25Ib2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxMb2dnaW5nVGFiX2Nvbm5lY3Rpb25MYWJlbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0Q29ubmVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZzJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlMb2dnaW5nMl8wLkNPTk5FQ1RJT05fUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmJiMzgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FY2xpcHNlTGlua1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxMb2dnaW5nMl8wPgotewotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5OwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlKAotCQkJCQlQYW5lPExvZ2dpbmcyXzA+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5TUUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLlRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5FVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuQ09OTkVDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuUVVFUllfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLkNBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuRUpCX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5ETVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQkJCi0JCXRoaXMucHJvcGVydHkgPSBMb2dnaW5nMl8wLkVKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZOwotCQluZXcgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlcih0aGlzLCBwYXJlbnQpOwotCQkKLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eSA9IExvZ2dpbmcyXzAuV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFk7Ci0JCW5ldyBDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbWJvVmlld2VyKHRoaXMsIHBhcmVudCk7Ci0JCQotCQl0aGlzLnByb3BlcnR5ID0gTG9nZ2luZzJfMC5TRVJWRVJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWTsKLQkJbmV3IENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIodGhpcywgcGFyZW50KTsKLQl9Ci0JCi0KLQotCXByaXZhdGUgY2xhc3MgQ2F0ZWdvcnlMb2dnaW5nTGV2ZWxDb21ib1ZpZXdlciBleHRlbmRzIFBhbmU8TG9nZ2luZzJfMD4KLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BST1BFUlRZID0gTG9nZ2luZzJfMC5DQVRFR09SSUVTX0RFRkFVTFRfTE9HR0lOR19QUk9QRVJUWTsKLQkJZmluYWwgcHJpdmF0ZSBTdHJpbmcgY2F0ZWdvcnk7Ci0JCQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZTwvY29kZT4uCi0JCSAqIAotCQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JCSAqIEBwYXJhbSBwYXJlbnQKLQkJICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCQkgKi8KLQkJcHVibGljIENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tYm9WaWV3ZXIoCi0JCQkJCVBhbmU8PyBleHRlbmRzIExvZ2dpbmcyXzA+IHBhcmVudENvbXBvc2l0ZSwgCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQKLQkJCQkJKSB7Ci0JCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JCQkKLQkJCXRoaXMuY2F0ZWdvcnkgPSBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlLnRoaXMucHJvcGVydHk7Ci0JCX0KLQotCQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZzJfMCwgTG9nZ2luZ0xldmVsPiBhZGRMb2dnaW5nTGV2ZWxDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8TG9nZ2luZzJfMCwgTG9nZ2luZ0xldmVsPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKERFRkFVTFRfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLlNRTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5FVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLlFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLkNBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLlBST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLlNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuRUpCX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLkRNU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSk7Ci0JCQkJCXByb3BlcnR5TmFtZXMuYWRkKExvZ2dpbmcyXzAuTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLldFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQkJcHJvcGVydHlOYW1lcy5hZGQoTG9nZ2luZzJfMC5QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFkpOwotCQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChMb2dnaW5nMl8wLlNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZKTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExvZ2dpbmdMZXZlbFtdIGdldENob2ljZXMoKSB7Ci0JCQkJCXJldHVybiBMb2dnaW5nTGV2ZWwudmFsdWVzKCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWwgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0Q2F0ZWdvcmllc0RlZmF1bHRMZXZlbCgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhMb2dnaW5nTGV2ZWwgdmFsdWUpIHsKLQkJCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEVjbGlwc2VMaW5rVWlNZXNzYWdlcy5jbGFzcywgRWNsaXBzZUxpbmtDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZS5jbGFzcywgdmFsdWUpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMb2dnaW5nTGV2ZWwgZ2V0VmFsdWUoKSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRMZXZlbChjYXRlZ29yeSk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoTG9nZ2luZ0xldmVsIHZhbHVlKSB7Ci0JCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldExldmVsKGNhdGVnb3J5LCB2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQkJaWYoIHByb3BlcnR5TmFtZSAhPSBjYXRlZ29yeSAmJiBwcm9wZXJ0eU5hbWUgIT0gREVGQVVMVF9QUk9QRVJUWSkgcmV0dXJuOwotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCQlwYXJlbnQsCi0JCQkJCXRoaXMuYnVpbGRMYWJlbFN0cmluZygpLAotCQkJCQl0aGlzLmFkZExvZ2dpbmdMZXZlbENvbWJvKHBhcmVudCksCi0JCQkJCW51bGwJLy8gVE9ETwotCQkJKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgYnVpbGRMYWJlbFN0cmluZygpIHsKLQotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQoIlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl8iKTsJIC8vJE5PTi1OTFMtMSQKLQkJCXNiLmFwcGVuZChFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlLnRoaXMucHJvcGVydHkpOwotCQkJc2IuYXBwZW5kKCJMYWJlbCIpOwkgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlyZXR1cm4gKFN0cmluZykgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUoRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLmNsYXNzLCBzYi50b1N0cmluZygpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9FY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWU0Yzk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0VjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZy5FY2xpcHNlTGlua0xvZ2dpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZSBleHRlbmRzIEVjbGlwc2VMaW5rTG9nZ2luZ0NvbXBvc2l0ZTxMb2dnaW5nMl8wPgotewotCi0JcHVibGljIEVjbGlwc2VMaW5rTG9nZ2luZzJfMENvbXBvc2l0ZSgKLQkJCQkJCQkJCVBhbmU8TG9nZ2luZzJfMD4gc3ViamVjdEhvbGRlciwgCi0JCQkJCQkJCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmluaXRpYWxpemVMYXlvdXQocGFyZW50KTsKLQotCQlDb21wb3NpdGUgY2F0ZWdvcnlMb2dnaW5nU2VjdGlvbiA9IHRoaXMuYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJdGhpcy5hZGRTdWJQYW5lKHBhcmVudCwgMCwgMTYpLAotCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYl9jYXRlZ29yeUxvZ2dpbmdMZXZlbFNlY3Rpb25UaXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkKLQkJKTsKLQotCQl0aGlzLmFkZENhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlKGNhdGVnb3J5TG9nZ2luZ1NlY3Rpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRlZ29yeUxvZ2dpbmdMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBFY2xpcHNlTGlua0NhdGVnb3J5TG9nZ2luZ0xldmVsQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9nUHJvcGVydGllc0NvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmxvZ1Byb3BlcnRpZXNDb21wb3NpdGUocGFyZW50KTsKLQkJCi0JCS8vIENvbm5lY3Rpb246Ci0JCW5ldyBDb25uZWN0aW9uQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL2xvZ2dpbmcvUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkMjIwZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2UvbG9nZ2luZy9QZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UubG9nZ2luZy5QZXJzaXN0ZW5jZVhtbExvZ2dpbmdUYWI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBQZXJzaXN0ZW5jZVhtbExvZ2dpbmcyXzBUYWIKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sTG9nZ2luZzJfMFRhYiBleHRlbmRzIFBlcnNpc3RlbmNlWG1sTG9nZ2luZ1RhYjxMb2dnaW5nMl8wPgotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxMb2dnaW5nMl8wVGFiKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nMl8wPiBzdWJqZWN0SG9sZGVyLCAKLQkJCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFY2xpcHNlTGlua0xvZ2dpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9FY2xpcHNlTGlua09wdGlvbnMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGUzYzMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0VjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zLkVjbGlwc2VMaW5rT3B0aW9uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcHRpb25zMl8wQ29tcG9zaXRlIGV4dGVuZHMgRWNsaXBzZUxpbmtPcHRpb25zQ29tcG9zaXRlPE9wdGlvbnMyXzA+Ci17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZSgKLQkJCVBhbmU8T3B0aW9uczJfMD4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBpbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHN1cGVyLmluaXRpYWxpemVNaXNjZWxsYW5lb3VzUGFuZShjb250YWluZXIpOwotCi0JCW5ldyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQluZXcgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCW5ldyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL0xvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjhlZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLCAKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJYWRkTG9ja1RpbWVvdXRDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTG9ja1RpbWVvdXRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88T3B0aW9uczJfMD4odGhpcywgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldExvY2tUaW1lb3V0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRMb2NrVGltZW91dCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9QZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjhhY2RiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1BlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5vcHRpb25zLlBlcnNpc3RlbmNlWG1sT3B0aW9uc1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlWG1sT3B0aW9uczJfMFRhYgotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VYbWxPcHRpb25zMl8wVGFiIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiPE9wdGlvbnMyXzA+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbE9wdGlvbnMyXzBUYWIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVjbGlwc2VMaW5rT3B0aW9uczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4ZTQyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5JbnRlZ2VyQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnMyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPE9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5hZGRRdWVyeVRpbWVvdXRDb21ibyhjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUXVlcnlUaW1lb3V0Q29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSW50ZWdlckNvbWJvPE9wdGlvbnMyXzA+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeVRpbWVvdXQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2E4OTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLk9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5KcHRKcGFFY2xpcHNlTGlua1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0vKioKLSAqICBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9wdGlvbnMyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uR3JvdXBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8T3B0aW9uczJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50Q29tcG9zaXRlLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIFZhbGlkYXRpb25Nb2RlCi0JCW5ldyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdAotCQl0aGlzLmFkZEdyb3VwUHJlUGVyc2lzdExpc3RQYW5lKHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlCi0JCXRoaXMuYWRkR3JvdXBQcmVVcGRhdGVMaXN0UGFuZShwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZQotCQl0aGlzLmFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYWRkR3JvdXBQcmVQZXJzaXN0TGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsLAotCQkJdGhpcy5hZGRQcmVQZXJzaXN0TGlzdFBhbmUocGFyZW50KSwKLQkJCW51bGwJLy8gVE9ETyBIZWxwCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGFkZFByZVBlcnNpc3RMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpLAotCQkJdGhpcy5idWlsZFByZVBlcnNpc3RMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsaXN0UGFuZTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVQZXJzaXN0Q2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmVQZXJzaXN0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcmVQZXJzaXN0Q2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZVR5cGUoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKTsKLQkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoY2xhc3NOYW1lKTsKLQkJCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShjbGFzc1JlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCBhZGRHcm91cFByZVVwZGF0ZUxpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUocGFyZW50LCAKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVVwZGF0ZUxhYmVsLAotCQkJdGhpcy5hZGRQcmVVcGRhdGVMaXN0UGFuZShwYXJlbnQpLAotCQkJbnVsbAkvLyBUT0RPIEhlbHAKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8T3B0aW9uczJfMD4gYWRkUHJlVXBkYXRlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIExpc3QgcGFuZQotCQlBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPiBsaXN0UGFuZSA9IG5ldyBBZGRSZW1vdmVMaXN0UGFuZTxPcHRpb25zMl8wPigKLQkJCXRoaXMsCi0JCQlwYXJlbnQsCi0JCQl0aGlzLmJ1aWxkUHJlVXBkYXRlQWRhcHRlcigpLAotCQkJdGhpcy5idWlsZFByZVVwZGF0ZUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCQkJCXN1cGVyLmluaXRpYWxpemVUYWJsZSh0YWJsZSk7Ci0KLQkJCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGFibGUuZ2V0UGFyZW50KCk7Ci0JCQkJR3JpZERhdGEgZ3JpZERhdGEgID0gKEdyaWREYXRhKSBjb250YWluZXIuZ2V0TGF5b3V0RGF0YSgpOwotCQkJCWdyaWREYXRhLmhlaWdodEhpbnQgPSA3NTsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGxpc3RQYW5lOwotCX0KLQotCXByaXZhdGUgQWRhcHRlciBidWlsZFByZVVwZGF0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJlVXBkYXRlQ2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKFN0cmluZykgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFByZVVwZGF0ZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3B0aW9uczJfMCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUHJlVXBkYXRlQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSB0aGlzLmNob29zZVR5cGUoKTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJyQnKTsKLQkJCWlmKCAhIHRoaXMuZ2V0U3ViamVjdCgpLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKGNsYXNzTmFtZSk7Ci0JCQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoY2xhc3NSZWYpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYWRkR3JvdXBQcmVSZW1vdmVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKHBhcmVudCwgCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVSZW1vdmVMYWJlbCwKLQkJCXRoaXMuYWRkUHJlUmVtb3ZlTGlzdFBhbmUocGFyZW50KSwKLQkJCW51bGwJLy8gVE9ETyBIZWxwCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPE9wdGlvbnMyXzA+IGFkZFByZVJlbW92ZUxpc3RQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyBMaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8T3B0aW9uczJfMD4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8T3B0aW9uczJfMD4oCi0JCQl0aGlzLAotCQkJcGFyZW50LAotCQkJdGhpcy5idWlsZFByZVJlbW92ZUFkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRQcmVSZW1vdmVMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsaXN0UGFuZTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQcmVSZW1vdmVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFByZVJlbW92ZUNsYXNzKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKChTdHJpbmcpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmVSZW1vdmVMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9wdGlvbnMyXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVJlbW92ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGVsZW1lbnQ7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBFY2xpcHNlTGlua1VpTWVzc2FnZXMuUGVyc2lzdGVuY2VYbWxPcHRpb25zVGFiX25vTmFtZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgamF2YVByb2plY3QgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQkiIgotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUVjbGlwc2VMaW5rVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+IGJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPE9wdGlvbnMyXzAsIFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCB0cmFuc2Zvcm1fKE9wdGlvbnMyXzAgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjk2ZjU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVmFsaWRhdGlvbk1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0Ml8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbk1vZGVDb21wb3NpdGU8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlKAotCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdDJfMD4gc3ViamVjdEhvbGRlciwKLQkJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQkJfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXBhcmVudCwKLQkJCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCwKLQkJCQl0aGlzLmFkZFZhbGlkYXRpb25Nb2RlQ29tYm8ocGFyZW50KSwKLQkJCQludWxsCQkJLy8gVE9ETwotCQkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFZhbGlkYXRpb25Nb2RlPiBhZGRWYWxpZGF0aW9uTW9kZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFZhbGlkYXRpb25Nb2RlPih0aGlzLCB0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfVkFMSURBVElPTl9NT0RFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBWYWxpZGF0aW9uTW9kZS52YWx1ZXMoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3J0Q2hvaWNlcygpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFZhbGlkYXRpb25Nb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFZhbGlkYXRpb25Nb2RlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nKEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5jbGFzcywgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUudGhpcywgdmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShWYWxpZGF0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OWIwYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8wL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRkbGdlbi53aXphcmRzLkVjbGlwc2VMaW5rMl8wRERMR2VuZXJhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5iYXNlLkJhc2VKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpIGV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpKAotCQkJCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciwKLQkJCQkJSnBhUGxhdGZvcm1VaVByb3ZpZGVyIHBsYXRmb3JtVWlQcm92aWRlcikgewotCi0JCXN1cGVyKG5hdmlnYXRvclByb3ZpZGVyLCBwbGF0Zm9ybVVpUHJvdmlkZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJRWNsaXBzZUxpbmsyXzBERExHZW5lcmF0b3JVaS5nZW5lcmF0ZShwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGVlZWUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wbGF0Zm9ybS5FY2xpcHNlTGlua05hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEVjbGlwc2VMaW5rTmF2aWdhdG9yUHJvdmlkZXIoKSwKLQkJCUVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkKLQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzAvcGxhdGZvcm0vRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTZlNWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMC9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzEuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzFVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52MV8yLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5kZXRhaWxzLmphdmEuRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM2NGFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljQ29sbGVjdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnN0cnVjdHVyZS5FY2xpcHNlTGlua09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMV9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8xVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkMDI1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8wVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkgCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybVhtbDJfMFVpRmFjdG9yeQotewotCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL2RldGFpbHMvb3JtL09ybUVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8xQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2OGFhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzEvZGV0YWlscy9vcm0vT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5FY2xpcHNlTGlua0pvaW5GZXRjaENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5UYXJnZXRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMUNvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzFDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRWNsaXBzZUxpbmtKb2luRmV0Y2hDb21wb3NpdGUodGhpcywgYnVpbGRKb2luRmV0Y2hIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSh0aGlzLCBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rSm9pbkZldGNoPiBidWlsZEpvaW5GZXRjaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBFY2xpcHNlTGlua0pvaW5GZXRjaD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFY2xpcHNlTGlua0pvaW5GZXRjaCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRKb2luRmV0Y2goKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTQ2MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGxhdGZvcm0uRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQluZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjQ0MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtWG1sMl8wVWlEZWZpbml0aW9uOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzFKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEVjbGlwc2VMaW5rMl8xSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFY2xpcHNlTGluazJfMUpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERldGFpbHNQcm92aWRlcnNUbyhMaXN0PEpwYURldGFpbHNQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMi9kZXRhaWxzL29ybS9FY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MzIwYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL2RldGFpbHMvb3JtL0VjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FY2xpcHNlTGlua1ZhcmlhYmxlT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuc3RydWN0dXJlLkVjbGlwc2VMaW5rT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmtPcm1YbWwyXzJVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRWNsaXBzZUxpbmtPcm1YbWwyXzFVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzJfMl9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmtPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNDb2xsZWN0aW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRWNsaXBzZUxpbmtWYXJpYWJsZU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMDMyZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMi5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwucGxhdGZvcm0uRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAucGxhdGZvcm0uRWNsaXBzZUxpbmsyXzBKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMC5wbGF0Zm9ybS5FY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaUZhY3RvcnkKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlTGluazJfMEpwYVBsYXRmb3JtVWkoCi0JCQluZXcgRWNsaXBzZUxpbmtOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMi9wbGF0Zm9ybS9FY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MWRjMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL3BsYXRmb3JtL0VjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8yLnBsYXRmb3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjFfMS5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYxXzIuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwxXzJVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLmRldGFpbHMuamF2YS5FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzAuZGV0YWlscy5vcm0uRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8wLnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8xLmRldGFpbHMub3JtLkVjbGlwc2VMaW5rT3JtWG1sMl8xVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMi5kZXRhaWxzLm9ybS5FY2xpcHNlTGlua09ybVhtbDJfMlVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8ySnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlTGluazJfMkpwYVBsYXRmb3JtVWlQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWNsaXBzZUxpbmsyXzJKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCQlwcm92aWRlcnMuYWRkKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDFfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMV8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChFY2xpcHNlTGlua09ybVhtbDJfMVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rT3JtWG1sMl8yVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzgzNDhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9FY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRWNsaXBzZUxpbmtVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMub3JtLk1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBpcyByZWZlcmVuY2VkIGluIHRoZSBwbHVnaW4ueG1sIGFzIGFuIG9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMgZXh0ZW5zaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkCi0JCWV4dGVuZHMgTWFwcGluZ0ZpbGVXaXphcmQgewotCQotCXB1YmxpYyBFY2xpcHNlTGlua01hcHBpbmdGaWxlV2l6YXJkKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSBidWlsZE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSgKLQkJCQkiUGFnZV8xIiwgdGhpcy5tdW5nZWRTZWxlY3Rpb24sIGdldERhdGFNb2RlbCgpLAotCQkJCUVjbGlwc2VMaW5rVWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZSwgCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2MpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSBidWlsZE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSgKLQkJCQkiUGFnZV8yIiwgZ2V0RGF0YU1vZGVsKCksCi0JCQkJRWNsaXBzZUxpbmtVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX3RpdGxlLCAKLQkJCQlFY2xpcHNlTGlua1VpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYyNTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluCi1AZG90Ci10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCi1qYXZhQ29tcGlsZXIuLi5hcmdzLioKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZlOGM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjE1ZmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBKYW4gMTUgMTE6MTI6MDcgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFkNTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6Mjg6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlNjNiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbgotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucztidW5kbGUtdmVyc2lvbj0iMy4yLjAiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nO2J1bmRsZS12ZXJzaW9uPSIyLjEuMCIsCi0gb3JnLmFwYWNoZS5vcm87YnVuZGxlLXZlcnNpb249IjIuMC44IiwKLSBvcmcuYXBhY2hlLnZlbG9jaXR5O2J1bmRsZS12ZXJzaW9uPSIxLjUuMCIsCi0gb3JnLmpkb207YnVuZGxlLXZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNS4wLDMuMC4wKSIKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlODc1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWEzNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM3YTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFbnRpdHkgR2VuCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkwN2EyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QYWNrYWdlR2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0aWVzCi1HZW5TY29wZV90YXNrTmFtZT1CdWlsZCBEYXRhYmFzZSBNb2RlbAotRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0eTogezB9Ci1FcnJvcl9HZW5lcmF0aW5nX0VudGl0aWVzID0gRXJyb3IgR2VuZXJhdGluZyBFbnRpdGllcwotCi1EZWxldGVfRm9sZGVyX0Vycm9yID0gIlRoZSBkaXJlY3RvcnkgezB9IGNvdWxkIG5vdCBiZSBkZWxldGVkLiIKLURlbGV0ZV9GaWxlX0Vycm9yID0gIlRoZSBmaWxlIHswfSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iCi1GaWxlX1JlYWRfT25seV9FcnJvcj0gIlRoZSBmaWxlIHswfSBjb3VsZCBub3QgYmUgbW9kaWZpZWQgYmVjYXVzZSB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkLlxuUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBtYXJrZWQgYXMgcmVhZG9ubHkgaW4gdGhlIGZpbGUgc3lzdGVtLiIKLQotVGVtcGxhdGVzX25vdEZvdW5kID0gVW5hYmxlIHRvIGZpbmQgSlBBIGVudGl0aWVzIGdlbmVyYXRpb24gdGVtcGxhdGVzIGluIHBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWI0YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIE9STSBhc3NvY2lhdGlvbi4KLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgYXNzb2NpYXRpb25zOgotICogPHVsPjxsaT5zaW1wbGUgYXNzb2NpYXRpb246IEFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIGRhdGFiYXNlIHRhYmxlcy4KLSAqIFRoZSA8ZW0+cmVmZXJyZXI8L2NvZGU+IHRhYmxlIGlzIHRoZSBvbmUgY29udGFpbmluZyB0aGUgZm9yZWlnbiBrZXkKLSAqICwgdGhlIDxlbT5yZWZlcmVuY2VkPC9jb2RlPiB0YWJsZSBpcyB0aGUgb3RoZXIgcGFydHkuPGJyPgotICogCi0gKiA8bGk+bWFueSB0byBtYW55IGFzc29jaWF0aW9uOiBBbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byB0YWJsZXMgam9pbmVkIGJ5IAotICogYSA8ZW0+am9pbiB0YWJsZTwvZW0+LgotICogSW4gdGhlIGV4YW1wbGUgQVVUSE9SLCBCT09LLCBBVVRIT1JfQk9PSywgVGhlIHJlZmVycmVyIGFuZCByZWZlcmVuY2VkIGFyZSAKLSAqIEFVVEhPUiBhbmQgIEJPT0ssIGFuZCB0aGUgam9pbiB0YWJsZSBpcyBBVVRIT1JfQk9PSy4KLSAqIDwvdWw+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkUgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJtYW55LXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkUgPSAib25lLXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJX0RJID0gImJpLWRpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUxfREkgPSAibm9ybWFsLWRpIjsgLy9yZWZlcnJlci0+cmVmZXJlbmNlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QUE9TSVRFX0RJID0gIm9wcG9zaXRlLWRpIjsgLy9yZWZlcmVuY2VkLT5yZWZlcnJlcgotCQotCXByaXZhdGUgdHJhbnNpZW50IE9STUdlbkN1c3RvbWl6ZXIgbUN1c3RvbWl6ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1Kb2luVGFibGVOYW1lOwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVycmVyQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckpvaW5Db2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVyZW5jZWRKb2luQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcnJlckNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJlbmNlZENvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJyZXJKb2luQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcmVuY2VkSm9pbkNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCQotCXByaXZhdGUgU3RyaW5nIG1DYXJkaW5hbGl0eTsKLQlwcml2YXRlIFN0cmluZyBtRGlyZWN0aW9uYWxpdHk7Ci0JcHJpdmF0ZSBieXRlIG1GbGFncyA9IEdFTkVSQVRFRDsKLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uUm9sZSBtUmVmZXJyZXJSb2xlOwotCXByaXZhdGUgQXNzb2NpYXRpb25Sb2xlIG1SZWZlcmVuY2VkUm9sZTsKLQotCXByaXZhdGUgdHJhbnNpZW50IEZvcmVpZ25LZXkgbUZvcmVpZ25LZXk7CQotCQotCS8qY29uc3RhbnRzIGZvciBtRmxhZ3MqLwotCS8qd2hldGhlciB0aGUgYXNzb2NpYXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBHRU5FUkFURUQgPSAxIDw8IDA7Ci0JLyp3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBjdXN0b20gKGkuZSBpcyBub3QgYXV0byBjb21wdXRlZCBmcm9tIGZvcmVpZ24ga2V5cyByZWxhdGlvbnNoaXBzKS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1VTVE9NID0gMSA8PCAxOwotCQotCS8qKgotCSAqIFRoZSBzaW1wbGUgYXNzb2NpYXRpb24gY29uc3RydWN0b3IuCi0JICogVGhlIDIgdGFibGVzIGFyZSBqb2luZWQgd2hlbiB0aGUgdmFsdWVzIG9mIGVhY2ggY29sdW1uIGluCi0JICogcmVmZXJyZXJDb2xOYW1lcyBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSByZWZlcnJlclRhYmxlTmFtZSBUaGUgImZvcmVpZ24ga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJyZXJDb2xOYW1lcyBUaGUgY29sdW1uIG5hbWVzIGluIHRoZSByZWZlcnJlciB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZFRhYmxlTmFtZSBUaGUgInByaW1hcnkga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbE5hbWVzIFRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcykgIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQkJbVJlZmVycmVyQ29sTmFtZXMgPSByZWZlcnJlckNvbE5hbWVzOwotCQltUmVmZXJlbmNlZENvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQkKLQkJbUNhcmRpbmFsaXR5ID0gTUFOWV9UT19PTkU7Ci0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBUaGUgbWFueSB0byBtYW55IGNvbnN0cnVjdG9yLgotCSAqIFRoZSAyIHRhYmxlcyBhcmUgam9pbmVkIHdoZW4gdGhlIHZhbHVlcyBvZiBlYWNoIGNvbHVtbiBpbgotCSAqIHJlZmVycmVyQ29sTmFtZXMgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHJlZmVycmVySm9pbkNvbE5hbWVzCi0JICogLCBhbmQgZWFjaCBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzIG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiByZWZlcmVuY2VkSm9pbkNvbE5hbWVzLgotCSAqCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcwotCQkJLCBTdHJpbmcgam9pblRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVycmVySm9pbkNvbE5hbWVzLCBMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcykgewotCQlzdXBlcigpOwotCQkKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltUmVmZXJyZXJUYWJsZU5hbWUgPSByZWZlcnJlclRhYmxlTmFtZTsKLQkJbVJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lOwotCQltUmVmZXJyZXJDb2xOYW1lcyA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkQ29sTmFtZXMgPSByZWZlcmVuY2VkQ29sTmFtZXM7Ci0JCW1Kb2luVGFibGVOYW1lID0gam9pblRhYmxlTmFtZTsKLQkJbVJlZmVycmVySm9pbkNvbE5hbWVzID0gcmVmZXJyZXJKb2luQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzID0gcmVmZXJlbmNlZEpvaW5Db2xOYW1lczsKLQkJCi0JCW1DYXJkaW5hbGl0eSA9IE1BTllfVE9fTUFOWTsJCi0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbiAoc2hvdWxkIG5vdCBiZSB1c2VkIG90aGVyd2lzZSkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKCkgewotCX0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgY2FyZGluYWxpdHkgYmFzZWRvbiB0aGUgZm9yaWduIGtleSBkZWZpbml0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlQ2FyZGluYWxpdHkoKSAgewotCQkvKmJ5IGRlZmF1bHQgdGhlIGFzc29jaWF0aW9uIGlzIG1hbnktdG8tb25lIHVubGVzcyB0aGUgZm9yZWlnbiBrZXkgCi0JCSAqIGlzIGFsc28gdGhlIHByaW1hcnkga2V5LCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgb25lLXRvLW9uZS4qLwotCQltQ2FyZGluYWxpdHkgPSBNQU5ZX1RPX09ORTsKLQkJCi0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZWZlcnJlckNvbHMgPSBnZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHBrQ29scyA9IGdldFJlZmVycmVyVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQlpZiAocGtDb2xzLnNpemUoKSA9PSByZWZlcnJlckNvbHMuc2l6ZSgpKSB7Ci0JCQlib29sZWFuIGlzRmtQayA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IHBrQ29scy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQlpZiAoISgoT1JNR2VuQ29sdW1uKXBrQ29scy5nZXQoaSkpLmdldE5hbWUoKS5lcXVhbHMoKChPUk1HZW5Db2x1bW4pcmVmZXJyZXJDb2xzLmdldChpKSkuZ2V0TmFtZSgpKSkgewotCQkJCQlpc0ZrUGsgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzRmtQaykgewotCQkJCW1DYXJkaW5hbGl0eSA9IE9ORV9UT19PTkU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldEN1c3RvbShmYWxzZSk7Ci0JfQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQkKLQkJaWYgKG1SZWZlcnJlclJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVycmVyUm9sZS5yZXN0b3JlKHRoaXMpOwotCQl9Ci0JCWlmIChtUmVmZXJlbmNlZFJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRSb2xlLnJlc3RvcmUodGhpcyk7Ci0JCX0KLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSAgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXIuZ2V0VGFibGUobVJlZmVycmVyVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZTsKLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCXJldHVybiBtQ3VzdG9taXplci5nZXRUYWJsZShtUmVmZXJlbmNlZFRhYmxlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCX0KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0Sm9pblRhYmxlKCkgIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyLmdldFRhYmxlKG1Kb2luVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gbUpvaW5UYWJsZU5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVycmVyCi0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpIHsKLQkJaWYgKG1SZWZlcnJlckNvbHMgPT0gbnVsbCkgewotCQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJCW1SZWZlcnJlckNvbHMgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckNvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVycmVyQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVyQ29sTmFtZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJlbmNlZENvbHMgPT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRDb2xzID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVyZW5jZWRDb2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJlbmNlZENvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJyZXJKb2luQ29scyA9PSBudWxsKSB7Ci0JCQltUmVmZXJyZXJKb2luQ29scyA9IGdldEpvaW5UYWJsZSgpLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlckpvaW5Db2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVySm9pbkNvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpICB7Ci0JCWlmIChtUmVmZXJlbmNlZEpvaW5Db2xzID09IG51bGwpIHsKLQkJCW1SZWZlcmVuY2VkSm9pbkNvbHMgPSBnZXRKb2luVGFibGUoKS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJcmV0dXJuIG1DYXJkaW5hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2FyZGluYWxpdHkoU3RyaW5nIGNhcmRpbmFsaXR5KSB7Ci0JCWFzc2VydChjYXJkaW5hbGl0eS5lcXVhbHMoTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhNQU5ZX1RPX01BTlkpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhPTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoT05FX1RPX01BTlkpKTsKLQkJbUNhcmRpbmFsaXR5ID0gY2FyZGluYWxpdHk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIGRpcmVjdGlvbmFsaXR5LCBvbmUgb2Yge0BsaW5rICNCSV9ESX18e0BsaW5rICNOT1JNQUxfREl9Ci0JICogfHtAbGluayAjT1BQT1NJVEVfREl9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb25hbGl0eSgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uYWxpdHkoU3RyaW5nIGRpcikgewotCQlhc3NlcnQoZGlyLmVxdWFscyhCSV9ESSkgfHwgZGlyLmVxdWFscyhOT1JNQUxfREkpIHx8IGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKTsKLQkJaWYgKCFkaXIuZXF1YWxzKG1EaXJlY3Rpb25hbGl0eSkpIHsKLQkJCW1EaXJlY3Rpb25hbGl0eSA9IGRpcjsKLQkJCQotCQkJaWYgKGRpci5lcXVhbHMoTk9STUFMX0RJKSkgewotCQkJCW1SZWZlcmVuY2VkUm9sZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKSB7Ci0JCQkJbVJlZmVycmVyUm9sZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGFzc29jaWF0aW9uIGlzIGJpZGlyZWN0aW9uYWwuCi0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciA8Y29kZT5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhCSV9ESSk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbCgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eS5lcXVhbHMoQklfREkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhpcyBhc3NvY2lhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBHRU5FUkFURUQpICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpZiAoZ2VuZXJhdGVkICE9IGlzR2VuZXJhdGVkKCkpIHsKLQkJCWlmIChnZW5lcmF0ZWQpIHsKLQkJCQltRmxhZ3MgfD0gR0VORVJBVEVEOwotCQkJfSBlbHNlIHsKLQkJCQltRmxhZ3MgJj0gfkdFTkVSQVRFRDsKLQkJCX0KLQkJCW1SZWZlcnJlclJvbGUgPSBtUmVmZXJlbmNlZFJvbGUgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGlzIGFzc29jaWF0aW9uIGlzIGN1c3RvbSAoaS5lIGlzIG5vdCBhdXRvIGNvbXB1dGVkIGZyb20gZm9yZWlnbiBrZXlzIHJlbGF0aW9uc2hpcHMpLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBDVVNUT00pICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbShib29sZWFuIGN1c3RvbSkgewotCQlpZiAoY3VzdG9tKSB7Ci0JCQltRmxhZ3MgfD0gQ1VTVE9NOwotCQl9IGVsc2UgewotCQkJbUZsYWdzICY9IH5DVVNUT007Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gcm9sZSBmb3IgdGhlIHJlZmVycmVyIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVycmVyUm9sZSgpIHsKLQkJaWYgKG1SZWZlcnJlclJvbGUgPT0gbnVsbCAmJiBpc0dlbmVyYXRlZCgpKSB7Ci0JCQlpZiAoIWdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKE9QUE9TSVRFX0RJKSkgeyAvL0JJX0RJIG9yIE5PUk1BTF9ESQotCQkJCW1SZWZlcnJlclJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIHRydWUvKmlzUmVmZXJyZXJFbmQqLyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlclJvbGU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIHJvbGUgZm9yIHRoZSByZWZlcmVuY2VkIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVyZW5jZWRSb2xlKCkgewotCQlpZiAobVJlZmVyZW5jZWRSb2xlID09IG51bGwgJiYgaXNHZW5lcmF0ZWQoKSkgewotCQkJaWYgKCFnZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5OT1JNQUxfREkpKSB7IC8vQklfREkgb3IgT1BQT1NJVEVfREkKLQkJCQltUmVmZXJlbmNlZFJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIGZhbHNlLyppc1JlZmVycmVyRW5kKi8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtUmVmZXJlbmNlZFJvbGU7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBhc3NvY2lhdGlvbiBpcyB2YWxpZCAodmFsaWQgdGFibGUgYW5kIGNvbHVtbiBuYW1lcykuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpewotCQlpZiAoIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobVJlZmVycmVyVGFibGVOYW1lLCBtUmVmZXJyZXJDb2xOYW1lcykKLQkJCQl8fCAhaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtUmVmZXJlbmNlZFRhYmxlTmFtZSwgbVJlZmVyZW5jZWRDb2xOYW1lcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobUpvaW5UYWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJyZXJKb2luQ29sTmFtZXMpCi0JCQkJCXx8ICFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcykgewotCQlPUk1HZW5UYWJsZSB0YWJsZSA9IG1DdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZSk7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5OYW1lcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCVN0cmluZyBjb2xOYW1lID0gKFN0cmluZyljb2x1bW5OYW1lcy5nZXQoaSk7Ci0JCQlpZiAodGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbE5hbWUpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXRoaXMubUZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotCQkKLQl9Ci0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpewotCQlyZXR1cm4gdGhpcy5tRm9yZWlnbktleTsKLQl9OwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiggdGhpcyA9PSBvYmogKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKCBvYmogaW5zdGFuY2VvZiBBc3NvY2lhdGlvbiApewotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24yID0gKEFzc29jaWF0aW9uKW9iajsKLQkJCWlmICghdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKQotCQkJCQl8fCAhU3RyaW5nVXRpbC5lcXVhbE9iamVjdHModGhpcy5nZXRKb2luVGFibGVOYW1lKCksIGFzc29jaWF0aW9uMi5nZXRKb2luVGFibGVOYW1lKCkpCi0JCQkJCXx8ICF0aGlzLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSkKLQkJCQkJKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQkJCi0JCQkvKnRoZSAyIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgcmVmZXJyZXIsIHJlZmVyZW5jZWQgYW5kIGpvaW4gdGFibGUqLwotCQkJLy9JZiBNVE8gb3IgT1RNIGFzc29jaWF0aW9uCi0JCQlpZiAodGhpcy5nZXRKb2luVGFibGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHRoaXMuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkpCi0JCQkJCSYmIHRoaXMuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZSArICIgIiArIG1DYXJkaW5hbGl0eSArICIgIiArIG1SZWZlcmVuY2VkVGFibGVOYW1lIDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDczNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiByb2xlICh0aGUgcmVmZXJyZXIgb3IgcmVmZXJlbmNlZCByb2xlKS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25Sb2xlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIHRyYW5zaWVudCBBc3NvY2lhdGlvbiBtQXNzb2NpYXRpb247IC8vdHJhbnNpZW50OiBzZWUgcmVzdG9yZQotCXByaXZhdGUgYm9vbGVhbiBtSXNSZWZlcnJlclJvbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBtQ2FzY2FkZTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCQkKLQlBc3NvY2lhdGlvblJvbGUoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sIGJvb2xlYW4gaXNSZWZlcnJlclJvbGUpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Bc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCQltSXNSZWZlcnJlclJvbGUgPSBpc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24gKHNob3VsZCBub3QgYmUgdXNlZCBvdGhlcndpc2UpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUoKSB7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQltQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQl9Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uIGdldEFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gbUFzc29jaWF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVycmVyUm9sZSgpIHsKLQkJcmV0dXJuIG1Jc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3Bwb3NpdGUgcm9sZSBvciBudWxsIGlmIHRoZSBhc3NvY2lhdGlvbiAKLQkgKiBpcyBub3QgYmkgZGlyZWN0aW9uYWwuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSBnZXRPcHBvc2l0ZVJvbGUoKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZ2V0QXNzb2NpYXRpb24oKTsKLQkJaWYgKCFhc3NvY2lhdGlvbi5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5CSV9ESSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpc1JlZmVycmVyUm9sZSgpKSB7Ci0JCQlyZXR1cm4gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtQXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJaWYgKCFtSXNSZWZlcnJlclJvbGUpIHsKLQkJCWlmICh0eXBlLmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSkpIHsKLQkJCQl0eXBlID0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkU7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSkgewotCQkJCXR5cGUgPSBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcnJlciBjb2x1bW4uCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRSZWZlcmVuY2VkQ29sdW1uKFN0cmluZyByZWZlcnJlckNvbHVtbikgIHsKLQkJYm9vbGVhbiBoYXNKb2luVGFibGUgPSBtQXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlKCkgIT0gbnVsbDsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlZmVycmVyQ29sdW1ucyA9IGdldFJlZmVycmVyQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVycmVyQ29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSByZWZlcnJlckNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVycmVySm9pbkNvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJyZXIgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcmVuY2VkIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFJlZmVycmVyQ29sdW1uKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uKSAgewotCQlib29sZWFuIGhhc0pvaW5UYWJsZSA9IG1Bc3NvY2lhdGlvbi5nZXRKb2luVGFibGUoKSAhPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVmZXJlbmNlZENvbHVtbnMgPSBnZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IHJlZmVyZW5jZWRDb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpLmdldChpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJyZXJDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3IgZm9yIAotCSAqIHRoZSBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcm9sZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpICAgewotCQlpZiAobVByb3BlcnR5TmFtZSAhPSBudWxsKSB7IC8vaWYgdGhlIHVzZXIgZXhwbGljaXRseSBzZXQgaXQgdGhlbiBkb24ndCBiZSB0b28gc21hcnQKLQkJCXJldHVybiBtUHJvcGVydHlOYW1lOwotCQl9Ci0JCXJldHVybiBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCk7Ci0JfQotCQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgcHJvcE5hbWUgPSAiIjsKLQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJT1JNR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQkJYm9vbGVhbiBpc1Npbmd1bGFyID0gaXNTaW5ndWxhcigpOwotCQlwcm9wTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXRWYXJOYW1lKGlzU2luZ3VsYXIpOwotCQkKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGNsYXNoaW5nUm9sZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvblJvbGU+KCk7IC8vcm9sZXMgd2l0aCBvdXIgc2FtZSByZWZlcnJlciBhbmQgcmVmZXJlbmNlZCB0YWJsZXMgKGkuZSB3b3VsZCB5aWVsZCB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lIGluIHRoZSBzYW1lIGJlYW4pCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiovCi0JCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb25Sb2xlPiBpdGVyID0gcmVmZXJyZXJUYWJsZS5nZXRBc3NvY2lhdGlvblJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyb2xlLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyVGFibGUuZ2V0TmFtZSgpKQotCQkJCQkmJiByb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKSkKLQkJCQkJJiYgcm9sZS5pc1Npbmd1bGFyKCkgPT0gaXNTaW5ndWxhcikgewotCQkJCWNsYXNoaW5nUm9sZXMuYWRkKHJvbGUpOwotCQkJfQotCQl9Ci0JCWlmIChjbGFzaGluZ1JvbGVzLnNpemUoKSA+IDEpIHsKLQkJCWludCBpbmRleCA9IGNsYXNoaW5nUm9sZXMuaW5kZXhPZih0aGlzKTsKLQkJCWFzc2VydChpbmRleCA+PSAwKTsKLQkJCXByb3BOYW1lICs9IGluZGV4KzE7Ci0JCX0KLQkJCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUuKi8KLQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29sdW1uLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhwcm9wTmFtZSkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gaXNTaW5ndWxhciA/ICJCZWFuIiA6ICJTZXQiOwotCQkJCXByb3BOYW1lICs9IHByZWZpeDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3BOYW1lOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5ndWxhcigpIHsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gZ2V0Q2FyZGluYWxpdHkoKTsKLQkJcmV0dXJuIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpOwotCX0KLQkKLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvciBmb3IgCi0JICogdGhlIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByb2xlLgotCSAqIElmIHRoZSBhcmd1bWVudCBuYW1lIGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nIHRoZW4gdGhlIAotCSAqIGRlZmF1bHQgY29tcHV0ZWQgbmFtZSBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQkJbVByb3BlcnR5TmFtZSA9IG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2NhZGUgdmFsdWUgZm9yIHRoaXMgcm9sZSwgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIG1DYXNjYWRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKFN0cmluZyBjYXNjYWRlKSB7Ci0JCWlmIChjYXNjYWRlICE9IG51bGwgJiYgY2FzY2FkZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljYXNjYWRlID0gbnVsbDsKLQkJfQotCQltQ2FzY2FkZSA9IGNhc2NhZGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGl2ZSBzdHJpbmcgdXNlZCBpbiBhIGNvbW1lbnQgaW4gdGhlIGdlbmVyYXRlZCAKLQkgKiBmaWxlIChmcm9tIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpICB7Ci0JCS8vPCEtLSAkZGlyZWN0aW9uYWxpdHkgJGNhcmRpbmFsaXR5IGFzc29jaWF0aW9uIHRvICRyZWZlcmVuY2VkQ2xhc3NOYW1lIC0tPgotCQlTdHJpbmcgZGlyZWN0aW9uYWxpdHk7Ci0JCWlmIChnZXRBc3NvY2lhdGlvbigpLmdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKEFzc29jaWF0aW9uLkJJX0RJKSkgewotCQkJZGlyZWN0aW9uYWxpdHkgPSAiYmktZGlyZWN0aW9uYWwiOwotCQl9IGVsc2UgewotCQkJZGlyZWN0aW9uYWxpdHkgPSAidW5pLWRpcmVjdGlvbmFsIjsKLQkJfQotCQlyZXR1cm4gZGlyZWN0aW9uYWxpdHkgKyAiICIgKyBnZXRBc3NvY2lhdGlvbigpLmdldENhcmRpbmFsaXR5KCkgKyAiIGFzc29jaWF0aW9uIHRvICIgKyBnZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRDbGFzc05hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE5Zjk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgT1JNR2VuQ3VzdG9taXplciBhY2NvcmRpbmcgdG8gSlBBIHNwZWNpZmljYXRpb24gZm9yCi0gKiBlbnRpdHkgZ2VuZXJhdGlvbi4KLSAqIAotICogVGhpcyBpcyB1c2VkIHRvIHJldHJpZXZlL2NoYW5nZSB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSB3aXphcmQgYW5kIGlzIGFsc28KLSAqIHBhc3NlZCBhcyBhIGNvbnRleHQgb2JqZWN0IHRvIFZlbG9jaXR5LgotICovCi1wdWJsaWMgY2xhc3MgQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIgZXh0ZW5kcyBPUk1HZW5DdXN0b21pemVyCi0JaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLQkvKiBtYXBwaW5nIGtpbmRzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX01BUFBJTkdfS0lORCA9ICJiYXNpYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19LSU5EID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX01BUFBJTkdfS0lORCA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiB0aGUgc3RyaW5ncyBmb3IgZ2VuZXJhdG9yIG5hbWVzLiBUaGVzZSBhcHBlYXIgaW4gYSBjb21ibyBib3ggYW5kIHVzZWQgYnkKLQkgKiB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgcHJvY2Vzc2luZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19HRU5FUkFUT1IgPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORV9HRU5FUkFUT1IgPSAibm9uZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURFTlRJVFlfR0VORVJBVE9SID0gImlkZW50aXR5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSAic2VxdWVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBCYXNlRW50aXR5R2VuQ3VzdG9taXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KEZpbGUgZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQlzdXBlci5pbml0KGZpbGUsIHNjaGVtYSk7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyAtLS0tLS0gT1JNR2VuQ3VzdG9taXplciBtZXRob2RzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEFsbElkR2VuZXJhdG9ycygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oNSk7Ci0JCS8qIGFkZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3b3VsZCBhcHBlYXIgaW4gdGhlIGNvbWJvICovCi0JCXJlc3VsdC5hZGQoQVVUT19HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKElERU5USVRZX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChUQUJMRV9HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKE5PTkVfR0VORVJBVE9SKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5vSWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBOT05FX0dFTkVSQVRPUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aXR5SWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBJREVOVElUWV9HRU5FUkFUT1I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFNlcXVlbmNlSWRHZW5lcmF0b3JzKCkgewotCQlTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkhhc2hTZXQ8U3RyaW5nPigzKTsKLQkJcmVzdWx0LmFkZChTRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbihDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBEVFBVdGlsLmdldEphdmFUeXBlKGNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbFByb3BlcnR5VHlwZXMoKSB7Ci0JCS8qCi0JCSAqIEphdmEgcHJpbWl0aXZlIHR5cGVzLCB3cmFwcGVyIG9mIHRoZSBwcmltaXRpdmUgdHlwZXMgLAotCQkgKiBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLm1hdGguQmlnSW50ZWdlciwgamF2YS5tYXRoLkJpZ0RlY2ltYWwsCi0JCSAqIGphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuQ2FsZW5kYXIsIGphdmEuc3FsLkRhdGUsIGphdmEuc3FsLlRpbWUsCi0JCSAqIGphdmEuc3FsLlRpbWVzdGFtcCwgYnl0ZVtdLCBCeXRlW10sIGNoYXJbXSwgQ2hhcmFjdGVyW10sIGVudW1zLCBhbmQKLQkJICogYW55IG90aGVyIHR5cGUgdGhhdCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZS4KLQkJICovCi0JCS8vIHJldHVybiBpbiB0aGUgb3JkZXIgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGNvbWJvCi0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJImJvb2xlYW4iLAotCQkJIkJvb2xlYW4iLAotCQkJImJ5dGUiLAotCQkJIkJ5dGUiLAotCQkJImJ5dGVbXSIsCi0JCQkiY2hhciIsCi0JCQkiY2hhcltdIiwKLQkJCSJDaGFyYWN0ZXIiLAotCQkJIkNoYXJhY3RlcltdIiwKLQkJCSJkb3VibGUiLAotCQkJIkRvdWJsZSIsCi0JCQkiZmxvYXQiLAotCQkJIkZsb2F0IiwKLQkJCSJpbnQiLAotCQkJIkludGVnZXIiLAotCQkJImxvbmciLAotCQkJIkxvbmciLAotCQkJIk9iamVjdCIsCi0JCQkic2hvcnQiLAotCQkJIlNob3J0IiwKLQkJCSJTdHJpbmciLAotCQkJamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5tYXRoLkJpZ0ludGVnZXIuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS51dGlsLkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEudXRpbC5EYXRlLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEuc3FsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5zcWwuVGltZS5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnNxbC5UaW1lc3RhbXAuY2xhc3MuZ2V0TmFtZSgpCi0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGdldEFsbE1hcHBpbmdLaW5kcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlCQVNJQ19NQVBQSU5HX0tJTkQsIElEX01BUFBJTkdfS0lORCwgVkVSU0lPTl9NQVBQSU5HX0tJTkQKLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEJhc2ljTWFwcGluZ0tpbmQoKSB7Ci0JCXJldHVybiBCQVNJQ19NQVBQSU5HX0tJTkQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRJZE1hcHBpbmdLaW5kKCkgewotCQlyZXR1cm4gSURfTUFQUElOR19LSU5EOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVkaXRDYXNjYWRlKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW55U2lkZUlzQXNzb2NpYXRpb25Pd25lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyAtLS0tIFZlbG9jaXR5IHRlbXBsYXRlcyBtZXRob2RzCi0JLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXNjYWRlcyBhbm5vdGF0aW9uIG1lbWJlciB2YWx1ZSwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vbmUuCi0JICogRW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGluc3RlYWQgb2YgbnVsbCBiZWNhdXNlIFZlbG9jaXR5IGRvZXMgbm90IGxpa2UKLQkgKiBudWxsIHdoZW4gdXNlZCBpbiAjc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuQ2FzY2FkZXMoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJTGlzdDxTdHJpbmc+IGNhc2NhZGVzID0gU3RyaW5nVXRpbC5zdHJUb0xpc3Qocm9sZS5nZXRDYXNjYWRlKCksICcsJywgdHJ1ZS8qIHRyaW0gKi8pOwotCQlpZiAoY2FzY2FkZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCggJ3snICk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY2FzY2FkZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlTdHJpbmcgY2FzY2FkZSA9IGNhc2NhZGVzLmdldChpKTsKLQkJCVN0cmluZyBlbnVtU3RyOwotCQkJaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLkFMTF9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuQUxMIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuUEVSU0lTVF9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUEVSU0lTVCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLk1FUkdFX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5NRVJHRSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLlJFTU9WRV9DQVNDQURFKSkgewotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUkVNT1ZFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYXNzZXJ0IChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5SRUZSRVNIX0NBU0NBREUpKTsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLlJFRlJFU0giOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoaSAhPSAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmZmVyLmFwcGVuZChlbnVtU3RyKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCd9Jyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZXRjaCB0eXBlIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZQotCSAqIG51bGwgd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZW5GZXRjaChPUk1HZW5UYWJsZSB0YWJsZSkgewotCQlTdHJpbmcgZmV0Y2ggPSB0YWJsZS5nZXREZWZhdWx0RmV0Y2goKTsKLQkJaWYgKGZldGNoID09IG51bGwgfHwgT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSC5lcXVhbHMoZmV0Y2gpKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChmZXRjaC5lcXVhbHMoT1JNR2VuVGFibGUuTEFaWV9GRVRDSCkpIHsKLQkJCXJldHVybiAiRmV0Y2hUeXBlLkxBWlkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIkZldGNoVHlwZS5FQUdFUiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDE0MmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0KLS8qKgotICogUHJvdmlkZSBhIHBsdWdnYWJsZSB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5kIGhvdyB0aGUgZW50aXR5IGdlbmVyYXRvcgotICogcHJpbnRzIHRoZSBuYW1lcyBvZiB2YXJpb3VzIGRhdGFiYXNlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZW50aXR5IGFuZCB0aGUgdGFibGUgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBlbnRpdHkncwotCSAqIFRhYmxlIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGVudGl0eQotCSAqIG1hcHMgdG8gdGhlIHRhYmxlIGJ5IGRlZmF1bHQuCi0JICovCi0JU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZSBjb2x1bW4KLQkgKiB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JICogQ29sdW1uIGFubm90YXRpb24ncyAnbmFtZScgZWxlbWVudC4gUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUKLQkgKiBtYW55LXRvLW9uZSBvciBtYW55LXRvLW1hbnkgZm9yZWlnbiBrZXkgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIEpvaW5Db2x1bW4gYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgYXR0cmlidXRlCi0JICogbWFwcyB0byB0aGUgam9pbiBjb2x1bW4gYnkgZGVmYXVsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGZvcmVpZ24ga2V5IGNvbnNpc3RzIG9mIGEgc2luZ2xlIGNvbHVtbiBwYWlyIHdob3NlCi0JICogcmVmZXJlbmNlZCBjb2x1bW4gaXMgdGhlIHNpbmdsZS1jb2x1bW4gcHJpbWFyeSBrZXkgb2YgdGhlIGZvcmVpZ24KLQkgKiBrZXkncyByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgSm9pbkNvbHVtbgotCSAqIGFubm90YXRpb24ncyAnbmFtZScgb3IgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50LgotCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW9uZSBhbmQgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4KLQkgKiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBuYW1lIGFuZC9vciByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFyZS9pcwotCSAqIG5vdCBhcHBsaWNhYmxlLgotCSAqIEBzZWUgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nLCBGb3JlaWduS2V5KQotCSAqLwotCVN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShDb2x1bW4gY29sdW1uKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIGEgSm9pblRhYmxlCi0JICogYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LgotCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW1hbnkgbWFwcGluZ3Mgd2hlbiB0aGUgZGVmYXVsdAotCSAqIGpvaW4gdGFibGUgbmFtZSBpcyBub3QgYXBwbGljYWJsZS4KLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSk7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBsZSByZXR1cm5zIHRoZSBkYXRhYmFzZSBvYmplY3QncyBuYW1lLAotCSAqIHVuYWx0ZXJlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBEZWZhdWx0IGltcGxlbWVudHMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGVudGl0eU5hbWUsIFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIGNvbHVtbi5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQlyZXR1cm4gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBjb2x1bW4uZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRhYmxlLmdldE5hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuRGVmYXVsdCI7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9KcHRHZW5NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDczYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSnB0R2VuTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUdlbmVyYXRvcl90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5TY29wZV90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlHZW5lcmF0b3JfdGFza05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGVtcGxhdGVzX25vdEZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlX0ZvbGRlcl9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVfRmlsZV9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlX1JlYWRfT25seV9FcnJvcjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfZ2VuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdEdlbk1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0R2VuTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEpwYUdlblBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEpwYUdlblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk2NDVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9KcHRKcGFHZW5QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSnB0SnBhR2VuUGx1Z2luIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24gKCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSApIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlJTG9nIGxvZyA9IFBsYXRmb3JtLmdldExvZyhidW5kbGUpOwotCQlsb2cubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBtc2csIGUgKSk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbiggQ29yZUV4Y2VwdGlvbiBjZSApIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlJTG9nIGxvZyA9IFBsYXRmb3JtLmdldExvZyhidW5kbGUpOwotCQlsb2cubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBjZSkpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU2NTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRW50aXR5R2VuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5TdHJpbmdVdGlsOwotCi0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgT1JNIGdlbmVyYXRpb24gcHJvcGVydGllcyBmb3IgYSBkYXRhYmFzZSAKLSAqIGNvbHVtbi4KLSAqIAotICogPHA+VGhpcyBpcyBkZXNpZ25lZCB0byBiZSBjcmVhdGVkL2NoYW5nZWQgYnkgdGhlIGdlbmVyYXRpb24gd2l6YXJkLAotICogYW5kIGdlbmVyYXRlZCB1c2luZyBWZWxvY2l0eSB0ZW1wbGF0ZXMuCi0gKiBUaGUgbW9kaWZpZWQgcHJvcGVydGllcyAoaWYgYW55KSBhcmUgcGVyc2lzdGVkL3JldHJpZXZlZCB1c2luZyAKLSAqIDxjb2RlPk9STUdlbkN1c3RvbWl6ZXI8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPUk1HZW5Db2x1bW4KLXsKLQlwcml2YXRlIFRhYmxlIG1UYWJsZTsKLQlwcml2YXRlIENvbHVtbiBtRGJDb2x1bW47Ci0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIG1DdXN0b21pemVyOwotCXByaXZhdGUgT1JNR2VuVGFibGUgbUdlblRhYmxlOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKQVZBX0xBTkdfUEFDS0FHRSA9ICJqYXZhLmxhbmcuIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBPUk1HZW5Db2x1bW4oQ29sdW1uIGRiQ29sdW1uLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1EYkNvbHVtbiA9IGRiQ29sdW1uOwotCQltQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCW1UYWJsZSA9IGRiQ29sdW1uLmdldFRhYmxlKCk7Ci0JfQotCQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBtQ3VzdG9taXplcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuVGFibGUoT1JNR2VuVGFibGUgb3JtR2VuVGFibGUpIHsKLQkJbUdlblRhYmxlID0gb3JtR2VuVGFibGU7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgY3VzdG9taXplZChTdHJpbmcgcHJvcE5hbWUpIHsKLQkJcmV0dXJuIGdldEN1c3RvbWl6ZXIoKS5nZXRQcm9wZXJ0eShwcm9wTmFtZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCBtVGFibGUuZ2V0TmFtZSgpLCBnZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBtVGFibGUuZ2V0TmFtZSgpLCBnZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkQm9vbGVhbihTdHJpbmcgcHJvcE5hbWUsIGJvb2xlYW4gdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWlmIChkZWZhdWx0VmFsdWUgPT0gdmFsdWUpIHsKLQkJCXNldEN1c3RvbWl6ZWQocHJvcE5hbWUsIG51bGwpOyAvL3JlbW92ZSB0aGUgcHJvcGVydHkKLQkJfSBlbHNlIHsKLQkJCWdldEN1c3RvbWl6ZXIoKS5zZXRCb29sZWFuUHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBtVGFibGUuZ2V0TmFtZSgpLCBnZXROYW1lKCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLgotCQkJYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShtRGJDb2x1bW4uZ2V0TmFtZSgpLCBtRGJDb2x1bW4pOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogbURiQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5Db2x1bW5OYW1lKCl7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKG1EYkNvbHVtbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZSAhPSBudWxsID8gYW5ub3RhdGlvbk5hbWUgOiBtRGJDb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uIGdldERiQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW47Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBiZWFuIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCi0JICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gY3VzdG9taXplZChQUk9QRVJUWV9OQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJLy9uYW1lID0gU3RyaW5nVXRpbC5jb2x1bW5OYW1lVG9WYXJOYW1lKGdldE5hbWUoKSk7Ci0JCQluYW1lID0gRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZShnZXROYW1lKCksIENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlTZXQoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKG5hbWUsIGdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJc2V0Q3VzdG9taXplZChQUk9QRVJUWV9OQU1FLCBuYW1lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIG9mIG5hbWUgZWxlbWVudCBpbiB0aGUgQENvbHVtbiBpcyBkZWZhdWx0Ci0JICogc28gd2UgY2FuIHNraXAgZ2VuZXJhdGluZyB0aGUgYW5ub3RhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpewotCQlyZXR1cm4gaXNEZWZhdWx0bmFtZSgpICYmIGlzVXBkYXRlYWJsZSgpICYmIGlzSW5zZXJ0YWJsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIG9mIG5hbWUgZWxlbWVudCBpbiB0aGUgQENvbHVtbiBpcyBkZWZhdWx0Ci0JICogc28gd2UgY2FuIHNraXAgZ2VuZXJhdGluZyB0aGUgYW5ub3RhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdG5hbWUoKXsKLQkJU3RyaW5nIHByb3BOYW1lID0gZ2V0UHJvcGVydHlOYW1lKCk7Ci0vLwkJU3RyaW5nIGRiQ29sdW1uTmFtZSA9IGdldE5hbWUoKTsKLS8vCQlyZXR1cm4gcHJvcE5hbWUuZXF1YWxzSWdub3JlQ2FzZSggZGJDb2x1bW5OYW1lICk7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUocHJvcE5hbWUsIHRoaXMubURiQ29sdW1uICk7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZT09bnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWVzIG9mIG5hbWUgZWxlbWVudCBpbiB0aGUgQENvbHVtbiBpcyBkZWZhdWx0Ci0JICogc28gd2UgY2FuIHNraXAgZ2VuZXJhdGluZyB0aGUgYW5ub3RhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEpvaW5Db2x1bW5OYW1lKFN0cmluZyBhc3NvY2lhdGlvblJvbGVQcm9wTmFtZSl7Ci0JCWlmKCAhdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSXRlcmFibGU8Rm9yZWlnbktleT4gaXQgPSBtRGJDb2x1bW4uZ2V0VGFibGUoKS5nZXRGb3JlaWduS2V5cygpOwotCQlJdGVyYXRvcjxGb3JlaWduS2V5PiBpID0gaXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUoIGkuaGFzTmV4dCgpICl7Ci0JCQlGb3JlaWduS2V5IGZrID0gaS5uZXh0KCk7Ci0JCQlDb2x1bW4gYyA9IGZrLmdldEJhc2VDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQlpZiggYy5lcXVhbHMoIHRoaXMubURiQ29sdW1uICkgKXsKLQkJCQl0cnl7Ci0JCQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCQkJCWJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGFzc29jaWF0aW9uUm9sZVByb3BOYW1lLCBmayApOwotCQkJCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWU9PW51bGw7Ci0JCQkJfWNhdGNoKEV4Y2VwdGlvbiBlKXsKLQkJCQkJLy9jYXRjaCB0aGUgY2FzZSB0aGF0IHJlZmVyZW5jZWQgdGFibGUgaGFzIG11bHRpcGxlIHByaW1hcnkga2V5IGNvbHVtbnMKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiB0eXBlLgotCSAqIERvZXMgbm90IHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlUeXBlKCkgIHsKLQkJU3RyaW5nIHR5cGUgPSBjdXN0b21pemVkKFBST1BFUlRZX1RZUEUpOwotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oIHRoaXMubURiQ29sdW1uICk7Ci0JCX0KLQkJaWYoIHR5cGUuc3RhcnRzV2l0aChKQVZBX0xBTkdfUEFDS0FHRSkgKSB7Ci0JCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcoIEpBVkFfTEFOR19QQUNLQUdFLmxlbmd0aCgpICk7Ci0JCX0KLQkJaWYoIHR5cGUuZXF1YWxzKCJqYXZhLnNxbC5EYXRlIikpeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gImphdmEudXRpbC5EYXRlIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQkKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlUHJvcGVydHlUeXBlKCkgIHsKLQkJcmV0dXJuIG1HZW5UYWJsZS5nZXRTaW1wbGlmaWVkQ29sVHlwZSggZ2V0UHJvcGVydHlUeXBlKCkgKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VHlwZShTdHJpbmcgdHlwZSkgIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyh0eXBlLCBnZXRQcm9wZXJ0eVR5cGUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoUFJPUEVSVFlfVFlQRSwgdHlwZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb2x1bW4gdHlwZSBpcyBudW1lcmljLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTnVtZXJpYygpIHsKLQkJYm9vbGVhbiByZXQgPSB0aGlzLm1EYkNvbHVtbi5pc051bWVyaWMoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFwcGluZyBraW5kLCBvbmUgb2Yge0BsaW5rICNQUk9QRVJUWV9NQVBQSU5HX0tJTkR9fHtAbGluayAjSURfTUFQUElOR19LSU5EfQotCSAqIHx7QGxpbmsgI1ZFUlNJT05fTUFQUElOR19LSU5EfXx7QGxpbmsgI1RJTUVTVEFNUF9NQVBQSU5HX0tJTkR9LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiBudWxsIChkZWZhdWx0cyB0byBiYXNpYyBwcm9wZXJ0eSB0eXBlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLaW5kKCkgewotCQlTdHJpbmcga2luZCA9IGN1c3RvbWl6ZWQoTUFQUElOR19LSU5EKTsKLQkJaWYgKGtpbmQgPT0gbnVsbCkgewotCQkJa2luZCA9IGdldEN1c3RvbWl6ZXIoKS5nZXRCYXNpY01hcHBpbmdLaW5kKCk7Ci0JCQkKLQkJCWlmICggdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgCi0JCQkJICYmIHRoaXMubURiQ29sdW1uLmdldFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPT0gMSkgewotCQkJCWtpbmQgPSBnZXRDdXN0b21pemVyKCkuZ2V0SWRNYXBwaW5nS2luZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBraW5kOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwaW5nS2luZChTdHJpbmcgbWFwcGluZ0tpbmQpICB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMobWFwcGluZ0tpbmQsIGdldE1hcHBpbmdLaW5kKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKE1BUFBJTkdfS0lORCwgbWFwcGluZ0tpbmQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc051bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTaXplKCkgewotCQlpZiAoIHRoaXMubURiQ29sdW1uLmlzTnVtZXJpYygpKXsKLQkJCXJldHVybiBtRGJDb2x1bW4uZ2V0UHJlY2lzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG1EYkNvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlY2ltYWxEaWdpdHMoKSB7Ci0JCWlmICggdGhpcy5tRGJDb2x1bW4uaXNOdW1lcmljKCkgKXsKLQkJCXJldHVybiBtRGJDb2x1bW4uZ2V0U2NhbGUoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRPZkNvbXBvc2l0ZVByaW1hcnlLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSAmJgotCQkJCXRoaXMubVRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID4gMTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoUFJPUEVSVFlfREVTQyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGF0YVR5cGVMT0IoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc0xPQigpOwotCX0JCi0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZWRNYXBUZW1wb3JhbFR5cGUoKSB7Ci0JCVN0cmluZyBwcm9wZXJ0eVR5cGUgPSB0aGlzLmdldFByb3BlcnR5VHlwZSgpOwotCQlyZXR1cm4gKCBwcm9wZXJ0eVR5cGUuZXF1YWxzKCJqYXZhLnV0aWwuRGF0ZSIpIHx8IHByb3BlcnR5VHlwZS5lcXVhbHMoImphdmEudXRpbC5DYWxlbmRhciIpICk7ICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVtcG9yYWxUeXBlKCkgewotCQlTdHJpbmcgZGVmYXVsdFR5cGUgPSBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbiggdGhpcy5tRGJDb2x1bW4gKTsKLQkJaWYoIGRlZmF1bHRUeXBlLmVxdWFscygiamF2YS5zcWwuRGF0ZSIpKXsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICJEQVRFIjsgLy8kTk9OLU5MUy0xJAotCQl9ZWxzZSBpZiggZGVmYXVsdFR5cGUuZXF1YWxzKCJqYXZhLnNxbC5UaW1lIikpeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIlRJTUUiOyAvLyROT04tTkxTLTEkCi0JCX1lbHNlIHsKLQkJCXJldHVybiAiVElNRVNUQU1QIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQkKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgcHJvcGVydHkgZ2V0dGVyIHNjb3BlLCBvbmUgb2Yge0BsaW5rICNQVUJMSUNfU0NPUEV9fHtAbGluayAjUFJPVEVDVEVEX1NDT1BFfQotCSAqIHx7QGxpbmsgI1BSSVZBVEVfU0NPUEV9LgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCAoZGVmYXVsdHMgdG8gcHVibGljKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5R2V0U2NvcGUoKSB7Ci0JCVN0cmluZyBzY29wZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfR0VUX1NDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpIHsKLQkJCXNjb3BlID0gUFVCTElDX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlHZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhzY29wZSwgZ2V0UHJvcGVydHlHZXRTY29wZSgpKSkgewotCQkJc2V0Q3VzdG9taXplZChQUk9QRVJUWV9HRVRfU0NPUEUsIHNjb3BlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgcHJvcGVydHkgc2V0dGVyIHNjb3BlLCBvbmUgb2Yge0BsaW5rICNQVUJMSUNfU0NPUEV9fHtAbGluayAjUFJPVEVDVEVEX1NDT1BFfQotCSAqIHx7QGxpbmsgI1BSSVZBVEVfU0NPUEV9LgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCAoZGVmYXVsdHMgdG8gcHVibGljKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5U2V0U2NvcGUoKSB7Ci0JCVN0cmluZyBzY29wZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfU0VUX1NDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpIHsKLQkJCXNjb3BlID0gUFVCTElDX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlTZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhzY29wZSwgZ2V0UHJvcGVydHlTZXRTY29wZSgpKSkgewotCQkJc2V0Q3VzdG9taXplZChQUk9QRVJUWV9TRVRfU0NPUEUsIHNjb3BlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgZmllbGQgbWVtYmVyIHNjb3BlLCBvbmUgb2Yge0BsaW5rICNQVUJMSUNfU0NPUEV9fHtAbGluayAjUFJPVEVDVEVEX1NDT1BFfQotCSAqIHx7QGxpbmsgI1BSSVZBVEVfU0NPUEV9LgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgbnVsbCAoZGVmYXVsdHMgdG8gcHJpdmF0ZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWVsZFNjb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKEZJRUxEX1NDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpIHsKLQkJCXNjb3BlID0gUFJJVkFURV9TQ09QRTsKLQkJfQotCQlyZXR1cm4gc2NvcGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbHVtbiBzaG91bGQgYmUgdXNlZCBpbiB0aGUgCi0JICogPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2VJbkVxdWFscygpICB7Ci0JCXJldHVybiBjdXN0b21pemVkQm9vbGVhbihVU0VfSU5fRVFVQUxTKSB8fCBpc1ByaW1hcnlLZXkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VXNlSW5FcXVhbHMoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihVU0VfSU5fRVFVQUxTLCB2YWx1ZSwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb2x1bW4gc2hvdWxkIGJlIHVzZWQgaW4gdGhlIAotCSAqIDxjb2RlPnRvU3RyaW5nPC9jb2RlPiBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2VJblRvU3RyaW5nKCkgIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9UT19TVFJJTkcpIHx8IGlzUHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VJblRvU3RyaW5nKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX1RPX1NUUklORywgdmFsdWUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVhYmxlKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGN1c3RvbWl6ZWQoVVBEQVRFQUJMRSkpOyAvL2RlZmF1bHRzIHRvIHRydWUgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVhYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oVVBEQVRFQUJMRSwgdmFsdWUsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoY3VzdG9taXplZChJTlNFUlRBQkxFKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZSAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihJTlNFUlRBQkxFLCB2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzR2VuZXJhdGVkKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGN1c3RvbWl6ZWQoR0VORVJBVEVEKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZSAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKEdFTkVSQVRFRCwgdmFsdWUsIHRydWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIm5hbWU9IiArIGdldE5hbWUoKSArICI7IHR5cGU9IiArIGdldFByb3BlcnR5VHlwZSgpIDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCX0KLQotCS8qZ2V0L3NldCBhbmQgZmllbGQgc2NvcGVzKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NPUEUgPSAicHVibGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9TQ09QRSA9ICJwcm90ZWN0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9TQ09QRSA9ICJwcml2YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JLypjdXN0b21pemF0aW9uIHByb3BlcnRpZXMqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInByb3BlcnR5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9UWVBFID0gInByb3BlcnR5VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0tJTkQgPSAibWFwcGluZ0tpbmQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFU0MgPSAicHJvcGVydHlEZXNjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9HRVRfU0NPUEUgPSAicHJvcGVydHlHZXRTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU0VUX1NDT1BFID0gInByb3BlcnR5U2V0U2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1NDT1BFID0gImZpZWxkU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9JTl9FUVVBTFMgPSAidXNlSW5FcXVhbHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9JTl9UT19TVFJJTkcgPSAidXNlSW5Ub1N0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFQUJMRSA9ICJ1cGRhdGVhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNFUlRBQkxFID0gImluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFRCA9ICJnZW5Qcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5DdXN0b21pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvT1JNR2VuQ3VzdG9taXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE2NzVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5DdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5Gb3JlaWduS2V5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gY3VzdG9taXplIHRoZSBkYXRhYmFzZSBzY2hlbWEgdG8gT1JNIGVudGl0eSAKLSAqIGdlbmVyYXRpb24uCi0gKiAKLSAqIDxwPlRoZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIGFyZSBtYWlubHkgZXhwb3NlZCBpbiB0aGUgZm9ybSBvZiAKLSAqIHByb3BlcnRpZXMuIFRoZXJlIGFyZSBubyBhc3N1bXB0aW9ucyBpbiB0aGlzIGNsYXNzIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRoZSAKLSAqIHByb3BlcnR5IG5hbWVzLiBQcm9wZXJ0aWVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIHNwZWNpZmljIHRhYmxlcyBhbmQgdGFibGUgCi0gKiBjb2x1bW5zLCBvciBnbG9iYWxseSBmb3IgYW55IHRhYmxlIGFuZC9vciBjb2x1bW4uCi0gKiAKLSAqIDxwPlN1YmNsYXNzIGNhbiBpbXBsZW1lbnQgdGhlIHNldHMgb2YgYWJzdHJhY3QgbWV0aG9kcyB0byBwcm92aWRlIE9STSB2ZW5kb3IKLSAqIHNwZWNpZmljIHByb3BlcnRpZXMuCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9STUdlbkN1c3RvbWl6ZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIHBhc3NlZCBmb3IgdGhlIHRhYmxlIG5hbWUgYXJndW1lbnQgdG8gZ2V0L3NldFByb3BlcnR5IAotCSAqIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgYXBwbGllcyB0byBhbnkgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX1RBQkxFID0gIl9fYW55VGFibGVfXyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRERMX0FOTk9UQVRJT04gPSAiZ2VuZXJhdGVERExBbm5vdGF0aW9ucyI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCB0YWJsZSB2YWx1ZS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1RBQkxFID0gIiI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCBjb2x1bW4gdmFsdWUuKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9DT0xVTU4gPSAiIjsKLQkKLQkvKlRoaXMgdmVyc2lvbiBudW1iZXIgaXMgd3JpdHRlbiBpbiB0aGUgaGVhZGVyIG9mIHRoZSBjdXN0b21pemF0aW9uIHN0cmVhbQotCSAqIGFuZCByZWFkIGF0IGRlLXNlcmlhbGl6YXRpb24gdGltZSwgaWYgaXQgaXMgZGlmZmVyZW50IHRoZW4gdGhlIGZpbGUgaXMgaW52YWxpZGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVkVSU0lPTiA9IDI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9DT05GSUdfRklMRSA9ICJ1cGRhdGVDb25maWdGaWxlIjsKLQotCXByaXZhdGUgdHJhbnNpZW50IFNjaGVtYSBtU2NoZW1hOwotCXByaXZhdGUgdHJhbnNpZW50IEZpbGUgbUZpbGU7Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRhYmxlTmFtZXM7Ci0JLyprZXk6IHRhYmxlIG5hbWUsIHZhbHVlOiBPUk1HZW5UYWJsZSBvYmplY3QuKi8KLQlwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nICwgT1JNR2VuVGFibGU+IG1UYWJsZXM7Ci0JLyp0aGUgPGNvZGU+QXNzb2NpYXRpb248L2NvZGU+IG9iamVjdHMgc29ydGVkIGJ5IHRoZWlyICJmcm9tIiAKLQkgKiB0YWJsZSBuYW1lLiBJbmNsdWRlcyBhbGwgYXNzb2NpYXRpb24gZGVyaXZlZCBmcm9tIGZvcmVpZ24ga2V5cyAKLQkgKiBpbiB1c2VyIHNlbGVjdGVkIHRhYmxlcy4gU2luY2Ugc29tZSBvZiB0aGUgZm9yZWlnbiBrZXlzIG1heSBwb2ludCB0byB0YWJsZQotCSAqIHVzZXIgZG9lcyBub3Qgc2VsZWN0LCB0aGlzIGxpc3QgbWF5IGJlIGRpZmZlcmVudCBmcm9tICBtVmFsaWRBc3NvY2lhdGlvbnMKLQkgKi8KLQlwcml2YXRlIExpc3Q8QXNzb2NpYXRpb24+IG1Bc3NvY2lhdGlvbnM7Ci0JLyoKLQkgKiBMaXN0IG9mIHZhbGlkIGFzc29jaWF0aW9ucyB3aXRoaW4gdGhlIHVzZXIgc2VsZWN0ZWQgdGFibGVzICAKLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PEFzc29jaWF0aW9uPiBtVmFsaWRBc3NvY2lhdGlvbnM7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBtSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnM7Ci0JCi0JLyp0aGUgcHJvcGVydHkgbmFtZSBpcyBpbiB0aGUgZm9ybSAkdGFibGVOYW1lLiRjb2x1bW5OYW1lLiRwcm9wZXJ0eU5hbWUuCi0JICogV2hlcmUgdGFibGVOYW1lIGNvdWxkIGJlIE5VTExfVEFCTEUgb3IgQU5ZX1RBQkxFCi0JICogYW5kIGNvbHVtbk5hbWUgY291bGQgYmUgTlVMTF9DT0xVTU4qLwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcHMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQuSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdHJ1ZTsKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIGFic3RyYWN0IG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHByaW1hcnkga2V5IGdlbmVyYXRvciBzY2hlbWVzLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8U3RyaW5nPiBnZXRBbGxJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXZlbG9wZXItYXNzaWduZWQgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb0lkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgaWRlbnRpdHkgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZGVudGl0eUlkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvcnMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU2V0PFN0cmluZz4gZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgdHlwZSBmcm9tIHRoZSBnaXZlbiBkYXRhYmFzZSBjb2x1bW4uCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oQ29sdW1uIGNvbHVtbikgOwotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyBwcm9wZXJ0eSB0eXBlcy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRBbGxQcm9wZXJ0eVR5cGVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHByb3BlcnR5IG1hcHBpbmcga2luZHMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0QWxsTWFwcGluZ0tpbmRzKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzaWMgKGRlZmF1bHQpIHByb3BlcnR5IG1hcHBpbmcga2luZC4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzaWNNYXBwaW5nS2luZCgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIChwcmltYXJ5IGtleSkgcHJvcGVydHkgbWFwcGluZyBraW5kLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZE1hcHBpbmdLaW5kKCk7Ci0JLyoqCi0JICogSW50ZXJhY3RzIHdpdGggdGhlIHVzZXIgdG8gZWRpdCB0aGUgY2FzY2FkZSBvZiB0aGUgZ2l2ZW4gCi0JICogcm9sZS4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWxzbyBjYWxsIDxjb2RlPkFzc29jaWF0aW9uUm9sZS5zZXRDYXNjYWRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSB1c2VyIGludGVyYWN0aW9uIGlzIGNhbmNlbGxlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZGl0Q2FzY2FkZShBc3NvY2lhdGlvblJvbGUgcm9sZSk7Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MuCi0JICogVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBuZWNlc3Nhcnkgd2hlbiB0aGUgPGNvZGU+c2F2ZTwvY29kZT4gCi0JICogbWV0aG9kIGlzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCBGaWxlIGZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5tU2NoZW1hID0gc2NoZW1hOwotCQltRmlsZSA9IGZpbGU7Ci0JCQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXNldFByb3BlcnR5KE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlbkN1c3RvbWl6ZXIuQU5ZX1RBQkxFLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKLQkJdHJ5IAotCQl7Ci0JCQkvL3JlYWQgaXQgaW4gYSBmaWxlIGZpcnN0IHRvIHNwZWVkdXAgZGVzZXJpYWxpemF0aW9uCi0JCQlieXRlW10gYnl0ZXMgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlKTsKLQkJCWlzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGlzdHJlYW0pOwotCQkJCi0JCQlGaWxlSGVhZGVyIGhlYWRlciA9IChGaWxlSGVhZGVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQlpZiAoaGVhZGVyLm1WZXJzaW9uID09IEZJTEVfVkVSU0lPTikgewotCQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IChPUk1HZW5DdXN0b21pemVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJcmVzdG9yZShjdXN0b21pemVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFHZW5QbHVnaW4ubG9nRXhjZXB0aW9uKCIqKipPUk1HZW5DdXN0b21pemVyLmxvYWQgZmFpbGVkICIrZmlsZSwgZXgpOwkJCQkKLQkJfQotCQlmaW5hbGx5IAotCQl7Ci0JCQlpZiAob2lzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5IAotCQkJCXsKLQkJCQkJb2lzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGlzdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkgCi0JCQkJewotCQkJCQlpc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCl7Ci0JCXJldHVybiB0aGlzLm1GaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHNjaGVtYSl7Ci0JCXRoaXMubVNjaGVtYSA9IHNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpewotCQlyZXR1cm4gbVNjaGVtYTsKLQl9Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24uCi0JICovCi0JcHVibGljIE9STUdlbkN1c3RvbWl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1c3RvbWl6YXRpb24gZmlsZS4KLQkgKiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLU9STUdlbkN1c3RvbWl6ZXIuc2F2ZTogIiArIG1GaWxlKTsKLQkJaWYgKCFtRmlsZS5leGlzdHMoKSAmJiAhbUZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7Ci0JCWJvb2xlYW4gZGVsZXRlSXQgPSB0cnVlOwotCQl0cnkgewotCQkJZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShtRmlsZSk7Ci0JCQlvb3MgPSBuZXcgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0oZm9zKTsKLQkJCUZpbGVIZWFkZXIgaGVhZGVyID0gbmV3IEZpbGVIZWFkZXIoKTsKLQkJCW9vcy53cml0ZU9iamVjdChoZWFkZXIpOwotCQkJb29zLndyaXRlT2JqZWN0KHRoaXMpOwotCQkJZGVsZXRlSXQgPSBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL2RlbGV0ZUl0IGlzIHRydWUsIHNvIHRoZSBjYWNoZSBpcyBub3Qgc2F2ZWQuCi0JCQlDb3JlRXhjZXB0aW9uIGNlID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lELAotCQkJCQkiVW5hYmxlIHRvIHNhdmUgdGhlIE9STUdlbkN1c3RvbWl6ZXIgZmlsZTogIittRmlsZSxleCkpOwotCQkJSnB0SnBhR2VuUGx1Z2luLmxvZ0V4Y2VwdGlvbiggY2UgKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG9vcyE9bnVsbCkgb29zLmNsb3NlKCk7Ci0JCQkJaWYgKGZvcyE9bnVsbCkgZm9zLmNsb3NlKCk7Ci0JCQkJaWYgKGRlbGV0ZUl0KSB7Ci0JCQkJCW1GaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgyKSB7fQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcihEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcikgewotCQlpZiAoZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJkYXRhYmFzZSBhbm5vdGF0aW9uIG5hbWUgYnVpbGRlciBpcyByZXF1aXJlZCIpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPSBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLQl9CQotCi0JLyoqCi0JICogUmV0dXJucyB7QGxpbmsgI0dFTkVSQVRFX0RETF9BTk5PVEFUSU9OfSAgaW5kaWNhdGluZyB3aGV0aGVyCi0JICogdGhlIG9wdGlvbmFsIERETCBwYXJhbWV0ZXJzIGxpa2UgbGVuZ3RoLCBudWxsYWJsZSwgdW5xaXVlLCBldGMgc2hvdWxkIGJlIGdlbmVyYXRlZCAKLQkgKiBpbiBAQ29sdW1uIGFubm90YXRpb24uCi0JICogZGVmYXVsdHMgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURETEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhnZXRQcm9wZXJ0eShHRU5FUkFURV9ERExfQU5OT1RBVElPTiwgQU5ZX1RBQkxFLCBudWxsKSk7IC8vZGVmYXVsdHMgdG8gZmFsc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0UHJvcEtleShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCVN0cmluZyB2YWx1ZSA9IG1Qcm9wcy5nZXQoa2V5KTsKLQkJLyppZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGFuZCBpdCBpcyBhIHRhYmxlIHByb3BlcnR5IHRoZW4gCi0JCSAqIGdldCB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0eS4qLwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiB0YWJsZU5hbWUgIT0gbnVsbCAmJiBjb2xOYW1lID09IG51bGwgJiYgIXRhYmxlTmFtZS5lcXVhbHMoQU5ZX1RBQkxFKSkgewotCQkJdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEFOWV9UQUJMRSwgY29sTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIGEgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUsIGNvdWxkIGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0UHJvcEtleShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQltUHJvcHMucHV0KGtleSwgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJbVByb3BzLnJlbW92ZShrZXkpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNhbWUgYXMge0BsaW5rICNnZXRQcm9wZXJ0eShTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0gYnV0IAotCSAqIGNvbnZlcnRzIHRoZSB2YWx1ZSB0byBib29sZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKHZhbHVlKTsKLQl9Ci0JLyoqCi0JICogQ2hhbmdlcyBhIHRhYmxlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gdmFsdWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiLCB0YWJsZU5hbWUsIGNvbE5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgdGFibGVzIHRvIGdlbmVyYXRlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIG1UYWJsZU5hbWVzICE9IG51bGwgPyBtVGFibGVOYW1lcyA6IGphdmEudXRpbC5Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZXRjaCB0eXBlIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgCi0JICogaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZSBudWxsIAotCSAqIHdoZW4gdXNlZCBpbiAjc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuRmV0Y2goT1JNR2VuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuICIiOwotCX0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHRhYmxlIHVzZXIgc2VsZWN0aW9uIGlzIGNoYW5nZWQgaW4gdGhlIAotCSAqIGdlbmVyYXRpb24gd2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZXMoTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMpIHsKLQkJbVRhYmxlTmFtZXMgPSB0YWJsZU5hbWVzOwotCQltVGFibGVzID0gbnVsbDsKLQkJbVZhbGlkQXNzb2NpYXRpb25zID0gbnVsbDsgLy9yZWNvbXB1dGUKLQkJbUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zID0gdHJ1ZTsgLy9tYWtlIHN1cmUgZm9yZWlnbiBhc3NvY2lhdGlvbnMgZnJvbSBuZXdseSBhZGRlZCB0YWJsZXMgYXJlIGNvbXB1dGVkLgotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lcyB0byBiZSBnZW5lcmF0ZWQuCi0JICogVGhpcyBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSA8Y29kZT5nZXRUYWJsZU5hbWVzPC9jb2RlPiBpZiB0aGVyZSAKLQkgKiBhcmUgbWFueS10by1tYW55IGpvaW4gdGFibGVzIGFuZCBhcmUgbm90IGNvbnRyaWJ1dGluZyAKLQkgKiBpbiBhbnkgb3RoZXIgYXNzb2NpYXRpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R2VuVGFibGVOYW1lcygpICB7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lcyA9IGdldFRhYmxlTmFtZXMoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4obmFtZXMuc2l6ZSgpKTsKLQkJCi0JCS8qZmlsdGVyIG91dCBqb2luIHRhYmxlcyovCi0JCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IGdldEFzc29jaWF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lc0l0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyB0YWJsZU5hbWVzSXRlci5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHRhYmxlTmFtZSA9IHRhYmxlTmFtZXNJdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGFzc29jSXRlciA9IGFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyBhc3NvY0l0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGFzc29jSXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFhc3NvY2lhdGlvbi5pc0dlbmVyYXRlZCgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpKQotCQkJCQkJfHwgdGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpKSB7Ci0JCQkJCWlzVmFsaWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRhYmxlTmFtZS5lcXVhbHMoYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpKSkgewotCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzVmFsaWQpIHsKLQkJCQlyZXN1bHQuYWRkKHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhbiA8Y29kZT5PUk1HZW5UYWJsZTwvY29kZT4gb2JqZWN0IGdpdmVuIGl0cyBuYW1lLCBvciAKLQkgKiBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlIGdldFRhYmxlKFN0cmluZyB0YWJsZU5hbWUpICB7Ci0JCWlmIChtVGFibGVzID09IG51bGwpIHsKLQkJCW1UYWJsZXMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBPUk1HZW5UYWJsZT4obVRhYmxlTmFtZXMuc2l6ZSgpKTsKLQkJfQotCQkKLQkJaWYobVRhYmxlTmFtZXMhPW51bGwgJiYgbVNjaGVtYSE9bnVsbCl7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG1UYWJsZU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJCVRhYmxlIGRiVGFibGUgPSBtU2NoZW1hLmdldFRhYmxlTmFtZWQoIG5hbWUgKTsKLQkJCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJCW1UYWJsZXMucHV0KG5hbWUsIGNyZWF0ZUdlblRhYmxlKGRiVGFibGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1UYWJsZXMuZ2V0KHRhYmxlTmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkFzc29jaWF0aW9uPC9jb2RlPiBvYmplY3RzIHNvcnRlZCBieSB0aGVpciAiZnJvbSIgCi0JICogdGFibGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdDxBc3NvY2lhdGlvbj4gZ2V0QXNzb2NpYXRpb25zKCl7Ci0JCXJldHVybiBnZXRBc3NvY2lhdGlvbnModHJ1ZS8qdmFsaWRPbmx5Ki8pOwotCX0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBhc3NvY2lhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBc3NvY2lhdGlvbihBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgIHsKLQkJZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykuYWRkKGFzc29jaWF0aW9uKTsKLQkJaWYgKG1WYWxpZEFzc29jaWF0aW9ucyAhPSBudWxsKSB7Ci0JCQltVmFsaWRBc3NvY2lhdGlvbnMuYWRkKGFzc29jaWF0aW9uKTsKLQkJfQotCQkKLQl9Ci0JLyoqCi0JICogRGVsZXRlcyB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQXNzb2NpYXRpb24oQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pICB7Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IGdldEFzc29jaWF0aW9ucyhmYWxzZS8qdmFsaWRPbmx5Ki8pLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCWFzc2VydChyZW1vdmVkKTsKLQkJCi0JCWlmIChtVmFsaWRBc3NvY2lhdGlvbnMgIT0gbnVsbCkgewotCQkJcmVtb3ZlZCA9IG1WYWxpZEFzc29jaWF0aW9ucy5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQkJYXNzZXJ0KHJlbW92ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbiBhc3NvY2lhdGlvbiBzaW1pbGFyIHRvIHRoZSBnaXZlbiBhc3NvY2lhdGlvbiAKLQkgKiBhbHJlYWR5IGV4aXN0cy4KLQkgKiBUaGlzIGlzIGRlY2lkZWQgYmFzZWQgb25seSBvbiB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGFuZCBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNpbWlsYXJBc3NvY2lhdGlvbkV4aXN0cyhBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IGdldEFzc29jaWF0aW9ucyhmYWxzZS8qdmFsaWRPbmx5Ki8pLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGVOYW1lKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpKQotCQkJCQkJfHwgIWFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSkKLQkJCQkJCXx8ICFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCksIGFzc29jaWF0aW9uMi5nZXRKb2luVGFibGVOYW1lKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKQotCQkJCQkJfHwgIWFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkpCi0JCQkJCQkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkJCi0JCQkJLyp0aGUgMiBhc3NvY2lhdGlvbiBoYXZlIHRoZSBzYW1lIHJlZmVycmVyLCByZWZlcmVuY2VkIGFuZCBqb2luIHRhYmxlKi8KLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKSkKLQkJCQkJCSYmIGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+T1JNR2VuVGFibGU8L2NvZGU+IGluc3RhbmNlLiAKLQkgKi8KLQlwdWJsaWMgT1JNR2VuVGFibGUgY3JlYXRlR2VuVGFibGUoVGFibGUgZGJUYWJsZSkgewotCQlyZXR1cm4gbmV3IE9STUdlblRhYmxlKGRiVGFibGUsIHRoaXMpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBPUk1HZW5Db2x1bW4gY3JlYXRlR2VuQ29sdW1uKENvbHVtbiBkYkNvbCkgewotCQlyZXR1cm4gbmV3IE9STUdlbkNvbHVtbihkYkNvbCwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBzcGVjcyByZXF1aXJlIHRoZSAibWFueSIgc2lkZSAKLQkgKiBvZiBhbiBhc3NvY2lhdGlvbiB0byBiZSB0aGUgb3duZXIgKGxpa2UgRUpCMykuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFueVNpZGVJc0Fzc29jaWF0aW9uT3duZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVDb25maWdGaWxlKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGdldFByb3BlcnR5KFVQREFURV9DT05GSUdfRklMRSwgbnVsbCwgbnVsbCkpOyAvL2RlZmF1bHRzIHRvIHRydWUKLQl9Ci0JcHVibGljIHZvaWQgc2V0VXBkYXRlQ29uZmlnRmlsZShib29sZWFuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSkgeyAvL2RlZmF1bHQgaXMgdHJ1ZQotCQkJc2V0UHJvcGVydHkoVVBEQVRFX0NPTkZJR19GSUxFLCBudWxsLCBudWxsLCBudWxsKTsgLy9yZW1vdmUgaXQKLQkJfSBlbHNlIHsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShVUERBVEVfQ09ORklHX0ZJTEUsIHZhbHVlLCBudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gVmVsb2NpdHkgdGVtcGxhdGVzIG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyBhIGdldHRlciBtZXRob2QgbmFtZSBnaXZlbiBhIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAiZ2V0IitTdHJpbmdVdGlsLmluaXRVcHBlcihwcm9wZXJ0eU5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2V0dGVyIG1ldGhvZCBuYW1lIGdpdmVuIGEgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5U2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJzZXQiK1N0cmluZ1V0aWwuaW5pdFVwcGVyKHByb3BlcnR5TmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFN0cmluZ1V0aWwucXVvdGUocywgJyInKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShib29sZWFuIGIpIHsKLQkJcmV0dXJuIHF1b3RlKFN0cmluZy52YWx1ZU9mKGIpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShpbnQgaSkgewotCQlyZXR1cm4gcXVvdGUoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQkvKioKLQkgKiBBcHBlbmRzIGFuIGFubm90YXRpb24gbWVtYmVyIG5hbWUgYW5kIHZhbHVlIHRvIGFuIGV4aXN0aW5nIGFubm90YXRpb24uCi0JICogCi0JICogQHBhcmFtIHMgVGhlIGFubm90YXRpb24gbWVtYmVycyBzdHJpbmcuCi0JICoKLQkgKiBAcGFyYW0gbWVtYmVyVmFsdWUgVGhlIG1lbWJlciB2YWx1ZSwgaWYgbnVsbCBvciBlbXB0eSBzdHJpbmdzIHRoZW4gCi0JICogbm90aGluZyBpcyBhcHBlbmVkLgotCSAqIAotCSAqIEBwYXJhbSB3aGV0aGVyIHRvIGRvdWJsZSBxdW90ZSB0aGUgbWVtYmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgYXBwZW5kQW5ub3RhdGlvbihTdHJpbmcgcywgU3RyaW5nIG1lbWJlck5hbWUsIFN0cmluZyBtZW1iZXJWYWx1ZSwgYm9vbGVhbiBxdW90ZSkgewotCQlpZiAobWVtYmVyVmFsdWUgPT0gbnVsbCB8fCBtZW1iZXJWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gczsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzKTsKLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCIsICIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQobWVtYmVyTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJaWYgKHF1b3RlKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChtZW1iZXJWYWx1ZSk7Ci0JCWlmIChxdW90ZSkgewotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNKREsxXzUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIHByaXZhdGUgbWV0aG9kcwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgY3VzdG9taXphdGlvbiBzZXR0aW5ncyBmcm9tIHRoZSBnaXZlbiAKLQkgKiAocGVyc2lzdGVkKSBjdXN0b21pemVyLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcikgIHsKLQkJbVRhYmxlTmFtZXMgPSBjdXN0b21pemVyLm1UYWJsZU5hbWVzOwotCQltQXNzb2NpYXRpb25zID0gY3VzdG9taXplci5tQXNzb2NpYXRpb25zOwotCQltUHJvcHMgPSBjdXN0b21pemVyLm1Qcm9wczsKLQkJbVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gY3VzdG9taXplci5tVXBkYXRlUGVyc2lzdGVuY2VYbWw7Ci0JCWlmKCBtU2NoZW1hID09IG51bGwgKQotCQkJcmV0dXJuOwotCQkKLQkJLypyZW1vdmUgaW52YWxpZCB0YWJsZSBuYW1lcyovCi0JCWZvciAoaW50IGkgPSBtVGFibGVOYW1lcy5zaXplKCktMTsgaSA+PSAwOyAtLWkpIHsKLQkJCVN0cmluZyB0YWJsZU5hbWUgPSBtVGFibGVOYW1lcy5nZXQoaSk7Ci0JCQlpZiAobVNjaGVtYS5nZXRUYWJsZU5hbWVkKCB0YWJsZU5hbWUpID09IG51bGwpIHsKLQkJCQltVGFibGVOYW1lcy5yZW1vdmUoaSk7Ci0JCQl9Ci0JCX0KLQkJaWYoIG1Bc3NvY2lhdGlvbnMhPW51bGwgKXsKLQkJCS8qcmVzdG9yZSB0aGUgYXNzb2NpYXRpb25zKi8KLQkJCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ZXIgPSBtQXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWFzc29jaWF0aW9uLnJlc3RvcmUodGhpcyk7Ci0JCQl9Ci0JCQkvKmFkZCB0aGUgZm9yZWlnbiBrZXlzIGFzc29jaWF0aW9ucyBqdXN0IGluIGNhc2UgdGhlIHRhYmxlcyBjaGFuZ2VkIHNpbmNlIAotCQkJICogdGhlIGxhc3QgdGltZSB0aGUgc3RhdGUgd2FzIHBlcnNpc3RlZC4gUGFzcyBjaGVja0V4aXN0aW5nIHRydWUgc28gdGhhdCB0aGUgCi0JCQkgKiBhc3NvY2lhdGlvbnMgcmVzdG9yZWQgYWJvdmUgYXJlIG5vdCBvdmVyd3JpdHRlbi4qLwotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyh0cnVlLypjaGVja0V4aXN0aW5nKi8pOwotCQkJLy8gc29ydCBvbiByZXN0b3JlCi0JCQlzb3J0QXNzb2NpYXRpb25zKCBtQXNzb2NpYXRpb25zICk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUga2V5IGluIG1Qcm9wcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgCi0JICogcHJvcGVydHlOYW1lLCB0YWJsZSBhbmQgY29sdW1uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByb3BLZXkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nIGNvbE5hbWUpIHsKLQkJaWYgKHRhYmxlTmFtZSA9PSBudWxsKSB7Ci0JCQl0YWJsZU5hbWUgPSBOVUxMX1RBQkxFOwotCQl9Ci0JCWlmIChjb2xOYW1lID09IG51bGwpIHsKLQkJCWNvbE5hbWUgPSBOVUxMX0NPTFVNTjsKLQkJfQotCQlyZXR1cm4gdGFibGVOYW1lICsgJy4nICsgY29sTmFtZSArICcuJyArIHByb3BlcnR5TmFtZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb25zIHRoYXQgYXJlIHZhbGlkIGZvciB0aGUgCi0JICogY3VycmVudCB0YWJsZXMuCi0JICovCi0JcHJpdmF0ZSBMaXN0PEFzc29jaWF0aW9uPiBnZXRBc3NvY2lhdGlvbnMoYm9vbGVhbiB2YWxpZE9ubHkpewotCQlpZiAobUFzc29jaWF0aW9ucyA9PSBudWxsKSB7Ci0JCQltQXNzb2NpYXRpb25zID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8QXNzb2NpYXRpb24+KCk7Ci0JCQkKLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnMoZmFsc2UvKmNoZWNrRXhpc3RpbmcqLyk7Ci0JCX0gZWxzZSBpZiAobUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zKSB7Ci0JCQltSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnMgPSBmYWxzZTsKLQkJCQotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyh0cnVlLypjaGVja0V4aXN0aW5nKi8pOwotCQl9Ci0JCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9uczsKLQkJaWYgKHZhbGlkT25seSkgewotCQkJaWYgKG1WYWxpZEFzc29jaWF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJLypmaWx0ZXIgb3V0IHRoZSBpbnZhbGlkIGFzc29jaWF0aW9ucyovCi0JCQkJbVZhbGlkQXNzb2NpYXRpb25zID0gbmV3IEFycmF5TGlzdDxBc3NvY2lhdGlvbj4obUFzc29jaWF0aW9ucy5zaXplKCkpOwotCQkJCWZvciAoaW50IGkgPSAwLCBuID0gbUFzc29jaWF0aW9ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBtQXNzb2NpYXRpb25zLmdldChpKTsKLQkJCQkJaWYgKGFzc29jaWF0aW9uLmlzVmFsaWQoKSkgewotCQkJCQkJbVZhbGlkQXNzb2NpYXRpb25zLmFkZChhc3NvY2lhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlhc3NvY2lhdGlvbnMgPSBtVmFsaWRBc3NvY2lhdGlvbnM7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NvY2lhdGlvbnMgPSBtQXNzb2NpYXRpb25zOwotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvbnM7Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKGJvb2xlYW4gY2hlY2tFeGlzdGluZykgewotCQlMaXN0PFN0cmluZz4gdGFibGVOYW1lcyA9IGdldFRhYmxlTmFtZXMoKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSB0YWJsZU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCU9STUdlblRhYmxlIHRhYmxlID0gZ2V0VGFibGUoaXRlci5uZXh0KCkpOwotCQkJYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyh0YWJsZSwgY2hlY2tFeGlzdGluZyk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnMoT1JNR2VuVGFibGUgdGFibGUsIGJvb2xlYW4gY2hlY2tFeGlzdGluZykgewotCQlpZih0YWJsZT09bnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCQotCQlMaXN0PEZvcmVpZ25LZXlJbmZvPiBmS2V5cyA9IG51bGw7Ci0JCQotCQl0cnl7Ci0JCQlmS2V5cyA9IERUUFV0aWwuZ2V0Rm9yZWlnbktleXModGFibGUuZ2V0RGJUYWJsZSgpKTsKLQkJfWNhdGNoKEV4Y2VwdGlvbiBpc2UpewotCQkJLy93b3JrYXJvdW5kIERhbGkgYnVnIGZvciBub3cKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoIGZLZXlzLnNpemUoKT09MCApCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PEFzc29jaWF0aW9uPiBhZGRlZEFzc29jaWF0aW9ucyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PEFzc29jaWF0aW9uPigpOwotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXlJbmZvPiBpdGVyID0gZktleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleUluZm8gZmtpID0gaXRlci5uZXh0KCk7Ci0JCQlPUk1HZW5UYWJsZSByZWZlcmVuY2VkVGFibGUgPSBnZXRUYWJsZShma2kuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKTsKLQkJCWlmIChyZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcywgdGFibGUuZ2V0TmFtZSgpLCBma2kuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpCi0JCQkJCQksIHJlZmVyZW5jZWRUYWJsZS5nZXROYW1lKCksIGZraS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSk7Ci0JCQlhc3NvY2lhdGlvbi5jb21wdXRlQ2FyZGluYWxpdHkoKTsKLQkJCS8vRGVmZXIgdGhlIGNoZWNrIG9mIHNpbWlsYXJBc3NvY2lhdGlvbkV4aXN0cyBhZnRlciBjb21wdXRlTWFueVRvTWFueSgpCi0JCQkvL290aGVyd2lzZSB0aGUgTVRNIGFzc29jaWF0aW9uIHdpbGwgbm90IGNvbXB1dGVkIGNvcnJlY3RseSBpbiBzb21lIGNhc2VzLgotCQkJLy9pZiAoY2hlY2tFeGlzdGluZyAmJiBzaW1pbGFyQXNzb2NpYXRpb25FeGlzdHMoYXNzb2NpYXRpb24pKSB7Ci0JCQkvLwljb250aW51ZTsKLQkJCS8vfQotCQkJYWRkZWRBc3NvY2lhdGlvbnMuYWRkKGFzc29jaWF0aW9uKTsKLQkJfQotCQkKLQkJQXNzb2NpYXRpb24gbTJtID0gY29tcHV0ZU1hbnlUb01hbnkodGFibGUsIGFkZGVkQXNzb2NpYXRpb25zKTsKLQkJaWYgKG0ybSAhPSBudWxsKSB7Ci0JCQkvKmRvIG5vdCBnZW5lcmF0ZSB0aGUgMiBtYW55LXRvLW9uZSovCi0JCQlhZGRlZEFzc29jaWF0aW9ucy5jbGVhcigpOwotCQkJYWRkZWRBc3NvY2lhdGlvbnMuYWRkKDAsIG0ybSk7Ci0JCX0KLQkJLy9yZW1vdmUgdGhlIGFzc29jaWF0aW9uIGlmIGFscmVhZHkgZXhpc3RpbmcKLQkJSXRlcmF0b3I8QXNzb2NpYXRpb24+IGl0ID0gIGFkZGVkQXNzb2NpYXRpb25zLml0ZXJhdG9yKCk7IAotCQl3aGlsZSggaXQuaGFzTmV4dCgpICl7Ci0JCQlBc3NvY2lhdGlvbiBuZXdBc3NvY2lhdGlvbiA9IGl0Lm5leHQoKTsKLQkJCWZvciggQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gOiBtQXNzb2NpYXRpb25zICl7Ci0JCQkJaWYoIG5ld0Fzc29jaWF0aW9uLmVxdWFscyggYXNzb2NpYXRpb24gKSl7Ci0JCQkJCWl0LnJlbW92ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJbUFzc29jaWF0aW9ucy5hZGRBbGwoYWRkZWRBc3NvY2lhdGlvbnMpOwotCX0KLQlwcml2YXRlIEFzc29jaWF0aW9uIGNvbXB1dGVNYW55VG9NYW55KE9STUdlblRhYmxlIHRhYmxlLCBMaXN0PEFzc29jaWF0aW9uPiBhZGRlZEFzc29jaWF0aW9ucykgewotCQkvKiogbWFueS10by1tYW55IGFzc29jaWF0aW9ucyBpZjoKLQkJICogLSBhZGRlZEFzc29jaWF0aW9ucyBjb250YWlucyAyIG1hbnktdG8tb25lIGFzc29jaWF0aW9ucwotCQkgKiAtIHRhYmxlcyB0MSBhbmQgdDIgZG9lcyBOT1QgaGF2ZSB0byBiZSBkaWZmZXJlbnQoIGZvciBzZWxmLU1UTS1zZWxmIHNpdHVhdGlvbikKLQkJICogLSA8Y29kZT50YWJsZTwvY29kZT4gY29udGFpbnMgb25seSB0aGUgZm9yZWlnbiBrZXkgY29sdW1ucy4KLQkJICogCi0JCSAqIE5vdGU6IGZvbGxvd2luZyByZXN0cmljdGlvbnMgaGF2ZSBiZWVuIHJlbW92ZWQ6Ci0JCSAqIC10YWJsZSBoYXMgb25seSB0d28gY29sdW1ucwotCQkgKiAtdDEgYW5kIHQyIG11c3QgYmUgZGlmZmVyZW50Ci0JCSAqIC10aGUgcHJpbWFyeSBrZXkgb2YgPGNvZGU+dGFibGU8L2NvZGU+IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGl0cyBmb3JlaWduIAotCQkgKiAJa2V5cyB0byB0MSBhbmQgdDIuKi8KLQkJCi0JCWlmIChhZGRlZEFzc29jaWF0aW9ucy5zaXplKCkgIT0gMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vTVRNIHRhYmxlIHNob3VsZCBoYXZlIHR3byBNVE8gcmVsYXRpb25zIHRvIG9yZ2luYWwgdGFibGVzCi0JCUFzc29jaWF0aW9uIGFzc29jMSA9IGFkZGVkQXNzb2NpYXRpb25zLmdldCgwKTsKLQkJQXNzb2NpYXRpb24gYXNzb2MyID0gYWRkZWRBc3NvY2lhdGlvbnMuZ2V0KDEpOwotCQlpZiAoYXNzb2MxLmdldENhcmRpbmFsaXR5KCkgIT0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkUKLQkJCQl8fCBhc3NvYzIuZ2V0Q2FyZGluYWxpdHkoKSAhPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvL01UTSB0YWJsZSBzaG91bGQgb25seSBpbmNsdWRlIGZvcmVpZ24ga2V5IGNvbHVtbnMKLQkJZm9yKCBPUk1HZW5Db2x1bW4gY29sIDogdGFibGUuZ2V0Q29sdW1ucygpKXsKLQkJCWlmKCAhY29sLmlzRm9yZWlnbktleSgpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCi0JCU9STUdlblRhYmxlIHQxID0gYXNzb2MxLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCQlPUk1HZW5UYWJsZSB0MiA9IGFzc29jMi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQotCQlpZiggdDEuZ2V0TmFtZSgpLmVxdWFscyh0YWJsZS5nZXROYW1lKCkpIHx8IHQyLmdldE5hbWUoKS5lcXVhbHModGFibGUuZ2V0TmFtZSgpKSApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9NYWtlIGEgZ3Vlc3Mgd2hpY2ggdGFibGUgaXMgdGhlIG93bmluZyBzaWRlIG9mIHRoZSBNVE0gcmVsYXRpb24KLQkJLy9TZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI2ODQ0NQotCQkvL0xvZ2ljIGJvcnJvd2VkIGZyb20gRFRQVGFibGVXcmFwcGVyLmdldEpvaW5UYWJsZU93bmluZ0ZvcmVpZ25LZXkoKQotCQlpZiggIXRhYmxlLmdldE5hbWUoKS5lcXVhbHModDEuZ2V0TmFtZSgpICsgIl8iICsgdDIuZ2V0TmFtZSgpICkgKSB7Ci0JCQkvL3N3YXAgdDEgYW5kIHQyICAKLQkJCU9STUdlblRhYmxlIHQzID0gdDE7Ci0JCQl0MT10MjsKLQkJCXQyPXQzOwotCQkJLy9zd2FwIGFzc29jMSBhbmQgYXNzb2MyCi0JCQlBc3NvY2lhdGlvbiBhc3NvYzM9YXNzb2MxOwotCQkJYXNzb2MxPWFzc29jMjsKLQkJCWFzc29jMj1hc3NvYzM7Ci0JCX0KLQkJCi0vL0NvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGUgYXNzdW1wdGlvbiBpcyB0b28gcmVzdHJpY3RpdmU6IAotLy90aGlzIGNoZWNrIHdpbGwgcHJldmVudCBnZW5lcmF0aW5nIE1UTSBtYXBwaW5nIHRhYmxlIG5vdCBoYXZpbmcgCi0vL3ByaW1hcnkga2V5IGRlZmluZWQgCQkKLS8vCQlMaXN0IHBrTmFtZXMgPSBEVFBVdGlsLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lcyh0YWJsZS5nZXREYlRhYmxlKCkpOwotLy8JCWlmIChwa05hbWVzLnNpemUoKSAhPSB0YWJsZS5nZXRDb2x1bW5OYW1lcygpLnNpemUoKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0vLwkJTGlzdCBma05hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoYXNzb2MxLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSk7IC8vY2xvbmUgYmVjYXVzZSB3ZSBtb2RpZnkgYnkgYWRkQWxsIGJlbG93Ci0vLwkJZmtOYW1lcy5hZGRBbGwoYXNzb2MyLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSk7Ci0vLwkJaWYgKCFDb2xsZWN0aW9uVXRpbC5lcXVhbHNJZ25vcmVPcmRlcihwa05hbWVzLCBma05hbWVzKSkgewotLy8JCQlyZXR1cm4gbnVsbDsKLS8vCQl9Ci0JCUFzc29jaWF0aW9uIG0ybSA9IG5ldyBBc3NvY2lhdGlvbih0aGlzLCB0MS5nZXROYW1lKCkvKnJlZmVycmVyVGFibGVOYW1lKi8sIGFzc29jMS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKS8qcmVmZXJyZXJDb2xOYW1lcyovCi0JCQkJLCB0Mi5nZXROYW1lKCkvKnJlZmVyZW5jZWRUYWJsZU5hbWUqLywgYXNzb2MyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLypyZWZlcmVuY2VkQ29sTmFtZXMqLwotCQkJCSwgdGFibGUuZ2V0TmFtZSgpLCBhc3NvYzEuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLypyZWZlcnJlckpvaW5Db2xOYW1lcyovLCBhc3NvYzIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLypyZWZlcmVuY2VkSm9pbkNvbE5hbWVzKi8pOwotCQltMm0uc2V0Q3VzdG9tKGZhbHNlKTsKLQkJcmV0dXJuIG0ybTsKLQl9Ci0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBGaWxlSGVhZGVyIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBUaGUgaGVhZGVyIG9mIHRoZSBjdXN0b21pemF0aW9uIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZUhlYWRlciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJLyoqCi0JCSAqIFNob3VsZCBiZSBhcmd1bWVudC1sZXNzIGJlY2F1c2UgaXQgaXMgdXNlZCBpbiAKLQkJICogdGhlIGRlLXNlcmlhbGl6YXRpb24gcHJvY2Vzcy4KLQkJICovCi0JCXB1YmxpYyBGaWxlSGVhZGVyKCkgewotCQkJbVZlcnNpb24gPSBGSUxFX1ZFUlNJT047Ci0JCX0KLQkJaW50IG1WZXJzaW9uOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc29ydEFzc29jaWF0aW9ucyggTGlzdDwgQXNzb2NpYXRpb24gPiBsaXN0ICkgewotCSAgIENvbGxlY3Rpb25zLnNvcnQoIGxpc3QsIG5ldyBDb21wYXJhdG9yPCBBc3NvY2lhdGlvbiA+KCkgewotCSAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSggQXNzb2NpYXRpb24gbGhzLCBBc3NvY2lhdGlvbiByaHMgKSB7Ci0JICAgICAgICAgLy8gc29ydCBieSByZWZlcnJlciB0YWJsZSBuYW1lIGZpcnN0Li4uCi0JICAgICAgICAgaW50IHRlc3QgPSBsaHMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKS5jb21wYXJlVG8oIHJocy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpICk7Ci0gICAgICAgICAgICBpZiggdGVzdCAhPSAwICkKLSAgICAgICAgICAgICAgIHJldHVybiB0ZXN0OwotICAgICAgICAgICAgLy8gdGhlbiBieSByZWZlcmVuY2VkIHRhYmxlIG5hbWUuLi4KLSAgICAgICAgICAgIHRlc3QgPSBsaHMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmNvbXBhcmVUbyggcmhzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSApOwotICAgICAgICAgICAgaWYoIHRlc3QgIT0gMCApCi0gICAgICAgICAgICAgICByZXR1cm4gdGVzdDsKLSAgICAgICAgICAgIC8vIGlmIHJlZmVycmVyIGFuZCByZWZlcmVuY2VkIHRhYmxlcyBhcmUgdGhlIHNhbWUsIHRoZXkgc2hvdWxkCi0gICAgICAgICAgICAvLyBhcHBlYXIgbmV4dCB0byBlYWNoIG90aGVyCi0gICAgICAgICAgICByZXR1cm4gMDsKLQkgICAgICB9Ci0JICAgfSApOwotCX0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJcmV0dXJuIG1VcGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VXBkYXRlUGVyc2lzdGVuY2VYbWwoYm9vbGVhbiB1cGRhdGVQZXJzaXN0ZW5jZVhtbCkgewotCQl0aGlzLm1VcGRhdGVQZXJzaXN0ZW5jZVhtbCA9IHVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTdiMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkVudGl0eUdlblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBPUk0gZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBhIGRhdGFiYXNlIHRhYmxlLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaXMgZGVzaWduZWQgdG8gYmUgY3JlYXRlZC9jaGFuZ2VkIGJ5IHRoZSBnZW5lcmF0aW9uIHdpemFyZCwgYW5kCi0gKiBnZW5lcmF0ZWQgdXNpbmcgVmVsb2NpdHkgdGVtcGxhdGVzLiBUaGUgbW9kaWZpZWQgcHJvcGVydGllcyAoaWYgYW55KSBhcmUKLSAqIHBlcnNpc3RlZC9yZXRyaWV2ZWQgdXNpbmcgPGNvZGU+T1JNR2VuQ3VzdG9taXplcjwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9STUdlblRhYmxlCi17Ci0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIG1DdXN0b21pemVyOwotCXByaXZhdGUgTGlzdDxPUk1HZW5Db2x1bW4+IG1Db2x1bW5zOwotCXByaXZhdGUgVGFibGUgbURiVGFibGU7Ci0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBjb2x1bW5UeXBlc01hcCA9ICBudWxsOwotCS8qKgotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgVGhlIGRhdGFiYXNlIHRhYmxlIG9yIG51bGwgaWYgdGhpcyB0YWJsZSBpcyB1c2VkIHRvIGdldC9zZXQKLQkgKiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHRhYmxlIHByb3BlcnRpZXMgKHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwKLQkgKiAgICAgICAgICAgIHRhYmxlcyB1bmxlc3Mgb3ZlcnJpZGVuKS4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuVGFibGUoVGFibGUgdGFibGUsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcikgewotCQlzdXBlcigpOwotCQltRGJUYWJsZSA9IHRhYmxlOwotCQltQ3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JfQotCi0JcHVibGljIE9STUdlbkN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhYmxlIGlzIGlzIHVzZWQgdG8gZ2V0L3NldCB0aGUgZGVmYXVsdCB0YWJsZQotCSAqIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0c1RhYmxlKCkgewotCQlyZXR1cm4gbURiVGFibGUgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGN1c3RvbWl6ZWQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHkocHJvcE5hbWUsIGdldE5hbWUoKSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCBnZXROYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWQoU3RyaW5nIHByb3BOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJdmFsdWUgPSBudWxsOwotCQl9Ci0JCWdldEN1c3RvbWl6ZXIoKS5zZXRQcm9wZXJ0eShwcm9wTmFtZSwgdmFsdWUsIGdldE5hbWUoKSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lLCBib29sZWFuIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlpZiAoZGVmYXVsdFZhbHVlID09IHZhbHVlKSB7Ci0JCQlzZXRDdXN0b21pemVkKHByb3BOYW1lLCBudWxsKTsgLy8gcmVtb3ZlIHRoZSBwcm9wZXJ0eQotCQl9Ci0JCWVsc2UgewotCQkJZ2V0Q3VzdG9taXplcigpLnNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgdmFsdWUsIGdldE5hbWUoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZiAobURiVGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBPUk1HZW5DdXN0b21pemVyLkFOWV9UQUJMRTsKLQkJcmV0dXJuIG1EYlRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZUFubm90YXRpb25OYW1lKCkgewotCQlpZiAobURiVGFibGUgPT0gbnVsbCkKLQkJCXJldHVybiBPUk1HZW5DdXN0b21pemVyLkFOWV9UQUJMRTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLmJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUobURiVGFibGUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogbURiVGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRhdGFiYXNlIHNjaGVtYSBjb250YWluaW5nIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJaWYgKERUUFV0aWwuaXNEZWZhdWx0U2NoZW1hKG1EYlRhYmxlKSB8fCBtRGJUYWJsZS5nZXRTY2hlbWEoKT09bnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc2NoZW1hTmFtZSA9IG1EYlRhYmxlLmdldFNjaGVtYSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIHNjaGVtYU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRm9sZGVyKFN0cmluZyBzcmNGb2xkZXIpewotCQlzZXRDdXN0b21pemVkKFNSQ19GT0xERVIsIHNyY0ZvbGRlcik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlRm9sZGVyKCl7Ci0JCVN0cmluZyBzcmNGb2xkZXIgPSBjdXN0b21pemVkKFNSQ19GT0xERVIpOwotCQlyZXR1cm4gc3JjRm9sZGVyID09IG51bGwgPyAiIiA6IHNyY0ZvbGRlcjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbXBvcnRTdGF0ZW1lbnRzKCl7Ci0JCWJ1aWxkQ29sdW1uVHlwZXNNYXAoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2thZ2VzID0gY29sdW1uVHlwZXNNYXAua2V5U2V0KCk7Ci0JCVN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yICggU3RyaW5nIHMgOiBwYWNrYWdlcyApIHsKLQkJCXJldC5hcHBlbmQoICJpbXBvcnQgIiArIHMgKyAiO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gZ2V0QXNzb2NpYXRpb25Sb2xlcygpOwotCQlmb3IgKCBBc3NvY2lhdGlvblJvbGUgcm9sZSA6ICBhc3NvY2lhdGlvblJvbGVzICkgewotCQkJaWYgKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSApCi0JCQkJCXx8IHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSApICkgewotCQkJCXJldC5hcHBlbmQoICJpbXBvcnQgIiArIGdldERlZmF1bHRDb2xsZWN0aW9uVHlwZSgpICsgIjtcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiByZXQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGltcG9ydCBzdGF0ZW1lbnRzIGZvciB0eXBlcyBmcm9tIGphdmF4LnBlcnNpc3RlbmNlIHBhY2thZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SmF2YXhQZXJzaXN0ZW5jZUltcG9ydFN0YXRlbWVudHMoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkvL1RPRE86IG9ubHkgaWYgQENvbHVtbnMgaXMgbmVlZGVkCi0JCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uO1xuIik7Ly8kTk9OLU5MUy0xJAotCQkvL1RPRE86IG9ubHkgaWYgdGhlcmUgaXMgQElkCi0JCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7XG4iKTsvLyROT04tTkxTLTEkCi0JCWlmKCAhdGhpcy5pc0RlZmF1bHRuYW1lKCkgKQotCQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZTtcbiIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoIHRoaXMuaXNDb21wb3NpdGVLZXkoKSApCi0JCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkSWQ7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBhcHBlbmQgamF2YXgucGVyc2lzdGVuY2UgcGFja2FnZSBpbXBvcnRzCi0JCUhhc2hTZXQ8U3RyaW5nPiBqcGFJbXBvcnRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOyAKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGFzc29jaWF0aW9uUm9sZXMgPSBnZXRBc3NvY2lhdGlvblJvbGVzKCk7Ci0JCWZvciggQXNzb2NpYXRpb25Sb2xlIHJvbGUgOiAgYXNzb2NpYXRpb25Sb2xlcyApewotCQkJaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk9ORV9UT19PTkUgKSApewotCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lOyIgKTsvLyROT04tTkxTLTEkCi0JCQl9ZWxzZXsKLQkJCQlpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uT05FX1RPX01BTlkgKSApewotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnk7XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCX1lbHNlIGlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSApICl7Ci0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW47XG4iICk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9ZWxzZSBpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZICkgKXsKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueTtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW5zO1xuIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uO1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZm9yKCBTdHJpbmcgczoganBhSW1wb3J0cyl7Ci0JCQlyZXQuYXBwZW5kKHMpOwotCQl9Ci0JCXJldHVybiByZXQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRDb2x1bW5UeXBlc01hcCgpewotCQlpZiAoIGNvbHVtblR5cGVzTWFwICE9IG51bGwpIHsKLQkJCXJldHVybiBjb2x1bW5UeXBlc01hcDsKLQkJfQotCQljb2x1bW5UeXBlc01hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlmb3IgKCBPUk1HZW5Db2x1bW4gY29sIDogdGhpcy5nZXRDb2x1bW5zKCkgKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGNvbC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJCWlmICggIWNvbC5pc1BhcnRPZkNvbXBvc2l0ZVByaW1hcnlLZXkoKQotCQkJCQkmJiAhY29sLmlzRm9yZWlnbktleSgpCi0JCQkJCSYmICF0eXBlLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpICYmIHR5cGUuaW5kZXhPZignLicpPjAgKSB7Ci0JCQkJU3RyaW5nIHNpbXBsZVR5cGU9IHR5cGUuc3Vic3RyaW5nKCB0eXBlLmxhc3RJbmRleE9mKCcuJykrMSApOwotCQkJCWNvbHVtblR5cGVzTWFwLnB1dCh0eXBlLCBzaW1wbGVUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sdW1uVHlwZXNNYXA7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxpZmllZENvbFR5cGUoU3RyaW5nIGZxdG4gKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IGJ1aWxkQ29sdW1uVHlwZXNNYXAoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gbWFwLmdldChmcXRuKTsKLQkJaWYgKCAgdHlwZU5hbWUgIT0gbnVsbCApIHsKLQkJCXJldHVybiB0eXBlTmFtZTsKLQkJfQotCQlyZXR1cm4gZnF0bjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgcGFja2FnZSBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzcyAoZW1wdHkgc3RyaW5nIGZvciB0aGUgZGVmYXVsdAotCSAqIHBhY2thZ2UpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGtnKSB7Ci0JCWdldEN1c3RvbWl6ZXIoKS5zZXRQcm9wZXJ0eShQQUNLQUdFLCBwa2csIGdldE5hbWUoKSwgbnVsbCk7IAotCQkvLyBub3QgY2FsbGluZyBzZXRDdXN0b21pemVkIHNvIHRoYXQgZW1wdHkgc3RyaW5ncyBkbyBub3QgZ2V0IG51bGxlZCBvdXQuCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSmF2YSBwYWNrYWdlIChlbXB0eSBzdHJpbmcgZm9yIHRoZSBkZWZhdWx0IHBhY2thZ2UpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gY3VzdG9taXplZChQQUNLQUdFKTsKLQkJcmV0dXJuIHBhY2thZ2VOYW1lID09IG51bGwgPyAiIiA6IHBhY2thZ2VOYW1lOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIEphdmEgY2xhc3MgbmFtZSAobm90IHF1YWxpZmllZCkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gY3VzdG9taXplZChDTEFTU19OQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJLy8gbmFtZSA9IFN0cmluZ1V0aWwudGFibGVOYW1lVG9WYXJOYW1lKGdldE5hbWUoKSk7Ci0JCQkvLyBuYW1lID0gU3RyaW5nVXRpbC5pbml0VXBwZXIobmFtZSk7Ci0JCQluYW1lID0gRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKGdldE5hbWUoKSwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJbmFtZSA9IFN0cmluZ1V0aWwuc2luZ3VsYXJpc2UobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJLyoKLQkJICogaWYgdGhlIGNsYXNzIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIChwb3NzaWJseSBjb21wdXRlZCkgY2xhc3MgbmFtZQotCQkgKiB0aGVuIG5vdGhpbmcgdG8gZG8KLQkJICovCi0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMoY2xhc3NOYW1lLCBnZXRDbGFzc05hbWUoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoQ0xBU1NfTkFNRSwgY2xhc3NOYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBuYW1lIHN1aXRhYmxlIHRvIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSBvciBjbGFzcyBuYW1lLiBUaGlzIGlzCi0JICogY29tcHV0ZWQgYmFzZWQgb24gdGhlIHRhYmxlIG5hbWUuCi0JICogCi0JICogQHBhcmFtIHNpbmd1bGFyCi0JICogICAgICAgICAgICBXaGV0aGVyIHRoZSBuYW1lIHNob3VsZCBiZSBzaW5ndWxhciBvciBwbHVyYWwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYXJOYW1lKGJvb2xlYW4gc2luZ3VsYXIpIHsKLQkJU3RyaW5nIG5hbWUgPSBTdHJpbmdVdGlsLnRhYmxlTmFtZVRvVmFyTmFtZShnZXROYW1lKCkpOwotCQlpZiAoc2luZ3VsYXIpIHsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9IFN0cmluZ1V0aWwucGx1cmFsaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBnZW5lcmF0ZWQgSmF2YSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gcXVhbGlmeShnZXRDbGFzc05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcG9zaXRlIGtleSBKYXZhIGNsYXNzIG5hbWUgKG5vdCBxdWFsaWZpZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoQ09NUE9TSVRFX0tFWV9DTEFTU19OQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IGdldENsYXNzTmFtZSgpICsgIlBLIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjb21wb3NpdGUga2V5IEphdmEgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHF1YWxpZnkoZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvc2l0ZSBrZXkgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuICJpZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGlzCi0JICogdGFibGUuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRDb2x1bW5zKCkgewotCQlpZiAobUNvbHVtbnMgPT0gbnVsbCkgewotCQkJbUNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJCWZvciAoQ29sdW1uIGMgOiBtRGJUYWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCQlPUk1HZW5Db2x1bW4gZ2VuQ29sdW1uID0gZ2V0Q3VzdG9taXplcigpLmNyZWF0ZUdlbkNvbHVtbihjKTsKLQkJCQlnZW5Db2x1bW4uc2V0R2VuVGFibGUodGhpcyk7Ci0JCQkJbUNvbHVtbnMuYWRkKGdlbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1Db2x1bW5zOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChDb2x1bW4gYyA6IG1EYlRhYmxlLmdldENvbHVtbnMoKSkgewotCQkJcmV0LmFkZChjLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB0YWJsZSdzCi0JICogcHJpbWFyeSBrZXkuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJldCA9IG5ldyBBcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiBtRGJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpKSB7Ci0JCQlyZXQuYWRkKG5ldyBPUk1HZW5Db2x1bW4oY29sdW1uLCB0aGlzLm1DdXN0b21pemVyKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBvciBtYW55IHByaW1hcnkga2V5Ci0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCU9STUdlbkNvbHVtbiBwa0NvbCA9IG51bGw7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBwa0NvbHVtbnMgPSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQlpZiAocGtDb2x1bW5zLnNpemUoKSA9PSAxKSB7Ci0JCQkvLyBDb2x1bW4gZGJDb2wgPSAoQ29sdW1uKXBrQ29sdW1ucy5nZXQoMCk7Ci0JCQlwa0NvbCA9IHBrQ29sdW1ucy5nZXQoMCk7IC8vIChPUk1HZW5Db2x1bW4pCi0JCQkJCQkJCQkJLy8gbUN1c3RvbWl6ZXIuY3JlYXRlR2VuQ29sdW1uKGRiQ29sKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBpZiBubyBwayBjb2x1bW4gdGhlbiBsb29rIGZvciB0aGUgZmlyc3QgY29sdW1uIHdpdGggaWQgbWFwcGluZwotCQkJICoga2luZC4gVGhpcyBpcyBzbyB0aGF0IHRoZSB3aXphcmQgY2FuIGJlIHVzZWQgd2l0aCB0YWJsZXMgbm90Ci0JCQkgKiBoYXZpbmcgcHJpbWFyeSBrZXlzLgotCQkJICovCi0JCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbHVtbi5nZXRNYXBwaW5nS2luZCgpLmVxdWFscyhtQ3VzdG9taXplci5nZXRJZE1hcHBpbmdLaW5kKCkpKSB7Ci0JCQkJCXBrQ29sID0gY29sdW1uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrQ29sOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBwayBjb2x1bW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGVLZXkoKSB7Ci0JCXJldHVybiBtRGJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgdGhlIGNvbHVtbnMgdGhhdAotCSAqIGFyZSBub3QgcGFydCBvZiBhbnkgYXNzb2NpYXRpb24uCi0JICogCi0JICogQHBhcmFtIGdlbk9ubHkKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHRoZSBjb2x1bW5zIG1hcmtlZCBmb3IgZ2VuZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVBrCi0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByaW1hcnkga2xleSBjb2x1bW4ocykuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVJbmhlcml0ZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgY29sdW1ucyBhc3NvY2lhdGVkIHdpdGggSmF2YSBwcm9wZXJ0aWVzCi0JICogICAgICAgICAgICB0aGF0IGV4aXN0IGluIHRoZSBzdXBlciBjbGFzcyAoaWYgYW55KS4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFNpbXBsZUNvbHVtbnMoYm9vbGVhbiBnZW5Pbmx5LCBib29sZWFuIGluY2x1ZGVQaywgYm9vbGVhbiBpbmNsdWRlSW5oZXJpdGVkKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0Q29sdW1ucygpOwotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gcm9sZXMgPSBnZXRBc3NvY2lhdGlvblJvbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChnZW5Pbmx5ICYmICFjb2x1bW4uaXNHZW5lcmF0ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXkoKSkgewotCQkJCWlmICghaW5jbHVkZVBrIHx8IGlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFkZCgwLCBjb2x1bW4pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0NvbHVtbkluQXNzY29jaWF0aW9uKGNvbHVtbiwgcm9sZXMpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXN1bHQuYWRkKGNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFNpbXBsZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRTaW1wbGVDb2x1bW5zKHRydWUvKiBnZW5Pbmx5ICovLCB0cnVlLyogaW5jbHVkZVBrICovLCB0cnVlLyogaW5jbHVkZUluaGVyaXRlZCAqLyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIHNob3VsZCBiZSBnZW5lcmF0ZWQgd2l0aCBmYWxzZQotCSAqIHVwZGF0YWJsZS9pbnNlcnRhYmxlLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGNvbHVtbiBpcyBtYXBwZWQgbW9yZQotCSAqIHRoYW4gb25jZSwgdGhpcyB1c3VhbGx5IGhhcHBlbiB3aXRoIGNvbHVtbnMgaW4gY29tcG9zaXRlIGtleXMgYW5kCi0JICogbWFueS10by1vbmUgYXNzb2NpYXRpb25zLgotCSAqIAotCSAqIDxicj4KLQkgKiBOb3RlIHRoYXQgZm9yIEhpYmVybmF0ZSB0aGUgY29sdW1uIHBhcmFtIGlzIG51bGwgYmVjYXVzZSB0aGUKLQkgKiBpbnNlcnQvdXBkYXRlIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBmb3IgdGhlIG1hbnktdG8tb25lIHRhZyBpdHNlbGYKLQkgKiBpbnN0ZWFkIG9mIHRoZSBuZXN0ZWQgY29sdW1uIHRhZ3MgKGJvZ3VzIG9idmlvdXNseSkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2x1bW5VcGRhdGVJbnNlcnQoQXNzb2NpYXRpb25Sb2xlIHJvbGUsIE9STUdlbkNvbHVtbiBjb2x1bW4pIHsKLQkJaWYgKGNvbHVtbiA9PSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gaXRlciA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGMgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWlzQ29sdW1uVXBkYXRlSW5zZXJ0KHJvbGUsIGMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY29sdW1uLmlzUHJpbWFyeUtleSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLyoKLQkJICogc2hvdWxkIGxvb2sgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGFzc29jaWF0aW9ucyB1c2luZyB0aGUgc2FtZSBjb2x1bW4KLQkJICogYW5kIHJldHVybiBmYWxzZSwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYW4gdW51c3VhbCBjYXNlLgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY29sdW1uIG5hbWVzLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0Q29sdW1uc0J5TmFtZXMoTGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbkJ5TmFtZShuYW1lKTsKLQkJCWFzc2VydCAoY29sdW1uICE9IG51bGwpOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChjb2x1bW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1ucyBoYXZpbmcgdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldENvbHVtbkJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5Bc3NvY2lhdGlvblJvbGU8L2NvZGU+IG9iamVjdHMgZm9yIHRoaXMgdGFibGUuIE9ubHkgdGhlCi0JICogYXNzb2NpYXRpb24gbWFya2VkIGZvciBnZW5lcmF0aW9uIGFyZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgTGlzdDxBc3NvY2lhdGlvblJvbGU+IGdldEFzc29jaWF0aW9uUm9sZXMoKSB7Ci0JCS8qCi0JCSAqIHRoaXMgaXMgbm90IGNhY2hlZCBpbnRlbnRpb25hbGx5IGJlY2F1c2UgaW52YWxpZGF0aW5nIHRoZSBjYWNoZSB3aXRoCi0JCSAqIHdpemFyZCBjaGFuZ2VzIGlzIGtpbmRhIHRyaWNreS4KLQkJICovCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gbmV3IEFycmF5TGlzdDxBc3NvY2lhdGlvblJvbGU+KCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMgPSBtQ3VzdG9taXplci5nZXRBc3NvY2lhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IGFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBjaGVjayBib3RoIHJlZmVycmVyYW5kIHJlZmVyZW5jZWQgYmVjYXVzZSBhbiBhc3NvY2lhdGlvbiBjb3VsZCBiZQotCQkJICogZnJvbS10byB0aGUgc2FtZSB0YWJsZSAoZW1wbG95ZWUvbWFuYWdlcikKLQkJCSAqLwotCQkJaWYgKGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKLQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCWFzc29jaWF0aW9uUm9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpOwotCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJYXNzb2NpYXRpb25Sb2xlcy5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvblJvbGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoQ0xBU1NfREVTQyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNjb3BlLCBvbmUgb2Yge0BsaW5rICNQVUJMSUNfU0NPUEV9fAotCSAqIHtAbGluayAjUFJPVEVDVEVEX1NDT1BFfSB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4gVGhpcyBtZXRob2QgbmV2ZXIKLQkgKiByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc1Njb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKENMQVNTX1NDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpIHsKLQkJCXNjb3BlID0gUFVCTElDX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuZHMoKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKEVYVEVORFMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVuZHMoU3RyaW5nIGJhc2VDbGFzcykgewotCQlzZXRDdXN0b21pemVkKEVYVEVORFMsIGJhc2VDbGFzcyk7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbXBsZW1lbnRzKCkgewotCQlTdHJpbmcgc3RyID0gY3VzdG9taXplZChJTVBMRU1FTlRTKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IFN0cmluZ1V0aWwuc3RyVG9MaXN0KHN0ciwgJywnLCB0cnVlLyogdHJpbSAqLyk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRzKExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzKSB7Ci0JCXNldEN1c3RvbWl6ZWQoSU1QTEVNRU5UUywgU3RyaW5nVXRpbC5saXN0VG9TdHIoaW50ZXJmYWNlcywgJywnKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiB0aGUgSmF2YSBjbGFzcyBmb3IgZXh0ZW5kcwotCSAqIGFuZCBpbXBsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFeHRlbmRzSW1wbGVtZW50cygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGV4dGVuZHNDbGFzcyA9IGdldEV4dGVuZHMoKTsKLQkJaWYgKGV4dGVuZHNDbGFzcyAhPSBudWxsICYmICFleHRlbmRzQ2xhc3MuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikgJiYgIWV4dGVuZHNDbGFzcy5lcXVhbHMoIk9iamVjdCIpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJleHRlbmRzICIgKyBzaW1wbGlmeUNsYXNzTmFtZShleHRlbmRzQ2xhc3MpICsgIiAiKTsgLy9maXggZm9yIGJ1ZyAyNzg2MjYKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSIpOyAvLyBhc3N1bWluZyB0aGF0IHRoZSBKYXZhCi0JCQkJCQkJCQkJCQkJLy8gZmlsZSB0ZW1wbGF0ZSBpbXBvcnRzIHRoZQotCQkJCQkJCQkJCQkJCS8vIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYnVmZmVyLmFwcGVuZCgiLCAiICsgc2ltcGxpZnlDbGFzc05hbWUoaXRlci5uZXh0KCkpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc2ltcGxpZnlDbGFzc05hbWUoU3RyaW5nIGZ1bGxDbGFzc05hbWUpIHsKLQkJZmluYWwgU3RyaW5nIEpBVkFfTEFORyA9ICJqYXZhLmxhbmcuIjsKLQkJaWYgKGZ1bGxDbGFzc05hbWUuc3RhcnRzV2l0aChKQVZBX0xBTkcpKSB7Ci0JCQlyZXR1cm4gZnVsbENsYXNzTmFtZS5zdWJzdHJpbmcoSkFWQV9MQU5HLmxlbmd0aCgpKTsKLQkJfQotCQlTdHJpbmcgcGtnID0gU3RyaW5nVXRpbC5nZXRQYWNrYWdlTmFtZShmdWxsQ2xhc3NOYW1lKTsKLQkJaWYgKHBrZyAhPSBudWxsICYmIFN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHBrZywgZ2V0UGFja2FnZSgpKSkgewotCQkJcmV0dXJuIFN0cmluZ1V0aWwuZ2V0Q2xhc3NOYW1lKGZ1bGxDbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBmdWxsQ2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGdlbmVyYXRvciBzY2hlbWUgKGFzc2lnbmVkLCBzZXF1ZW5jZSwgZXRjKS4gRG9lcyBub3QKLQkgKiByZXR1cm4gbnVsbCwgZGVmYXVsdHMgdG8gImFzc2lnbmVkIiBvciAiaWRlbnRpdHkiIGRlcGVuZGluZyBvbiB3aGV0aGVyCi0JICogdGhlIHRhYmxlIGhhcyBhbiBpZGVudGl0eSBjb2x1bW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZEdlbmVyYXRvcigpIHsKLQkJU3RyaW5nIGdlbmVyYXRvciA9IGN1c3RvbWl6ZWQoSURfR0VORVJBVE9SKTsKLQkJU3RyaW5nIG5vbmVHZW5lcmF0b3IgPSBnZXRDdXN0b21pemVyKCkuZ2V0Tm9JZEdlbmVyYXRvcigpOwotCQlpZiAoIWlzRGVmYXVsdHNUYWJsZSgpKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyBkb25lIG1haW5seSBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGNhc2VzIHdoZXJlIHNvbWUKLQkJCSAqIHRhYmxlcyBoYXZlIGF1dG9pbmN0ZW1lbnQgcGsgYW5kIG90aGVycyBhcmUgYXNzaWduZWQuIEluIHRoaXMKLQkJCSAqIGNhc2UgdGhpcyBtYWtlcyBpdCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSAibm9uZSIKLQkJCSAqIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gdGhlIGNhc2UuCi0JCQkgKi8KLQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCB8fCBnZW5lcmF0b3IuZXF1YWxzKG5vbmVHZW5lcmF0b3IpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIHBrQ29sdW1uID0gZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQkJCWlmIChwa0NvbHVtbiAhPSBudWxsICYmIERUUFV0aWwuaXNBdXRvSW5jcmVtZW50KHBrQ29sdW1uLmdldERiQ29sdW1uKCkpKSB7Ci0JCQkJCWdlbmVyYXRvciA9IGdldEN1c3RvbWl6ZXIoKS5nZXRJZGVudGl0eUlkR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJZ2VuZXJhdG9yID0gbm9uZUdlbmVyYXRvcjsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGlkIGdlbmVyYXRvciBzY2hlbWUgKGFzc2lnbmVkLCBzZXF1ZW5jZSwgZXRjKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEdlbmVyYXRvcihTdHJpbmcgc2NoZW1lKSB7Ci0JCXNldEN1c3RvbWl6ZWQoSURfR0VORVJBVE9SLCBzY2hlbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBnaXZlbiB0YWJsZSwgb3IgbnVsbCBpZiBub25lIChtYWtlcwotCSAqIHNlbnNlIG9ubHkgd2hlbiB0aGUgc2NoZW1lIGlzIG5hdGl2ZSwgc2VxdWVuY2UsIC4uKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChTRVFVRU5DRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKLQkJc2V0Q3VzdG9taXplZChTRVFVRU5DRSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VxdWVuY2UgbmFtZSBhZnRlciByZXBsYWNpbmcgdGhlICR7dGFibGV9IGFuZCAke3BrfSBieSB0aGVpcgotCSAqIHZhbHVlcywgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU2VxdWVuY2UoKSB7Ci0JCVN0cmluZyBzZXF1ZW5jZSA9IGdldFNlcXVlbmNlKCk7Ci0JCWlmIChzZXF1ZW5jZSAhPSBudWxsKSB7Ci0JCQkvKiByZXNvbHZlIHRoZSAke3RhYmxlfSBhbmQgJHtwa30gcGF0dGVybnMgKi8KLQkJCXNlcXVlbmNlID0gU3RyaW5nVXRpbC5zdHJSZXBsYWNlKHNlcXVlbmNlLCBUQUJMRV9TRVFfUEFUVEVSTiwgZ2V0TmFtZSgpKTsKLQkJCWlmIChzZXF1ZW5jZS5pbmRleE9mKFBLX1NFUV9QQVRURVJOKSA+PSAwKSB7Ci0JCQkJSXRlcmF0b3I8Q29sdW1uPiBwa0NvbHMgPSBnZXREYlRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBwa05hbWUgPSBwa0NvbHMuaGFzTmV4dCgpID8gcGtDb2xzLm5leHQoKS5nZXROYW1lKCkgOiBudWxsOwotCQkJCXNlcXVlbmNlID0gU3RyaW5nVXRpbC5zdHJSZXBsYWNlKHNlcXVlbmNlLCBQS19TRVFfUEFUVEVSTiwgcGtOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VxdWVuY2UgIT0gbnVsbCA/IHNlcXVlbmNlLnRvVXBwZXJDYXNlKCkgOiAiIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxlbWVudEVxdWFscygpIHsKLQkJcmV0dXJuICEidHJ1ZSIuZXF1YWxzKGN1c3RvbWl6ZWQoSU1QTEVNRU5UX0VRVUFMUykpOyAvLyBkZWZhdWx0cyB0bwotCQkJCQkJCQkJCQkJCQkJCS8vIGZhbHNlCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50RXF1YWxzKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oSU1QTEVNRU5UX0VRVUFMUywgdmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgY29sdW1uIHBhcnRpY2lwYXRpbmcgaW4gZXF1YWxzL2hhc2hjb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbHVtbnNJbkVxdWFscygpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRTaW1wbGVDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMge0BsaW5rICNHRU5FUkFURV9ERExfQU5OT1RBVElPTn0gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcHRpb25hbAotCSAqIERETCBwYXJhbWV0ZXJzIGxpa2UgbGVuZ3RoLCBudWxsYWJsZSwgdW5xaXVlLCBldGMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiBAQ29sdW1uCi0JICogYW5ub3RhdGlvbi4gZGVmYXVsdHMgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURETEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhjdXN0b21pemVkKE9STUdlbkN1c3RvbWl6ZXIuR0VORVJBVEVfRERMX0FOTk9UQVRJT04pKTsgLy8gZGVmYXVsdHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmYWxzZQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRERMQW5ub3RhdGlvbnMoYm9vbGVhbiBnZW5lcmF0ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihPUk1HZW5DdXN0b21pemVyLkdFTkVSQVRFX0RETF9BTk5PVEFUSU9OLCBnZW5lcmF0ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjUFJPUEVSVFlfQUNDRVNTfXx7QGxpbmsgI0ZJRUxEX0FDQ0VTU30gaW5kaWNhdGluZwotCSAqIGhvdyB0aGUgZW50aXR5IHByb3BlcnRpZXMgYXJlIG1hcHBlZC4gRG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvCi0JICoge0BsaW5rICNGSUVMRF9BQ0NFU1N9KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VzcygpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKEFDQ0VTUyk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBGSUVMRF9BQ0NFU1M7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKFN0cmluZyBhY2Nlc3MpIHsKLQkJYXNzZXJ0IChhY2Nlc3MgPT0gbnVsbCB8fCBhY2Nlc3MuZXF1YWxzKFBST1BFUlRZX0FDQ0VTUykgfHwgYWNjZXNzLmVxdWFscyhGSUVMRF9BQ0NFU1MpKTsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhhY2Nlc3MsIGdldEFjY2VzcygpKSkgewotCQkJc2V0Q3VzdG9taXplZChBQ0NFU1MsIGFjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0xBWllfRkVUQ0h9fHtAbGluayAjRUFHRVJfRkVUQ0h9IGluZGljYXRpbmcgaG93Ci0JICogdGhlIHRhYmxlIGFzc29jaWF0aW9ucyBhcmUgZmVjaGVkLiBSZXR1cm5zIG51bGwgaWYgdGhlIHByb3ZpZGVyIGRlZmF1bHRzCi0JICogc2hvdWxkIGJlIHVzZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKERFRkFVTFRfRkVUQ0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGZXRjaChTdHJpbmcgZmV0Y2gpIHsKLQkJYXNzZXJ0IChmZXRjaCA9PSBudWxsIHx8IGZldGNoLmVxdWFscyhMQVpZX0ZFVENIKSB8fCBmZXRjaC5lcXVhbHMoRUFHRVJfRkVUQ0gpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0ZFVENILCBmZXRjaCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbGxlY3Rpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlTRVRfQ09MTEVDVElPTl9UWVBFLCBMSVNUX0NPTExFQ1RJT05fVFlQRQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjTElTVF9DT0xMRUNUSU9OX1RZUEV9fHtAbGluayAjU0VUX0NPTExFQ1RJT05fVFlQRX0KLQkgKiBpbmRpY2F0aW5nIHRoZSBKYXZhIHR5cGUgKGZ1bGwgY2xhc3MgbmFtZSkgdXNlZCBmb3IgcHJvcGVydGllcyBvZgotCSAqIGNvbGxlY3Rpb24gdHlwZXMuIFRoaXMgZG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvIGxpc3QpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCkgewotCQlTdHJpbmcgY1R5cGUgPSBjdXN0b21pemVkKERFRkFVTFRfQ09MTEVDVElPTl9UWVBFKTsKLQkJaWYgKGNUeXBlID09IG51bGwpIHsKLQkJCWNUeXBlID0gU0VUX0NPTExFQ1RJT05fVFlQRTsKLQkJfQotCQlyZXR1cm4gY1R5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlQ29sbGVjdGlvblR5cGUoKXsKLQkJIFN0cmluZyB0eXBlID0gZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCk7Ci0JCXJldHVybiB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpICsxICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKFN0cmluZyBjVHlwZSkgewotCQlhc3NlcnQgKGNUeXBlLmVxdWFscyhMSVNUX0NPTExFQ1RJT05fVFlQRSkgfHwgY1R5cGUuZXF1YWxzKFNFVF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0NPTExFQ1RJT05fVFlQRSwgY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG91bmQgYW5kIGFueSBvZiBpdHMgY29sdW1ucyBzaG91bGQKLQkgKiBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3VuZEtleVVzZUluRXF1YWxzKCkgewotCQlpZiAoaXNDb21wb3NpdGVLZXkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUm9sZVVzZUluRXF1YWxzKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAVGFibGUgaXMgZGVmYXVsdCBzbyB3ZQotCSAqIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKGVudGl0eU5hbWUsIG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUXVhbGlmaWVzIGEgY2xhc3MgbmFtZSBpZiB0aGVyZSBpcyBhIHBhY2thZ2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmeShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBwa2cgPSBnZXRQYWNrYWdlKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCAmJiBwa2cubGVuZ3RoKCkgIT0gMCkgewotCQkJY2xhc3NOYW1lID0gcGtnICsgJy4nICsgY2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb2x1bW4gaXMgcGFydCBvZiBhbnkgYXNzb2NpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sdW1uSW5Bc3Njb2NpYXRpb24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgTGlzdDxBc3NvY2lhdGlvblJvbGU+IHJvbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gcm9sZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHJvbGVzLmdldChpKTsKLQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2xzID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJCWZvciAoT1JNR2VuQ29sdW1uIGNvbCA6IGNvbHMpIHsKLQkJCQlpZiAoY29sLmdldE5hbWUoKS5lcXVhbHMoY29sdW1uLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY2xhdXNlIHRvIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBlcXVhbHMoKSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUVxdWFsc0NsYXVzZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJaWYgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJCQlidWYuYXBwZW5kKCJcdFx0XHQiKTsKLQkJCQlidWYuYXBwZW5kKCImJiAiKTsKLQkJCX0KLQkJfQotCQlidWYuYXBwZW5kKCI7Iik7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RXF1YWxzQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgiKHRoaXMuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgiID09IGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCIuZXF1YWxzKGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNsYXVzZSB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgaGFzQ29kZSgpIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJYnVmLmFwcGVuZCgiaGFzaCA9IGhhc2ggKiBwcmltZSArICIpOwotCQkJdGhpcy5wcmludFByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJYnVmLmFwcGVuZCgnOycpOwotCQkJYnVmLmFwcGVuZCgnXG4nKTsKLQkJCWJ1Zi5hcHBlbmQoIlx0XHQiKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBwcmltaXRpdmVOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImludCIpKSB7Ci0JCQkvLyB0aGlzLnZhbHVlCi0JCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJzaG9ydCIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJieXRlIikgfHwgcHJpbWl0aXZlTmFtZS5lcXVhbHMoImNoYXIiKSkgeyAvLyBleHBsaWNpdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXN0Ci0JCQkvLyAoKGludCkgdGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoIigoaW50KSB0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgnKScpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJsb25nIikpIHsgLy8gY3JpYmJlZCBmcm9tIExvbmcjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSkpCi0JCQlidWYuYXBwZW5kKCIoKGludCkgKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIgXiAodGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiA+Pj4gMzIpKSkiKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZmxvYXQiKSkgeyAvLyBjcmliYmVkIGZyb20KLQkJCQkJCQkJCQkJCQkvLyBGbG9hdCNoYXNoQ29kZSgpCi0JCQkvLyBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHModGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5GbG9hdCIpOwotCQkJYnVmLmFwcGVuZCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7IC8vIGNyaWJiZWQgZnJvbQotCQkJCQkJCQkJCQkJCS8vIERvdWJsZSNoYXNoQ29kZSgpCi0JCQkvLyAoKGludCkgKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSBeCi0JCQkvLyAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID4+PiAzMikpKQotCQkJYnVmLmFwcGVuZCgiKChpbnQpICgiKTsKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIpIF4gKCIpOwotCQkJYnVmLmFwcGVuZCgiamF2YS5sYW5nLkRvdWJsZSIpOwotCQkJYnVmLmFwcGVuZCgiLmRvdWJsZVRvTG9uZ0JpdHModGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIikgPj4+IDMyKSkpIik7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJLy8gKHRoaXMudmFsdWUgPyAxIDogMCkKLQkJCWJ1Zi5hcHBlbmQoIih0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiID8gMSA6IDApIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCWJ1Zi5hcHBlbmQoIi5oYXNoQ29kZSgpIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJuYW1lPSIgKyB0aGlzLmdldE5hbWUoKSArICI7IGNvbHVtbnM9IiArIEFycmF5cy50b1N0cmluZyh0aGlzLmdldENvbHVtbk5hbWVzKCkudG9BcnJheSgpKTsKLQl9Ci0KLQkvKiBjbGFzcyBzY29wZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NPUEUgPSAicHVibGljIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9TQ09QRSA9ICJwcm90ZWN0ZWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9TQ09QRSA9ICJwcml2YXRlIjsKLQotCS8qIGFjY2VzcyBjb25zdGFudHMuIE5vdGUgdGhhdCB0aGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIHRoZSB1aSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FDQ0VTUyA9ICJwcm9wZXJ0eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BQ0NFU1MgPSAiZmllbGQiOwotCi0JLyoKLQkgKiBkZWZhdWx0IGZlY2ggY29uc3RhbnRzLiBOb3RlIHRoYXQgdGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgZ2VuCi0JICogdmVsb2NpdHkgdGVtcGxhdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkVUQ0ggPSAiZGVmYXVsdEZldGNoIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWllfRkVUQ0ggPSAibGF6eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUdFUl9GRVRDSCA9ICJlYWdlciI7Ci0KLQkvKgotCSAqIGRlZmF1bHQgY29sbGVjdGlvbiB0eXBlIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4KLQkgKiB0aGUgZ2VuIHZlbG9jaXR5IHRlbXBsYXRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0NPTExFQ1RJT05fVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQ09MTEVDVElPTl9UWVBFID0gImphdmEudXRpbC5TZXQiOwotCi0JLyoqCi0JICogVGhlIHBhdHRlcm4gcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgaW4gdGhlIGlkIGdlbmVyYXRvciBzZXF1ZW5jZSBuYW1lCi0JICogcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfU0VRX1BBVFRFUk4gPSAiJHRhYmxlIjsKLQotCS8qKgotCSAqIFRoZSBwYXR0ZXJuIHJlcGxhY2VkIGJ5IHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgaWQgZ2VuZXJhdG9yIHNlcXVlbmNlIG5hbWUKLQkgKiBwYXJhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19TRVFfUEFUVEVSTiA9ICIkcGsiOwotCi0JLyogY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDX0ZPTERFUiA9ICJzcmNGb2xkZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19ERVNDID0gImNsYXNzRGVzYyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfU0NPUEUgPSAiY2xhc3NTY29wZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EUyA9ICJleHRlbmRzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRTID0gImltcGxlbWVudHMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dFTkVSQVRPUiA9ICJpZEdlbmVyYXRvciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0UgPSAic2VxdWVuY2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSA9ICJjb21wb3NpdGVLZXlDbGFzc05hbWUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVF9FUVVBTFMgPSAiaW1wbGVtZW50RXF1YWxzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTExFQ1RJT05fVFlQRSA9ICJkZWZhdWx0Q29sbGVjdGlvblR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA1NDczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PdmVyd3JpdGVDb25maXJtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGdlbmVyYXRvciBzaG91bGQgb3ZlcndyaXRlIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLgotCSAqLwotCWJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpOwotCi0KLQlmaW5hbCBjbGFzcyBBbHdheXMgaW1wbGVtZW50cyBPdmVyd3JpdGVDb25maXJtZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBBbHdheXMoKTsKLQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEFsd2F5cygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5BbHdheXMiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlmaW5hbCBjbGFzcyBOZXZlciBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IE5ldmVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOZXZlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWE5M2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHlFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLmxvZy5KZGtMb2dDaHV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkNvbXBpbGF0aW9uVW5pdE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5VcmxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgcGFja2FnZSBvZiBlbnRpdGllcyBmb3IgYSBzZXQgb2YgdGFibGVzLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUdlbmVyYXRvciB7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5lbnRpdGllcy5nZW4ubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCXByaXZhdGUgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMjApOwotCQlQYWNrYWdlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBQYWNrYWdlR2VuZXJhdG9yKGpwYVByb2plY3QsIGN1c3RvbWl6ZXIsIG92ZXJ3cml0ZUNvbmZpcm1lcik7Ci0JCXNtLndvcmtlZCgxKTsKLQkJdHJ5IHsKLQkJCWdlbmVyYXRvci5kb0dlbmVyYXRlKHNtLm5ld0NoaWxkKDE5KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQsIEpwdEdlbk1lc3NhZ2VzLkVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXMsIGUpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBhY2thZ2VHZW5lcmF0b3IoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIE92ZXJ3cml0ZUNvbmZpcm1lciBjb25maXJtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBjb25maXJtZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZG9HZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlnZW5lcmF0ZUludGVybmFsKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW50ZXJuYWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wbERpciA9IHByZXBhcmVUZW1wbGF0ZXNGb2xkZXIoKTsKLQotCQlMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0R2VuVGFibGVOYW1lcygpOwotCi0JCS8qIC5qYXZhIHBlciB0YWJsZSwgcGVyc2lzdGVuY2UueG1sLCByZWZyZXNoIHBhY2thZ2UgZm9sZGVyICovCi0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGFibGVOYW1lcy5zaXplKCkgKyAyKTsKLQotCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IHRoaXMuY3VzdG9taXplci5nZXRUYWJsZSh0YWJsZU5hbWUpOwotCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdGFibGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0KLQkJCWdlbmVyYXRlQ2xhc3ModGFibGUsIHRlbXBsRGlyLmdldEFic29sdXRlUGF0aCgpLCBzbS5uZXdDaGlsZCgxLCBTdWJNb25pdG9yLlNVUFBSRVNTX05PTkUpKTsKLQotCQkJZ2VuQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCS8qCi0JCQkgKiBhZGQgdGhlIGNvbXBvc2l0ZSBrZXkgY2xhc3MgdG8gcGVyc2lzdGVuY2UueG1sIGJlY2F1c2Ugc29tZSAKLQkJCSAqIEpQQSBwcm92aWRlcihlLmcuIEtvZG8pIHJlcXVpcmVzIGl0LiBIaWJlcm5hdGUgZG9lc24ndCBzZWVtIHRvIGNhcmUpLiAKLQkJCSAqLwotCQkJaWYgKHRhYmxlLmlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCQlnZW5DbGFzc2VzLmFkZCh0YWJsZS5nZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL3VwZGF0ZSBwZXJzaXN0ZW5jZS54bWwKLQkJaWYgKHRoaXMuY3VzdG9taXplci51cGRhdGVQZXJzaXN0ZW5jZVhtbCgpKSB7Ci0JCQl1cGRhdGVQZXJzaXN0ZW5jZVhtbChnZW5DbGFzc2VzKTsKLQkJfQotCQlzbS53b3JrZWQoMik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVhtbChmaW5hbCBMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcykgewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvL3RoZSByZXNvdXJjZSB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGhhZCBhbiBpbnZhbGlkIGNvbnRlbnQgdHlwZSwKLQkJCS8vZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gUGFja2FnZUdlbmVyYXRvci50aGlzLmpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGludmFsaWQgY29udGVudCwgZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKLQkJCQkvLyBjcmVhdGUgYSBwZXJzaXN0ZW5jZSB1bml0IGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKLQkJCQlpZiAocGVyc2lzdGVuY2UucGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAwKSB7Ci0JCQkJCXBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmFkZFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShQYWNrYWdlR2VuZXJhdG9yLnRoaXMuanBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgcGVyc2lzdGVuY2UgdW5pdCAtIHRha2UgdGhlIGZpcnN0IG9uZQotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gZ2VuQ2xhc3Nlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHBlcnNpc3RlbmNlVW5pdC5tYXBwaW5nRmlsZVJlZnNDb250YWluaW5nKGNsYXNzTmFtZSkpICYmICFwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVzUGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKSkgewotCQkJCQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgRmlsZSBwcmVwYXJlVGVtcGxhdGVzRm9sZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGNlcHRpb24sCi0JCQlDb3JlRXhjZXB0aW9uIHsKLQkJLy9QcmVwYXJlIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSBmb2xkZXI6Ci0JCS8vSWYgdGhlIHBsdWctaW4gaXMgcGFja2FnZWQgYXMgYSBKQVIsIHdlIG5lZWQgZXh0cmFjdCB0aGUgdGVtcGxhdGUgCi0JCS8vZm9sZGVyIGludG8gdGhlIHBsdWctaW4gc3RhdGUgbG9jYXRpb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgVmVsb2NpdHkKLQkJLy9zaW5jZSB3ZSB1c2UgaW5jbHVkZWQgdGVtcGxhdGVzLgotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQpOwotCQlTdHJpbmcgdGVtcGxhdGVzUGF0aCA9ICJ0ZW1wbGF0ZXMvZW50aXRpZXMvIjsgIC8vJE5PTi1OTFMtMSQKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoIHRlbXBsYXRlc1BhdGgpOwotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhR2VuUGx1Z2luLlBMVUdJTl9JRCwgIEpwdEdlbk1lc3NhZ2VzLlRlbXBsYXRlc19ub3RGb3VuZCArICIgIisgIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQgKyAiLyIgKyB0ZW1wbGF0ZXNQYXRoKSApOy8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCVVSTCB0ZW1wbFVybCA9IEZpbGVMb2NhdG9yLnJlc29sdmUodXJsKTsKLQkJCi0JCS8vSGF2ZSB0aGlzIGNoZWNrIHNvIHRoYXQgdGhlIGNvZGUgd291bGQgd29yayBpbiBib3RoIFBERSBhbmQgSkFSZWQgcGx1Zy1pbiBhdCBydW50aW1lCi0JCUZpbGUgdGVtcGxEaXIgPSBudWxsOwotCQlpZiAoVXJsVXRpbC5pc0phclVybCh0ZW1wbFVybCkpIHsKLQkJCXRlbXBsRGlyID0gRmlsZVV0aWwuZXh0cmFjdEZpbGVzRnJvbUJ1bmRsZSggdGVtcGxVcmwsIGJ1bmRsZSwgdGVtcGxhdGVzUGF0aCApOwotCQl9IGVsc2UgewotCQkJdGVtcGxEaXIgPSBVcmxVdGlsLmdldFVybEZpbGUodGVtcGxVcmwpOwotCQl9Ci0JCQotCi0JCWlmICh0ZW1wbERpciA9PSBudWxsIHx8ICF0ZW1wbERpci5leGlzdHMoKSkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lELCAgSnB0R2VuTWVzc2FnZXMuVGVtcGxhdGVzX25vdEZvdW5kICsgIiAiKyAgSnB0SnBhR2VuUGx1Z2luLlBMVUdJTl9JRCApICk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0ZW1wbERpcjsKLQl9Ci0JCi0JLyoqCi0JICogU2F2ZXMvQ3JlYXRlcyB0aGUgLmphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIGEgZGF0YWJhc2UgdGFibGUgCi0JICogd2l0aCB0aGUgZ2l2ZW4gY29udGVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxEaXIgVGhlIHZlbG9jaXR5IHRlbXBsYXRlIGZpbGUgZGlyZWN0b3J5LiBJdCBpcyBhc3N1bWVkIAotCSAqIHRoYXQgdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDIgZmlsZXMgPGVtPm1haW4uamF2YS52bTwvZW0+IAotCSAqIGFuZCA8ZW0+cGsuamF2YS52bTwvZW0+IAotCSAqIEBwYXJhbSBwcm9ncmVzcyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNsYXNzKE9STUdlblRhYmxlIHRhYmxlLCBTdHJpbmcgdGVtcGxhdGVEaXJQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBzdWJUYXNrTmFtZSA9IE5MUy5iaW5kKEpwdEdlbk1lc3NhZ2VzLkVudGl0eUdlbmVyYXRvcl90YXNrTmFtZSwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBzdWJUYXNrTmFtZSwgMTApOwotCi0JCXRyeSB7Ci0JCQlJRm9sZGVyIGphdmFQYWNrYWdlRm9sZGVyID0gZ2V0SmF2YVBhY2thZ2VGb2xkZXIodGFibGUsIG1vbml0b3IpOwotCQkJSUZpbGUgamF2YUZpbGUgPSBqYXZhUGFja2FnZUZvbGRlci5nZXRGaWxlKCB0YWJsZS5nZXRDbGFzc05hbWUoKSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChqYXZhRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lciAhPSBudWxsICYmICF0aGlzLm92ZXJ3cml0ZUNvbmZpcm1lci5vdmVyd3JpdGUoamF2YUZpbGUuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJLy9KZGtMb2dDaHV0ZSBpbiB0aGlzIHZlcnNpb24gb2YgVmVsb2NpdHkgbm90IGFsbG93IHRvIHNldCBsb2cgbGV2ZWwKLQkJCS8vV29ya2Fyb3VuZCBieSBwcmVzZXQgdGhlIGxvZyBsZXZlbCBiZWZvcmUgVmVsb2NpdHkgaXMgaW5pdGlhbGl6ZWQKLQkJCUxvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCBMT0dHRVJfTkFNRSApOwotCQkJbG9nZ2VyLnNldExldmVsKCBMZXZlbC5TRVZFUkUgKTsKLQkJCQotCQkJUHJvcGVydGllcyB2ZXAgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdmVwLnNldFByb3BlcnR5KCJmaWxlLnJlc291cmNlLmxvYWRlci5wYXRoIiwgdGVtcGxhdGVEaXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJdmVwLnNldFByb3BlcnR5KCBKZGtMb2dDaHV0ZS5SVU5USU1FX0xPR19KREtfTE9HR0VSLCBMT0dHRVJfTkFNRSApOwotCQkJVmVsb2NpdHlFbmdpbmUgdmUgPSBuZXcgVmVsb2NpdHlFbmdpbmUoKTsKLQkJICAgIHZlLmluaXQodmVwKTsKLQkJICAgIHNtLndvcmtlZCgyKTsKLQkJICAgIAotCQkgICAgZ2VuZXJhdGVKYXZhRmlsZSh0YWJsZSwgamF2YUZpbGUsIHZlLCAibWFpbi5qYXZhLnZtIiwgdHJ1ZS8qaXNEb21haW5DbGFzcyovLCBzbS5uZXdDaGlsZCg2KSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAotCQkgICAgaWYgKHRhYmxlLmlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJICAgIAlJRmlsZSBjb21wb3NpdGVLZXlGaWxlID0gamF2YVBhY2thZ2VGb2xkZXIuZ2V0RmlsZSggdGFibGUuZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkrIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJICAgIAlnZW5lcmF0ZUphdmFGaWxlKHRhYmxlLCBjb21wb3NpdGVLZXlGaWxlLCB2ZSwgInBrLmphdmEudm0iLCBmYWxzZS8qaXNEb21haW5DbGFzcyovLCBzbS5uZXdDaGlsZCgxKSk7IC8vJE5PTi1OTFMtMSQKLQkJICAgIH0KLQkJICAgIGVsc2UgewotCQkgICAgCXNtLnNldFdvcmtSZW1haW5pbmcoMSk7Ci0JCSAgICB9Ci0JCQlqYXZhRmlsZS5yZWZyZXNoTG9jYWwoMSwgc20ubmV3Q2hpbGQoMSkpOwotCQkJCi0JCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlDb3JlRXhjZXB0aW9uIGNlID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lELCBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiIiArIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQgLCBlKSApOy8vJE5PTi1OTFMtMSQKLQkJCUpwdEpwYUdlblBsdWdpbi5sb2dFeGNlcHRpb24oIGNlICk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF2YUZpbGUoT1JNR2VuVGFibGUgdGFibGUsIElGaWxlIGphdmFGaWxlLCBWZWxvY2l0eUVuZ2luZSB2ZQotCQkJLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBib29sZWFuIGlzRG9tYWluQ2xhc3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCgpOwotICAgICAgICBjb250ZXh0LnB1dCgidGFibGUiLCB0YWJsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgY29udGV4dC5wdXQoImN1c3RvbWl6ZXIiLCBnZXRDdXN0b21pemVyKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIAotCQlTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdmUubWVyZ2VUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIGNvbnRleHQsIHcpOwotCQkKLQkJU3RyaW5nIGZpbGVDb250ZW50ID0gdy50b1N0cmluZygpOwotCQlpZiAoamF2YUZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmIChpc0RvbWFpbkNsYXNzKSB7Ci0JCQkJdXBkYXRlRXhpc3RpbmdEb21haW5DbGFzcyh0YWJsZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSwgamF2YUZpbGUsIGZpbGVDb250ZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJamF2YUZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZpbGVDb250ZW50LmdldEJ5dGVzKCkpLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNyZWF0ZUZpbGUoamF2YUZpbGUsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShmaWxlQ29udGVudC5nZXRCeXRlcygpKSk7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSAoZXhpc3RpbmcpIEphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUZpbGUgVGhlIGV4aXN0aW5nIEphdmEgZmlsZSBvZiB0aGUgY2xhc3MgdG8gdXBkYXRlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlQ29udGVudCBUaGUgbmV3IGZpbGUgY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKFN0cmluZyBjbGFzc05hbWUsIElGaWxlIGphdmFGaWxlLCBTdHJpbmcgZmlsZUNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkvKnVzZSBDb21waWxhdGlvblVuaXRNb2RpZmllciBpbnN0ZWFkIG9mIGNhbGxpbmcgV2lkZUVudi5nZXRFbnYoKS5zZXRGaWxlQ29udGVudCAKLQkJICogc28gdGhhdCBpZiB0aGUgdW5pdCBpcyB1cCB0byBkYXRlIGlmIGl0IGlzIHVzZWQgYmVmb3JlIGZpbGUgY2hhbmdlIAotCQkgKiBub3RpZmljYXRpb25zIGFyZSBkZWxpdmVyZWQgKHNlZSBFSkIzSW1wb3J0U2NoZW1hV2l6YXJkLnVwZGF0ZUV4aXN0aW5nRG9tYWluQ2xhc3MgZm9yIGV4YW1wbGUpKi8KLQkJQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIgbW9kaWZpZXIgPSBuZXcgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIodGhpcy5nZXRKYXZhUHJvamVjdCgpLCBjbGFzc05hbWUpOwotCQltb2RpZmllci5zZXRKYXZhU291cmNlKGZpbGVDb250ZW50KTsKLQkJbW9kaWZpZXIuc2F2ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlKElGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQlmaWxlLmNyZWF0ZShjb250ZW50cywgZmFsc2UsIG51bGwvKm1vbml0b3IqLyk7Ci0JfQotCQotCXB1YmxpYyBJRm9sZGVyIGdldEphdmFQYWNrYWdlRm9sZGVyKE9STUdlblRhYmxlIHRhYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERlZmF1bHRKYXZhU291cmNlTG9jYXRpb24odGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0YWJsZS5nZXRTb3VyY2VGb2xkZXIoKSk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHRhYmxlLmdldFBhY2thZ2UoKTsKLQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JCWlmKCAhcGFja2FnZUZyYWdtZW50LmV4aXN0cygpKXsKLQkJCXJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLQkJfQkJCi0JCXJldHVybiAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldFJlc291cmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREZWZhdWx0SmF2YVNvdXJjZUxvY2F0aW9uKElKYXZhUHJvamVjdCBqcHJvamVjdCwgU3RyaW5nIHNvdXJjZUZvbGRlcil7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IGRlZmF1bHRTcmNQYXRoID0gbnVsbDsKLQkJaWYgKGpwcm9qZWN0ICE9IG51bGwgJiYganByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocm9vdHNbaV0uZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICl7Ci0JCQkJCQlpZiAoZGVmYXVsdFNyY1BhdGggPT0gbnVsbCkgewotCQkJCQkJCWRlZmF1bHRTcmNQYXRoID0gcm9vdHNbaV07Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IHJvb3RzW2ldLmdldFBhdGgoKS50b1N0cmluZygpOyAKLQkJCQkJCWlmIChwYXRoLmVxdWFscygnLycgKyBzb3VyY2VGb2xkZXIpKSB7Ci0JCQkJCQkJcmV0dXJuIHJvb3RzW2ldIDsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdEpwYUdlblBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRTcmNQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9UYWdOYW1lcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWVjZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi0vKioKLSAqIFRPRE86IG1lcmdlIHdpdGggSlBBIGNsYXNzID8KLSAqIFRoZSBKUEEgbWFwcGluZyB0YWcgYW5kIGF0dHJpYnV0ZSBuYW1lcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFnTmFtZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19UQUcgPSAiYmFzaWMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0NBREVfVEFHID0gImNhc2NhZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUcgPSAiY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9UQUcgPSAiZW1iZWRkZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX0lEX1RBRyA9ICJlbWJlZGRlZC1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX1RBRyA9ICJnZW5lcmF0ZWQtdmFsdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1RBRyA9ICJpZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ0xBU1NfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9UQUcgPSAiam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVEFHID0gImludmVyc2Utam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQl9UQUcgPSAibG9iIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX01BTllfVEFHID0gIm1hbnktdG8tbWFueSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkVfVEFHID0gIm1hbnktdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfVEFHID0gIm1hcHBlZC1ieSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTllfVEFHID0gIm9uZS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fT05FX1RBRyA9ICJvbmUtdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19KT0lOX0NPTFVNTl9UQUcgPSAicHJpbWFyeS1rZXktam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RBRyA9ICJ0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9UQUcgPSAidmVyc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9UQUcgPSAiam9pbi10YWJsZSI7Ci0KLQkvKmNhc2NhZGUgdGFncyovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0NBU0NBREUgPSAiYWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNUX0NBU0NBREUgPSAicGVyc2lzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfQ0FTQ0FERSA9ICJtZXJnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0NBU0NBREUgPSAicmVtb3ZlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0NBU0NBREUgPSAicmVmcmVzaCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNDZlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgZ3J1bnQgd29yayBuZWVkZWQgZm9yIG1vZGlmeWluZyBhIGNvbXBpbGF0aW9uIAotICogdW5pdCBhbmQgcGVyZm9ybXMgdGhlIG1vZGlmaWVkIGNvbXBpbGF0aW9uIHVuaXQgc2F2ZS4KLSAqIAotICogVGhlIHR5cGljYWwgdXNhZ2UgaXMgYXMgZm9sbG93czoKLSAqIDxvbD48bGk+Q3JlYXRlIGFuIGluc3RhbmNlLgotICogCi0gKiA8bGk+TW9kaWZ5IHRoZSBjb21waWxhdGlvbiB1bml0IHVzaW5nIEFTVCBvcGVyYXRpb25zIHBlcmZvcm1lZCAKLSAqIAlvbiB0aGUgbm9kZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldENvbXBpbGF0aW9uVW5pdE5vZGUoKX0uCi0gKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNhbGwgPGNvZGU+c2V0SmF2YVNvdXJjZTwvY29kZT4gdG8gY2hhbmdlIHRoZSBlbnRpcmUgc291cmNlIGNvZGUuIAotICogCi0gKiA8bGk+Q2FsbCB0aGUge0BsaW5rICNzYXZlKCl9IG1ldGhvZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIKLXsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBtUHJvamVjdDsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgbUNvbXBpbGF0aW9uVW5pdDsKLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBtQ29tcGlsYXRpb25Vbml0Tm9kZTsKLQlwcml2YXRlIERvY3VtZW50IG1Eb2N1bWVudDsKLQkKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbVByb2plY3QgPSBwcm9qZWN0OwotCQkKLQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JCW1Db21waWxhdGlvblVuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAobUNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc291cmNlIGNvZGUgZm9yICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JfQotCXB1YmxpYyBDb21waWxhdGlvblVuaXRNb2RpZmllcihJSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltUHJvamVjdCA9IHByb2plY3Q7Ci0JCW1Db21waWxhdGlvblVuaXQgPSBjdTsKLQl9Ci0JcHVibGljIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ29tcGlsYXRpb25Vbml0IGN1LCBDb21waWxhdGlvblVuaXQgY3VOb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Qcm9qZWN0ID0gcHJvamVjdDsKLQkJbUNvbXBpbGF0aW9uVW5pdCA9IGN1OwotCQltQ29tcGlsYXRpb25Vbml0Tm9kZSA9IGN1Tm9kZTsKLQkJCi0JCWdldENvbXBpbGF0aW9uVW5pdE5vZGUoKTsgLy90byBjcmVhdGUgbURvY3VtZW50ICh0aGUgY2FsbGVyIGluIHRoaXMgY2FzZSBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSkKLQl9Ci0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIAotCSAqIHR5aGUgbW9kaWZpY2F0aW9uIEFTVCBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSgpIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlID09IG51bGwpIHsKLQkJCUFTVFBhcnNlciBjID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCQljLnNldFNvdXJjZShtQ29tcGlsYXRpb25Vbml0KTsKLQkJCWMuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUgPSAoQ29tcGlsYXRpb25Vbml0KWMuY3JlYXRlQVNUKG51bGwpOwotCQl9Ci0JCWlmIChtRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQobUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotCQl9Ci0JCQotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdE5vZGU7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGVudGlyZSBKYXZhIHNvdXJjZSBjb2RlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2UoU3RyaW5nIG5ld1NvdXJjZSkgewotCQl0cnkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdTb3VyY2UpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBtb2RpZmljYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlICE9IG51bGwpIHsKLQkJCWFzc2VydChtRG9jdW1lbnQgIT0gbnVsbCk7IC8vc2VlIGdldENvbXBpbGF0aW9uVW5pdE5vZGUKLQkJCQotCQkJLy9jb21wdXRhdGlvbiBvZiB0aGUgdGV4dCBlZGl0cwotCQkJVGV4dEVkaXQgZWRpdHMgPSBtQ29tcGlsYXRpb25Vbml0Tm9kZS5yZXdyaXRlKG1Eb2N1bWVudCwgbVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQkvL2NvbXB1dGF0aW9uIG9mIHRoZSBuZXcgc291cmNlIGNvZGUKLQkJCWVkaXRzLmFwcGx5KG1Eb2N1bWVudCk7Ci0JCQlTdHJpbmcgbmV3U291cmNlID0gbURvY3VtZW50LmdldCgpOwotCQkJLy8gdXBkYXRlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JCQltQ29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKG5ld1NvdXJjZSk7Ci0JCX0KLQkJCi0JCWlmIChtQ29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5jb21taXRXb3JraW5nQ29weSh0cnVlLypmb3JjZSovLCBudWxsLyptb25pdG9yKi8pOwotCQl9IGVsc2UgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5zYXZlKG51bGwvKm1vbml0b3IqLywgdHJ1ZS8qZm9yY2UqLyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTA1ODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRFRQVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXkuQ29sdW1uUGFpcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBhY2Nlc3MgRFRQIGFuZCBvdGhlciBqcHQuZGIgQVBJcyAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9JbmNyZW1lbnQoQ29sdW1uIGMpewotCQkvL0AgVE9ETwotCQkvL0Jsb2NrZWQgYnkgRFRQIGJ1ZwotCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAwMjMKLQkJLy9UaGUgRGFsaSBidWcgaXMKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NjU4Ci0JCS8vCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBmawotCSAqIEBwYXJhbSBkYlRhYmxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxGb3JlaWduS2V5SW5mbz4gZ2V0Rm9yZWlnbktleXMoVGFibGUgZGJUYWJsZSkgewotCQlMaXN0PEZvcmVpZ25LZXlJbmZvPiByZXQgPSBuZXcgQXJyYXlMaXN0PEZvcmVpZ25LZXlJbmZvPigpOwotCQlpZihkYlRhYmxlIT1udWxsKXsKLQkJCWZvciAoRm9yZWlnbktleSBmayA6IGRiVGFibGUuZ2V0Rm9yZWlnbktleXMoKSkgewotCQkJCUl0ZXJhdG9yPENvbHVtblBhaXI+IGNvbHVtblBhaXJlcyA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKTsKLQkJCQlGb3JlaWduS2V5SW5mbyBma0luZm8gPSBudWxsOwotCQkJCXdoaWxlKCBjb2x1bW5QYWlyZXMuaGFzTmV4dCgpICl7Ci0JCQkJCUNvbHVtblBhaXIgY29sdW1uUGFpciA9IGNvbHVtblBhaXJlcy5uZXh0KCk7Ci0JCQkJCWlmKCBma0luZm8gPT0gbnVsbCl7Ci0JCQkJCQlTdHJpbmcgdGFibGVOYW1lID0gZGJUYWJsZS5nZXROYW1lKCk7Ci0JCQkJCQlTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSA9ICIiOwotCQkJCQkJVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCQkJCQlyZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKTsKLQkJCQkJCWZrSW5mbyA9IG5ldyBGb3JlaWduS2V5SW5mbyhmaywgdGFibGVOYW1lLCByZWZlcmVuY2VkVGFibGVOYW1lICk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCQkJCWZrSW5mby5hZGRDb2x1bW5NYXBwaW5nKCBiYXNlQ29sTmFtZSwgIHJlZmVyZW5jZWRDb2xOYW1lICk7Ci0JCQkJfSAKLQkJCQlpZiggZmtJbmZvICE9bnVsbCApCi0JCQkJCXJldC5hZGQoIGZrSW5mbyApOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVR5cGUoQ29sdW1uIGRiQ29sdW1uKSB7Ci0JCXJldHVybiBkYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSA/Ci0JCQkJZGJDb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSA6Ci0JCQkJZGJDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHRTY2hlbWEoVGFibGUgZGJUYWJsZSl7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gZGJUYWJsZS5nZXRTY2hlbWEoKS5nZXROYW1lKCk7Ci0JCVNjaGVtYSBkZWZhdWx0U2NoZW1hID0gZGJUYWJsZS5nZXRTY2hlbWEoKS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlyZXR1cm4gZGVmYXVsdFNjaGVtYS5nZXROYW1lKCkgPT0gc2NoZW1hTmFtZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRW50aXR5R2VuVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYTQ4YzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRW50aXR5R2VuVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgZW50aXR5IGdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5Ub29scyB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgKGRhdGFiYXNlKSBpZGVudGlmaWVyIHRvIGEgdW5pcXVlICJKYXZhIHN0eWxlIgotCSAqIGNsYXNzIG5hbWUuCi0JICogQHNlZSAjY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihTdHJpbmcsIGJvb2xlYW4sIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKFN0cmluZyBpZGVudGlmaWVyLCBDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcykgewotCQlyZXR1cm4gY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihpZGVudGlmaWVyLCB0cnVlLCBjbGFzc05hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgKGRhdGFiYXNlKSBpZGVudGlmaWVyIHRvIGEgdW5pcXVlICJKYXZhIHN0eWxlIgotCSAqIGF0dHJpYnV0ZSAoZmllbGQvcHJvcGVydHkpIG5hbWUuCi0JICogQHNlZSAjY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihTdHJpbmcsIGJvb2xlYW4sIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZShTdHJpbmcgaWRlbnRpZmllciwgQ29sbGVjdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKGlkZW50aWZpZXIsIGZhbHNlLCBhdHRyaWJ1dGVOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBpZGVudGlmaWVyOgotCSAqICAgICAtIGlmIHRoZSBpZGVudGlmaWVyIGlzIGFsbC1jYXBzLCBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvICJjYW1lbCBjYXNlIgotCSAqICAgICAtIGlmIHRoZSBpZGVudGlmaWVyIGlzIG5vdCBhbGwtY2FwcywgbGVhdmUgaXQgdW5jaGFuZ2VkIChleGNlcHQsIHBvc3NpYmx5LCBmb3IgdGhlIGZpcnN0IGxldHRlcikKLQkgKiAgICAgLSBjb252ZXJ0IHRvIGEgbGVnYWwgSmF2YSBpZGVudGlmaWVyCi0JICogICAgICAgICAtIGVsaW1pbmF0ZSBpbGxlZ2FsIGNoYXJhY3RlcnMKLQkgKiAgICAgICAgIC0gaWYgdGhlIHJlc3VsdCBpcyBhIHJlc2VydmVkIHdvcmQsIG1vZGlmeSBpdCBzbGlnaHRseQotCSAqIElmIHRoZSByZXN1bHQgaXMgYWxyZWFkeSBvbmUgb2YgdGhlIHNwZWNpZmllZCBleGlzdGluZyBpZGVudGlmaWVycwotCSAqIChpZ25vcmluZyBjYXNlIHNvIHdlIGRvbid0IGhhdmUgZmlsZW5hbWUgY29sbGlzaW9ucyBvbiBXaW5kb3dzKSwKLQkgKiBtb2RpZnkgaXQgc2xpZ2h0bHkgYWdhaW4uCi0JICogICAgICJGT08iID0+ICJGb28iIG9yICJmb28iCi0JICogICAgICJGT09fQkFSIiA9PiAiRm9vQmFyIiBvciAiZm9vQmFyIgotCSAqICAgICAiUEFDS0FHRSIgPT4gIlBhY2thZ2UiIG9yICJwYWNrYWdlXyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkZW50aWZpZXJzKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBpZGVudGlmaWVyOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2UocmVzdWx0KSB8fCBTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShyZXN1bHQpKSB7Ci0JCQkvLyBsZWF2ZSBtaXhlZCBjYXNlIGlkZW50aWZpZXJzIGFsb25lPwotCQkJcmVzdWx0ID0gU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UocmVzdWx0LCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShyZXN1bHQpIDogU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplKHJlc3VsdCk7Ci0JCX0KLQkJcmVzdWx0ID0gTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKHJlc3VsdCk7Ci0JCS8vIGFzc3VtZSB0aGF0IGNvbnZlcnRpbmcgdG8gYSB1bmlxdWUgbmFtZSB3aWxsIG5vdCByZXN1bHQgaW4gYSBKYXZhIHJlc2VydmVkIHdvcmQKLQkJLy8gKHNpbmNlIG5vIEphdmEgcmVzZXJ2ZWQgd29yZHMgZW5kIHdpdGggYSBudW1iZXIpCi0JCXJlc3VsdCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZShyZXN1bHQsIGlkZW50aWZpZXJzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEVudGl0eUdlblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0ZpbGVVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2FiOTA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5KcHRHZW5NZXNzYWdlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbGxlY3Rpb25zIG9mIHV0aWxpdHkgbWV0aG9kcyBoYW5kbGluZyBmaWxlcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWwKLXsKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRm9sZGVyKEZpbGUgZm9sZGVyKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVbXSBmaWxlcyA9IGZvbGRlci5saXN0RmlsZXMoKTsKLQkJLy9lbXB0eSB0aGUgZm9sZGVyIGZpcnN0IChqYXZhLmlvLmZpbGUuZGVsZXRlIHJlcXVpcmVzIGl0IGVtcHR5KQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotCQkJCUZpbGUgZiA9IGZpbGVzW2ldOwotCQkJCWlmIChmLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWRlbGV0ZUZvbGRlcihmKTsKLQkJCQllbHNlCi0JCQkJCWRlbGV0ZVBhdGgoZik7Ci0JCQl9Ci0JCX0KLQkJZGVsZXRlUGF0aChmb2xkZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVQYXRoKEZpbGUgZikKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoIWYuZGVsZXRlKCkpIHsKLQkJCVN0cmluZyBtc2dJZCA9IGYuaXNEaXJlY3RvcnkoKSA/ICBKcHRHZW5NZXNzYWdlcy5EZWxldGVfRm9sZGVyX0Vycm9yIDogIEpwdEdlbk1lc3NhZ2VzLkRlbGV0ZV9GaWxlX0Vycm9yOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCBOTFMuYmluZChtc2dJZCxmLmdldFBhdGgoKSkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRGaWxlKEZpbGUgc3JjKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWphdmEuaW8uRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzcmMpOwotCQl0cnkgewotCQkJbG9uZyBmaWxlTGVuID0gc3JjLmxlbmd0aCgpOwotCQkJaWYgKGZpbGVMZW4gPiBJbnRlZ2VyLk1BWF9WQUxVRSkKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZpbGUgbGVuZ3RoIHRvbyBiaWcgdG8gYmUgcmVhZCBieSBGaWxlVXRpbC5yZWFkRmlsZTogIiArIGZpbGVMZW4pOwotCQkKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWyhpbnQpZmlsZUxlbl07Ci0JCQlmaW4ucmVhZChieXRlcyk7Ci0JCQlyZXR1cm4gYnl0ZXM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlmaW4uY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUZpbGUoRmlsZSBkZXN0LCBieXRlW10gYnl0ZXMpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKGRlc3QuZXhpc3RzKCkgJiYgIWRlc3QuY2FuV3JpdGUoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggTkxTLmJpbmQoSnB0R2VuTWVzc2FnZXMuRmlsZV9SZWFkX09ubHlfRXJyb3IsIGRlc3QuZ2V0UGF0aCgpKSk7ICAvL3Rocm93IHdpdGggYSBjbGVhciBlcnJvciBiZWNhdXNlIG90aGVyd2lzZSBGaWxlT3V0cHV0U3RyZWFtIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24hCi0JCWphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSBmb3V0ID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShkZXN0LmdldFBhdGgoKSwgZmFsc2UvKmFwcGVuZCovKTsKLQkJdHJ5IHsKLQkJCWZvdXQud3JpdGUoYnl0ZXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZm91dC5mbHVzaCgpOwotCQkJZm91dC5jbG9zZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsIGZvciBhIGZpbGUuCi0JICogVGhpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgZmlsZS50b1VybCgpIGJ1dCB3aXRob3V0IHRoZSBub24tc2Vuc2UgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEZpbGVVcmwoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmlsZS50b1VSSSgpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy9zaG91bGQgbm90IGhhcHBlbiBhcyBmaWxlLnRvVVJMKCkgZG9lcyBub3QgcmVhbGx5IHRocm93IGFuIGV4Y2VwdGlvbgotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEZpbGVDb250ZW50KEZpbGUgZmlsZSwgamF2YS5pby5JbnB1dFN0cmVhbSBjb250ZW50cykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCUlGaWxlIGlGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoaUZpbGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVGhlIHBhdGggIiArIGZpbGUgKyAiIGRvZXMgbm90IHNlZW0gdG8gYmUgYSB2YWxpZCBmaWxlIHBhdGguIik7Ci0JCQl9Ci0JCQlpRmlsZS5zZXRDb250ZW50cyhjb250ZW50cywgdHJ1ZS8qZm9yY2UqLywgdHJ1ZS8qa2VlcEhpc3RvcnkqLywgbnVsbC8qbW9uaXRvciovKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CQotCQotICAgIC8qKgotICAgICAqIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIGEgSmFyIGFyY2hpdmUgdG8gdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5qYXIoSW5wdXRTdHJlYW0gaW4sIEZpbGUgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFkZXN0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBkZXN0Lm1rZGlycygpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkRlc3RpbmF0aW9uIG11c3QgYmUgYSBkaXJlY3RvcnkuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICAgIEphcklucHV0U3RyZWFtIGppbiA9IG5ldyBKYXJJbnB1dFN0cmVhbShpbik7Ci0gICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxMDI0XTsKLQotICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IGppbi5nZXROZXh0RW50cnkoKTsKLSAgICAgICAgd2hpbGUgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5jaGFyQXQoZmlsZU5hbWUubGVuZ3RoKCkgLSAxKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmNoYXJBdCgwKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3QsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0gICAgICAgICAgICAgICAgZmlsZS5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBqaW4uY2xvc2VFbnRyeSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGRpcmVjdG9yeSBleGlzdHMKLSAgICAgICAgICAgICAgICBGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBkdW1wIHRoZSBmaWxlCi0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgICAgIGludCBsZW4gPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgobGVuID0gamluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgamluLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgICAgICBmaWxlLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW50cnkgPSBqaW4uZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRXhwbGljaXRseSB3cml0ZSBvdXQgdGhlIE1FVEEtSU5GL01BTklGRVNULk1GIHNvIHRoYXQgYW55IGhlYWRlcnMgc3VjaAotICAgICAgICAgYXMgdGhlIENsYXNzLVBhdGggYXJlIHNlZW4gZm9yIHRoZSB1bnBhY2thZ2VkIGphcgotICAgICAgICAgKi8KLSAgICAgICAgTWFuaWZlc3QgbWYgPSBqaW4uZ2V0TWFuaWZlc3QoKTsKLSAgICAgICAgaWYgKG1mICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc3QsICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50LmV4aXN0cygpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50Lm1rZGlycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgICAgICAgICAgbWYud3JpdGUob3V0KTsKLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgamluLmNsb3NlKCk7Ci0gICAgfQotICAgIAotCS8vVXNlZCB0byBVbnppcCB0aGUgYSBzcGVjaWZpYyBmb2xkZXIgcGFja2VkIGluc2lkZSBhIHBsdWctaW4gYnVuZGxlIHRvIHRoZSBwbHVnLWluIHN0YXRlIGxvY2F0aW9uCi0JcHVibGljIHN0YXRpYyBGaWxlIGV4dHJhY3RGaWxlc0Zyb21CdW5kbGUoIFVSTCB1cmwsIEJ1bmRsZSBidW5kbGUsIFN0cmluZyBwYXRoICkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCBqYXJVcmwgPSBVcmxVdGlsLmdldEphckZpbGVVcmwodXJsKTsKLQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoamFyVXJsLmdldEZpbGUoKSApOwotCQlMb2NhdGlvbiBjb25maWdMb2NhdGlvbiA9IFBsYXRmb3JtLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCUZpbGUgY29uZmlnRm9sZGVyID0gbmV3IEZpbGUoIGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLmdldEZpbGUoKSwgcGx1Z2luSWQpOwotCQlGaWxlIHRlbXBsRGlyID0gbmV3IEZpbGUoIGNvbmZpZ0ZvbGRlciwgcGF0aCApOwotCQlpZiggIXRlbXBsRGlyLmV4aXN0cygpICl7Ci0JCQlGaWxlVXRpbC51bmphciggbmV3IEZpbGVJbnB1dFN0cmVhbSggamFyRmlsZSApLCBjb25maWdGb2xkZXIgKTsKLQkJCS8vRGVsZXRlIHVuLXJlbGF0ZWQgZmlsZXMgYW5kIGZvbGRlcnMKLQkJCUZpbGVbXSBmaWxlcyA9IGNvbmZpZ0ZvbGRlci5saXN0RmlsZXMoKTsKLQkJCWZvciggRmlsZSBmIDogZmlsZXMgKXsKLQkJCQlpZiggZi5pc0ZpbGUoKSApCi0JCQkJCWYuZGVsZXRlKCk7Ci0JCQkJZWxzZSBpZiggIHRlbXBsRGlyLmdldFBhdGgoKS5pbmRleE9mKCBmLmdldFBhdGgoKSApICE9MCAgKXsKLQkJCQkJRmlsZVV0aWwuZGVsZXRlRm9sZGVyKGYpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVtcGxEaXIgOwotCX0JCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0ZvcmVpZ25LZXlJbmZvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGY1ZWI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0ZvcmVpZ25LZXlJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgbWV0YWRhdGEgZm9yIGEgcGFydGljdWxhciBmb3JlaWduIGtleSByZWxhdGlvbnNoaXAgCi0gKiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2Ugc2NoZW1hLgotICogPHAvPgotICogVGhlIHJlZmVycmVyIGNvbHVtbiBpcyBvbmUgd2hpY2ggYWN0dWFsbHkgY29udGFpbnMgYSBmb3JlaWduIAotICoga2V5IGNvbnN0cmFpbnQsIGFuZCBpcyBlcXVpdmFsZW50IHRvIHRoZSAiZm9yZWlnbiBrZXkiIGNvbHVtbi4KLSAqIDxwLz4KLSAqIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBpcyBvbmUgd2hpY2ggYSByZWZlcnJlciBvciBmb3JlaWduIGtleSAKLSAqIGNvbHVtbiByZWZlcmVuY2VzLCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUgInByaW1hcnkga2V5IiBjb2x1bW4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZvcmVpZ25LZXlJbmZvCi17Ci0JcHJpdmF0ZSB0cmFuc2llbnQgRm9yZWlnbktleSBtRm9yZWlnbktleSA7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyVGFibGVOYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckNvbE5hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkQ29sTmFtZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZrIFRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50IGJhY2tpbmcgCi0gICAgICogdGhpcyBmb3JlaWduIGtleSBtZXRhZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRm9yZWlnbktleUluZm8oRm9yZWlnbktleSBmaywgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSkgewotICAgIAltRm9yZWlnbktleSA9IGZrOwotICAgIAltTmFtZSA9IGZrLmdldE5hbWUoKTsKLSAgICAJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0gICAgCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQl9Ci0gICAgLyoqCi0gICAgICogT2J0YWluIHRoZSBjb25zdHJhaW50IG5hbWUgZm9yIHRoaXMgZm9yZWlnbiBrZXkgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBUaGUgbmFtZSBmb3IgYSBGb3JlaWduIEtleSBtYXksIGFzIHBlciB0aGUgSkRCQyBzcGVjaWZpY2F0aW9uLAotICAgICAqIGJlIDxjb2RlPm51bGw8L2NvZGU+IHdoZXJlIHRoZSBjb25zdHJhaW50IGlzIG5vdCBuYW1lZC4KLSAgICAgKiBJbiBhZGRpdGlvbiwgaXQgbWF5IGJlIGhhcmRseSByZWNvZ25pemFibGUgdG8gdGhlIHVzZXIsCi0gICAgICogcGFydGljdWxhcmx5IGZvciBEQi8yIGNvbnN0cmFpbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGNvbnN0cmFpbnQgYmFja2luZwotICAgICAqICAgICAgICAgdGhpcyBmb3JlaWduIGtleSBtZXRhZGF0YSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgRm9yZWlnbktleSBnZXRGb3JlaWduS2V5KCl7Ci0gICAgCXJldHVybiBtRm9yZWlnbktleTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogQWRkIGFub3RoZXIgcGFpciBvZiBmb3JlaWduIGtleSBtYXBwaW5ncyBmb3IgdGhpcyBmb3JlaWduIGtleQotICAgICAqIGRlZmluaXRpb24uCi0gICAgICogCi0gICAgICogQHBhcmFtIHJlZmVycmVyQ29sdW1uIFRoZSByZWZlcnJlciBjb2x1bW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWZlcmVuY2VkQ29sdW1uIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ29sdW1uTWFwcGluZyhTdHJpbmcgcmVmZXJyZXJDb2xOYW1lLCBTdHJpbmcgcmVmZXJlbmNlZENvbE5hbWUpIHsKLSAgICAJbVJlZmVycmVyQ29sTmFtZXMuYWRkKHJlZmVycmVyQ29sTmFtZSk7Ci0gICAgCW1SZWZlcmVuY2VkQ29sTmFtZXMuYWRkKHJlZmVyZW5jZWRDb2xOYW1lKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJyZXIgdGFibGUgbmFtZSBvZiB0aGlzIGZvcmVpZ24ga2V5Ci0gICAgICogcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJyZXJUYWJsZU5hbWU7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVycmVyIGNvbHVtbiBuYW1lcyBmb3IgdGhpcwotICAgICAqIGZvcmVpZ24ga2V5LgotICAgICAqIFRoZSBzaXplIG9mIHRoaXMgbGlzdCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgCi0gICAgICogdGhlIGxpc3QgcmV0dXJlZCBmcm9tIDxjb2RlPmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lczwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJyZXJDb2xOYW1lczsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCB0YWJsZSBuYW1lIG9mIHRoaXMgZm9yZWlnbiBrZXkKLSAgICAgKiByZWxhdGlvbnNoaXAuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgewotICAgIAkgcmV0dXJuIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lcyBmb3IgdGhpcwotICAgICAqIGZvcmVpZ24ga2V5LgotICAgICAqIFRoZSBzaXplIG9mIHRoaXMgbGlzdCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgCi0gICAgICogdGhlIGxpc3QgcmV0dXJlZCBmcm9tIDxjb2RlPmdldFJlZmVycmVyQ29sdW1uTmFtZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0gICAgICAgIHJldHVybiBtUmVmZXJlbmNlZENvbE5hbWVzOwotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIAlyZXR1cm4gIm5hbWU9IiArIG1OYW1lCi0JCSsgIiwgcmVmZXJyZXJUYWJsZT0iICsgbVJlZmVycmVyVGFibGVOYW1lCi0JCSsgIiwgcmVmZXJlbmNlZFRhYmxlPSIgKyBtUmVmZXJlbmNlZFRhYmxlTmFtZQotCQkrICIsIHJlZmVycmVyQ29sdW1ucz0iICsgbVJlZmVycmVyQ29sTmFtZXMKLQkJKyAiLCByZWZlcmVuY2VkQ29sdW1ucz0iICsgbVJlZmVyZW5jZWRDb2xOYW1lcwotCQkJOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvU3RyaW5nVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvU3RyaW5nVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYyMjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTdHJpbmdVdGlsCi17Ci0JLyoqCi0JICogUGFkcyBhIHN0cmluZyBieSBhZGRpbmcgYSBzZXF1ZW5jZSBvZiBhbiBhcmJpdHJhcnkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcuCi0JICogQHBhcmFtIHBhZENoYXIgVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIGZvciBwYWRkaW5nLgotCSAqIEBwYXJhbSBsZW4gVGhlIGRlc2lyZWQgbGVuZ3RoIGFmdGVyIHBhZGRpbmcuCi0JICogQHJldHVybiBUaGUgcGFkZGVkIHN0cmluZy4gRm9yIGV4YW1wbGUgaWYgPGNvZGU+c3RyPC9jb2RlPiBpcyAiZjRlIiBhbmQgPGNvZGU+cGFkQ2hhcjwvY29kZT4gaXMgJzAnIAotCSAqIGFuZCA8Y29kZT5sZW48L2NvZGU+IGlzIDYgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zICIwMDBmNGUiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkTGVmdChTdHJpbmcgc3RyLCBjaGFyIHBhZENoYXIsIGludCBsZW4pIHsKLQkJaWYoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBzdHJMZW4gPSBzdHIubGVuZ3RoKCk7Ci0JCWlmIChzdHJMZW4gPCBsZW4pIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbik7Ci0JCQlpbnQgY291bnQgPSBsZW4tc3RyTGVuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQkJCWJ1ZmZlci5hcHBlbmQocGFkQ2hhcik7Ci0JCQlidWZmZXIuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQkvKioKLQkgKiBJbnNlcnRzIGEgZ2l2ZW4gY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogRm9yIGV4YW1wbGUgaWYgdGhlIHN0cmluZyBpcyA8dHQ+ZXh0cmVtZTwvdHQ+IGFuZCB0aGUgY2hhciBpcyA8dHQ+JzwvdHQ+IHRoZW4gCi0JICogdGhlIHJldHVybmVkIHN0cmluZyBpcyA8dHQ+J2V4dGVybWUnPC90dD4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHN0ciwgY2hhciBjKSB7Ci0JCWFzc2VydChzdHIgIT0gbnVsbCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKSsyKTsKLQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIpOwotCQlidWZmZXIuYXBwZW5kKGMpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRvdWJsZVF1b3RlKFN0cmluZyBzdHIpIHsKLQkJcmV0dXJuIHF1b3RlKHN0ciwgJyInKTsKLQl9Ci0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKGlmIHRoZXkgZXhpc3QpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVucXVvdGUoU3RyaW5nIHF1b3RlZCkgewotCQlpZiAocXVvdGVkICE9IG51bGwgJiYgcXVvdGVkLmxlbmd0aCgpID49IDIpewotCQkJaW50IGxlbiA9IHF1b3RlZC5sZW5ndGgoKTsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcXVvdGVkLmNoYXJBdCgwKTsKLQkJCWNoYXIgbGFzdENoYXIgPSBxdW90ZWQuY2hhckF0KGxlbi0xKTsKLQkJCWlmIChmaXJzdENoYXIgPT0gbGFzdENoYXIgJiYgKGZpcnN0Q2hhciA9PSAnXCcnIHx8IGZpcnN0Q2hhciA9PSAnIicpKSB7Ci0JCQkJcmV0dXJuIHF1b3RlZC5zdWJzdHJpbmcoMSwgbGVuLTEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdW90ZWQ7Ci0JfQotCS8qKgotCSAqIFRydW5jYXRlcyBhIHN0cmluZyBhbmQgYWRkcyAiLi4uIiBpbiB0aGUgcmVzdWx0IHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGxlbmd0aCBpcyBsZXNzIG9yIGVxdWFsIHRvIHRoZSBtYXggbGVuIHRoZW4gCi0JICogdGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0cnVuY2F0ZShTdHJpbmcgcywgaW50IG1heExlbikgewotCQlpZiAocyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IG1heExlbikgewotCQkJaW50IHNlZ21lbnRMZW4gPSBtYXhMZW4vMjsKLQkJCXMgPSBzLnN1YnN0cmluZygwLCBzZWdtZW50TGVuKSArICIuLi4iICsgcy5zdWJzdHJpbmcobGVuLXNlZ21lbnRMZW4pOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNhbWUgY2hhcmFjdGVyIHJlcGVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGVhdChjaGFyIGMsIGludCBjb3VudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihjb3VudCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdpdmVuIHN0cmluZyB1bmxlc3MgaXQgaXMgZW10cHR5IHdoZXJlIGl0IHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBudWxsSWZFbXB0eShTdHJpbmcgcykgewotCQlpZiAocyAhPSBudWxsICYmIHMubGVuZ3RoKCkgPT0gMCkgewotCQkJcyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHM7Ci0JfQotCS8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgc2FtZSBjaGFyYWN0ZXJzIGFzIHRoZSBhcmd1bWVudCBzdHJpbmcgCi0JICogZXhjZXB0IHRoYXQgdGhlIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIHRoZWlyIGhleCBjb2RlLgotCSAqIEZvciBleGFtcGxlIGlmIHRoZSBzdHJpbmcgaXMgImFiXG5jIiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzICJhYnsweEF9YyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VmlzaWJsZVN0cmluZyhTdHJpbmcgcykgewotCQlpZiAocyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjIDw9IDB4MUYgfHwgKGMgPT0gMHgyMCAmJiAoaSA9PSAwIHx8IGkgPT0gbGVuLTEpKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIigweCIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKChpbnQpYykudG9VcHBlckNhc2UoKSArICIpIik7Ci0JCQl9Ci0JCQllbHNlIGJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBSZXBsYWNlcyBhIHBvcnRpb24gb2Ygc3RyaW5nLgotCSAqIEBwYXJhbSBzdHIgVGhlIG9yaWdpbmFsIHN0cmluZy4KLQkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgaW4gdGhlIG9yaWdpbmFsIHN0cmluZyB3aGVyZSB0aGUgcmVwbGFjZSBzdGFydHMKLQkgKiBAcGFyYW0gbGVuIFRoZSByZXBsYWNlIGxlbmd0aCB0aGUgb3JpZ2luYWwgc3RyaW5nCi0JICogQHBhcmFtIHJlcGxhY2VTdHIgVGhlIHJlcGxhY2VtZW50IHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0clJlcGxhY2UoU3RyaW5nIHN0ciwgaW50IG9mZnNldCwgaW50IGxlbiwgU3RyaW5nIHJlcGxhY2VTdHIpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpLWxlbityZXBsYWNlU3RyLmxlbmd0aCgpKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKDAsIG9mZnNldCkpOwotCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VTdHIpOwotCQlidWZmZXIuYXBwZW5kKHN0ci5zdWJzdHJpbmcob2Zmc2V0K2xlbikpOwotCQkKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlKFN0cmluZyBzdHIsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZVN0cikKLQl7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZihwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCWludCBpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4pOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHN0cjsKLQkJCi0JCWlmIChyZXBsYWNlU3RyID09IG51bGwpCi0JCQlyZXBsYWNlU3RyID0gIiI7Ci0JCXJldHVybiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHJlcGxhY2VTdHIgKyBzdHIuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0clJlcGxhY2VBbGwoU3RyaW5nIHN0ciwgU3RyaW5nIHBhdHRlcm4sIFN0cmluZyByZXBsYWNlU3RyKQotCXsKLQkJaWYoc3RyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChyZXBsYWNlU3RyID09IG51bGwpCi0JCQlyZXBsYWNlU3RyID0gIiI7Ci0JCWlmKHBhdHRlcm4gPT0gbnVsbCB8fCBwYXR0ZXJuLmVxdWFscygiIikpIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJaW50IGluZGV4ID0gc3RyLmluZGV4T2YocGF0dGVybik7Ci0JCXdoaWxlIChpbmRleCA+PSAwKSB7Ci0JCQlzdHIgPSBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSArIHJlcGxhY2VTdHIgKyBzdHIuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0JCQlpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4sIGluZGV4K3JlcGxhY2VTdHIubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBzdHI7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0ckluc2VydChTdHJpbmcgc3RyLCBpbnQgaW5kZXgsIFN0cmluZyBpbnNlcnRTdHIpCi0JewotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkKLQkJCQkrIGluc2VydFN0cgotCQkJCSsgc3RyLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotICAgIC8qKgotICAgICAqIFRva2VuaXplIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYSA8Y29kZT5MaXN0PC9jb2RlPiBvZgotICAgICAqIHdvcmRzLgotICAgICAqIElmIHRoZSBzdHJpbmcgc3BlY2lmaWVkIGlzIDxjb2RlPm51bGw8L2NvZGU+IG9yIGVtcHR5LCB0aGlzCi0gICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIAotICAgICAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byB0b2tlbml6ZSBpbnRvIGEgPGNvZGU+TGlzdDwvY29kZT4uCi0gICAgICogQHBhcmFtIHNlcCAgICBUaGUgc2VwYXJhdG9yIGNoYXJhY3RlciB0byB1c2UgdG8gc3BsaXQKLSAgICAgKiAgICAgICAgICAgICAgIHRoZSBzdHJpbmcuCi0gICAgICogQHBhcmFtIHRyaW0gICBJZiA8Y29kZT50cnVlPC9jb2RlPiwgcnVuIDxjb2RlPnRyaW08L2NvZGU+IG9uCi0gICAgICogICAgICAgICAgICAgICBlYWNoIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCA8Y29kZT5MaXN0PC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIEEgPGNvZGU+TGlzdDwvY29kZT4gY29udGFpbmluZyBhbGwgdG9rZW5pemVkIHdvcmRzCi0gICAgICogICAgICAgICBpbiB0aGUgcGFyYW1ldGVyIHN0cmluZy4KLSAgICAgKiAgICAgICAgIEVhY2ggZWxlbWVudCBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gc3RyVG9MaXN0KFN0cmluZyBzLCBjaGFyIHNlcCwgYm9vbGVhbiB0cmltKQotCXsKLQkvL2V4OiBpZiBzZXAgaXMgJzsnIHRoZW4gcyBzaG91bGQgYmUgc29tZXRpbmcgbGlrZSAiUmVkO0JsYWNrIgotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJY2hhciBkZWxpbWl0ZXJzW10gPSB7c2VwfTsKLQkJamF2YS51dGlsLlN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihzLCBuZXcgU3RyaW5nKGRlbGltaXRlcnMpLCB0cnVlLypyZXR1cm5EZWxpbWl0ZXJzKi8pOwotCQlTdHJpbmcgbGFzdFRvaz1udWxsOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRvayA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2subGVuZ3RoKCk9PTEgJiYgdG9rLmNoYXJBdCgwKT09c2VwKXsvL2RlbGltaXRlcgotCQkJICAgIGlmICh0b2suZXF1YWxzKGxhc3RUb2spfHxsYXN0VG9rPT1udWxsLypmaXJzdCBlbGVtZW50IGlzIGVtcHR5Ki8pCi0JCQkgICAgICAgIHJlc3VsdC5hZGQoIiIpOwotCQkJfQotCQkJZWxzZXsKLQkJCSAgICBpZiAodHJpbSkKLQkJCSAgICAgICAgdG9rID0gdG9rLnRyaW0oKTsKLQkJCSAgICByZXN1bHQuYWRkKHRvayk7Ci0JCQl9Ci0JCQlsYXN0VG9rPXRvazsKLQkJfQotCQlpZihsYXN0VG9rLmxlbmd0aCgpPT0xICYmIGxhc3RUb2suY2hhckF0KDApPT1zZXApLy9sYXN0IGVsZW1lbnQgaXMgZW1wdHkKLQkJICAgIHJlc3VsdC5hZGQoIiIpOwotCQlyZXN1bHQudHJpbVRvU2l6ZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBzdHJUb0xpc3QoU3RyaW5nIHMsIGNoYXIgc2VwKQotCXsKLQkJcmV0dXJuIHN0clRvTGlzdChzLCBzZXAsIGZhbHNlLyp0cmltKi8pOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0VG9TdHIoQ29sbGVjdGlvbiBhLCBjaGFyIHNlcCkKLQl7Ci0JCXJldHVybiBsaXN0VG9TdHIoYSwgU3RyaW5nLnZhbHVlT2Yoc2VwKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxpc3RUb1N0cihDb2xsZWN0aW9uPE9iamVjdD4gYSwgU3RyaW5nIHNlcCkgewotCQkvL3JldmVyc2Ugb2Ygc3RyVG9MaXN0Ci0JCWlmIChhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGNvdW50ID0gYS5zaXplKCk7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IGl0ZXIgPSBhLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0JCXsKLQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCWlmIChvYmogPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCQotCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKHNlcCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nKQotCQkJCWJ1ZmZlci5hcHBlbmQoKFN0cmluZylvYmopOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQob2JqKTsKLQkJfQotCQlyZXR1cm4gKGJ1ZmZlciAhPSBudWxsKSA/IGJ1ZmZlci50b1N0cmluZygpIDogbnVsbDsKLQl9Ci0JLyoqCi0JICogQ29udmVydCB0aGUgdGV4dCBvZiBhIFN0cmluZyBpbnRvIGEgTWFwIG9mIFN0cmluZ3MsIHdoZXJlIGVhY2gKLQkgKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBNYXAgaXMgb2YgdHlwZSBTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIHMgICAgICBUaGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKiBAcGFyYW0gc2VwMSAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXlzIGFuZCB0aGVpcgotCSAqICAgICAgICAgICAgICAgdmFsdWVzLgotCSAqIEBwYXJhbSBzZXAyICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleS12YWx1ZSBwYWlycy4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgY29udmVydGVkIHRvIGEgTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gc3RyVG9NYXAoU3RyaW5nIHMsIGNoYXIgc2VwMSwgY2hhciBzZXAyKQotCXsKLQkJcmV0dXJuIHN0clRvTWFwKHMsIHNlcDEsIHNlcDIsIGZhbHNlLypsb3dlcmNhc2VLZXlzKi8pOwotCX0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSB0ZXh0IG9mIGEgU3RyaW5nIGludG8gYSBNYXAgb2YgU3RyaW5ncywgd2hlcmUgZWFjaAotCSAqIGtleSBhbmQgdmFsdWUgaW4gdGhlIE1hcCBpcyBvZiB0eXBlIFN0cmluZy4KLQkgKiBUaGlzIGZvcm0gYWxzbyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhhdCBhbGwga2V5cyB3aWxsIGJlCi0JICogY29udmVydGVkIHRvIGxvd2VyLWNhc2UgYmVmb3JlIGFkZGluZyB0byB0aGUgTWFwLgotCSAqIAotCSAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICogQHBhcmFtIHNlcDEgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5cyBhbmQgdGhlaXIKLQkgKiAgICAgICAgICAgICAgIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2VwMiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXktdmFsdWUgcGFpcnMuCi0JICogQHBhcmFtIGxvd2VyY2FzZUtleXMKLQkgKiAgICAgICAgICAgICAgIFdoZXRoZXIgdG8gY29udmVydCBrZXlzIHRvIGxvd2VyIGNhc2UKLQkgKiAgICAgICAgICAgICAgIGJlZm9yZSBhZGRpbmcgdG8gdGhlIE1hcC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgY29udmVydGVkIHRvIGEgTWFwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgamF2YS51dGlsLk1hcDxTdHJpbmcsIFN0cmluZz4gc3RyVG9NYXAoU3RyaW5nIHMsIGNoYXIgc2VwMSwgY2hhciBzZXAyLCBib29sZWFuIGxvd2VyY2FzZUtleXMpCi0JewotCQkvL2V4OiBpZiBzZXAxIGlzICc6JyBhbmQgc2VwMiBpcyAnLCcgdGhlbiBzIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSAiY29sb3I6UmVkLHNpemU6WEwiCi0JCQotCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0JCX0KLQkJCQotCQlqYXZhLnV0aWwuTGlzdDxTdHJpbmc+IGEgPSBzdHJUb0xpc3Qocywgc2VwMik7Ci0JCWlmIChhID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotCQl9Ci0JCQotCQlqYXZhLnV0aWwuSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaG0gPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWludCBjb3VudCA9IGEuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCXsKLQkJCVN0cmluZyBzMiA9IChTdHJpbmcpYS5nZXQoaSk7IC8vZXg6IGNvbG9yOlJlZAotCQkJaW50IHBvcyA9IHMyLmluZGV4T2Yoc2VwMSk7Ci0JCQlpZiAocG9zID49IDApCi0JCQl7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzMi5zdWJzdHJpbmcoMCwgcG9zKTsKLQkJCQlTdHJpbmcgdmFsID0gczIuc3Vic3RyaW5nKHBvcysxKTsKLQkJCQlpZiAobG93ZXJjYXNlS2V5cykKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQlobS5wdXQobmFtZSwgdmFsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaG07Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hcFRvU3RyKGphdmEudXRpbC5NYXAgaG0sIGNoYXIgc2VwMSwgY2hhciBzZXAyKQotCS8vcmV2ZXJzZSBvZiBzdHJUb01hcAotCXsKLQkJaWYgKGhtID09IG51bGwgfHwgaG0uaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlqYXZhLnV0aWwuSXRlcmF0b3I8amF2YS51dGlsLk1hcC5FbnRyeT4gaXRlciA9IGhtLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhLnV0aWwuTWFwLkVudHJ5IGVudHJ5ID0gKGphdmEudXRpbC5NYXAuRW50cnkpaXRlci5uZXh0KCk7Ci0JCQlidWZmZXIuYXBwZW5kKGVudHJ5LmdldEtleSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoc2VwMSk7Ci0JCQlidWZmZXIuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChzZXAyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSA8ZW0+Y2FzZSBpbnNlbnNpdGl2ZTwvZW0+IGNvbXBhcmlzb24gYmV0d2VlbgotICAgICAqIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHR3byBvYmplY3RzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBvYmoxICAgVGhlIGZpcnN0IG9iamVjdCB0byBjb21wYXJlLgotICAgICAqIEBwYXJhbSBvYmoyICAgVGhlIHNlY29uZCBvYmplY3QgdG8gY29tcGFyZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGJvdGggb2JqZWN0cyBoYXZlIHRoZQotICAgICAqICAgICAgICAgc2FtZSBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29tcGFyZUFzU3RyaW5ncyhPYmplY3Qgb2JqMSwgT2JqZWN0IG9iajIpCi0JewkKLQkJaWYgKG9iajEgPT0gbnVsbCB8fCBvYmoyID09IG51bGwpCi0JCQlyZXR1cm4gb2JqMSA9PSBvYmoyOwotCQkKLQkJU3RyaW5nIHMxLCBzMjsKLQkJaWYgKG9iajEgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXMxID0gKFN0cmluZylvYmoxOwotICAgICAgICB9IGVsc2UgewotCQkJczEgPSBvYmoxLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQkJaWYgKG9iajIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCXMyID0gKFN0cmluZylvYmoyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCQkJczIgPSBvYmoyLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQkJCi0JCXJldHVybiBzMS5lcXVhbHNJZ25vcmVDYXNlKHMyKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhIHN0cmluZyBzdGFydHMgd2l0aCBhbnkgb2YgYSBsaXN0IG9mIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0c1dpdGhBbnkoU3RyaW5nIHMsIExpc3Q8U3RyaW5nPiBwcmVmaXhlcykgewotCQlpbnQgY291bnQgPSBwcmVmaXhlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQkJaWYgKHMuc3RhcnRzV2l0aCgoU3RyaW5nKXByZWZpeGVzLmdldChpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFyZ3VtZW50IHN0cmluZyB3aXRoIHRoZSBmaXJzdCBjaGFyIHVwcGVyLWNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW5pdFVwcGVyKFN0cmluZyBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsIHx8IHN0ci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyLmNoYXJBdCgwKSkgKyBzdHIuc3Vic3RyaW5nKDEpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhciBsb3dlci1jYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRMb3dlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0ci5jaGFyQXQoMCkpICsgc3RyLnN1YnN0cmluZygxKTsKLQl9Ci0JLyoqCi0JICogVGVzdHMgd2hldGhlciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIGFyZSB1cHBlcgotCSAqIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBwZXJDYXNlKFN0cmluZyBzKSB7Ci0JCXJldHVybiBzLnRvVXBwZXJDYXNlKCkuZXF1YWxzKHMpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBub24td2hpdGUgY2hhciBpbmRleCBzdGFydGluZyBmcm9tIHRoZSAKLQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2tpcFdoaXRlU3BhY2VzKFN0cmluZyBzdHIsIGludCBpbmRleCkgewotCQlpbnQgbGVuID0gc3RyLmxlbmd0aCgpOwotCQl3aGlsZSAoaW5kZXggPCBsZW4pIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KGluZGV4KSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCSsraW5kZXg7Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQkvKioKLQkgKiBDb2xsYXBzZXMgY29uc2VjdXRpdmUgd2hpdGUgc3BhY2VzIGludG8gb25lIHNwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxhcHNlV2hpdGVTcGFjZXMoU3RyaW5nIHN0cil7Ci0JICAgIFN0cmluZyByZXN1bHQ9bnVsbDsKLQkgICAgaWYgKHN0ciE9bnVsbCl7Ci0JICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyPW5ldyBTdHJpbmdCdWZmZXIoKTsKLQkgICAgICAgIGJvb2xlYW4gaXNJbldoaXRlU3BhY2U9ZmFsc2U7Ci0JICAgICAgICBmb3IgKGludCBpPTA7aTxzdHIubGVuZ3RoKCk7aSsrKXsKLQkgICAgICAgICAgICBjaGFyIGM9c3RyLmNoYXJBdChpKTsKLQkgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSl7Ci0JICAgICAgICAgICAgICAgIGlzSW5XaGl0ZVNwYWNlPXRydWU7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGVsc2UgewotCSAgICAgICAgICAgICAgICBpZiAoaXNJbldoaXRlU3BhY2UpCi0JICAgICAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgIik7Ci0JICAgICAgICAgICAgICAgIGlzSW5XaGl0ZVNwYWNlPWZhbHNlOyAgIAotCSAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGMpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHJlc3VsdD1idWZmZXIudG9TdHJpbmcoKTsKLQkgICAgfQotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZHMgdXNlZCB0byBjb252ZXJ0IERCIG9iamVjdCBuYW1lcyB0byAgCi0JICogYXBwcm9wcmlhdGUgSmF2YSB0eXBlIGFuZCBmaWVsZCBuYW1lIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsdXJhbGlzZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbmFtZTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSkgewotCQkJcmVzdWx0ICs9ICdzJzsKLQkJfSBlbHNlIGlmICghc2VlbXNQbHVyYWxpc2VkKG5hbWUpKSB7Ci0JCQlTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAoIWxvd2VyLmVuZHNXaXRoKCJkYXRhIikpIHsgLy9vcmRlckRhdGEgLS0+IG9yZGVyRGF0YXMgaXMgZHVtYgotCQkJCWNoYXIgc2Vjb25kTGFzdCA9IGxvd2VyLmNoYXJBdChuYW1lLmxlbmd0aCgpIC0gMik7Ci0JCQkJaWYgKCFpc1Zvd2VsKHNlY29uZExhc3QpICYmIGxvd2VyLmVuZHNXaXRoKCJ5IikpIHsKLQkJCQkJLy8gY2l0eSwgYm9keSBldGMgLS0+IGNpdGllcywgYm9kaWVzCi0JCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKSArICJpZXMiOwotCQkJCX0gZWxzZSBpZiAobG93ZXIuZW5kc1dpdGgoImNoIikgfHwgbG93ZXIuZW5kc1dpdGgoInMiKSkgewotCQkJCQkvLyBzd2l0Y2ggLS0+IHN3aXRjaGVzICBvciBidXMgLS0+IGJ1c2VzCi0JCQkJCXJlc3VsdCA9IG5hbWUgKyAiZXMiOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IG5hbWUgKyAicyI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2luZ3VsYXJpc2UoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5hbWU7Ci0JCWlmIChzZWVtc1BsdXJhbGlzZWQobmFtZSkpIHsKLQkJCVN0cmluZyBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCWlmIChsb3dlci5lbmRzV2l0aCgiaWVzIikpIHsKLQkJCQkvLyBjaXRpZXMgLS0+IGNpdHkKLQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMykgKyAieSI7Ci0JCQl9IGVsc2UgaWYgKGxvd2VyLmVuZHNXaXRoKCJjaGVzIikgfHwgbG93ZXIuZW5kc1dpdGgoInNlcyIpKSB7Ci0JCQkJLy8gc3dpdGNoZXMgLS0+IHN3aXRjaCBvciBidXNlcyAtLT4gYnVzCi0JCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJfSBlbHNlIGlmIChsb3dlci5lbmRzV2l0aCgicyIpKSB7Ci0JCQkJLy8gY3VzdG9tZXJzIC0tPiBjdXN0b21lcgotCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGlzVm93ZWwoY2hhciBjKSB7Ci0JCWJvb2xlYW4gdm93ZWwgPSBmYWxzZTsKLQkJdm93ZWwgfD0gYyA9PSAnYSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ2UnOwotCQl2b3dlbCB8PSBjID09ICdpJzsKLQkJdm93ZWwgfD0gYyA9PSAnbyc7Ci0JCXZvd2VsIHw9IGMgPT0gJ3UnOwotCQl2b3dlbCB8PSBjID09ICd5JzsKLQkJcmV0dXJuIHZvd2VsOwotCX0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHNlZW1zUGx1cmFsaXNlZChTdHJpbmcgbmFtZSkgewotCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHBsdXJhbGlzZWQgPSBmYWxzZTsKLQkJcGx1cmFsaXNlZCB8PSBuYW1lLmVuZHNXaXRoKCJlcyIpOwotCQlwbHVyYWxpc2VkIHw9IG5hbWUuZW5kc1dpdGgoInMiKTsKLQkJcGx1cmFsaXNlZCAmPSAhKG5hbWUuZW5kc1dpdGgoInNzIikgfHwgbmFtZS5lbmRzV2l0aCgidXMiKSk7Ci0JCXJldHVybiBwbHVyYWxpc2VkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgb2YgYSBjbGFzcyBuYW1lLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIDxjb2RlPm9yYWNsZS51dGlsLk9iamVjdFV0aWw8L2NvZGU+IGl0IHdvdWxkIHJldHVybiAKLQkgKiA8Y29kZT5vcmFjbGUudXRpbDwvY29kZT4uIElmIHRoZSBjbGFzcyBpcyBub3QgaW4gYSBwYWNrYWdlIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbGFzdERvdEluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0RG90SW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZ2l2ZW4gYSBmdWxsIGNsYXNzIG5hbWUuCi0JICogRm9yIGV4YW1wbGUgaWYgZ2l2ZW4gPGNvZGU+b3JhY2xlLnV0aWwuT2JqZWN0VXRpbDwvY29kZT4gaXQgd291bGQgcmV0dXJuIAotCSAqIDxjb2RlPk9iamVjdFV0aWw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0JCWlmKGZ1bGxDbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxhc3REb3RJbmRleCA9IGZ1bGxDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKGxhc3REb3RJbmRleCA8IDApCi0JCQlyZXR1cm4gZnVsbENsYXNzTmFtZTsKLQkJcmV0dXJuIGZ1bGxDbGFzc05hbWUuc3Vic3RyaW5nKGxhc3REb3RJbmRleCsxKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBDb252ZXJ0cyBhIGRhdGFiYXNlIGNvbHVtbiBuYW1lIHRvIGEgSmF2YSB2YXJpYWJsZSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbHVtbk5hbWVUb1Zhck5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJcmV0dXJuIGRiTmFtZVRvVmFyTmFtZShjb2x1bW5OYW1lKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSB0YWJsZSBuYW1lIHRvIGEgSmF2YSB2YXJpYWJsZSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRhYmxlTmFtZVRvVmFyTmFtZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBkYk5hbWVUb1Zhck5hbWUodGFibGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSBuYW1lICh0YWJsZSBvciBjb2x1bW4pIHRvIGEgamF2YSBuYW1lICg8ZW0+Zmlyc3QgbGV0dGVyCi0JICogbm90IGNhcGl0YWxpemVkPC9lbT4pLiBlbXBsb3llZV9uYW1lIG9yIGVtcGxveWVlLW5hbWUgLT4gZW1wbG95ZWVOYW1lCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRiTmFtZVRvVmFyTmFtZShTdHJpbmcgcykgewotCQlpZiAoIiIuZXF1YWxzKHMpKSB7Ci0JCQlyZXR1cm4gczsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJvb2xlYW4gY2FwaXRhbGl6ZSA9IHRydWU7Ci0JCWJvb2xlYW4gbGFzdENhcGl0YWwgPSBmYWxzZTsKLQkJYm9vbGVhbiBsYXN0RGVjYXBpdGFsaXplZCA9IGZhbHNlOwotCQlTdHJpbmcgcCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgYyA9IHMuc3Vic3RyaW5nKGksIGkgKyAxKTsKLQkJCWlmICgiXyIuZXF1YWxzKGMpIHx8ICIgIi5lcXVhbHMoYykpIHsKLQkJCQljYXBpdGFsaXplID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGMudG9VcHBlckNhc2UoKS5lcXVhbHMoYykpIHsKLQkJCQlpZiAobGFzdERlY2FwaXRhbGl6ZWQgJiYgIWxhc3RDYXBpdGFsKSB7Ci0JCQkJCWNhcGl0YWxpemUgPSB0cnVlOwotCQkJCX0KLQkJCQlsYXN0Q2FwaXRhbCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWxhc3RDYXBpdGFsID0gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChjYXBpdGFsaXplKSB7Ci0JCQkJaWYgKHAgPT0gbnVsbCB8fCAhcC5lcXVhbHMoIl8iKSkgewotCQkJCQlyZXN1bHQuYXBwZW5kKGMudG9VcHBlckNhc2UoKSk7Ci0JCQkJCWNhcGl0YWxpemUgPSBmYWxzZTsKLQkJCQkJcCA9IGM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFwcGVuZChjLnRvTG93ZXJDYXNlKCkpOwotCQkJCQljYXBpdGFsaXplID0gZmFsc2U7Ci0JCQkJCXAgPSBjOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChjLnRvTG93ZXJDYXNlKCkpOwotCQkJCWxhc3REZWNhcGl0YWxpemVkID0gdHJ1ZTsKLQkJCQlwID0gYzsKLQkJCX0KLQotCQl9Ci0JCS8qdGhpcyB3YXMgdXNpbmcgU3RyaW5nVXRpbC5pbml0TG93ZXIuIENoYW5nZWQgdG8gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZSBzbyB0aGF0IAotCQkgKiBpdCByZXR1cm5zIHRoZSBjb3JyZWN0IGJlYW4gcHJvcGVydHkgbmFtZSB3aGVuIGNhbGxlZCBmcm9tIGNvbHVtbk5hbWVUb1Zhck5hbWUuCi0JCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIFVSTCB3b3VsZCBiZSB1Ukwgd2hpY2ggd291bGQgY2F1c2UgCi0JCSAqIGFuICJUaGUgcHJvcGVydHkgdVJMIGlzIHVuZGVmaW5lZCBmb3IgdGhlIHR5cGUgeHgiIGVycm9yIGJlY2F1c2UgCi0JCSAqIEludHJvc3BlY3Rvci5nZXRCZWFuSW5mbyAodXNlZCBieSBKYXZhVHlwZUludHJvc3BlY3RvcikgcmV0dXJucyAKLQkJICogdGhlIHByb3BlcnR5IG5hbWUgYXMgVVJMLiovCi0JCVN0cmluZyByZXN1bHRTdHIgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKHJlc3VsdC50b1N0cmluZygpKTsKLQkJaWYgKHJlc3VsdFN0ci5lcXVhbHMoImNsYXNzIikpIHsKLQkJCS8vICJjbGFzcyIgaXMgaWxsZWdhbCBiZWNhdXNlT2YgT2JqZWN0LmdldENsYXNzKCkgY2xhc2gKLQkJCXJlc3VsdFN0ciA9ICJjbGF6eiI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFN0cjsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZSB0d28gb2JqZWN0cy4gSWYgYm90aCBTdHJpbmcsIGlnbm9yZSBjYXNlCi0JICogQHBhcmFtIG8xCi0JICogQHBhcmFtIG8yCi0JICogQHBhcmFtIGlnbm9yZUNhc2VJZlN0cgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxPYmplY3RzKE9iamVjdCBvMSwgT2JqZWN0IG8yLCBib29sZWFuIGlnbm9yZUNhc2VJZlN0cikKLQl7Ci0JCWlmIChvMSA9PSBvMikgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkgICAgYm9vbGVhbiByZXN1bHQ7Ci0JICAgIGlmIChvMSA9PSBudWxsIHx8IG8yID09IG51bGwpIHsKLQkgICAgCXJldHVybiBmYWxzZTsgLy93ZSBhbHJlYWR5IGNoZWNrZWQgbzEgPT0gbzIgYWJvdmUKLQkgICAgfQotCSAgICBpZiAoaWdub3JlQ2FzZUlmU3RyICYmIG8xIGluc3RhbmNlb2YgU3RyaW5nICYmIG8yIGluc3RhbmNlb2YgU3RyaW5nKQotCSAgICAgICAgcmVzdWx0ID0gKChTdHJpbmcpbzEpLmVxdWFsc0lnbm9yZUNhc2UoKFN0cmluZylvMik7Ci0JICAgIGVsc2UKLQkgICAgICAgIHJlc3VsdCA9IG8xLmVxdWFscyhvMik7Ci0JCi0JICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsT2JqZWN0cyhPYmplY3QgbzEsIE9iamVjdCBvMikKLQl7Ci0JICAgIHJldHVybiBlcXVhbE9iamVjdHMobzEsIG8yLCBmYWxzZS8qaWdub3JlQ2FzZUlmU3RyKi8pOwotCX0KLQkKLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvVXJsVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvVXJsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjRmMTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ29sbGVjdGlvbnMgb2YgdXRpbGl0eSBtZXRob2RzIGhhbmRsaW5nIFVSTHMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFVybFV0aWwKLXsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgZmlsZSBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGUiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBodHRwIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfUFJPVE9DT0wgPSAiaHR0cCI7Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGh0dHAgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUFNfUFJPVE9DT0wgPSAiaHR0cHMiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBmaWxlIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9QUk9UT0NPTCA9ICJqYXIiOwotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIGlzIHRvIGEgZmlsZSwgaS5lIGl0cyBwcm90b2NvbCBpcyA8Y29kZT5maWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlVXJsKFVSTCB1cmwpIHsKLQkJcmV0dXJuIHVybCAhPSBudWxsICYmIEZJTEVfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIGlzIHRvIGEgamFyLCBpLmUgaXRzIHByb3RvY29sIGlzIDxjb2RlPmphcjwvY29kZT4uCi0JICogRm9yIGV4YW1wbGUgPGNvZGU+amFyOmZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQ8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0phclVybChVUkwgdXJsKSB7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiBKQVJfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdXJsIHByb3RvY29sIGlzIGh0dHAuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cFVybChVUkwgdXJsKSB7Ci0JCVN0cmluZyBwcm90b2NvbCA9ICB1cmwuZ2V0UHJvdG9jb2woKTsKLQkJcmV0dXJuIHVybCAhPSBudWxsICYmIChIVFRQX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkgfHwgSFRUUFNfUFJPVE9DT0wuZXF1YWxzKHByb3RvY29sKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkZpbGU8L2NvZGU+IGNvcnJlc3BvbmRpbmcgdG8gYSB1cmwsIG9yIG51bGwgaWYgdGhlIHVybCAKLQkgKiBwcm90b2NvbCBpcyBub3QgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEuaW8uRmlsZSBnZXRVcmxGaWxlKFVSTCB1cmwpIHsKLQkJaWYgKGlzRmlsZVVybCh1cmwpICYmICFpc0phclVybCggdXJsICkgKXsKLQkJCUZpbGUgcmV0ID0gbmV3IGphdmEuaW8uRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCXJldHVybiByZXQgOwotCQl9Ci0JCXJldHVybiBudWxsOwotIAl9Ci0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwgdG8gYSBqYXIgZmlsZSBnaXZlbiBhIHVybCB0byBhIGZpbGUgaW5zaWRlIAotCSAqIHRoZSBqYXIuCi0JICogRm9yIGV4YW1wbGUgaWYgZ2l2ZW4gCi0JICogPGNvZGU+amFyOmZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQ8L2NvZGU+Ci0JICogdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5maWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXI8L2NvZGU+LgotCSAqIAotCSAqIDxwPlJldHVybnMgbnVsbCBpZiB0aGUgZ2l2ZW4gdXJsIGlzIG5vdCByZWNvZ25pemVkIGFzIGEgdXJsIHRvIGEgZmlsZSAKLQkgKiBpbnNpZGUgYSBqYXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SmFyRmlsZVVybChVUkwgdXJsKSB7Ci0JCWlmICghaXNKYXJVcmwodXJsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGZpbGUgPSB1cmwuZ2V0RmlsZSgpOyAvL2ZpbGU6L0M6L3Rlc3RhcHBzL2V4YW1wbGUvV0VCLUlORi9saWIvc3RydXRzLmphciEvTUVUQS1JTkYvdGxkcy9zdHJ1dHMtYmVhbi50bGQKLQkJaW50IGluZGV4ID0gZmlsZS5pbmRleE9mKCchJyk7Ci0JCWlmIChpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBqYXJGaWxlVXJsU3RyID0gZmlsZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoamFyRmlsZVVybFN0cik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSZW1vdGUoU3RyaW5nIHVybCl7Ci0JCXJldHVybiB1cmwuc3RhcnRzV2l0aCgiaHR0cDoiKXx8dXJsLnN0YXJ0c1dpdGgoImh0dHBzOiIpfHx1cmwuc3RhcnRzV2l0aCgid3d3LiIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0VGVtcGxhdGVGb2xkZXIoU3RyaW5nIHBsdWdJZCAsIFN0cmluZyBzdHJQYXRoICl7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIHBsdWdJZCApOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aCggc3RyUGF0aCApOwotCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQl0cnkgewotCQkJVVJMIHRlbXBsVXJsOwotCQkJdGVtcGxVcmwgPSBGaWxlTG9jYXRvci5yZXNvbHZlKHVybCk7Ci0JCQlGaWxlIHRlbXBsRGlyID0gVXJsVXRpbC5nZXRVcmxGaWxlKHRlbXBsVXJsKTsKLQkJCXJldHVybiB0ZW1wbERpciA7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2NvbHVtbi52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0Yjk4YjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2NvbHVtbi52bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQENvbHVtbiBhbm5vdGF0aW9uLg0KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJjb2x1bW4iIGFuZCBhICJ0YWJsZSIgb2JqZWN0DQotIyNnZW5lcmF0ZSBhbm5vdGF0aW9uIG9ubHkgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb2x1bW4gTk9UIGRlZmF1bHQNCi0jI2FuZCB0aGUgZ2VuZXJhdGVETExBbm5vdGF0aW9uIHByb3BlcnR5IGlzIG5vdCBzZXQgb24gdGhlIHRhYmxlDQotIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotI21hY3JvKCBhcHBlbmQgJG1lbWJlcnMgJHBhcmFtZXRlcnMgKQ0KLSNpZiggJG1lbWJlcnMgPT0gIiIpDQotI3NldCggJG1lbWJlcnMgPSAkcGFyYW1ldGVycyApDQotI2Vsc2UNCi0jc2V0KCAkbWVtYmVycyA9ICIkbWVtYmVycywgJHBhcmFtZXRlcnMiICkgDQotI2VuZAkNCi0jZW5kDQotIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotI2lmICggJGNvbHVtbi5kYXRhVHlwZUxPQikNCi0gICAgQExvYigpDQotI2VuZA0KLSNpZiAoICRjb2x1bW4ubmVlZE1hcFRlbXBvcmFsVHlwZSkNCi0gICAgQFRlbXBvcmFsKCBUZW1wb3JhbFR5cGUuJGNvbHVtbi50ZW1wb3JhbFR5cGUpDQotI2VuZA0KLSNzZXQgKCRtZW1iZXJzID0gIiIpDQotI2lmICggISRjb2x1bW4uZGVmYXVsdCB8fCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkNCi0jaWYgKCAhJHtjb2x1bW4uZGVmYXVsdG5hbWV9ICkNCi0jYXBwZW5kKCRtZW1iZXJzICJuYW1lPSRjdXN0b21pemVyLnF1b3RlKCRjb2x1bW4ubmFtZSkiICkNCi0jZW5kDQotI2lmICghJGNvbHVtbi5pbnNlcnRhYmxlKQ0KLSNhcHBlbmQoJHttZW1iZXJzfSAiaW5zZXJ0YWJsZT1mYWxzZSIpDQotI2VuZA0KLSNpZiAoISRjb2x1bW4udXBkYXRlYWJsZSkNCi0jYXBwZW5kKCR7bWVtYmVyc30gInVwZGF0YWJsZT1mYWxzZSIpDQotI2VuZA0KLSNlbmQNCi0jaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQ0KLSNpZiAoJGNvbHVtbi51bmlxdWUpDQotI2FwcGVuZCgkbWVtYmVycyAgInVuaXF1ZT10cnVlIikNCi0jZW5kDQotI2lmICghJGNvbHVtbi5udWxsYWJsZSkNCi0jYXBwZW5kKCRtZW1iZXJzICAibnVsbGFibGU9ZmFsc2UiKQ0KLSNlbmQNCi0jaWYgKCRjb2x1bW4uc2l6ZSA+IDApDQotI2lmICgkY29sdW1uLm51bWVyaWMpDQotI2FwcGVuZCgkbWVtYmVycyAicHJlY2lzaW9uPSRjb2x1bW4uc2l6ZSIpDQotI2lmICgkY29sdW1uLmRlY2ltYWxEaWdpdHMgIT0gMCAmJiAkY29sdW1uLmRlY2ltYWxEaWdpdHMgIT0gLTEpDQotI2FwcGVuZCgkbWVtYmVycyAic2NhbGU9JGNvbHVtbi5kZWNpbWFsRGlnaXRzIikNCi0jZW5kDQotI2Vsc2UNCi0jaWYgKCAhJGNvbHVtbi5kYXRhVHlwZUxPQikNCi0jYXBwZW5kKCRtZW1iZXJzICJsZW5ndGg9JGNvbHVtbi5zaXplIikNCi0jZW5kDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotI2lmKCAkbWVtYmVycyAhPSIiICkNCi0JQENvbHVtbigkbWVtYmVycykNCi0jZW5kDQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvam9pbi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNjZDdmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvam9pbi52bQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQEpvaW5UYWJsZSwgQEpvaW5Db2x1bW4gb3IgQEpvaW5Db2x1bW5zIGFubm90YXRpb24uDQotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUNCi0jIw0KLSMjbWFjcm8gam9pbkNvbHVtbiB1c2VzICRjb2x1bW4sICRyZWZlcmVuY2VkQ29sdW1uDQotI21hY3JvIChqb2luQ29sdW1uICRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pDQotI3NldCAoJG1lbWJlcnMgPSAibmFtZT0kY3VzdG9taXplci5xdW90ZSgkY29sdW1uLmpvaW5Db2x1bW5OYW1lKSIpDQotI2lmKCAhJHJlZmVyZW5jZWRDb2x1bW4ucHJpbWFyeUtleSB8fCAkcmVmZXJlbmNlZENvbHVtbi5wYXJ0T2ZDb21wb3NpdGVQcmltYXJ5S2V5ICkNCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgcmVmZXJlbmNlZENvbHVtbk5hbWU9JGN1c3RvbWl6ZXIucXVvdGUoJHJlZmVyZW5jZWRDb2x1bW4ubmFtZSkiKQ0KLSNlbmQNCi0jaWYoICRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgKQ0KLSNpZiAoJGNvbHVtbi51bmlxdWUgJiYgISRjb2x1bW4ucHJpbWFyeUtleSkNCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgdW5pcXVlPXRydWUiKQ0KLSNlbmQNCi0jaWYgKCEkY29sdW1uLm51bGxhYmxlKQ0KLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCBudWxsYWJsZT1mYWxzZSIpDQotI2VuZA0KLSNlbmQNCi0jaWYgKCRjdXN0b21pemVyLmdlbmVyYXRlRERMQW5ub3RhdGlvbnMgJiYgISRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSAmJiAhJHJvbGUucmVmZXJyZXJUYWJsZS5pc0NvbHVtblVwZGF0ZUluc2VydCgkcm9sZSwgJGNvbHVtbikpDQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSIpDQotI2VuZA0KLUBKb2luQ29sdW1uKCRtZW1iZXJzKSNlbmQNCi0jIw0KLSMjDQotIyMNCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSkNCi0jc2V0ICgkam9pblRhYmxlID0gJHJvbGUuYXNzb2NpYXRpb24uam9pblRhYmxlKQ0KLQlASm9pblRhYmxlKA0KLQkJbmFtZT0iJHtqb2luVGFibGUuam9pblRhYmxlQW5ub3RhdGlvbk5hbWV9Ig0KLQkJLCBqb2luQ29sdW1ucz17DQotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHJvbGUucmVmZXJyZXJDb2x1bW5zKQ0KLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpDQotIyMkcmVmZXJlbmNlZENvbHVtbiBpcyB0aGUgY29sdW1uIGluIHRoZSBqb2luIHRhYmxlDQotCQkJI2pvaW5Db2x1bW4oJHJlZmVyZW5jZWRDb2x1bW4gJGNvbHVtbikNCi0jaWYgKCR2ZWxvY2l0eUNvdW50IDwgJHJvbGUucmVmZXJyZXJDb2x1bW5zLnNpemUoKSApDQotLA0KLSNlbmQJCQkNCi0jZW5kDQotDQotCQkJfQ0KLQkJLCBpbnZlcnNlSm9pbkNvbHVtbnM9ew0KLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zKQ0KLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW4oJHtjb2x1bW4ubmFtZX0pKQ0KLSMjJHJlZmVyZW5jZWRDb2x1bW4gaXMgdGhlIGNvbHVtbiBpbiB0aGUgam9pbiB0YWJsZQ0KLQkJCSNqb2luQ29sdW1uKCRyZWZlcmVuY2VkQ29sdW1uICRjb2x1bW4pDQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKSApDQotLA0KLSNlbmQJCQkNCi0jZW5kDQotDQotCQkJfQ0KLQkJKQ0KLSNlbHNlDQotI2lmICgkcm9sZS5yZWZlcnJlckNvbHVtbnMuc2l6ZSgpID09IDEpDQotI3NldCAoJGNvbHVtbiA9ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5nZXQoMCkpDQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkNCi0jc2V0ICgkcmVmZXJlbmNlZFRhYmxlTmFtZSA9ICRyb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSApDQotI3NldCggJHJlZmVyZW5jZWRUYWJsZVBrTmFtZSA9ICRyb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5uYW1lICkNCi0jc2V0KCAkY29tcHV0ZWRKb2luQ29sdW1uTmFtZSA9ICIke3JvbGUucHJvcGVydHlOYW1lfV8ke3JlZmVyZW5jZWRUYWJsZVBrTmFtZX0iICkNCi0jc2V0KCAkaXNEZWZhdWx0Sm9pbkNvbHVtbk5hbWUgPSAgJGNvbHVtbi5pc0RlZmF1bHRKb2luQ29sdW1uTmFtZSggJHtyb2xlLnByb3BlcnR5TmFtZX0pICkNCi0jaWYoICEgJGlzRGVmYXVsdEpvaW5Db2x1bW5OYW1lICkNCi0JI2pvaW5Db2x1bW4oJGNvbHVtbiAkcmVmZXJlbmNlZENvbHVtbikNCi0NCi0jZWxzZWlmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkNCi0JI2pvaW5Db2x1bW4oJGNvbHVtbiAkcmVmZXJlbmNlZENvbHVtbikNCi0NCi0jZW5kDQotI2Vsc2UNCi0JQEpvaW5Db2x1bW5zKHsNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkcm9sZS5yZWZlcnJlckNvbHVtbnMpDQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkNCi0JCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pDQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5zaXplKCkgKQ0KLSwNCi0jZWxzZQ0KLQ0KLSNlbmQNCi0jZW5kCQkNCi0JCX0pDQotI2VuZA0KLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21haW4uamF2YS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ZDRkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNpZiAoJHRhYmxlLnBhY2thZ2UgIT0gIiIpDQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9Ow0KLSNlbmQNCi0NCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7DQotJHt0YWJsZS5pbXBvcnRTdGF0ZW1lbnRzfQ0KLQ0KLS8qKg0KLSAqIFRoZSBwZXJzaXN0ZW50IGNsYXNzIGZvciB0aGUgJHt0YWJsZS5uYW1lfSBkYXRhYmFzZSB0YWJsZS4NCi0gKiANCi0gKi8NCi1ARW50aXR5DQotI2lmKCAhJHt0YWJsZS5kZWZhdWx0bmFtZX0gfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucykNCi1AVGFibGUobmFtZT0iJHt0YWJsZS5uYW1lfSIpDQotI2VuZA0KLXB1YmxpYyBjbGFzcyAke3RhYmxlLmNsYXNzTmFtZX0gJHt0YWJsZS5nZW5lcmF0ZUV4dGVuZHNJbXBsZW1lbnRzKCl9IHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotIyMjIyMNCi0jIyMjIyBmaWVsZHMNCi0jIyMjIw0KLSNpZiAoJHRhYmxlLmNvbXBvc2l0ZUtleSkNCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikNCi0NCi0JQEVtYmVkZGVkSWQNCi0jZW5kDQotCXByaXZhdGUgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9ICR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfTsNCi0jZW5kDQotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLmdldFNpbXBsZUNvbHVtbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKQ0KLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQ0KLQ0KLSNwYXJzZSgibWFwcGluZ0tpbmQudm0iKQ0KLSNwYXJzZSgiY29sdW1uLnZtIikNCi0jZW5kDQotCSR7Y29sdW1uLmZpZWxkU2NvcGV9ICR7Y29sdW1uLnNpbXBsZVByb3BlcnR5VHlwZX0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsNCi0jZW5kDQotI2ZvcmVhY2ggKCRyb2xlIGluICR0YWJsZS5hc3NvY2lhdGlvblJvbGVzKQ0KLSMjIyMjDQotIyMjIyMgZmllbGQgYW5ub3RhdGlvbnMNCi0jIyMjIw0KLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQ0KLQ0KLQkvLyR7cm9sZS5kZXNjcmlwdGlvbn0NCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIpDQotI3BhcnNlKCJtYW55VG9PbmUudm0iKQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiKQ0KLSNwYXJzZSgibWFueVRvTWFueS52bSIpDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikNCi0jcGFyc2UoIm9uZVRvTWFueS52bSIpDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQ0KLSNwYXJzZSgib25lVG9PbmUudm0iKQ0KLSNlbmQNCi0jZW5kDQotIyMjIyMNCi0jIyMjIyBmaWVsZCBkZWNsYXJhdGlvbg0KLSMjIyMjDQotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikNCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gJHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5jbGFzc05hbWV9KQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpDQotI3NldCAoJHByb3BlcnR5VHlwZSA9ICIke3JvbGUucmVmZXJlbmNlZFRhYmxlLnNpbXBsZUNvbGxlY3Rpb25UeXBlfTwke3JvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZX0+IikNCi0jZW5kDQotCXByaXZhdGUgJHByb3BlcnR5VHlwZSAkcm9sZS5wcm9wZXJ0eU5hbWU7DQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgJHt0YWJsZS5jbGFzc05hbWV9KCkgew0KLSAgICB9DQotDQotIyMjIyMNCi0jIyMjIyBzaW1wbGUgcHJvcGVydGllcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzDQotIyMjIyMNCi0jaWYgKCR0YWJsZS5jb21wb3NpdGVLZXkpDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJwcm9wZXJ0eSIpDQotDQotCUBFbWJlZGRlZElkDQotI2VuZA0KLQlwdWJsaWMgJHRhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkdGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lKSgpIHsNCi0JCXJldHVybiB0aGlzLiR7dGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lfTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCAkY3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkdGFibGUuY29tcG9zaXRlS2V5UHJvcGVydHlOYW1lKSgkdGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lICR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpIHsNCi0JCXRoaXMuJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9ID0gJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9Ow0KLQl9DQotCQ0KLSNlbmQNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUuZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLCB0cnVlLCBmYWxzZSkpDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJwcm9wZXJ0eSIpDQotDQotI3BhcnNlKCJtYXBwaW5nS2luZC52bSIpDQotI3BhcnNlKCJjb2x1bW4udm0iKQ0KLSNlbmQNCi0JJGNvbHVtbi5wcm9wZXJ0eUdldFNjb3BlICRjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgpIHsNCi0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07DQotCX0NCi0NCi0JJGNvbHVtbi5wcm9wZXJ0eVNldFNjb3BlIHZvaWQgJGN1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCRjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlICRjb2x1bW4ucHJvcGVydHlOYW1lKSB7DQotCQl0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX0gPSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9Ow0KLQl9DQotDQotI2VuZA0KLSMjIyMjDQotIyMjIyMgYXNzb2NpYXRpb25zIGdldHRlcnMgYW5kIHNldHRlcnMNCi0jIyMjIw0KLSNmb3JlYWNoICgkcm9sZSBpbiAkdGFibGUuYXNzb2NpYXRpb25Sb2xlcykNCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikNCi0NCi0JLy8ke3JvbGUuZGVzY3JpcHRpb259DQotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiKQ0KLSNwYXJzZSgibWFueVRvT25lLnZtIikNCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1tYW55IikNCi0jcGFyc2UoIm1hbnlUb01hbnkudm0iKQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpDQotI3BhcnNlKCJvbmVUb01hbnkudm0iKQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikNCi0jcGFyc2UoIm9uZVRvT25lLnZtIikNCi0jZW5kDQotI2VuZA0KLSMjDQotI2lmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1vbmUiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tb25lIikNCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gJHJvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZSkNCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAibWFueS10by1tYW55IiB8fCAkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW1hbnkiKQ0KLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAiJHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5zaW1wbGVDb2xsZWN0aW9uVHlwZX08JHtyb2xlLnJlZmVyZW5jZWRUYWJsZS5jbGFzc05hbWV9PiIpDQotI2VuZA0KLQlwdWJsaWMgJHByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkcm9sZS5wcm9wZXJ0eU5hbWUpKCkgew0KLQkJcmV0dXJuIHRoaXMuJHtyb2xlLnByb3BlcnR5TmFtZX07DQotCX0NCi0NCi0JcHVibGljIHZvaWQgJHtjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCRyb2xlLnByb3BlcnR5TmFtZSl9KCRwcm9wZXJ0eVR5cGUgJHJvbGUucHJvcGVydHlOYW1lKSB7DQotCQl0aGlzLiR7cm9sZS5wcm9wZXJ0eU5hbWV9ID0gJHJvbGUucHJvcGVydHlOYW1lOw0KLQl9DQotCQ0KLSMjDQotI2VuZA0KLSMjDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9NYW55LnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDQ4YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9NYW55IGFubm90YXRpb24uDQotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUNCi0jIw0KLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCAmJiAhJHJvbGUuaXNSZWZlcnJlclJvbGUoKSkjI3RoZSBvd25pbmcgc2lkZSAoZWl0aGVyIHNpZGUgZm9yIG1hbnktdG8tbWFueSkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oIiIsICJtYXBwZWRCeSIsICRyb2xlLm9wcG9zaXRlUm9sZS5wcm9wZXJ0eU5hbWUsIHRydWUpKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkNCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkxBWlkiKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkNCi0jZW5kDQotI2lmKCRtZW1iZXJzIT0iIikNCi0JQE1hbnlUb01hbnkoJG1lbWJlcnMpDQotI2Vsc2UJDQotICAgIEBNYW55VG9NYW55DQotI2VuZCAgICANCi0jZWxzZQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkNCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkxBWlkiKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkNCi0jZW5kDQotI2lmKCRtZW1iZXJzIT0iIikNCi0JQE1hbnlUb01hbnkoJG1lbWJlcnMpDQotI2Vsc2UJDQotICAgIEBNYW55VG9NYW55DQotI2VuZCAgICANCi0jcGFyc2UoImpvaW4udm0iKQ0KLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvT25lLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb09uZS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiMTYwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvT25lLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBATWFueVRvT25lIGFubm90YXRpb24uDQotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUNCi0jIw0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkNCi0jaWYoICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0gIiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSAiRmV0Y2hUeXBlLkVBR0VSIikNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpDQotI2VuZA0KLSNpZigkbWVtYmVycyE9IiIpDQotCUBNYW55VG9PbmUoJG1lbWJlcnMpDQotI2Vsc2UNCi0gICAgQE1hbnlUb09uZQ0KLSNlbmQNCi0jcGFyc2UoImpvaW4udm0iKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzZjE4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFwcGluZ0tpbmQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBCYXNpYywgQElkLCBAVmVyc2lvbiBhbm5vdGF0aW9ucy4NCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAiY29sdW1uIiBvYmplY3QNCi0jIw0KLSNzZXQgKCRtYXBwaW5nS2luZCA9ICRjb2x1bW4ubWFwcGluZ0tpbmQpDQotI2lmICgkbWFwcGluZ0tpbmQgPT0gImlkIikNCi0JQElkDQotI3NldCAoJGlkR2VuZXJhdG9yID0gJHRhYmxlLmlkR2VuZXJhdG9yKQ0KLSNpZiAoJGlkR2VuZXJhdG9yID09ICJhdXRvIikNCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiR2VuZXJhdGlvblR5cGUuQVVUTyIpDQotI2Vsc2VpZiAoJGlkR2VuZXJhdG9yID09ICJpZGVudGl0eSIpDQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIkdlbmVyYXRpb25UeXBlLklERU5USVRZIikNCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gInNlcXVlbmNlIikNCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UiKQ0KLSNlbHNlaWYgKCRpZEdlbmVyYXRvciA9PSAidGFibGUiKQ0KLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5UQUJMRSIpDQotI2Vsc2UNCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiIikNCi0jZW5kDQotI2lmICgkaWRHZW5lcmF0b3IgPT0gInNlcXVlbmNlIiApDQotI3NldCAoJGdlbmVyYXRvck5hbWUgPSAiJHt0YWJsZS5uYW1lLnRvVXBwZXJDYXNlKCl9XyR7Y29sdW1uLnByb3BlcnR5TmFtZS50b1VwcGVyQ2FzZSgpfV9HRU5FUkFUT1IiKQ0KLSNpZiggJHRhYmxlLmZvcm1hdHRlZFNlcXVlbmNlICE9ICIiICkNCi0JQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IiRnZW5lcmF0b3JOYW1lIiwgc2VxdWVuY2VOYW1lPSIkdGFibGUuZm9ybWF0dGVkU2VxdWVuY2UiKQ0KLSNlbHNlDQotCUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSIkZ2VuZXJhdG9yTmFtZSIgKQ0KLSNlbmQJDQotCUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT0kZ2VuZXJhdGlvblR5cGUsIGdlbmVyYXRvcj0iJGdlbmVyYXRvck5hbWUiKQ0KLSNlbHNlaWYgKCRnZW5lcmF0aW9uVHlwZSAhPSAiIikNCi0JQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PSRnZW5lcmF0aW9uVHlwZSkNCi0jZW5kICAgICAgDQotI2Vsc2VpZiAoJG1hcHBpbmdLaW5kID09ICJ2ZXJzaW9uIikNCi0JQFZlcnNpb24NCi0jZWxzZQ0KLSMjREVGQVVMVCBpcyBAQmFzaWMsIG5vIG5lZWQgdG8gZ2VuZXJhdGUNCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvTWFueS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb01hbnkudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0N2JiM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvTWFueS52bQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE9uZVRvTWFueSBhbm5vdGF0aW9uLg0KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlDQotIyMNCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmJpZGlyZWN0aW9uYWwpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpDQotI2lmKCRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iIiAmJiAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSAhPSJGZXRjaFR5cGUuTEFaWSIpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQ0KLSNlbmQNCi0JQE9uZVRvTWFueSgkbWVtYmVycykNCi0jZWxzZQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkNCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpICE9IkZldGNoVHlwZS5MQVpZIikNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpDQotI2VuZA0KLQlAT25lVG9NYW55KCRtZW1iZXJzKQ0KLSNwYXJzZSgiam9pbi52bSIpDQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb09uZS52bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb09uZS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NDliNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBPbmVUb09uZSBhbm5vdGF0aW9uLg0KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlDQotIyMNCi0jaWYgKCRyb2xlLmFzc29jaWF0aW9uLmJpZGlyZWN0aW9uYWwgJiYgISRyb2xlLmlzUmVmZXJyZXJSb2xlKCkpIyN0aGUgb3duaW5nIHNpZGUgKGVpdGhlciBzaWRlIGZvciBvbmUtdG8tb25lKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQ0KLSNlbmQNCi0JQE9uZVRvT25lKCRtZW1iZXJzKQ0KLSNlbHNlDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpIT0iRmV0Y2hUeXBlLkVBR0VSIiApDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQ0KLSNlbmQNCi0jaWYoJG1lbWJlcnMhPSIiKQ0KLQlAT25lVG9PbmUoJG1lbWJlcnMpDQotI2Vsc2UNCi0JQE9uZVRvT25lDQotI2VuZA0KLSNwYXJzZSgiam9pbi52bSIpDQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9way5qYXZhLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NzRmNjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0jaWYgKCR0YWJsZS5wYWNrYWdlICE9ICIiKQ0KLXBhY2thZ2UgJHt0YWJsZS5wYWNrYWdlfTsNCi0jZW5kDQotDQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOw0KLWltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qOw0KLQ0KLS8qKg0KLSAqIFRoZSBwcmltYXJ5IGtleSBjbGFzcyBmb3IgdGhlICR7dGFibGUubmFtZX0gZGF0YWJhc2UgdGFibGUuDQotICogDQotICovDQotQEVtYmVkZGFibGUNCi1wdWJsaWMgY2xhc3MgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsNCi0JLy9kZWZhdWx0IHNlcmlhbCB2ZXJzaW9uIGlkLCByZXF1aXJlZCBmb3Igc2VyaWFsaXphYmxlIGNsYXNzZXMuDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOw0KLSMjIyMjDQotIyMjIyMgZmllbGRzDQotIyMjIyMNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpDQotDQotI3BhcnNlKCJjb2x1bW4udm0iKQ0KLSNlbmQNCi0JJHtjb2x1bW4uZmllbGRTY29wZX0gJHtjb2x1bW4ucHJvcGVydHlUeXBlfSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9Ow0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSgpIHsNCi0gICAgfQ0KLSMjIyMjDQotIyMjIyMgc2ltcGxlIHByb3BlcnRpZXMgZ2V0dGVycyBhbmQgc2V0dGVycw0KLSMjIyMjDQotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHRhYmxlLnByaW1hcnlLZXlDb2x1bW5zKQ0KLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAicHJvcGVydHkiKQ0KLQ0KLSNwYXJzZSgiY29sdW1uLnZtIikNCi0jZW5kDQotCSRjb2x1bW4ucHJvcGVydHlHZXRTY29wZSAkY29sdW1uLnByb3BlcnR5VHlwZSAkY3VzdG9taXplci5wcm9wZXJ0eUdldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoKSB7DQotCQlyZXR1cm4gdGhpcy4ke2NvbHVtbi5wcm9wZXJ0eU5hbWV9Ow0KLQl9DQotCSRjb2x1bW4ucHJvcGVydHlTZXRTY29wZSB2b2lkICRjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgkY29sdW1uLnByb3BlcnR5VHlwZSAkY29sdW1uLnByb3BlcnR5TmFtZSkgew0KLQkJdGhpcy4ke2NvbHVtbi5wcm9wZXJ0eU5hbWV9ID0gJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsNCi0JfQ0KLSNlbmQNCi0jIw0KLSMjIGVxdWFscy9oYXNoQ29kZQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7DQotCQlpZiAodGhpcyA9PSBvdGhlcikgew0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJaWYgKCEob3RoZXIgaW5zdGFuY2VvZiAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0pKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9IGNhc3RPdGhlciA9ICgke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0pb3RoZXI7DQotCQlyZXR1cm4gDQotCQkJJHt0YWJsZS5wcmltYXJ5S2V5RXF1YWxzQ2xhdXNlfQ0KLQ0KLSAgICB9DQotICAgIA0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgew0KLQkJZmluYWwgaW50IHByaW1lID0gMzE7DQotCQlpbnQgaGFzaCA9IDE3Ow0KLQkJJHt0YWJsZS5wcmltYXJ5S2V5SGFzaENvZGVDbGF1c2V9DQotCQlyZXR1cm4gaGFzaDsNCi0gICAgfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NGExN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LnV0aWxpdHkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3NzUxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkgYW5kIG1vdmVkIHRvIGNvbW1vbiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjYTM1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjUyZmQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byByZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0czwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmZiMWQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0czwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhZWY3MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5nZW4udGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzZDg4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2UwM2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJpbgotQGRvdAotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotamF2YUNvbXBpbGVyLi4uYXJncwotamF2YUNvbXBpbGVyLi4uYXJncy4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3ODNhNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTA0NGFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMDcgMTQ6MjY6MzIgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjlkNTQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI1N1biBNYXkgMjcgMTQ6NTk6MTggRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmY2VmOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLnN3dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzYjI0MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZT0xLjUKLWphdmFjVGFyZ2V0PTEuNQotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1ODc4OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRXh0ZW5zaW9uIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2E4ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1Y2Q2ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9FeHRlbnNpb25UZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5zaW9uVGVzdFBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEV4dGVuc2lvblRlc3RQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBFeHRlbnNpb25UZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3ZDBlZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBbm5vdGF0aW9uPgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInRlc3RBdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDIzZDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX0FOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoVGVzdEpwYUZhY3RvcnkpIGZhY3RvcnkpLmJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY5ZDU4ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFUZXN0VHlwZU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UWVBFX01BUFBJTkdfS0VZID0gInRlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UWVBFX0FOTk9UQVRJT05fTkFNRSA9ICJ0ZXN0LlRlc3QiOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIFRFU1RfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTMyOTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb24sIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChUZXN0SnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhVGVzdFR5cGVNYXBwaW5nKHBlcnNpc3RlbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhZGU0MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotewotCXB1YmxpYyBUZXN0SmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZTYzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFFbnRpdHkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVudGl0eQotewotCXByb3RlY3RlZCBUZXN0SmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbnRpdHlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiM2UwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50LCBlbnRpdHlBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIwYzlhOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtVmFyaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IFRlc3RKcGFGYWN0b3J5KCksIAotCQkJbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXIoR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSksIAotCQkJVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSk7Ci0JfQotCQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVmVyc2lvbihKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQkJCXJldHVybiAiQk9PT1lBSCEiOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk1BWUJFOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDcyYmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLk9ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29yZS50ZXN0SnBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbHMgKioqKioqKioqKgotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNvbnRlbnRUeXBlLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VNb2RlbFByb3ZpZGVyc1RvKEFycmF5TGlzdDxKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHByb3ZpZGVycywgUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTKTsKLQl9Ci0KLQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMgPSBuZXcgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gewotCQlKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCUphclJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlQZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvLyBvcmRlciBtYXRjaGVzIHRoYXQgdXNlZCBieSB0aGUgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIChFY2xpcHNlTGluaykKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW50aXR5RGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkgIC8vIGFkZGVkCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gU1BFQ0lGSUVEX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkgLy8gYWRkZWQKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmRiMjE0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCi0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBUZXN0SnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMjhmMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWVjZjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIzZDBjNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgSmFuIDE1IDExOjExOjExIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZDU0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gTWF5IDI3IDE0OjU5OjE4IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzkzOGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cwotQnVuZGxlLVZlcnNpb246IDIuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5KcHRKcGFEYlRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmU7YnVuZGxlLXZlcnNpb249IjEuMC4xIiwKLSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbDtidW5kbGUtdmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3YWI4Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9kZXJieS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmQxNTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCBmb3IgRGVyYnkKLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9kZXJieS9saWIvZGVyYnkuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkIGZvciBEZXJieQotIyB1cmwgPSBqZGJjOmRlcmJ5OkM6L2RlcmJ5L2RhdGEvdGVzdGRiO2NyZWF0ZT10cnVlCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9teXNxbC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDA3ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L215c3FsL215c3FsLWNvbm5lY3Rvci1qYXZhLTUuMC42LWJpbi5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgb3B0aW9uYWwgZm9yIE15U1FMCi0jIHVybCA9IGpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGcucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSBzY290dAotcGFzc3dvcmQgPSB0aWdlcgotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzUuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6b3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOnRlc3RkYgotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnWEUucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjdjMDFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6WEUKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTlpLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI5MTFiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSBzY290dAotcGFzc3dvcmQgPSB0aWdlcgotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L29yYWNsZS9qZGJjL2xpYi9vamRiYzUuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIHJlcXVpcmVkCi0jIHVybCA9IGpkYmM6b3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOnRlc3RkYgotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3Bvc3RncmVzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmYWZlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9wb3N0Z3Jlc3FsL2pkYmMvcG9zdGdyZXNxbC04LjItNTA1LmpkYmMzLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyBvcHRpb25hbCBmb3IgUG9zdGdyZVNRTAotIyB1cmwgPSBqZGJjOnBvc3RncmVzcWwKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyYjY0NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvc3Fsc2VydmVyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3NxbHNlcnZlci9saWIvc3FsamRiYy5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpzcWxzZXJ2ZXI6Ly9sb2NhbGhvc3Q6MTQzMwotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5M2Q1ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3N5YmFzZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IAotcGFzc3dvcmQgPSAKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9zeWJhc2UvbGliL2pjb25uMy5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTg3NzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IEpQQSBEQiBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKLQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyZWZhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLkRyaXZlck1hbmFnZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGhlc2UgYXJlbid0IHRlc3RzLiBUaGV5IGFyZSBqdXN0IGFuIGVhc3kgd2F5IHRvIGR1bXAgSkRCQyBtZXRhZGF0YSB0byB0aGUKLSAqIGNvbnNvbGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKREJDVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlcmJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKERFUkJZKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXlTUUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoTVlTUUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmFjbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoT1JBQ0xFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdGdyZVNRTCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShQT1NUR1JFU1FMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3liYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKFNZQkFTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE1ldGFEYXRhKENvbm5lY3Rpb25Db25maWcgY29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKiBQTEFURk9STTogIiArIGNvbmZpZy5wbGF0Zm9ybU5hbWUgKyAiICoqKioqIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlDbGFzcy5mb3JOYW1lKGNvbmZpZy5kcml2ZXJDbGFzc05hbWUpOwotCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBEcml2ZXJNYW5hZ2VyLmdldENvbm5lY3Rpb24odGhpcy5idWlsZFVSTChjb25maWcpLCBjb25maWcudXNlciwgY29uZmlnLnBhc3N3b3JkKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJDQVRBTE9HUzoiKTsKLQkJSkRCQ1Rvb2xzLmR1bXAoY29ubmVjdGlvbi5nZXRNZXRhRGF0YSgpLmdldENhdGFsb2dzKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTQ0hFTUFUQToiKTsKLQkJSkRCQ1Rvb2xzLmR1bXAoY29ubmVjdGlvbi5nZXRNZXRhRGF0YSgpLmdldFNjaGVtYXMoKSk7Ci0JCWNvbm5lY3Rpb24uY2xvc2UoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFVSTChDb25uZWN0aW9uQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gImpkYmM6IiArIGNvbmZpZy5kYXRhYmFzZVVSTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgREVSQlkgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJEZXJieSIsCi0JCQkib3JnLmFwYWNoZS5kZXJieS5qZGJjLkVtYmVkZGVkRHJpdmVyIiwKLQkJCSJkZXJieTpDOi9kZXJieS9kYXRhL3Rlc3QiLAotCQkJbnVsbCwKLQkJCW51bGwKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBNWVNRTCA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIk15U1FMIiwKLQkJCSJjb20ubXlzcWwuamRiYy5Ecml2ZXIiLAotCQkJIm15c3FsOi8vbG9jYWxob3N0OjMzMDYiLAotCQkJInJvb3QiLAotCQkJIm9yYWNsZSIKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBPUkFDTEUgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJPcmFjbGUiLAotCQkJIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciIsCi0JCQkib3JhY2xlOnRoaW46QGxvY2FsaG9zdDoxNTIxOm9yY2wiLAotCQkJInNjb3R0IiwKLQkJCSJ0aWdlciIKLQkJKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBQT1NUR1JFU1FMID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiUG9zdGdyZVNRTCIsCi0JCQkib3JnLnBvc3RncmVzcWwuRHJpdmVyIiwKLQkJCSJwb3N0Z3Jlc3FsOnBvc3RncmVzIiwKLQkJCSJwb3N0Z3JlcyIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JLy8gdGhlIFN5YmFzZSBzZXJ2ZXIgbXVzdCBiZSBjb25maWd1cmVkIGV4cGxpY2l0bHkgdG8gImxvY2FsaG9zdCIKLQkvLyBpbiB0aGUgY29uZmlnIGZpbGUgW1NZQkFTRV0vaW5pL3NxbC5pbmkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25Db25maWcgU1lCQVNFID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiU3liYXNlIiwKLQkJCSJjb20uc3liYXNlLmpkYmMzLmpkYmMuU3liRHJpdmVyIiwKLQkJCSJzeWJhc2U6VGRzOmxvY2FsaG9zdDo1MDAwIiwKLQkJCSJzYSIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uQ29uZmlnIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwbGF0Zm9ybU5hbWU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGRhdGFiYXNlVVJMOwotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHVzZXI7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7Ci0JCXByb3RlY3RlZCBDb25uZWN0aW9uQ29uZmlnKAotCQkJCVN0cmluZyBwbGF0Zm9ybU5hbWUsCi0JCQkJU3RyaW5nIGRyaXZlckNsYXNzTmFtZSwKLQkJCQlTdHJpbmcgZGF0YWJhc2VVUkwsCi0JCQkJU3RyaW5nIHVzZXIsCi0JCQkJU3RyaW5nIHBhc3N3b3JkCi0JCSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGxhdGZvcm1OYW1lID0gcGxhdGZvcm1OYW1lOwotCQkJdGhpcy5kcml2ZXJDbGFzc05hbWUgPSBkcml2ZXJDbGFzc05hbWU7Ci0JCQl0aGlzLmRhdGFiYXNlVVJMID0gZGF0YWJhc2VVUkw7Ci0JCQl0aGlzLnVzZXIgPSB1c2VyOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVG9vbHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjhkODc5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZXN1bHRTZXRJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1Rvb2xzIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCWR1bXAoZXhlY3V0ZShjb25uZWN0aW9uLCBzcWwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZHVtcChSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCWR1bXBPbihyZXN1bHRTZXQsIHB3KTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wT24oUmVzdWx0U2V0IHJlc3VsdFNldCwgUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcHMgPSBjb252ZXJ0VG9NYXBzKHJlc3VsdFNldCk7Ci0JCWZvciAoSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcFN0cmVhbSA9IG1hcHMuaXRlcmF0b3IoKTsgbWFwU3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4+IGVudHJ5U3RyZWFtID0gbWFwU3RyZWFtLm5leHQoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGVudHJ5U3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA9IGVudHJ5U3RyZWFtLm5leHQoKTsKLQkJCQlwdy5wcmludChlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJcHcucHJpbnQoIiA9ICIpOwotCQkJCXB3LnByaW50KGVudHJ5LmdldFZhbHVlKCkpOwotCQkJCXB3LnByaW50bG4oKTsKLQkJCX0KLQkJCWlmIChtYXBTdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50bG4oInRvdGFsIHJvd3M6ICIgKyBtYXBzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGNvbnZlcnRUb01hcHMoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnZlcnRUb01hcHMoZXhlY3V0ZShjb25uZWN0aW9uLCBzcWwpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc3VsdFNldCBleGVjdXRlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBzdGF0ZW1lbnQgPSBjb25uZWN0aW9uLmNyZWF0ZVN0YXRlbWVudCgpOwotCQlzdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOwotCQlSZXN1bHRTZXQgcmVzdWx0U2V0ID0gc3RhdGVtZW50LmdldFJlc3VsdFNldCgpOwotCQlzdGF0ZW1lbnQuY2xvc2UoKTsKLQkJcmV0dXJuIHJlc3VsdFNldDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydFRvTWFwcyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gbmV3IEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKLQkJZm9yIChJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gc3RyZWFtID0gYnVpbGRNYXBJdGVyYXRvcihyZXN1bHRTZXQpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCXJvd3MuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkTWFwSXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KHJlc3VsdFNldCwgbmV3IE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihidWlsZENvbHVtbk5hbWVzKHJlc3VsdFNldCkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGJ1aWxkQ29sdW1uTmFtZXMoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJbmFtZXNbaV0gPSByZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5OYW1lKGkgKyAxKTsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYXBSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIgaW1wbGVtZW50cyBSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gY29sdW1uTmFtZXM7Ci0JCXB1YmxpYyBNYXBSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoU3RyaW5nW10gY29sdW1uTmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gY29sdW1uTmFtZXM7Ci0JCX0KLQkJcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHRoaXMuY29sdW1uTmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW1hcC5wdXQodGhpcy5jb2x1bW5OYW1lc1tpXSwgcnMuZ2V0T2JqZWN0KGkgKyAxKSk7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCQl9Ci0JCQlyZXR1cm4gbWFwOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFEYlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFEYlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzN2I4YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRGJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtcy5BbGxQbGF0Zm9ybVRlc3RzOwotCi0vKioKLSAqICBKUFQgREIgVGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYURiVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYURiVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0gICAgCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoIEFsbFBsYXRmb3JtVGVzdHMuc3VpdGUoKSk7Ci0gICAgCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBKcHRKcGFEYlRlc3RzKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHNQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyODMyZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFEYlRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqICBKcHRKcGFEYlRlc3RzUGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFEYlRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKcHRKcGFEYlRlc3RzUGx1Z2luIElOU1RBTkNFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYURiVGVzdHNQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwdEpwYURiVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9BbGxQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MmU5NTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQWxsUGxhdGZvcm1UZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsUGxhdGZvcm1UZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGVyYnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNeVNRTFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTEwZ1Rlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlMTBnWEVUZXN0cy5jbGFzcyk7Ci0vLwkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZTlpVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUG9zdGdyZVNRTFRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU1FMU2VydmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3liYXNlVGVzdHMuY2xhc3MpOwotCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFsbFBsYXRmb3JtVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9EVFBQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODYzMzUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGE7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OwotaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JTWFuYWdlZENvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSURyaXZlck1nbXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklQcm9wZXJ0eVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuUHJvcGVydHlTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5YTUxGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aXZpdHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5jb25uZWN0aW9uLkNvbm5lY3Rpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5LkNvbHVtblBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5KcHRKcGFEYlRlc3RzUGx1Z2luOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIHRlc3RpbmcgRFRQIHdyYXBwZXJzIG9uIHZhcmlvdXMgZGF0YWJhc2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVFBQbGF0Zm9ybVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogVGhlIHBsYXRmb3JtIHByb3BlcnRpZXMgYXJlIGxvYWRlZCBmcm9tIGEgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlCi0JICogJ29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnJyBkaXJlY3RvcnkuIEVhY2ggZGF0YWJhc2UgcGxhdGZvcm0gaGFzCi0JICogaXRzIG93biBwcm9wZXJ0aWVzIGZpbGUgKGUuZy4gJ2RlcmJ5LnByb3BlcnRpZXMnKS4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnRpZXMgcGxhdGZvcm1Qcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgRGFsaSBjb25uZWN0aW9uIHByb2ZpbGUgd3JhcHBlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9DT05GSUdfRElSRUNUT1JZID0gImNvbmZpZyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfVVNFUl9JRF9QUk9QRVJUWSA9ICJ1c2VySUQiOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfVVNFUl9JRF9ERUZBVUxUID0gInVzZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1BBU1NXT1JEX1BST1BFUlRZID0gInBhc3N3b3JkIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1BBU1NXT1JEX0RFRkFVTFQgPSAiIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9EUklWRVJfSkFSU19QUk9QRVJUWSA9ICJqYXJzIjsKLQkJLy8gcmVxdWlyZWQgLSBubyBkZWZhdWx0Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfVVJMX1BST1BFUlRZID0gInVybCI7Ci0JCS8vIHJlcXVpcmVkIC0gbm8gZGVmYXVsdAotCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERUUFBsYXRmb3JtVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldC11cC90ZWFyLWRvd24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLnBsYXRmb3JtUHJvcGVydGllcyA9IHRoaXMubG9hZFBsYXRmb3JtUHJvcGVydGllcygpOwotCQl0aGlzLmJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvbkZpbGUoKTsKLQkJdGhpcy5idWlsZERUUENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUodGhpcy5nZXRQcm9maWxlTmFtZSgpLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCXRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzID0gbnVsbDsKLQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCS8vICoqKioqIHBsYXRmb3JtIHByb3BlcnRpZXMgZmlsZQotCXByaXZhdGUgUHJvcGVydGllcyBsb2FkUGxhdGZvcm1Qcm9wZXJ0aWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcC5sb2FkKHRoaXMuYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkub3BlblN0cmVhbSgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgYnVpbGRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlVVJMKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKHRoaXMuZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkpLmdldEVudHJ5KHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGVzdFBsdWdpbkJ1bmRsZUlEKCkgewotCQlyZXR1cm4gSnB0SnBhRGJUZXN0c1BsdWdpbi5CVU5ETEVfSUQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0RpcmVjdG9yeU5hbWUoKSArICcvJyArIHRoaXMuZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgewotCQlyZXR1cm4gUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWTsKLQl9Ci0KLQkvKioKLQkgKiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcyBhIHNlcGFyYXRlIHByb3BlcnRpZXMgZmlsZSBpbiB0aGUgJ2NvbmZpZycKLQkgKiBkaXJlY3RvcnkgdGhhdCBtdXN0IGJlIGN1c3RvbWl6ZWQgYnkgd2hvbWV2ZXIgaXMgZXhlY3V0aW5nIHRoZSB0ZXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0KLQkvLyAqKioqKiBkcml2ZXIgZGVmaW5pdGlvbiBmaWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvbkZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldFN0b3JhZ2VMb2NhdGlvbih0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpKTsKLQkJWE1MRmlsZU1hbmFnZXIuc2V0RmlsZU5hbWUodGhpcy5nZXREVFBEcml2ZXJGaWxlTmFtZSgpKTsKLQotCQlJUHJvcGVydHlTZXRbXSBzZXRzID0gWE1MRmlsZU1hbmFnZXIubG9hZFByb3BlcnR5U2V0cygpOwotCQlmb3IgKElQcm9wZXJ0eVNldCBzZXQgOiBzZXRzKSB7Ci0JCQlpZiAoc2V0LmdldElEKCkuZXF1YWxzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpKSB7Ci0JCQkJcmV0dXJuOyAgLy8gcHJvcGVydHkgc2V0cyBsaXZlIGFjcm9zcyB0ZXN0cwotCQkJfQotCQl9Ci0KLQkJWE1MRmlsZU1hbmFnZXIuc2F2ZU5hbWVkUHJvcGVydHlTZXQodGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSk7Ci0KLQkJLy8gdmVyaWZ5IHRoZSBmaWxlIHdhcyBjcmVhdGVkOgotCQlGaWxlIGRyaXZlckRlZmluaXRpb25lRmlsZSA9IHRoaXMuZ2V0RFRQRHJpdmVyRGVmaW5pdGlvbkxvY2F0aW9uKCkuYXBwZW5kKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSkudG9GaWxlKCk7Ci0JCWFzc2VydFRydWUoZHJpdmVyRGVmaW5pdGlvbmVGaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQlwcml2YXRlIElQYXRoIGdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpIHsKLQkJcmV0dXJuIENvbm5lY3Rpdml0eVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERUUERyaXZlckZpbGVOYW1lKCkgewotCQlyZXR1cm4gSURyaXZlck1nbXRDb25zdGFudHMuRFJJVkVSX0ZJTEU7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlTZXRbXSBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0eVNldHMoKSB7Ci0JCUlQcm9wZXJ0eVNldFtdIHByb3BlcnR5U2V0cyA9IG5ldyBJUHJvcGVydHlTZXRbMV07Ci0JCVByb3BlcnR5U2V0SW1wbCBwcm9wZXJ0eVNldCA9IG5ldyBQcm9wZXJ0eVNldEltcGwodGhpcy5nZXREcml2ZXJOYW1lKCksIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCQlwcm9wZXJ0eVNldC5zZXRQcm9wZXJ0aWVzKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCksIHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydGllcygpKTsKLQkJcHJvcGVydHlTZXRzWzBdID0gcHJvcGVydHlTZXQ7Ci0JCXJldHVybiBwcm9wZXJ0eVNldHM7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoQ29ubmVjdGlvblByb2ZpbGUuRFJJVkVSX0RFRklOSVRJT05fVFlQRV9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25UeXBlKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9KQVJfTElTVF9QUk9QX0lELCB0aGlzLmdldEpEQkNEcml2ZXJKYXJMaXN0KCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuRFJJVkVSX0NMQVNTX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyQ2xhc3MoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVSTF9QUk9QX0lELCB0aGlzLmdldEpEQkNVUkwoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBUaGUgSkFSIGxpc3QgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDRHJpdmVySmFyTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KERCX0RSSVZFUl9KQVJTX1BST1BFUlRZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJDbGFzcygpOwotCi0JLyoqCi0JICogVGhlIGRhdGFiYXNlIFVSTCBpcyB3b3Jrc3BhY2Utc3BlY2lmaWMgYW5kIGlzIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlCi0JICogZm9yIHNvbWUgZGF0YWJhc2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEpEQkNVUkwoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VUkxfUFJPUEVSVFksIHRoaXMuZ2V0RGVmYXVsdEpEQkNVUkwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJcmV0dXJuICIiOwotCX0KLQotCS8qKgotCSAqIFRoZSB1c2VyIElEIGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VySUQoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShEQl9VU0VSX0lEX1BST1BFUlRZLCBEQl9VU0VSX0lEX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXNzd29yZCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfUEFTU1dPUkRfUFJPUEVSVFksIERCX1BBU1NXT1JEX0RFRkFVTFQpOwotCX0KLQotCS8vICoqKioqIERUUCBjb25uZWN0aW9uIHByb2ZpbGUKLQlwcml2YXRlIHZvaWQgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZSgpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpICE9IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIHByb2ZpbGVzIGxpdmUgYWNyb3NzIHRlc3RzCi0JCX0KLQkJdGhpcy5jcmVhdGVQcm9maWxlKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUodGhpcy5nZXRQcm9maWxlTmFtZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5jcmVhdGVQcm9maWxlKAotCQkJCXByb2ZpbGVOYW1lLAotCQkJCXRoaXMuZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCksCi0JCQkJdGhpcy5nZXRQcm92aWRlcklEKCksCi0JCQkJdGhpcy5idWlsZERUUENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydGllcygpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9maWxlTmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuIENvbm5lY3Rpb25Qcm9maWxlLkNPTk5FQ1RJT05fUFJPRklMRV9UWVBFOwotCX0KLQkgCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlVTRVJOQU1FX1BST1BfSUQsIHRoaXMuZ2V0VXNlcklEKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QQVNTV09SRF9QUk9QX0lELCB0aGlzLmdldFBhc3N3b3JkKCkpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1BST1BfSUQsIHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpOwotCi0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EQVRBQkFTRV9WRU5ET1JfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVSU0lPTl9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlVmVyc2lvbigpKTsKLQotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRBVEFCQVNFX1NBVkVfUFdEX1BST1BfSUQsIHRoaXMucGFzc3dvcmRJc1NhdmVkKCkpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwYXNzd29yZElzU2F2ZWQoKSB7Ci0JCXJldHVybiAidHJ1ZSI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgdGhyb3dzIENvbm5lY3Rpb25Qcm9maWxlRXhjZXB0aW9uIHsKLQkJVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlTdHJpbmcgY3BOYW1lMSA9IHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSArICIxIjsKLQkJdGhpcy5jcmVhdGVQcm9maWxlKGNwTmFtZTEpOwotCQlJQ29ubmVjdGlvblByb2ZpbGUgZHRwQ1AgPSB0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuZ2V0UHJvZmlsZUJ5TmFtZShjcE5hbWUxKTsKLQkJYXNzZXJ0Tm90TnVsbChkdHBDUCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLmFkZGVkTmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJU3RyaW5nIGNwTmFtZTIgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMiI7Ci0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5tb2RpZnlQcm9maWxlKGR0cENQLCBjcE5hbWUyLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTEsIGxpc3RlbmVyLnJlbmFtZWRPbGROYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbmFtZWROZXdOYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0Tm90TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmRlbGV0ZVByb2ZpbGUoZHRwQ1ApOwotCQlhc3NlcnRFcXVhbHMoY3BOYW1lMiwgbGlzdGVuZXIucmVtb3ZlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCWNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNwTmFtZTIpOwotCQlhc3NlcnROdWxsKGNwKTsKLQotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRQcm9maWxlTmFtZSgpLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQ29ubmVjdGVkKCkpOwotCi0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VWZW5kb3IoKTsKLQkJdGhpcy52ZXJpZnlEYXRhYmFzZUNvbnRlbnQoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZXJzaW9uTnVtYmVyKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChkYXRhYmFzZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlcnNpb24oKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJleHBlY3RlZDogIiArIGV4cGVjdGVkICsgIiAtIGFjdHVhbDogIiArIGFjdHVhbDsKLQkJLy8gcGFydGlhbCBtYXRjaCBpcyBnb29kIGVub3VnaAotCQlhc3NlcnRUcnVlKGVycm9yTWVzc2FnZSwgYWN0dWFsLmluZGV4T2YoZXhwZWN0ZWQpICE9IC0xKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCURhdGFiYXNlIGRhdGFiYXNlID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpOwotCQlTdHJpbmcgYWN0dWFsID0gZGF0YWJhc2UuZ2V0VmVuZG9yTmFtZSgpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSB0aGlzLmdldERhdGFiYXNlVmVuZG9yKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGF0YWJhc2VDb250ZW50KCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJYXNzZXJ0VHJ1ZShkYXRhYmFzZS5nZXRTY2hlbWF0YVNpemUoKSA+PSAwKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gZGF0YWJhc2UuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVzU2l6ZSgpID4gMCkgewotCQkJCVRhYmxlIHRhYmxlID0gc2NoZW1hLmdldFRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCWFzc2VydFRydWUodGFibGUuZ2V0Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpID49IDApOwotCQkJCWFzc2VydFRydWUodGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkgPj0gMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCk7Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCB0ZXN0T2ZmbGluZSgpIHsKLQkJaWYgKCAhIHRoaXMuZXhlY3V0ZU9mZmxpbmVUZXN0cygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuc3VwcG9ydHNXb3JrT2ZmbGluZU1vZGUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5wcmVwYXJlRm9yT2ZmbGluZVdvcmsoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUud29ya09mZmxpbmUoKTsKLQkJYXNzZXJ0VHJ1ZShzdGF0dXMuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNXb3JraW5nT2ZmbGluZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzSW5hY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVwYXJlRm9yT2ZmbGluZVdvcmsoKSB7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNhbldvcmtPZmZsaW5lKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQkJCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJDb25uZWN0KCkgewotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9wZW5lZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9rVG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmFib3V0VG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmNsb3NlZFByb2ZpbGUpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lck9mZmxpbmUoKSB7Ci0JCWlmICggISB0aGlzLmV4ZWN1dGVPZmZsaW5lVGVzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5wcmVwYXJlRm9yT2ZmbGluZVdvcmsoKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub3BlbmVkUHJvZmlsZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIub2tUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuYWJvdXRUb0Nsb3NlUHJvZmlsZSk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZSwgbGlzdGVuZXIuY2xvc2VkUHJvZmlsZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJEYXRhYmFzZSgpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25MaXN0ZW5lckNhdGFsb2coKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCQotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIHRha2UgdGhlIGZpcnN0IGNhdGFsb2cKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IHRoaXMuZ2V0Rmlyc3REVFBDYXRhbG9nKCk7Ci0JCUNhdGFsb2cgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKGR0cENhdGFsb2cuZ2V0TmFtZSgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgZHRwQ2F0YWxvZykucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKGNhdGFsb2csIGxpc3RlbmVyLmNoYW5nZWRDYXRhbG9nKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJTY2hlbWEoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGR0cENhdGFsb2dzID0gdGhpcy5nZXREVFBDYXRhbG9ncygpOwotCQlvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nID0gbnVsbDsKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEgPSBudWxsOwotCQlTY2hlbWEgc2NoZW1hID0gbnVsbDsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCWR0cENhdGFsb2cgPSBkdHBDYXRhbG9ncy5nZXQoMCk7Ci0JCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCkuZ2V0KDApOwotCQkJc2NoZW1hID0gdGhpcy5nZXRDYXRhbG9nTmFtZWQoZHRwQ2F0YWxvZy5nZXROYW1lKCkpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJaWYgKGR0cENhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSB0aGlzLmdldERUUERhdGFiYXNlKCkuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCQlzY2hlbWEgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoZHRwU2NoZW1hLmdldE5hbWUoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWR0cENhdGFsb2cgPSBkdHBDYXRhbG9ncy5nZXQoMCk7ICAvLyBzaG91bGQgYmUgdGhlICJ2aXJ0dWFsIiBjYXRhbG9nCi0JCQkJYXNzZXJ0RXF1YWxzKCIiLCBkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIGR0cENhdGFsb2cuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCQkvLyB0aGUgc2NoZW1hdGEgYXJlIGhlbGQgZGlyZWN0bHkgYnkgdGhlIGRhdGFiYXNlIGluIHRoaXMgc2l0dWF0aW9uCi0JCQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoc2NoZW1hLmdldFRhYmxlc1NpemUoKSA+PSAwKTsgIC8vIGZvcmNlIHRhYmxlcyB0byBiZSBsb2FkZWQKLQkJKChJQ2F0YWxvZ09iamVjdCkgZHRwU2NoZW1hKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBsaXN0ZW5lci5jaGFuZ2VkU2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdXBwb3J0c0NhdGFsb2dzKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MgPSB0aGlzLnN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQkJYXNzZXJ0RXF1YWxzKHN1cHBvcnRzQ2F0YWxvZ3MsIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpOwotCQlpZiAoc3VwcG9ydHNDYXRhbG9ncykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3NTaXplKCkgPiAwKTsKLQkJCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hdGFTaXplKCkpOwotCQl9IGVsc2UgewotCQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nc1NpemUoKSk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWF0YVNpemUoKSA+IDApOwotCQl9Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLS8vCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotLy8JCXRoaXMuZHVtcEpEQkNDYXRhbG9ncygpOwotLy8JCXRoaXMuZHVtcEpEQkNTY2hlbWF0YSgpOwotLy8JCXRoaXMuZHVtcERhdGFiYXNlQ29udGFpbmVycygpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotLy8JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBKcHRKcGFEYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCS8qKgotCSAqIG9ubHkgdmFsaWQgb24gZGF0YWJhc2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgY2F0YWxvZ3MKLQkgKi8KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nIGdldENhdGFsb2dOYW1lZChTdHJpbmcgY2F0YWxvZ05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoY2F0YWxvZ05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRQbGF0Zm9ybVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUtleSkgewotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvcGVydHlWYWx1ZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhYmFzZSBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUgJyIgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkKLQkJCQkJKyAiJyBpcyBtaXNzaW5nIGEgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSAnIiArIHByb3BlcnR5S2V5ICsgIicuIik7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5VmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycyh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY3AsICJoYXNBbnlMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVIYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJcmV0dXJuICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY3AsICJoYXNOb0xpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQIG1vZGVsICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9maWxlTWFuYWdlciBnZXREVFBQcm9maWxlTWFuYWdlcigpIHsKLQkJcmV0dXJuIFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb25uZWN0aW9uUHJvZmlsZSBnZXREVFBDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSUNvbm5lY3Rpb25Qcm9maWxlIGdldERUUENvbm5lY3Rpb25Qcm9maWxlKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoSUNvbm5lY3Rpb25Qcm9maWxlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShjcCwgImR0cENvbm5lY3Rpb25Qcm9maWxlIik7Ci0JfQotCi0JcHJvdGVjdGVkIElNYW5hZ2VkQ29ubmVjdGlvbiBnZXREVFBNYW5hZ2VkQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIChJTWFuYWdlZENvbm5lY3Rpb24pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsICJkdHBNYW5hZ2VkQ29ubmVjdGlvbiIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXREVFBEYXRhYmFzZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkYXRhYmFzZSwgImR0cERhdGFiYXNlIik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGdldERUUENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldENhdGFsb2dzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldEZpcnN0RFRQQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKS5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RFRQQ2F0YWxvZyh0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKG5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHNjaGVtYSwgImR0cFNjaGVtYSIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGVjdXRlIFNRTCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpZ25vcmUgYW55IGVycm9ycyAodXNlZnVsIGZvciBkcm9wcGluZyBkYXRhYmFzZSBvYmplY3RzIHRoYXQgbWlnaHQKLQkgKiBub3QgYmUgdGhlcmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycyhTdHJpbmcgc3FsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU1FMOiAiICsgc3FsKTsKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQl0cnkgewotCQkJamRiY1N0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoc3FsLCAyMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcChTdHJpbmcgc3FsLCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wT24oc3FsLCBwdywgY29sdW1uV2lkdGgpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE9uKFN0cmluZyBzcWwsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKHNxbCk7Ci0JCWZvciAoQXJyYXlMaXN0PE9iamVjdD4gcm93IDogdGhpcy5leGVjdXRlKHNxbCkpIHsKLQkJCWZvciAoT2JqZWN0IGNvbHVtblZhbHVlIDogcm93KSB7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGNvbHVtblZhbHVlKSwgY29sdW1uV2lkdGgsIHB3KTsKLQkJCQlwdy5wcmludCgnICcpOwotCQkJfQotCQkJcHcucHJpbnRsbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gZXhlY3V0ZShTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IGpkYmNTdGF0ZW1lbnQgPSB0aGlzLmNyZWF0ZUpEQkNTdGF0ZW1lbnQoKTsKLQkJamRiY1N0YXRlbWVudC5leGVjdXRlKHNxbCk7Ci0JCUFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4gcm93cyA9IHRoaXMuYnVpbGRSb3dzKGpkYmNTdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCkpOwotCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IGJ1aWxkUm93cyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiByb3dzID0gbmV3IEFycmF5TGlzdDxBcnJheUxpc3Q8T2JqZWN0Pj4oKTsKLQkJZm9yIChJdGVyYXRvcjxBcnJheUxpc3Q8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5idWlsZEFycmF5SXRlcmF0b3IocmVzdWx0U2V0KTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlyb3dzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8QXJyYXlMaXN0PE9iamVjdD4+IGJ1aWxkQXJyYXlJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxBcnJheUxpc3Q8T2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKS5nZXRDb2x1bW5Db3VudCgpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyIGltcGxlbWVudHMgUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlcjxBcnJheUxpc3Q8T2JqZWN0Pj4gewotCQlwcml2YXRlIGZpbmFsIGludCBjb2x1bW5Db3VudDsKLQkJcHVibGljIExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIoaW50IGNvbHVtbkNvdW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb2x1bW5Db3VudCA9IGNvbHVtbkNvdW50OwotCQl9Ci0JCXB1YmxpYyBBcnJheUxpc3Q8T2JqZWN0PiBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJCUFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4odGhpcy5jb2x1bW5Db3VudCk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQlsaXN0LmFkZChycy5nZXRPYmplY3QoaSkpOwotCQkJfQotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVtZW50IGNyZWF0ZUpEQkNTdGF0ZW1lbnQoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5jcmVhdGVTdGF0ZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbiBnZXRKREJDQ29ubmVjdGlvbigpIHsKLQkJcmV0dXJuICgoQ29ubmVjdGlvbkluZm8pIHRoaXMuZ2V0RFRQTWFuYWdlZENvbm5lY3Rpb24oKS5nZXRDb25uZWN0aW9uKCkuZ2V0UmF3Q29ubmVjdGlvbigpKS5nZXRTaGFyZWRDb25uZWN0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlTWV0YURhdGEgZ2V0RGF0YWJhc2VNZXRhRGF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLmdldE1ldGFEYXRhKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgRFRQIG1ldGFkYXRhICoqKioqKioqKioKLQotCS8qKgotCSAqIGR1bXAgYWxsIHRoZSBkYXRhYmFzZSBtZXRhZGF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZSgpIHsKLQkJdGhpcy5kdW1wRGF0YWJhc2UodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogZHVtcCB0aGUgZGF0YWJhc2UgY2F0YWxvZ3MgYW5kIHNjaGVtYXRhIHRvIHRoZSBjb25zb2xlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlQ29udGFpbmVycygpIHsKLQkJdGhpcy5kdW1wRGF0YWJhc2UoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZShib29sZWFuIGRlZXApIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcERhdGFiYXNlT24ocHcsIGRlZXApOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcERhdGFiYXNlT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJcHcucHJpbnQoImRhdGFiYXNlOiAiKTsKLQkJcHcucHJpbnRsbihkYXRhYmFzZS5nZXROYW1lKCkpOwotCQlpZiAoZGF0YWJhc2Uuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlmb3IgKENhdGFsb2cgY2F0YWxvZyA6IGRhdGFiYXNlLmdldENhdGFsb2dzKCkpIHsKLQkJCQl0aGlzLmR1bXBDYXRhbG9nT24oY2F0YWxvZywgcHcsIGRlZXApOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oZGF0YWJhc2UsIHB3LCBkZWVwKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDYXRhbG9nT24oQ2F0YWxvZyBjYXRhbG9nLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJjYXRhbG9nOiAiKTsKLQkJcHcucHJpbnRsbihjYXRhbG9nLmdldE5hbWUoKSk7Ci0JCXB3LmluZGVudCgpOwotCQkJdGhpcy5kdW1wU2NoZW1hQ29udGFpbmVyT24oY2F0YWxvZywgcHcsIGRlZXApOwotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hQ29udGFpbmVyT24oU2NoZW1hQ29udGFpbmVyIHNjaGVtYUNvbnRhaW5lciwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlmb3IgKFNjaGVtYSBzY2hlbWEgOiBzY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hdGEoKSkgewotCQkJdGhpcy5kdW1wU2NoZW1hT24oc2NoZW1hLCBwdywgZGVlcCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5kdW1wU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYShTY2hlbWEgc2NoZW1hLCBib29sZWFuIGRlZXApIHsKLQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0ub3V0KSk7Ci0JCS8vIHN5bmNocm9uaXplIHRoZSBjb25zb2xlIHNvIGV2ZXJ5dGhpbmcgaXMgY29udGlndW91cwotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXRoaXMuZHVtcFNjaGVtYU9uKHNjaGVtYSwgcHcsIGRlZXApOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYU9uKFNjaGVtYSBzY2hlbWEsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJcHcucHJpbnQoInNjaGVtYTogIik7Ci0JCXB3LnByaW50bG4oc2NoZW1hLmdldE5hbWUoKSk7Ci0JCWlmIChkZWVwKSB7Ci0JCQlwdy5pbmRlbnQoKTsKLQkJCQlmb3IgKFRhYmxlIHRhYmxlIDogc2NoZW1hLmdldFRhYmxlcygpKSB7Ci0JCQkJCXRoaXMuZHVtcFRhYmxlT24odGFibGUsIHB3KTsKLQkJCQl9Ci0JCQkJZm9yIChTZXF1ZW5jZSBzZXF1ZW5jZSA6IHNjaGVtYS5nZXRTZXF1ZW5jZXMoKSkgewotCQkJCQl0aGlzLmR1bXBTZXF1ZW5jZU9uKHNlcXVlbmNlLCBwdyk7Ci0JCQkJfQotCQkJcHcudW5kZW50KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wVGFibGVPbihUYWJsZSB0YWJsZSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInRhYmxlOiAiKTsKLQkJcHcucHJpbnRsbih0YWJsZS5nZXROYW1lKCkpOwotCQlwdy5pbmRlbnQoKTsKLQkJCWZvciAoQ29sdW1uIGNvbHVtbiA6IHRhYmxlLmdldENvbHVtbnMoKSkgewotCQkJCXRoaXMuZHVtcENvbHVtbk9uKGNvbHVtbiwgcHcpOwotCQkJfQotCQkJZm9yIChGb3JlaWduS2V5IGZvcmVpZ25LZXkgOiB0YWJsZS5nZXRGb3JlaWduS2V5cygpKSB7Ci0JCQkJdGhpcy5kdW1wRm9yZWlnbktleU9uKGZvcmVpZ25LZXksIHB3KTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcENvbHVtbk9uKENvbHVtbiBjb2x1bW4sIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJjb2x1bW46ICIpOwotCQlwdy5wcmludChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiA6ICIpOwotCQlwdy5wcmludChjb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlpZiAoY29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKSB7Ci0JCQlwdy5wcmludCgiIFtwcmltYXJ5IGtleV0iKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEZvcmVpZ25LZXlPbihGb3JlaWduS2V5IGZvcmVpZ25LZXksIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJmb3JlaWduIGtleTogIik7Ci0JCXB3LnByaW50KGZvcmVpZ25LZXkuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIj0+Iik7Ci0JCXB3LnByaW50KGZvcmVpZ25LZXkuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJcHcucHJpbnQoIiAoIik7Ci0JCWZvciAoSXRlcmF0b3I8Q29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJQ29sdW1uUGFpciBjcCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlwdy5wcmludChjcC5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCXB3LnByaW50KCI9PiIpOwotCQkJcHcucHJpbnQoY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXB3LnByaW50KCIsICIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50KCcpJyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wU2VxdWVuY2VPbihTZXF1ZW5jZSBzZXF1ZW5jZSwgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnQoInNlcXVlbmNlOiAiKTsKLQkJcHcucHJpbnRsbihzZXF1ZW5jZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkdW1wIEpEQkMgbWV0YWRhdGEgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNDYXRhbG9ncygpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wSkRCQ0NhdGFsb2dzT24ocHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNDYXRhbG9nc09uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcHcucHJpbnRsbigiSkRCQyBjYXRhbG9nczogIik7Ci0JCXB3LmluZGVudCgpOwotCQkJQXJyYXlMaXN0PEFycmF5TGlzdDxPYmplY3Q+PiByb3dzID0gdGhpcy5idWlsZFJvd3ModGhpcy5nZXREYXRhYmFzZU1ldGFEYXRhKCkuZ2V0Q2F0YWxvZ3MoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yPEFycmF5TGlzdDxPYmplY3Q+PiBzdHJlYW0gPSByb3dzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXB3LnByaW50bG4oc3RyZWFtLm5leHQoKS5nZXQoMCkpOwotCQkJfQotCQlwdy51bmRlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ1NjaGVtYXRhKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDU2NoZW1hdGFPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ1NjaGVtYXRhT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIHNjaGVtYXRhOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8QXJyYXlMaXN0PE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRTY2hlbWFzKCkpOwotCQkJZm9yIChBcnJheUxpc3Q8T2JqZWN0PiByb3cgOiByb3dzKSB7Ci0JCQkJaWYgKHJvdy5zaXplKCkgPT0gMikgeyAgLy8gY2F0YWxvZ3Mgd2VyZSBhZGRlZCBpbiBqZGsgMS40Ci0JCQkJCU9iamVjdCBjYXRhbG9nID0gcm93LmdldCgxKTsKLQkJCQkJcHcucHJpbnQoY2F0YWxvZyk7Ci0JCQkJCXB3LnByaW50KCcuJyk7Ci0JCQkJfQotCQkJCU9iamVjdCBzY2hlbWEgPSByb3cuZ2V0KDApOwotCQkJCXB3LnByaW50bG4oc2NoZW1hKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBTdHJpbmcgYWRkZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWRPbGROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWROZXdOYW1lOwotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBvbGROYW1lOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLmFkZGVkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbW92ZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb3BlbmVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG1vZGlmaWVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG9rVG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBhYm91dFRvQ2xvc2VQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY2xvc2VkUHJvZmlsZTsKLQkJcHVibGljIERhdGFiYXNlIGNoYW5nZWREYXRhYmFzZTsKLQkJcHVibGljIENhdGFsb2cgY2hhbmdlZENhdGFsb2c7Ci0JCXB1YmxpYyBTY2hlbWEgY2hhbmdlZFNjaGVtYTsKLQkJcHVibGljIFNlcXVlbmNlIGNoYW5nZWRTZXF1ZW5jZTsKLQkJcHVibGljIFRhYmxlIGNoYW5nZWRUYWJsZTsKLQkJcHVibGljIENvbHVtbiBjaGFuZ2VkQ29sdW1uOwotCQlwdWJsaWMgRm9yZWlnbktleSBjaGFuZ2VkRm9yZWlnbktleTsKLQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5vcGVuZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMub2tUb0Nsb3NlUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5jbG9zZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXRoaXMuY2hhbmdlZERhdGFiYXNlID0gZGF0YWJhc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IHNjaGVtYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCXRoaXMuY2hhbmdlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IHRhYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gY29sdW1uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5tb2RpZmllZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuYWJvdXRUb0Nsb3NlUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ2F0YWxvZyA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTY2hlbWEgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkVGFibGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZEZvcmVpZ25LZXkgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkODc5Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVyYnlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIERlcmJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVyYnkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIkRlcmJ5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieV8xMC4xX0VtYmVkZGVkIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJEZXJieSAxMC4xIEVtYmVkZGVkIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyg0LCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIlNBTEFSWSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygzLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCi0JCUNvbHVtbiBpZDJDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQyIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGlkMkNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOyAgLy8gZG9lc24ndCB3b3JrKD8pCi0JCWFzc2VydEZhbHNlKGlkMkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkMkNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZDJDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZS4uLgotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFNjYWxlKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZSBlaXRoZXIuLi4KLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFaIik7Ci0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJOSUNLTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5pY2tuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLS8vCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiRk9PX0lEIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEMiBJTlQgVU5JUVVFIE5PVCBOVUxMLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIEJMT0IoMTAwSykiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgVkFSQ0hBUigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgU0FMQVJZIERFQ0lNQUwoMTEsIDIpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBJTlQgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOSUNLTkFNRSBWQVJDSEFSKDIwKSBOT1QgTlVMTCBVTklRVUUiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBJTlQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBJTlQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIENPTFVNTl9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IENPTFVNTl9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgSU5URUdFUiwgXCJOYW1lXCIgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCksICIgKwotCQkJCSJPUkdfSUQgSU5URUdFUiBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQSBEZXJieSBzY2hlbWEgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRyb3BwZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgUkVTVFJJQ1QiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTk0NWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogTXlTUUwKLSAqIAotICogTm90ZXM6Ci0gKiAtIFdlIGNhbiBvbmx5IGdldCBkYXRhYmFzZSBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCBvdXIKLSAqICAgICBjb25uZWN0aW9uIHByb2ZpbGUuCi0gKiAtIFdlIGNhbiByZWZlcmVuY2Ugb2JqZWN0cyBhY3Jvc3MgbXVsdGlwbGUgZGF0YWJhc2VzLCBzbyB0aGV5IGFyZSBzb3J0YSBsaWtlCi0gKiAgICAgc2NoZW1hcy4uLi4KLSAqIC0gRm9yZWlnbiBrZXlzIG11c3QgYmUgZGVmaW5lZCBhcyB0YWJsZS1sZXZlbCBjb25zdHJhaW50czsgdGhleSBjYW5ub3QgYmUKLSAqICAgICBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIGNvbHVtbiBjbGF1c2UuCi0gKiAtIENhc2Utc2Vuc2l0aXZpdHkgYW5kIC1mb2xkaW5nIGlzIHdoYWNrZWQgb24gTXlTUUwuLi4uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE15U1FMVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBNeVNRTFRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm15c3FsLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5NeVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC40XzEuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiTXlTcWwiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjQuMSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20ubXlzcWwuamRiYy5Ecml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCXJldHVybiAiamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk15U1FMXzQuMSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiTXlTUUwgNC4xIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBidWlsZERUUENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydGllcygpIHsKLQkJUHJvcGVydGllcyBwID0gc3VwZXIuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfTkFNRV9QUk9QX0lELCB0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YWJhc2VOYW1lKCkgewotCQlyZXR1cm4gImRhbGl0ZXN0IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQlyZXR1cm4gdHJ1ZTsgIC8vIHNlZW1zIHRvIHdvcmsuLi4KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gRFRQOiBNeVNRTCBoYXMgYSBzaW5nbGUgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGF0YWJhc2UKLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLCBzY2hlbWEpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSAiICsgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmFyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyX2lkIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMT0IiLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoImNodW5rIikuZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5pc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAiYmFyIik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJhciAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBjaHVuayBCTE9CIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb28gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgSU5URUdFUiwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoYmFyX2lkKSBSRUZFUkVOQ0VTIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgSU5ULCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhel9pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGZvb19pZCkgUkVGRVJFTkNFUyBmb28oaWQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPUkVJR04gS0VZIChiYXpfaWQpIFJFRkVSRU5DRVMgYmF6KGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIE9uIFdpbmRvd3MsIHRhYmxlIG5hbWVzIGdldCBmb2xkZWQgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQ7Ci0JICogZXZlbiBpZiB0aGUgbmFtZSBpcyBkZWxpbWl0ZWQgKGFwcGFyZW50bHkpLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgREFUQUJBU0UgIiArIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdDEiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJgVEVTVDNgIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdDEgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFRFU1QyIChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBgVEVTVDNgIChpZCBJTlRFR0VSLCBuYW1lIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJVGFibGUgdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0KLQkJLy8gdGhpcyBwcm9iYWJseSBvbmx5IHdvcmtzIG9uIFdpbmRvd3MKLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0KLQkJLy8gdGhpcyBwcm9iYWJseSBvbmx5IHdvcmtzIG9uIFdpbmRvd3MKLQkJVGFibGUgdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImB0ZXN0M2AiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0M1RhYmxlKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdDEiKTsKLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJgVEVTVDNgIik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcERhdGFiYXNlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSAiICsgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCksICJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCS8vIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJRCBJTlRFR0VSLCBOQU1FIFZBUkNIQVIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIElOVEVHRVIsIE5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChgSWRgIElOVEVHRVIsIGBOYW1lYCBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiYElkYCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJgTmFtZWAiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUodGhpcy5nZXREYXRhYmFzZU5hbWUoKSwgInRlc3QiKTsKLQotCQl0aGlzLmRyb3BEYXRhYmFzZSh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbiBvbmx5IGdldCBhIHNpbmdsZSAic2NoZW1hIiBwZXIgY29ubmVjdGlvbiB2aWEgRFRQLAotCSAqIHNvIGNyb3NzLXNjaGVtYSByZWZlcmVuY2VzIGFyZSBub3QgdmlzaWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UoInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5kcm9wRGF0YWJhc2UoInhyZWZfdGVzdDEiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSB4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIG9yZyAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBEQVRBQkFTRSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGVtcCAoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgbmFtZSBWQVJDSEFSKDIwKSwgIiArCi0JCQkJIm9yZ19pZCBJTlRFR0VSLCBGT1JFSUdOIEtFWSAob3JnX2lkKSBSRUZFUkVOQ0VTIHhyZWZfdGVzdDEub3JnKGlkKSkiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoImVtcCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJLy8gbm8gZm9yZWlnbiBrZXlzCi0JCWFzc2VydEVxdWFscygwLCBlbXBUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJdGhpcy5kcm9wRGF0YWJhc2UoInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5kcm9wRGF0YWJhc2UoInhyZWZfdGVzdDEiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIGRiTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSBJRiBFWElTVFMgIiArIGRiTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BEYXRhYmFzZShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgIiArIG5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3MTFlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTEwZ1Rlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlMTBnVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZy5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZ18xMC4xLjAuNCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnICgxMC4xLjAuNCkgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJLy8gT3JhY2xlIHNob3VsZCBoYXZlIGEgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlcgotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRVc2VySUQoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLm1hdGguQmlnRGVjaW1hbCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIik7Ci0JCWFzc2VydEVxdWFscygiVkFSQ0hBUjIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiTlVNQkVSIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmFyIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGJhciAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBjaHVuayBCTE9CIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb28gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSMigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmFyX2lkIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUjIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlwidGVzdDNcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QxIChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBcInRlc3QzXCIgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJVGFibGUgdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0JCXRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCi0JCVRhYmxlIHRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCQl0ZXN0MlRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQlUYWJsZSB0ZXN0M1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiXCJ0ZXN0M1wiIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0JCXRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MyIpOwotCQlhc3NlcnROdWxsKHRlc3QzVGFibGUpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlwidGVzdDNcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChpZCBOVU1CRVIoMTApLCBuYW1lIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJpZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJuYW1lIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIE5VTUJFUigxMCksIE5BTUUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIE5VTUJFUigxMCksIE5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyBkZWxpbWl0ZWQKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoXCJJZFwiIE5VTUJFUigxMCksIFwiTmFtZVwiIFZBUkNIQVIyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIklkXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXRVc2VyTmFtZSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTWVMiKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGVkIHRlc3Q6ICIgKyB0aGlzLmdldENsYXNzKCkgKyAnLicgKyB0aGlzLmdldE5hbWUoKSk7Ci0JCQlyZXR1cm47ICAvLyBTWVMgZG9lcyBub3QgaGF2ZSBhIHNjaGVtYQotCQl9Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBVU0VSIFhSRUZfVEVTVDIgQ0FTQ0FERSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVVNFUiBYUkVGX1RFU1QxIENBU0NBREUiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBVU0VSIFhSRUZfVEVTVDEgSURFTlRJRklFRCBCWSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJBTFRFUiBVU0VSIFhSRUZfVEVTVDEgUVVPVEEgVU5MSU1JVEVEIE9OIFVTRVJTIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFhSRUZfVEVTVDEuT1JHIChJRCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCBOQU1FIFZBUkNIQVIyKDIwKSkiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBVU0VSIFhSRUZfVEVTVDIgSURFTlRJRklFRCBCWSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJBTFRFUiBVU0VSIFhSRUZfVEVTVDIgUVVPVEEgVU5MSU1JVEVEIE9OIFVTRVJTIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiR1JBTlQgQUxMIE9OIFhSRUZfVEVTVDEuT1JHIFRPIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgWFJFRl9URVNUMi5FTVAgKElEIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUjIoMjApLCAiICsKLQkJCQkiT1JHX0lEIE5VTUJFUigxMCkgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJYUkVGX1RFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJPUkciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoIkVNUCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIk9SRyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIk9SR19JRCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDIgQ0FTQ0FERSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVVNFUiBYUkVGX1RFU1QxIENBU0NBREUiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgVEFCTEUgIiArIHRhYmxlTmFtZSArICIgQ0FTQ0FERSBDT05TVFJBSU5UUyIpOwotCX0KLQotLy8gbmVlZCBPcmFjbGUgZW5hYmxlbWVudCBwbHVnLWluCi0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJGT09fU0VRIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNFUVVFTkNFIEZPT19TRVEiKTsKLS8vCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLS8vCi0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFNlcXVlbmNlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT09fU0VRIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgdm9pZCBkcm9wU2VxdWVuY2UoU3RyaW5nIHNlcXVlbmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFNFUVVFTkNFICIgKyBzZXF1ZW5jZU5hbWUpOwotLy8JfQotLy8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wVXNlck9iamVjdHMoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wKCJzZWxlY3QgKiBmcm9tIHVzZXJfb2JqZWN0cyIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdYRVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NjZhOWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgT3JhY2xlIDEwZyBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTEwZ1hFVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGUxMGdYRVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGUxMGdYRS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDEwZyBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjEwLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk9yYWNsZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTAiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTEwZ19YRSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnIFhFIFJlbGVhc2UgMiAoMTAuMikgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTlpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAyZTkxOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgOWkgVGhpbiBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmFjbGU5aVRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgT3JhY2xlOWlUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlOWkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZSA5aSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5PcmFjbGUgVGhpbiBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLjkuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGU5aSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiT3JhY2xlOWkgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCS8vIHdvcmtpbmcgb2ZmbGluZSBpcyBwcmV0dHkgdWdseQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTAxYTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1Bvc3RncmVTUUxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUG9zdGdyZVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgUG9zdGdyZVNRTFRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJwb3N0Z3Jlc3FsLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQucG9zdGdyZXNxbC5wb3N0Z3Jlc3FsRHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAicG9zdGdyZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjgueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCS8vIHVzaW5nIHRoaXMgVVJMIHdpbGwgcmVzdWx0IGluIHRoZSBEVFAgZGF0YWJhc2UgY29udGFpbmluZyBhIHNpbmdsZQotCQkvLyBjYXRhbG9nIG5hbWVkICIiIC0gd2hpY2gsIHVuZm9ydHVuYXRlbHksIHJlc2VtYmxlcyB0aGUgcHNldWRvLWNhdGFsb2cKLQkJLy8gZ2VuZXJhdGVkIGJ5IERUUCBmb3IgZGF0YWJhc2VzIHRoYXQgZG8gbm90IHJldHVybiBhbnkgY2F0YWxvZ3MgdmlhCi0JCS8vIEpEQkMgbWV0YWRhdGEgY2FsbHMuLi4KLQkJcmV0dXJuICJqZGJjOnBvc3RncmVzcWwiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiUG9zdGdyZVNRTCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiUG9zdGdyZVNRTCA4LjIgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gRFRQIGRvZXMgbm90IHN1cHBvcnQgUG9zdGdyZVNRTCBvZmYtbGluZSAtIHNlZSAyMjY3MDQvMjQxNTU4Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBURVNUMSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hMSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJURVNUMSIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBURVNUMiIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0JCWFzc2VydE5vdFNhbWUoc2NoZW1hMSwgdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QxIikpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgc2NoZW1hIGFmdGVyIHRoZSByZWZyZXNoCi0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX3Rlc3RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF90ZXN0IikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJMT09LVVBfVEVTVFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWFJZGVudGlmaWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgbG9va3VwX3Rlc3QiKTsgIC8vIHRoaXMgZ2V0cyBmb2xkZWQgdG8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigiTG9va3VwVGVzdCIpKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWEuZ2V0SWRlbnRpZmllcigiTG9va3VwX1Rlc3QiKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoImxvb2t1cF90ZXN0Iiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpOwotCi0JCS8vIEZPTwotCQlUYWJsZSBmb29UYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVDQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkJBUl9JRCIpOwotCQlhc3NlcnRFcXVhbHMoIklOVDQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCWVRFQSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJLy8gYXNzZXJ0VHJ1ZShiYXJUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJDSFVOSyIpLmRhdGFUeXBlSXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJGT09fSUQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFSICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIGJ5dGVhIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT08gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTkFNRSB2YXJjaGFyKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVJfSUQgaW50ZWdlciBSRUZFUkVOQ0VTIEJBUihJRCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBWiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIHZhcmNoYXIoMjApIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBGT09fQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT09fSUQgaW50IFJFRkVSRU5DRVMgRk9PKElEKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBCQVpfSUQgaW50IFJFRkVSRU5DRVMgQkFaKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBUQUJMRV9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIGludCwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChJRCBpbnQsIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRBQkxFX1RFU1QiKS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElkIGludCwgTmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgaW50LCBcIk5hbWVcIiB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgT1JHIChJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCBOQU1FIHZhcmNoYXIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBYUkVGX1RFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgRU1QIChJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCBOQU1FIHZhcmNoYXIoMjApLCAiICsKLQkJCQkiT1JHX0lEIGludGVnZXIgUkVGRVJFTkNFUyBYUkVGX1RFU1QxLk9SRyhJRCkpIik7Ci0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJ4cmVmX3Rlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJvcmciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJU2NoZW1hIHNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoInhyZWZfdGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoImVtcCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIm9yZyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm9yZ19pZCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJYUkVGX1RFU1QyIiwgIkVNUCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlhSRUZfVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDEiLCAiT1JHIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIHNjaGVtYU5hbWUsIFN0cmluZyB0YWJsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihzY2hlbWFOYW1lKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcih0YWJsZU5hbWUpICE9IG51bGwpIHsKLQkJCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgVEFCTEUgIiArIHNjaGVtYU5hbWUgKyAnLicgKyB0YWJsZU5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgQ0FTQ0FERSIpOwotCQl9Ci0JfQotCi0vLyBzZWUgMjQxNTc4LzI0MTU1NwotLy8JcHVibGljIHZvaWQgdGVzdFNlcXVlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0vLwkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiU0VRVUVOQ0VfVEVTVCIsICJGT08iKTsKLS8vCQl0aGlzLmRyb3BTY2hlbWEoIlNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFNFUVVFTkNFX1RFU1QiKTsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBzZWFyY2hfcGF0aCBUTyBTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNFUVVFTkNFIEZPTyBTVEFSVCAxIik7Ci0vLy8vCQlMaXN0PE9iamVjdFtdPiBsaXN0ID0gdGhpcy5leGVjdXRlKCJTRUxFQ1QgbmV4dHZhbCgnZm9vJykiKTsKLS8vLy8JCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0KTsKLS8vCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLS8vCi0vLwkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiU0VRVUVOQ0VfVEVTVCIpOwotLy8JCVNlcXVlbmNlIHNlcXVlbmNlID0gc2NoZW1hLmdldFNlcXVlbmNlTmFtZWQoIkZPTyIpOwotLy8JCWFzc2VydE5vdE51bGwoc2VxdWVuY2UpOwotLy8JCWFzc2VydEVxdWFscygiZm9vX3NlcSIsIHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGRyb3BTZXF1ZW5jZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHNlcXVlbmNlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJU2NoZW1hIHNjaGVtYT0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKHNjaGVtYU5hbWUpOwotLy8JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotLy8JCQlpZiAoc2NoZW1hLmdldFNlcXVlbmNlTmFtZWQoc2VxdWVuY2VOYW1lKSAhPSBudWxsKSB7Ci0vLwkJCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgU0VRVUVOQ0UgIiArIHNjaGVtYU5hbWUgKyAnLicgKyBzZXF1ZW5jZU5hbWUpOwotLy8JCQl9Ci0vLwkJfQotLy8JfQotLy8KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TUUxTZXJ2ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NjU4M2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIFNRTCBTZXJ2ZXIgMjAwNSBEcml2ZXIgVGVzdAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTUUxTZXJ2ZXJUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFNRTFNlcnZlclRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJzcWxzZXJ2ZXIucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIk1pY3Jvc29mdCBTUUwgU2VydmVyIDIwMDUgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LnNxbHNlcnZlci4yMDA1LmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIlNRTFNlcnZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20ubWljcm9zb2Z0LnNxbHNlcnZlci5qZGJjLlNRTFNlcnZlckRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJTUUxTZXJ2ZXJfMjAwNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQlyZXR1cm4gdHJ1ZTsgIC8vIGhhdmVuJ3QgYWN0dWFsbHkgdHJpZWQgdGhpcyB5ZXQuLi4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9TeWJhc2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmOTFkN2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3liYXNlVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBTeWJhc2VUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAic3liYXNlLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJTeWJhc2UgSkRCQyBEcml2ZXIgZm9yIFN5YmFzZSBBU0UgMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5TeWJhc2UgSkRCQyBEcml2ZXIgZm9yIFN5YmFzZSBBU0UgMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLnN5YmFzZS5hc2UuZ2VuZXJpY0RyaXZlclRlbXBsYXRlXzE1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIlN5YmFzZV9BU0UiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjE1LngiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLnN5YmFzZS5qZGJjMy5qZGJjLlN5YkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJTeWJhc2VfMTUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIlN5YmFzZSBBU0UgMTUgakNvbm5lY3QgSkRCQyBQcm9maWxlIFtUZXN0XSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTeWJhc2UgImRhdGFiYXNlcyIgYmVjb21lIERUUCAiY2F0YWxvZ3MiCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRlc3QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGVzdDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nMSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QxIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzEpOwotCQlTY2hlbWEgc2NoZW1hMSA9IGNhdGFsb2cxLmdldFNjaGVtYU5hbWVkKCJkYm8iKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWExLCBjYXRhbG9nMS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRlc3QyIik7Ci0JCUNhdGFsb2cgY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MiIpOwotCQlhc3NlcnROdWxsKGNhdGFsb2cyKTsgIC8vIHNob3VsZCBiZSBudWxsIHVudGlsIHJlZnJlc2gKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERhdGFiYXNlKCksIGxpc3RlbmVyLmNoYW5nZWREYXRhYmFzZSk7Ci0KLQkJY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cyKTsKLQkJU2NoZW1hIHNjaGVtYTIgPSBjYXRhbG9nMi5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMik7Ci0KLQkJYXNzZXJ0Tm90U2FtZShjYXRhbG9nMSwgdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBjYXRhbG9nIGFmdGVyIHRoZSByZWZyZXNoCi0JCWFzc2VydE5vdFNhbWUoc2NoZW1hMSwgdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKS5nZXREZWZhdWx0U2NoZW1hKCkpOyAgLy8gd2Ugc2hvdWxkIGhhdmUgYSBuZXcgc2NoZW1hIGFmdGVyIHRoZSByZWZyZXNoCi0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB0ZXN0MSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0YWJsZV90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInRhYmxlX3Rlc3QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRhYmxlX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJLy8gZm9vCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZm9vVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmb29UYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0KLQkJQ29sdW1uIHBrQ29sdW1uID0gZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGlkQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIik7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygiSU5UIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkQ29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGlkQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIik7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOyAgLy8gaW1wbGllZCAiTk9UIE5VTEwiID8KLQotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgbmFtZUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgbmFtZUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc0xPQigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiYmFyX2lkIik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgYmFyQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXJDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRGYWxzZShiYXJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyX2lkIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlDb2x1bW4gY2h1bmtDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTUFHRSIsIGNodW5rQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2h1bmtDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRUcnVlKGNodW5rQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGNodW5rQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg0LCBiYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gbmlja25hbWVDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgibmlja25hbWUiKTsKLQkJYXNzZXJ0VHJ1ZShuaWNrbmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBzb25nQ29sdW1uID0gYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoInNvbmciKTsKLQkJYXNzZXJ0RmFsc2Uoc29uZ0NvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBzYWxhcnlDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgic2FsYXJ5Iik7Ci0JCWFzc2VydEZhbHNlKHNhbGFyeUNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEVxdWFscygiREVDSU1BTCIsIHNhbGFyeUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoc2FsYXJ5Q29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzYWxhcnlDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgc2FsYXJ5Q29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHNhbGFyeUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEZhbHNlKHNhbGFyeUNvbHVtbi5pc0xPQigpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJmb29fYmF6Iik7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBmb29fYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuam9pblRhYmxlTmFtZUlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0VHJ1ZShmb29fYmF6VGFibGUuZ2V0Q29sdW1uTmFtZWQoImZvb19pZCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgZm9vX2JheiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgYmF6Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBmb28iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGJhciIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIGltYWdlIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29EREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBmb28gKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSB2YXJjaGFyKDIwKSB1bmlxdWUsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmFyX2lkIGludGVnZXIgcmVmZXJlbmNlcyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmlja25hbWUgdmFyY2hhcigyMCkgbnVsbCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBzb25nIHZhcmNoYXIoMjApIG5vdCBudWxsLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHNhbGFyeSBkZWNpbWFsKDEwLCAyKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRm9vQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJjcmVhdGUgdGFibGUgZm9vX2JheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgZm9vX2lkIGludGVnZXIgcmVmZXJlbmNlcyBmb28oaWQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhel9pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgYmF6KGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZUxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0YWJsZV9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0YWJsZV9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygidGFibGVfbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0MSAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgVEVTVDIgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIFtUZXN0M10gKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0YWJsZV9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJ0ZXN0MSIpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJURVNUMiIpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMiIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIltUZXN0M10iKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIFtUZXN0M10iKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIFRFU1QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0MSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coImNvbHVtbl9sb29rdXBfdGVzdCIpOwotCi0JCS8vIGxvd2VyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKElEIGludGVnZXIsIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOQU1FIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gbWl4ZWQgY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChJZCBpbnRlZ2VyLCBOYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgdGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSB0ZXN0IChbSWRdIGludGVnZXIsIFtOYW1lXSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIltJZF0iKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiW05hbWVdIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgeHJlZl90ZXN0MSIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBvcmcgKGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIGVtcCAoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB2YXJjaGFyKDIwKSwgIiArCi0JCQkJIm9yZ19pZCBpbnRlZ2VyIHJlZmVyZW5jZXMgeHJlZl90ZXN0MS4ub3JnKGlkKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJQ2F0YWxvZyBjYXRhbG9nMSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInhyZWZfdGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMSk7Ci0JCVNjaGVtYSBzY2hlbWExID0gY2F0YWxvZzEuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlUYWJsZSBvcmdUYWJsZSA9IHNjaGVtYTEuZ2V0VGFibGVOYW1lZCgib3JnIik7Ci0JCWFzc2VydE5vdE51bGwob3JnVGFibGUpOwotCi0JCUNhdGFsb2cgY2F0YWxvZzIgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ4cmVmX3Rlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IGNhdGFsb2cyLmdldFNjaGVtYU5hbWVkKCJkYm8iKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJVGFibGUgZW1wVGFibGUgPSBzY2hlbWEyLmdldFRhYmxlTmFtZWQoImVtcCIpOwotCQlhc3NlcnROb3ROdWxsKGVtcFRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJRm9yZWlnbktleSBmayA9IGVtcFRhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlIHJlZlRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVmVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIm9yZyIsIHJlZlRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmay5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCUZvcmVpZ25LZXkuQ29sdW1uUGFpciBjcCA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBiYXNlQ29sdW1uID0gY3AuZ2V0QmFzZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm9yZ19pZCIsIGJhc2VDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIHJlZkNvbHVtbiA9IGNwLmdldFJlZmVyZW5jZWRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHJlZkNvbHVtbi5nZXROYW1lKCkpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBlbXAiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIG9yZyIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZiZjQwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pwYS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YmE2MTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLUBkb3QKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjZjQ1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTU1ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDA3IDE0OjI2OjU0IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYWI5MTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNNb24gSnVsIDA3IDIwOjEzOjI0IEVEVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNlMTlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8yLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmRlMWVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWNmY2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgLSBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDQ1NGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuSnB0SnBhRWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqIAotICogUmVxdWlyZWQgSmF2YSBzeXN0ZW0gcHJvcGVydHk6Ci0gKiAgICAtRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPTxqcGEuamFyIHBhdGg+Ci0gKiAgICAtRG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXI9PGVjbGlwc2VsaW5rLmphciBwYXRoPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cwotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfSkFSX1BST1BFUlRZID0gVGVzdEpwYVByb2plY3QuSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZID0gVGVzdEpwYVByb2plY3QuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7Ci0JCXJldHVybiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpCi0JCQkmJiBqcGFKYXJGaWxlRXhpc3RzKCkKLQkJCSYmIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKQotCQkJJiYgZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJQcm9wZXJ0eUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqcGFKYXJGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKSkuZXhpc3RzKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNsaXBzZWxpbmtKYXJGaWxlRXhpc3RzKCkgewotCQlyZXR1cm4gKG5ldyBGaWxlKGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmKCAhIGpwYUphclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKTsKLQkJfQotCQllbHNlIGlmKCAhIGpwYUphckZpbGVFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKSk7Ci0JCX0KLQkJZWxzZSBpZiggISBlY2xpcHNlbGlua0phclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpOwotCQl9Ci0JCXJldHVybiBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSk7Ci0JfQotCi0JLyoqKioqKioqKioqIHByaXZhdGUgKioqKioqKioqKi8KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzBiNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua0pwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotCWV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzApOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUVjbGlwc2VMaW5rRW50aXR5IGdldEphdmFFbnRpdHkoKSB7Ci0JCXJldHVybiAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwY2Y2N2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGRvbid0IGJ1aWxkIG9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVOYW1lKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUKLQkJY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlmZmVyZW50bHlOYW1lZE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0KLQkJLy9jcmVhdGUgdGhlIG9ybTIueG1sIGZpbGUKLQkJY3JlYXRlRWNsaXBzZUxpbmtPcm1YbWxGaWxlKCJvcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgb3JtMi54bWwgZmlsZSBiYWNrCi0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8wQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhLkpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm0uSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8wQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsxXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQwZGViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQuSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYxXzIuY29udGV4dC5KcHRFY2xpcHNlTGluazFfMkNvcmVDb250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkpwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsxXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazFfMkNvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmNzc5Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5DTEFTU19JTlNUQU5DRV9DT05WRVJURVIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ2FjaGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ0Njc2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsJCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1NoYXJlZCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZEZhbHNlVW5zZXRzT3RoZXJDYWNoZVNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWNhY2hpbmcuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUpOwotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODAwMCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkKLQkJLy9leGlzdGVuY2UgY2hlY2tpbmcgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBpc24ndCB1bnNldCB3aGVuIHNoYXJlZCBpcyBzZXQgdG8gZmFsc2UKLQkJYXNzZXJ0VHJ1ZShjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheSB0aW1lT2ZEYXlFeHBpcnkgPSBjYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aW1lT2ZEYXlFeHBpcnkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRTaGFyZWQoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1NoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCi0KLQkKLQkJLy9zZXQgc3BlY2lmaWVkIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCi0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUssIGNhY2hlQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0QWx3YXlzUmVmcmVzaCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRBbHdheXNSZWZyZXNoKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNEaXNhYmxlSGl0cygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldERpc2FibGVIaXRzKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZUFubm90YXRpb24uZ2V0RGlzYWJsZUhpdHMoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Rpc2FibGVIaXRzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsJCQotCi0JCi0JCS8vc2V0IHNwZWNpZmllZCBjb29yZGluYXRpb24gdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CQkKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpKTsKLQkJCi0JCWNhY2hpbmcuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCWNhY2hpbmcuc2V0RXhpc3RlbmNlQ2hlY2tpbmcodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUsIGNhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCi0KLQkKLQkJLy9zZXQgc3BlY2lmaWVkIGNvb3JkaW5hdGlvbiB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUsIGNhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCQljYWNoZUFubm90YXRpb24uc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig1NykpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTcpLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU4KSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU4KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKLQkJCi0JCQotCQljYWNoaW5nLnNldEV4cGlyeShudWxsKTsKLQkJY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeVVuc2V0c0V4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCQotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoOTAwKSk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTAwKSwgY2FjaGluZy5nZXRFeHBpcnkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGltZU9mRGF5RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0KLQkJY2FjaGVBbm5vdGF0aW9uLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUaW1lT2ZEYXlFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rVGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IGNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0Tm90TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHModGltZU9mRGF5RXhwaXJ5LCBjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE5vdE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQljYWNoaW5nLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRpbWVPZkRheUV4cGlyeVVuc2V0c0V4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMCkpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MDApLCBjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5KCkpOwkKLQkJCi0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCi0JCQotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxMDAsIGNhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBjYWNoZUFubm90YXRpb24uZ2V0U2l6ZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNmI2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuTk9fQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5OT19DT05WRVJURVIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXREZWZhdWx0Q29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydE5hbWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJZWNsaXBzZUxpbmtDb252ZXJ0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0QW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQkJY29udmVydEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydEFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJOYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWVjbGlwc2VMaW5rQ29udmVydC5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKTsJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3MsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWVjbGlwc2VMaW5rQ29udmVydC5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyLmNsYXNzLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDQ2ZTAxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkuZ2V0TmFtZSgpKTsJCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldENvbnZlcnRlckNsYXNzKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWMyODkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ3VzdG9taXplcihGb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gZW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFY2xpcHNlTGlua0VtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBlbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2ZDIxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKEVjbGlwc2VMaW5rTWFwcGluZ0tleXMuQkFTSUNfTUFQX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlRSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLlZBUklBQkxFX09ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IGVudGl0eS5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBlbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQkvL1RPRE8gdGVzdCBpbmhlcml0aW5nIGEgZGVmYXVsdCByZWFkb25seSBmcm9tIHlvdSBzdXBlcmNsYXNzCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQkJCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ5NzBlYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5DTEFTU19JTlNUQU5DRV9DT05WRVJURVIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoaWRNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3YTViYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPVVRFUiwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE0OGZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE1hbnlUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPVVRFUiwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE1NTYyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JLy9UT0RPIHRlc3QgaW5oZXJpdGluZyBhIGRlZmF1bHQgcmVhZG9ubHkgZnJvbSB5b3Ugc3VwZXJjbGFzcwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JCQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFJlYWRPbmx5VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBtYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0MGJjYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiwgZGVmYXVsdE9iamVjdFZhbHVlPVwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIsIGRlZmF1bHRPYmplY3RWYWx1ZT1cImJhclwiLCBjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWU9XCJmXCIsIG9iamVjdFZhbHVlPVwiZmVtYWxlXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXROYW1lKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0RGF0YVR5cGUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0T2JqZWN0VHlwZSgpKTsJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKCJmZW1hbGUiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUyID0gY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVyc2lvblZhbHVlMi5zZXRPYmplY3RWYWx1ZSgibWFsZSIpOwotCQkKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUzID0gY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKTsKLQkJY29udmVyc2lvblZhbHVlMy5zZXREYXRhVmFsdWUoIk8iKTsKLQkJY29udmVyc2lvblZhbHVlMy5zZXRPYmplY3RWYWx1ZSgibWFsZSIpOwotCQkKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUyLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUzLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhjb252ZXJzaW9uVmFsdWUsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKLQkJCi0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JCQotCQljb252ZXJ0ZXIubW92ZUNvbnZlcnNpb25WYWx1ZSgyLDApOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQ29udmVyc2lvblZhbHVlcykpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsMSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMikuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ubW92ZUNvbnZlcnNpb25WYWx1ZSgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24ucmVtb3ZlQ29udmVyc2lvblZhbHVlKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVyc2lvblZhbHVlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDApLnNldERhdGFWYWx1ZSgiRiIpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMikuc2V0RGF0YVZhbHVlKCJPIik7Ci0JCQotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKS5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDIxN2E3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ByaXZhdGVPd25lZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpdmF0ZU93bmVkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjwiICsgVFlQRV9OQU1FICsgIj4gbXlUeXBlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb01hbnlNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0KLQkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcml2YXRlT3duZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGFubm90YXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4OTRkMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtQcml2YXRlT3duZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17CQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpdmF0ZU93bmVkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEpvaW5GZXRjaCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG15VHlwZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWQgcHJpdmF0ZU93bmFibGUgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCXByaXZhdGVPd25hYmxlLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCi0JCXByaXZhdGVPd25hYmxlLnNldFByaXZhdGVPd25lZCh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT1VURVIsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBhbm5vdGF0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiRm9vIik7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzM4ODMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyKG5hbWU9XCJmb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpLmdldE5hbWUoKSk7CQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0Q29udmVydGVyKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0Q29udmVydGVyKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzY5ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlcihkYXRhVHlwZT1Gb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVHlwZUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kVHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKS5nZXROYW1lKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0RGF0YVR5cGUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpIGVjbGlwc2VMaW5rQ29udmVydC5nZXRDb252ZXJ0ZXIoKSkuZ2V0T2JqZWN0VHlwZSgpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjOThjNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTiwgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5DTEFTU19JTlNUQU5DRV9DT05WRVJURVIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUodmVyc2lvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7Ci0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24pOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlRm9yRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmYzYTMwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTQxNDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKCJGb28iKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJGb28iKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcihjb250ZXh0U3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDM0ZWY1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKLQkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCi0JCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbENvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxDb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWNEYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJteURhdGUiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgcmVzb3VyY2VCYXNpYyA9IAotCQkJKFhtbEJhc2ljKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIikuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgYmFzaWMgbWFwcGluZwotCQkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyB2aXJ0dWFsQ29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQl2aXJ0dWFsQ29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IAotCQkJKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIHJlc291cmNlQmFzaWMgPSAKLQkJCShYbWxCYXNpYykgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSAoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCWphdmFCYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODZmYWMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQkKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5lY2xpcHNlTGlua09ybVhtbFJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCA9IHN1cGVyLmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwotCQkKLQkJRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gCi0JCQluZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24oYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyh0ZXN0SnBhUHJvamVjdCkpOwotCQlvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCi0JCXJldHVybiB0ZXN0SnBhUHJvamVjdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCXRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluay5TQ0hFTUFfVkVSU0lPTik7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19QRVJTSVNURU5DRV9VTklULCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4YTA5Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIuY2xhc3MpOwotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENsYXNzTmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHZpcnR1YWxDb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB2aXJ0dWFsQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKTsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyLmNsYXNzKTsKLQkJT3JtRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKE9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIHZpcnR1YWxDb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHZpcnR1YWxDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlci5jbGFzcyk7Ci0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGVjMWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvckN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlIGphdmFDb250ZXh0RW1iZWRkYWJsZSA9IChKYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBqYXZhQ29udGV4dEVtYmVkZGFibGUgPSAoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmFkZChyZXNvdXJjZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldENsYXNzTmFtZSgiRm9vIik7Ci0JCXJlc291cmNlQ29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzcxMjY5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJCi0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCi0JCWphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCXJlc291cmNlRW50aXR5LnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBqYXZhQ29udGV4dEVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVFRSSUJVVEUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCXJlc291cmNlRW50aXR5LnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUssIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY29vcmRpbmF0aW9uIHR5cGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQl4bWxFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJeG1sRW50aXR5LmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbEVudGl0eS5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZEZhbHNlVW5zZXRzT3RoZXJDYWNoZVNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkKLQkJLy9leGlzdGVuY2UgY2hlY2tpbmcgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBpc24ndCB1bnNldCB3aGVuIHNoYXJlZCBpcyBzZXQgdG8gZmFsc2UKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXkgdGltZU9mRGF5RXhwaXJ5ID0gb3JtQ29udGV4dENhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldEV4aXN0ZW5jZUNoZWNraW5nKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGV4aXN0ZW5jZSBjaGVja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgZXhwaXJ5LCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeShuZXcgSW50ZWdlcig0NSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4cGlyeSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRFeHBpcnkobmV3IEludGVnZXIoNTUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0NSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGV4cGlyeSB0byBudWxsLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleHBpcnksIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRFeHBpcnkobmV3IEludGVnZXIoNjApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDYwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0RXhwaXJ5KG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgZXhwaXJ5LCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEV4cGlyeVRpbWVPZkRheShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRpbWVPZkRheSgpKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMCksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBleHBpcnksIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEyKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBleHBpcnkgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4cGlyeSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLmFkZEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIobmV3IEludGVnZXIoMTIpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleHBpcnkgdGltZSBvZiBkYXkgbWludXRlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0TWludXRlKG5ldyBJbnRlZ2VyKDM1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigzNSksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0TWludXRlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRNaW51dGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBleHBpcnkgdGltZSBvZiBkYXkgbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldENsYXNzTmFtZSgiRm9vMiIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzk5ODAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZERhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGNvbnRleHRJZCA9IAotCQkJKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbElkIHJlc291cmNlSWQgPSAKLQkJCShYbWxJZCkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gVE9ETyAtIHRlc3QgZGVmYXVsdHMgZm9yIGphdmEgc2VyaWFsaXphYmxlIGFuZCBkYXRlL3RpbWUgdHlwZXMsIAotCQkvLyB3aXRoIGFuZCB3aXRob3V0IHBlcnNpc3RlbmNlIHByb3BlcnR5Ci0JCQotCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGJhc2ljIG1hcHBpbmcKLQkJCi0JCWphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyB2aXJ0dWFsSWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbEJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVJZERhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RGF0ZSIpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlSWQuc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBpZCBtYXBwaW5nCi0JCQotCQlqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIHZpcnR1YWxJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsSWRNYXBwaW5nLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcgY29udGV4dElkID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sSWQgcmVzb3VyY2VJZCA9IAotCQkJKFhtbElkKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRJZC5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0SWQuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0SWQuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBiYXNpY1Jlc291cmNlID0gKFhtbElkKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydCgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkKLQkJCi0JCWphdmFJZE1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbElkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbElkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCWphdmFJZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydE51bGwoamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGJhc2ljUmVzb3VyY2UgPSAoWG1sSWQpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtSWRNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOwotCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1JZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlN2UxNjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFueVRvTWFueSA9IAotCQkJKFhtbE1hbnlUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9NYW55LnNldEpvaW5GZXRjaChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYW55VG9NYW55ID0gCi0JCQkoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueSA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQltYW55VG9NYW55ID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgYW5kIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gZmFsc2UsIGFkZCBtYXBwaW5nIHRvIG9ybS54bWwgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJbWFueVRvTWFueSA9IChNYW55VG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtcGxveWVlcyIpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQltYW55VG9NYW55ID0gKE1hbnlUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X0VtcGxveWVlIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MzBlNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSkuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IAotCQkJKFhtbE1hbnlUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gCi0JCQkoWG1sTWFueVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU1hbnlUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkZldGNoRGVmYXVsdEZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmUgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJbWFueVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCW1hbnlUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBtYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCU1hbnlUb09uZU1hcHBpbmcgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmI1ZGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0KLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHJlYWQgb25seSwgc2V0IGphdmEgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImJhciIpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvL3NldCB4bWwgY3VzdG9taXplciBudWxsCi0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q3VzdG9taXplcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIERFRkVSUkVELCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBBVVRPLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRUeXBlKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGNoYW5nZSB0cmFja2luZywgc2V0IGphdmEgY2hhbmdlIHRyYWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKG51bGwpOwotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gdW5zZXQgbWV0YWRhdGFDb21wbGV0ZSwgc2V0IHhtbCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2hhbmdlVHJhY2tpbmcoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDaGFuZ2VUcmFja2luZygpKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIERFRkVSUkVELCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaXplKG5ldyBJbnRlZ2VyKDEwNSkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODlkMGMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVyc2lvblZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXJDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyKG5hbWU9XCJmb29cIiwgZGVmYXVsdE9iamVjdFZhbHVlPVwiYmFyXCIsIGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZT1cImZcIiwgb2JqZWN0VmFsdWU9XCJmZW1hbGVcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciB2aXJ0dWFsQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJamF2YUNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB2aXJ0dWFsQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJdmlydHVhbEJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyk7Ci0JCU9ybUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIuY2xhc3MpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBjb252ZXJzaW9uIHZhbHVlIHRvIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoImZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWU+IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmFkZCgwLCB4bWxDb252ZXJzaW9uVmFsdWUyKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXRPYmplY3RWYWx1ZSgiYmFyMiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJCi0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL3JlbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgbGlzdAotCi0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9jbGVhciB0aGUgY29udmVyc2lvbiB2YWx1ZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBjb252ZXJzaW9uIHZhbHVlIHRvIGphdmEgY29udGV4dCBtb2RlbCwgdmVyaWZ5IGRvZXMgbm90IGFmZmVjdCBvcm0gY29udGV4dCBtb2RlbAotCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoSmF2YUVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGphdmFDb252ZXJzaW9uVmFsdWUgPSBqYXZhQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQlqYXZhQ29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiYmF6Iik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJLy9yZW1vdmUgb3JtIGF0dHJpYnV0ZSBtYXBwaW5nLCB2ZXJpZnkgdmlydHVhbCBtYXBwaW5nIGhhcyBjb252ZXJzaW9uIHZhbHVlcyBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHZlcmlmeSB2aXJ0dWFsIG1hcHBpbmcgaWdub3JlcyB0aGUgY29udmVyc2lvbiB2YWx1ZXMgZnJvbSBqYXZhCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlci5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgY29udmVyc2lvbiB2YWx1ZSB0byBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb250ZXh0Q29udmVyc2lvblZhbHVlID0gb3JtQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlLnNldERhdGFWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUuc2V0T2JqZWN0VmFsdWUoImJhciIpOwotCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZT4gY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZTIgPSBvcm1Db252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZTIuc2V0T2JqZWN0VmFsdWUoImJhcjIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL21vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJCi0JCW9ybUNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL3JlbW92ZSBhIGNvbnZlcnNpb24gdmFsdWUgZnJvbSB0aGUgY29udGV4dCBtb2RlbCBsaXN0Ci0KLQkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL2NsZWFyIHRoZSBjb252ZXJzaW9uIHZhbHVlIHJlc291cmNlIG1vZGVsIGxpc3QKLQkJb3JtQ29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplQ29udmVyc2lvblZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyQ29udmVyc2lvblZhbHVlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyKSBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0Q29udmVydGVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKS5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCkubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTRjMmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3REZXBhcnRtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkpPSU5fVEFCTEUpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkpPSU5fQ09MVU1OKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pblRhYmxlKG5hbWU9XCJERVBfRU1QXCIsIGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9XCJERVBUX0lEXCIpLCBpbnZlcnNlSm9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkVNUF9JRFwiKSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRPbmVUb01hbnkgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKLQkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsJCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnkgPSAoT25lVG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlKb2luVGFibGUgb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiREVQX0VNUCIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFUFRfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGFuZCB2ZXJpZnkgSm9pblRhYmxlIGluZm8gaXMgbm90IHRha2VuIGZyb20gdGhlIGphdmEKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsJCi0JCWF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCW9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gZmFsc2UsIGFkZCBtYXBwaW5nIHRvIG9ybS54bWwgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJb25lVG9NYW55ID0gKE9uZVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1wbG95ZWVzIik7Ci0JCWF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCW9uZVRvTWFueSA9IChPbmVUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfRW1wbG95ZWUiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9pZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19lbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEgY29tcGxldGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBvcm0gbW9kZWwgaWdub3JlcyB0aGUgamF2YSBhbm5vdGF0aW9ucwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nID0gKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nID0gKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1NTQ2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5PTkVfVE9fT05FKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRW1wbG95ZWUgZW1wbG95ZWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuSU5ORVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAUHJpdmF0ZU93bmVkKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcHJpdmF0ZSBvd25lZCB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldFByaXZhdGVPd25lZCh0cnVlKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgYmFjayB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSAKLQkJCShYbWxPbmVUb09uZSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZCh0cnVlKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0Sm9pbkZldGNoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBJTk5FUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkZldGNoRGVmYXVsdEZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmUgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb25lVG9PbmUgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7CQkKLQkJCi0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBqYXZhUmVsYXRpb25zaGlwTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgb25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlPbmVUb09uZU1hcHBpbmcgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gCi0JCQl2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKCgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBpbiB4bWwgb25lLXRvLW9uZQotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBpbiB4bWwKLQkJLy9hc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuam9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzAwNzhiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy90YWtlIGEgdmlydHVhbCBtYXBwaW5nIHdpdGggYSBtYXBwaW5nIHR5cGUgYW5kIG1ha2UgaXQgc3BlY2lmaWVkCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZSgpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUyKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGaWVsZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucGVyc2lzdGFibGVGaWVsZHMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IHRoZSBwcm9wZXJ0eSBqYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIHVzZWQgaW4gb3JtLgotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0Tm90U2FtZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzUHJvcGVydHkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnBlcnNpc3RhYmxlUHJvcGVydGllcygpLm5leHQoKSwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOy8vZGVmYXVsdCBhY2Nlc3Mgd2lsbCBiZSBmaWVsZAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhM2NmYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxTdHJ1Y3RDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q29udmVydGVyKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkJCi0JCQkJCi0JCS8vcmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGVyc2lzdGVudCBhdHRyaWJ1dGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlCYXNpY01hcHBpbmcgdmlydHVhbEJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJamF2YUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgdGVzdCB2aXJ0dWFsIG1hcHBpbmcJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcyk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVydGVyKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlci5jbGFzcyk7Ci0JCU9ybUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIHZpcnR1YWxDb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCkpOwotCQlqYXZhQ29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHZpcnR1YWxDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIuY2xhc3MpOwotCQlPcm1FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFN0cnVjdENvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWY5OGY1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4ZTM2YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlQ29udmVydGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9ICgoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3MpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldENvbnZlcnRlcihFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIuY2xhc3MpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyKCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQkJCQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gKChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWphdmFDb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIHRlc3QgdmlydHVhbCBtYXBwaW5nCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQl2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOyAKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyLmNsYXNzKTsKLQkJT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IChPcm1FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIpICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQotCQkvL3JlbW92ZSB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciB2aXJ0dWFsQ29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSAoKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcikgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlcigpKTsKLQkJamF2YUNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB2aXJ0dWFsQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCB0ZXN0IHZpcnR1YWwgbWFwcGluZwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJdmlydHVhbEJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsgCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlci5jbGFzcyk7Ci0JCU9ybUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSAoT3JtRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyKSAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXIoKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcigpOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDgzYmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgY29udGV4dFZlcnNpb24gPSAKLQkJCShPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFZlcnNpb24gcmVzb3VyY2VWZXJzaW9uID0gCi0JCQkoWG1sVmVyc2lvbikgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBtdXRhYmxlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZpcnR1YWxDb250ZXh0VmVyc2lvbiA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlEYXRlIik7Ci0JCU9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgY29udGV4dFZlcnNpb24gPSAKLQkJCShPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFZlcnNpb24gcmVzb3VyY2VWZXJzaW9uID0gCi0JCQkoWG1sVmVyc2lvbikgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGphdmFWZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIikuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZVZlcnNpb24uc2V0TXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIG11dGFibGUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSB2ZXJzaW9uIG1hcHBpbmcKLQkJCi0JCWphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZpcnR1YWxDb250ZXh0VmVyc2lvbiA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YSBjb21wbGV0ZQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQlPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIGNvbnRleHRWZXJzaW9uID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxWZXJzaW9uIHJlc291cmNlVmVyc2lvbiA9IAotCQkJKFhtbFZlcnNpb24pIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVmVyc2lvbiBiYXNpY1Jlc291cmNlID0gKFhtbFZlcnNpb24pIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlKYXZhVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nID0gKEphdmFWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydCgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlWZXJzaW9uTWFwcGluZyB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbFZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydE51bGwoamF2YVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIGJhc2ljUmVzb3VyY2UgPSAoWG1sVmVyc2lvbikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOwotCi0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3NTIxNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYSgiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhdGFsb2coImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhdGFsb2cyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyB0YWcgbm90IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYWFiOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5KcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsJCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0KLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWJhNWJkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsJCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2E0ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBvcHVsYXRlUHUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWVlNjkwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua09ybUNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQl0ZXN0SnBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRWNsaXBzZUxpbmtJbXBsaWVkTWFwcGluZ0ZpbGVSZWYxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHRoZXJlIGlzIG9uZSBpbml0aWFsbHkKLQkJSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGVsZXRlUmVzb3VyY2UoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBhZGQgc3BlY2lmaWVkIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjMoKSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHRoZXJlIGlzIG9uZSBpbml0aWFsbHkKLQkJSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gaWdub3JlIGluIHBlcnNpc3RlbmNlIHVuaXQKLQkJcGVyc2lzdGVuY2VVbml0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCkuc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0ZpbGVSZWZzKCkgewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJTGlzdEl0ZXJhdG9yPE1hcHBpbmdGaWxlUmVmPiBtYXBwaW5nRmlsZVJlZnMgPSBwZXJzaXN0ZW5jZVVuaXQubWFwcGluZ0ZpbGVSZWZzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpLCBtYXBwaW5nRmlsZVJlZnMubmV4dCgpLmdldE1hcHBpbmdGaWxlKCkuZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCksIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0Lm1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsJCi0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJLy9wZXJzaXN0ZW50VHlwZSBub3QgbGlzdGVkIGluIHBlcnNpc3RlbmNlLnhtbCBhbmQgZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIGlzIGZhbHNlCi0JCS8vc3RpbGwgZmluZCB0aGUgcGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFzc2VydEZhbHNlKGdldEpwYVByb2plY3QoKS5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgbm90IGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwsIGRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzIHNldCB0byB0cnVlCi0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwkKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGxpc3QgYXMgY2xhc3MgaW4gcGVyc2lzdGVuY2UueG1sCi0JCWdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGZhbHNlKTsKLQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCi0JCQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQlhZGRYbWxNYXBwaW5nRmlsZVJlZihKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZSwgcGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0KLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGZyb20gZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIHRoYXQgaXMgaW1wbGllZChub3Qgc3BlY2lmaWVkKSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmQ2NWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlU2NoZW1hR2VuZXJhdGlvblRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmE3MzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkZsdXNoQ2xlYXJDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIENhY2hpbmcgY2FjaGluZzsKLQlwcml2YXRlIExpc3RFdmVudCBlbnRpdGllc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFU1QgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUXzIgPSAiQWRkcmVzcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSBDYWNoZVR5cGUuZnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfREVGQVVMVF9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSAxMjM0NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMiA9IDY3ODkwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIgPSB0cnVlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVFlQRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX1RFU1RfVkFMVUUgPSBDYWNoZVR5cGUuc29mdF93ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yID0gQ2FjaGVUeXBlLmZ1bGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfVEVTVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUVfMiA9IHRydWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TSVpFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRSArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TSVpFX1RFU1RfVkFMVUUgPSAxMjM0NTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU0laRV9URVNUX1ZBTFVFXzIgPSA2Nzg5MDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTFVTSF9DTEVBUl9DQUNIRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0ZMVVNIX0NMRUFSX0NBQ0hFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmx1c2hDbGVhckNhY2hlIEZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUgPSBGbHVzaENsZWFyQ2FjaGUuZHJvcDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZsdXNoQ2xlYXJDYWNoZSBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIgPSBGbHVzaENsZWFyQ2FjaGUubWVyZ2U7Ci0KLQlwdWJsaWMgQ2FjaGluZ0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNhY2hpbmcgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldENhY2hpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBlbnRpdGllc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jYWNoaW5nLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkVOVElUSUVTX0xJU1QsIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA3OwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgNDsgLy8gNCBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1RZUEVfREVGQVVMVF9LRVksIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLCBDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLCBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TSVpFX0tFWSwgQ0FDSEVfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9UWVBFX0tFWSwgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTSEFSRURfQ0FDSEVfS0VZLCBTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLCBGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogTGlzdGVuZXJzICoqKioqKioqKioKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZEVudGl0aWVzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy5lbnRpdHlBZGRlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLmVudGl0eVJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IG51bGw7Ci0JfQotCi0Jdm9pZCBlbnRpdHlBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgZW50aXR5UmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBlOwotCX0KLQotCS8vICoqKioqKioqKiogZW50aXRpZXMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdEVudGl0aWVzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBhZGQKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCWludCBvcmlnaW5hbE51bWJlck9mRW50aXRpZXMgPSB0aGlzLmNhY2hpbmcuZW50aXRpZXNTaXplKCk7Ci0JCQotCQl0aGlzLmNhY2hpbmcuYWRkRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQlhc3NlcnRFcXVhbHMoIkVudGl0eSBub3QgYWRkZWQiLCB0aGlzLmNhY2hpbmcuZW50aXRpZXNTaXplKCksIG9yaWdpbmFsTnVtYmVyT2ZFbnRpdGllcyArIDEpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldExpc3ROYW1lKCksIENhY2hpbmcuRU5USVRJRVNfTElTVCk7Ci0KLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmNhY2hpbmcucmVtb3ZlRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQlhc3NlcnRFcXVhbHMoIkVudGl0eSBub3QgcmVtb3ZlZCIsIHRoaXMuY2FjaGluZy5lbnRpdGllc1NpemUoKSwgb3JpZ2luYWxOdW1iZXJPZkVudGl0aWVzKTsKLQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlRGVmYXVsdCBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVR5cGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU2l6ZURlZmF1bHQgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVTaXplRGVmYXVsdCBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVNpemVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9LRVksCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTaGFyZWRDYWNoZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENhY2hlVHlwZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlIFBVCi0JICogb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFksCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFksCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU2l6ZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVNpemUgcHJvcGVydHkgYnkgdGhlIENhY2hpbmcgYWRhcHRlciB3aGVuIHRoZSBQVQotCSAqIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldENhY2hpbmdQcm9wZXJ0eSgKLQkJCUVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZLAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eSgKLQkJCUVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZLAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBTaGFyZWRDYWNoZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTaGFyZWRDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eSgKLQkJCUVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFksCi0JCQlTSEFSRURfQ0FDSEVfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEZsdXNoQ2xlYXJDYWNoZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEZsdXNoQ2xlYXJDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9LRVksCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVGbHVzaENsZWFyQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlGTFVTSF9DTEVBUl9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZUNhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCQotCQkvLyBTZXQgdG8gbnVsbAotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGluZ0V2ZW50KHByb3BlcnR5TmFtZSwgZW50aXR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q2FjaGluZ0V2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBlbnRpdHkuZ2V0UGFyZW50KCkuZ2V0Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBlbnRpdHkuZ2V0UGFyZW50KCkuZ2V0Q2FjaGVTaXplT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeUNhY2hpbmdFdmVudCIsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVEZWZhdWx0KChDYWNoZVR5cGUpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplRGVmYXVsdCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlRGVmYXVsdCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldEZsdXNoQ2xlYXJDYWNoZSgoRmx1c2hDbGVhckNhY2hlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlT2YoZW50aXR5TmFtZSwgKENhY2hlVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lLCAoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSwgKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRDYWNoaW5nUHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZURlZmF1bHQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZURlZmF1bHQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlT2YoRU5USVRZX1RFU1QpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmcuRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRGbHVzaENsZWFyQ2FjaGUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZDUzOGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY2FjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmcuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jYWNoaW5nLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIENhY2hpbmcgY2FjaGluZzsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBjYWNoaW5nSG9sZGVyOwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBjYWNoZVR5cGVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZUxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjYWNoZVR5cGVFdmVudDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gc2hhcmVkQ2FjaGVIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNoYXJlZENhY2hlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHNoYXJlZENhY2hlRXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gY2FjaGVUeXBlRGVmYXVsdEhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBjYWNoZVR5cGVEZWZhdWx0RXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlRGVmYXVsdEhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHNoYXJlZENhY2hlRGVmYXVsdEV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLmhhcmRfd2VhazsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQ2FjaGVUeXBlLndlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jYWNoaW5nID0gdGhpcy5zdWJqZWN0LmdldENhY2hpbmcoKTsgLy8gU3ViamVjdAotCQl0aGlzLmNhY2hpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+KHRoaXMuY2FjaGluZyk7Ci0JCQotCQl0aGlzLmNhY2hlVHlwZUhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLmNhY2hlVHlwZUxpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGVUeXBlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZUxpc3RlbmVyKTsKLQkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZUxpc3RlbmVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKLQkJCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRBQSh0aGlzLmNhY2hpbmdIb2xkZXIpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyID0gdGhpcy5idWlsZFNoYXJlZENhY2hlRGVmYXVsdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0Q2FjaGluZyA9IChBYnN0cmFjdE1vZGVsKSB0aGlzLmNhY2hpbmc7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4gY2FjaGVUeXBlQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVIb2xkZXI7Ci0JCWFzc2VydFRydWUoY2FjaGVUeXBlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX1BST1BFUlRZKSk7Ci0JCQotCQljYWNoZVR5cGVBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShjYWNoZVR5cGVBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KSB0aGlzLnNoYXJlZENhY2hlSG9sZGVyOwotCQlhc3NlcnRUcnVlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKTsKLQkJCi0JCXNoYXJlZENhY2hlQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPiBjYWNoZVR5cGVEZWZhdWx0QUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPikgdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyOwotCQlhc3NlcnRUcnVlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQkKLQkJY2FjaGVUeXBlRGVmYXVsdEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGNhY2hlVHlwZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPiBzaGFyZWRDYWNoZURlZmF1bHRBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPikgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXI7Ci0JCWFzc2VydFRydWUoc2hhcmVkQ2FjaGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQkKLQkJc2hhcmVkQ2FjaGVEZWZhdWx0QUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0TGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHNoYXJlZENhY2hlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgCi0JCQlTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENhY2hlVHlwZSBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVUeXBlT2YoRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYWNoZVR5cGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5jYWNoZVR5cGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlQUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ2FjaGluZy5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVUeXBlPiBidWlsZENhY2hlVHlwZURlZmF1bHRBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuQ0FDSEVfVFlQRV9ERUZBVUxUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYWNoZVR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKENhY2hlVHlwZSBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q2FjaGVUeXBlRGVmYXVsdChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENhY2hlVHlwZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0QUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRTaGFyZWRDYWNoZURlZmF1bHQoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdWYWx1ZU1vZGVsVGVzdHMudGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBCYXNpYyBFbnRpdHkncyBQcm9wZXJ0aWVzIFRlc3RzICoqKioqKiogKi8KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKGVudGl0eSwgZW50aXR5LmNsb25lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlFbnRpdHkgZW50aXR5MSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlBIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCUVudGl0eSBlbnRpdHkyID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUIiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTIpOwotCQlFbnRpdHkgZW50aXR5MyA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlDIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkzKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTIsIGVudGl0eTMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNFbXB0eSgpKTsKLQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIDEwMCk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShFbnRpdHkgb3JpZ2luYWwsIEVudGl0eSBjbG9uZSkgewotCQlhc3NlcnROb3RTYW1lKG9yaWdpbmFsLCBjbG9uZSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgb3JpZ2luYWwpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIGNsb25lKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmFkZEVudGl0eShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIEVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSwgQ2FjaGVUeXBlIGNhY2hlVHlwZSwgSW50ZWdlciBzaXplLCBCb29sZWFuIGlzU2hhcmVkKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmNhY2hpbmcuYWRkRW50aXR5KG5hbWUpOwotCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlT2YoZW50aXR5LmdldE5hbWUoKSwgY2FjaGVUeXBlKTsKLQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIHNpemUpOwotCQl0aGlzLmNhY2hpbmcuc2V0U2hhcmVkQ2FjaGVPZihlbnRpdHkuZ2V0TmFtZSgpLCBpc1NoYXJlZCk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCQotCS8qKiAqKioqKiogQ2FjaGluZyBUZXN0cyAqKioqKioqICovCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvKiogKioqKioqIENhY2hlVHlwZSAtIGRlZmF1bHRzIGZvciBlbnRpdHkgbGV2ZWwgY2FjaGluZyBhcmUgZXF1YWwgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgc2V0dGluZ3MgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUoQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0Q2FjaGVUeXBlKCkpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlIC0gZGVmYXVsdHMgZm9yIGVudGl0eSBsZXZlbCBjYWNoaW5nIGFyZSBlcXVhbCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzZXR0aW5ncyAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKSwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRTaGFyZWRDYWNoZSgpKTsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoaW5nLkRFRkFVTFRfQ0FDSEVfVFlQRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdENhY2hlVHlwZURlZmF1bHQoKSk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGluZy5ERUZBVUxUX1NIQVJFRF9DQUNIRV9ERUZBVUxULCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdFNoYXJlZENhY2hlRGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGUgKioqKioqKiAqLwotCQl0aGlzLmNhY2hlVHlwZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUNhY2hlVHlwZSBuZXdDYWNoZVR5cGUgPSBDYWNoZVR5cGUuZnVsbDsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlKTsKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKG5ld0NhY2hlVHlwZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVFdmVudCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCQl0aGlzLnNoYXJlZENhY2hlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1NoYXJlZENhY2hlID0gIVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG5ld1NoYXJlZENhY2hlKTsKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUobmV3U2hhcmVkQ2FjaGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVFdmVudCk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlDYWNoZVR5cGUgbmV3Q2FjaGVUeXBlRGVmYXVsdCA9IENhY2hlVHlwZS5ub25lOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUobmV3Q2FjaGVUeXBlRGVmYXVsdCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdTaGFyZWRDYWNoZURlZmF1bHQgPSAhU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKG5ld1NoYXJlZENhY2hlRGVmYXVsdCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxWYWx1ZSgpIHsKLQkJU3RyaW5nIG5vdERlbGV0ZWQgPSAiUHJvcGVydHkgbm90IGRlbGV0ZWQiOwotCQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBub3REZWxldGVkKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgbm90RGVsZXRlZCk7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQsIG5vdERlbGV0ZWQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxULCBub3REZWxldGVkKTsKLQl9Ci0KLQkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLwotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCi0JCQl0aGlzLmNhY2hlVHlwZUhvbGRlciwgCi0JCQlDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKSwgCi0JCQl0aGlzLnNoYXJlZENhY2hlSG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfU0hBUkVEX0NBQ0hFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKENhY2hlVHlwZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCksIAotCQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2hhcmVkQ2FjaGVEZWZhdWx0QUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpLCAKLQkJCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2NhY2hpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjQ3MTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY2FjaGluZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmNhY2hpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDYWNoaW5nVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNhY2hpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9FY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjk1NWM1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQmF0Y2hXcml0aW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci0KLS8qKgotICogIENvbm5lY3Rpb25BZGFwdGVyVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUgPSAiVGVzdF9KVEEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFXzIgPSAiVGVzdF9KVEFfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUgPSAiVGVzdF9Ob25fSlRBIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUVfMiA9ICJUZXN0X05vbl9KVEFfMiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX1NRTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX05BVElWRV9TUUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMiA9ICEgTkFUSVZFX1NRTF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfV1JJVElOR19LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0JBVENIX1dSSVRJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFID0gQmF0Y2hXcml0aW5nLm9yYWNsZV9qZGJjOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQmF0Y2hXcml0aW5nIEJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yID0gQmF0Y2hXcml0aW5nLmJ1ZmZlcmVkOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFXzIgPSAhIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19DQUNIRV9TVEFURU1FTlRTX1NJWkU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0RSSVZFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRSA9ICJjb25uZWN0aW9uLmRyaXZlciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJjb25uZWN0aW9uLmRyaXZlci4yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VUkw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklORF9QQVJBTUVURVJTX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQklORF9QQVJBTUVURVJTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRV8yID0gISBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfU0hBUkVEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMiA9ICEgUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUlOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19SRUFEX0NPTk5FQ1RJT05TX01BWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1dSSVRFX0NPTk5FQ1RJT05TX01JTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUFYOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFID0gRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUuYWx3YXlzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFXzIgPSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5pc29sYXRlZDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVpZX0NPTk5FQ1RJT05fS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19MQVpZX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFXzIgPSAhIExBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE2OyAvLyBFY2xpcHNlTGluayBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShOQVRJVkVfU1FMX0tFWSwgTkFUSVZFX1NRTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEJBVENIX1dSSVRJTkdfS0VZLCBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NUQVRFTUVOVFNfS0VZLCBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVJMX0tFWSwgVVJMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVNFUl9LRVksIFVTRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQQVNTV09SRF9LRVksIFBBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQklORF9QQVJBTUVURVJTX0tFWSwgQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLCBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwgUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksIFJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwgV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVksIEVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEFaWV9DT05ORUNUSU9OX0tFWSwgTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQVSBlbGVtZW50cwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldEp0YURhdGFTb3VyY2UoSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldE5vbkp0YURhdGFTb3VyY2UoTk9OX0pUQV9EQVRBX1NPVVJDRV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXROYXRpdmVTcWwoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJBVENIX1dSSVRJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEJhdGNoV3JpdGluZygoQmF0Y2hXcml0aW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRDYWNoZVN0YXRlbWVudHMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfU0laRV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRCaW5kUGFyYW1ldGVycygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01pbigoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFJlYWRDb25uZWN0aW9uc01heCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRXcml0ZUNvbm5lY3Rpb25zTWluKChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNYXgoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKChFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRMYXp5Q29ubmVjdGlvbigoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uTkFUSVZFX1NRTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldE5hdGl2ZVNxbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEJhdGNoV3JpdGluZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldENhY2hlU3RhdGVtZW50cygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRFJJVkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVcmwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVTRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFBhc3N3b3JkKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRCaW5kUGFyYW1ldGVycygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19TSEFSRURfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zTWluKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc01heCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUlOX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01pbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uV1JJVEVfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0V3JpdGVDb25uZWN0aW9uc01heCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRMYXp5Q29ubmVjdGlvbigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBOYXRpdmVTcWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXROYXRpdmVTcWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUsCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZU5hdGl2ZVNxbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTkFUSVZFX1NRTF9LRVksCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUUsCi0JCQlOQVRJVkVfU1FMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCYXRjaFdyaXRpbmcgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRCYXRjaFdyaXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUsCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUJhdGNoV3JpdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQkFUQ0hfV1JJVElOR19LRVksCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUsCi0JCQlCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYWNoZVN0YXRlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogQ2FjaGVTdGF0ZW1lbnRzU2l6ZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU3RhdGVtZW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZVN0YXRlbWVudHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldERyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVcmwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUsCi0JCQlVU0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFLAotCQkJVVNFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogUGFzc3dvcmQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5kUGFyYW1ldGVycyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEJpbmRQYXJhbWV0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlCSU5EX1BBUkFNRVRFUlNfS0VZLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUUsCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQmluZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zU2hhcmVkIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc1NoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWluIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUmVhZENvbm5lY3Rpb25zTWF4IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVhZENvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVJlYWRDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVJFQURfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogV3JpdGVDb25uZWN0aW9uc01pbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdyaXRlQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVXcml0ZUNvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWF4IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V3JpdGVDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdyaXRlQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRSwKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogTGF6eUNvbm5lY3Rpb24gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMYXp5Q29ubmVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMQVpZX0NPTk5FQ1RJT05fS0VZLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTEFaWV9DT05ORUNUSU9OX0tFWSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxhenlDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMQVpZX0NPTk5FQ1RJT05fS0VZLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUsCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGE1OTViLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUNvbm5lY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ29ubmVjdGlvblRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25uZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDb25uZWN0aW9uVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZWZiMTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvY3VzdG9taXphdGlvbi9DdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGhyb3dFeGNlcHRpb25zSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgdGhyb3dFeGNlcHRpb25zRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUUgPSAiYWNtZS5zZXNzaW9ucy5DdXN0b21pemVyIjsKLQotCXB1YmxpYyBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDdXN0b21pemF0aW9uKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IGN1c3RvbWl6YXRpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+KHRoaXMuY3VzdG9taXphdGlvbik7Ci0JCQotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciA9IHRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNBQShjdXN0b21pemF0aW9uSG9sZGVyKTsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lciA9IHRoaXMuYnVpbGRUaHJvd0V4Y2VwdGlvbnNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aHJvd0V4Y2VwdGlvbnNMaXN0ZW5lcik7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdEN1c3RvbWl6YXRpb24gPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5jdXN0b21pemF0aW9uOyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4gdGhyb3dFeGNlcHRpb25zQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4pIHRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyOwotCQlhc3NlcnRUcnVlKHRocm93RXhjZXB0aW9uc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDdXN0b21pemF0aW9uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEN1c3RvbWl6YXRpb24uVEhST1dfRVhDRVBUSU9OU19QUk9QRVJUWSkpOwotCQkKLQkJdGhyb3dFeGNlcHRpb25zQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q3VzdG9taXphdGlvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhyb3dFeGNlcHRpb25zQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsIAotCQkJVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21pemF0aW9uOwotCX0KLQotCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKgotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUaHJvd0V4Y2VwdGlvbnNBQShQcm9wZXJ0eVZhbHVlTW9kZWw8Q3VzdG9taXphdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDdXN0b21pemF0aW9uLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUaHJvd0V4Y2VwdGlvbnMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0VGhyb3dFeGNlcHRpb25zKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGhyb3dFeGNlcHRpb25zQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogQmFzaWMgRW50aXR5J3MgUHJvcGVydGllcyBUZXN0cyAqKioqKioqICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5IiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUNsb25lKGVudGl0eSwgZW50aXR5LmNsb25lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlFbnRpdHkgZW50aXR5MSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlBIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJRW50aXR5IGVudGl0eTIgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QiIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkyKTsKLQkJRW50aXR5IGVudGl0eTMgPSB0aGlzLmJ1aWxkRW50aXR5KCJUZXN0RW50aXR5QyIsIENVU1RPTUlaRVJfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkzKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTIsIGVudGl0eTMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNFbXB0eSgpKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LmdldE5hbWUoKSwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5LmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKEVudGl0eSBvcmlnaW5hbCwgRW50aXR5IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBvcmlnaW5hbCk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgY2xvbmUpOwotCX0KLQotCXByaXZhdGUgRW50aXR5IGJ1aWxkRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb24uYWRkRW50aXR5KG5hbWUpOwotCX0KLQotCXByaXZhdGUgRW50aXR5IGJ1aWxkRW50aXR5KFN0cmluZyBuYW1lLCBTdHJpbmcgYUNsYXNzTmFtZSkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShuYW1lKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LmdldE5hbWUoKSwgYUNsYXNzTmFtZSk7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQ3VzdG9taXphdGlvbi5ERUZBVUxUX1RIUk9XX0VYQ0VQVElPTlMsIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZWZhdWx0VGhyb3dFeGNlcHRpb25zKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKiogCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaHJvd0V4Y2VwdGlvbnMgPSAhVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlci5zZXRWYWx1ZShuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobmV3VGhyb3dFeGNlcHRpb25zKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKgotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeVRocm93RXhjZXB0aW9uc0FBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLCBub3REZWxldGVkKTsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShCb29sZWFuIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jdXN0b21pemF0aW9uLmdldFRocm93RXhjZXB0aW9ucygpLCAKLQkJCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLCAKLQkJCUN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5MDQyMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLlByb2ZpbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmN1c3RvbWl6YXRpb24uV2VhdmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uLkVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0JcHJpdmF0ZSBMaXN0RXZlbnQgZW50aXRpZXNFdmVudDsKLQlwcml2YXRlIExpc3RFdmVudCBzZXNzaW9uQ3VzdG9taXplcnNFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUID0gIkVtcGxveWVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVF8yID0gIkFkZHJlc3MiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhST1dfRVhDRVBUSU9OU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMiA9ICEgVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19MQVpZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19MQVpZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19DSEFOR0VfVFJBQ0tJTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0ZFVENIX0dST1VQUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0lOVEVSTkFMX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19JTlRFUk5BTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yID0gISBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0VBR0VSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklOR19FQUdFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fT05MWV9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1ZBTElEQVRJT05fT05MWTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMiA9ICEgVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9TQ0hFTUFfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19WQUxJREFURV9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFID0gdHJ1ZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUVfMiA9ICEgVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfU0VTU0lPTl9DVVNUT01JWkVSOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJqYXZhLmxhbmcuQm9vbGVhbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfV0VBVklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFID0gV2VhdmluZy5mYWxzZV87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBXZWF2aW5nIFdFQVZJTkdfVEVTVF9WQUxVRV8yID0gV2VhdmluZy5zdGF0aWNfOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0RFU0NSSVBUT1JfQ1VTVE9NSVpFUiArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRSA9ICJhY21lLnNlc3Npb25zLkRlc2NyaXB0b3JDdXN0b21pemVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX1RFU1RfVkFMVUVfMiA9ICJhY21lLnNlc3Npb25zLkN1c3RvbWl6ZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfUFJPRklMRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvZmlsZXIgUFJPRklMRVJfVEVTVF9WQUxVRSA9IFByb2ZpbGVyLnF1ZXJ5X21vbml0b3I7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20ucHJvZmlsZXIudGVzdCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19FWENFUFRJT05fSEFORExFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFID0gImFjbWUuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q3VzdG9taXphdGlvbigpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0xBWllfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5WQUxJREFURV9TQ0hFTUFfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyIHNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCwgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkTGlzdENoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCwgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTM7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19LRVksIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0xBWllfS0VZLCBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLCBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfSU5URVJOQUxfS0VZLCBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19FQUdFUl9LRVksIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX09OTFlfS0VZLCBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFURV9TQ0hFTUFfS0VZLCBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLCBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0tFWSwgV0VBVklOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDVVNUT01JWkVSX0tFWSwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9GSUxFUl9LRVksIFBST0ZJTEVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTl9IQU5ETEVSX0tFWSwgRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RlbmVycyAqKioqKioqKioqCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLmVudGl0eUFkZGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLmVudGl0eVJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJBZGRlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5zZXNzaW9uQ3VzdG9taXplclJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5zZXNzaW9uQ3VzdG9taXplclJlcGxhY2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJMaXN0Q2xlYXJlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJc3VwZXIuY2xlYXJFdmVudCgpOwotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBudWxsOwotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQl2b2lkIGVudGl0eUFkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBlbnRpdHlSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBzZXNzaW9uQ3VzdG9taXplckFkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBzZXNzaW9uQ3VzdG9taXplckxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFRocm93RXhjZXB0aW9ucygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nTGF6eSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdDaGFuZ2VUcmFja2luZygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdGZXRjaEdyb3VwcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0ludGVybmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nRWFnZXIoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGlvbk9ubHkoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGVTY2hlbWEoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRFeGNlcHRpb25IYW5kbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZygoV2VhdmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQlpZiAobmV3VmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKLQkJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0UHJvZmlsZXIoKFByb2ZpbGVyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0xhenkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdJbnRlcm5hbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdFYWdlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFZhbGlkYXRlU2NoZW1hKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0UHJvZmlsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5jdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVycygpOwotCQkJaWYoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJbW9kZWxWYWx1ZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKEVOVElUWV9URVNUKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihQUk9GSUxFUl9URVNUX1ZBTFVFKSA6IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkJCWV4cGVjdGVkVmFsdWU7Ci0JCX0KLQkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpOwotCQkKLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzZXNzaW9uQ3VzdG9taXplcnMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNlc3Npb25DdXN0b21pemVyc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gYWRkCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5jdXN0b21pemF0aW9uLmFkZFNlc3Npb25DdXN0b21pemVyKFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JCQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJvd0V4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRocm93RXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nTGF6eSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0xBWllfS0VZLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0xhenkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0NoYW5nZVRyYWNraW5nIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRmV0Y2hHcm91cHMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nRmV0Y2hHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ZldGNoR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdJbnRlcm5hbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ludGVybmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdFYWdlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdFYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0VhZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25DdXN0b21pemVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmcgdGVzdHMgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgV2VhdmluZyBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbk9ubHkgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Pbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRlU2NoZW1hIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVZBTElEQVRFX1NDSEVNQV9LRVksCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjZXB0aW9uSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX0tFWSwKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25IYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6YXRpb24gY2xhc3MgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ3VzdG9taXphdGlvbiBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ1VTVE9NSVpFUl9LRVksCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ3VzdG9taXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlDVVNUT01JWkVSX0tFWSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRSwKLQkJCUNVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9maWxlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb2ZpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFBST0ZJTEVSX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCS8vIHZlcmlmeSBzZXQgZW51bSB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUFJPRklMRVJfS0VZLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUVfMik7Ci0JCS8vIHZlcmlmeSBzZXQgY3VzdG9tIGFuZCBsaXRlcmFsIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvZmlsZXIoCi0JCQlQUk9GSUxFUl9LRVksCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvZmlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUUsCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSBwcm9maWxlciBhbmQgbGl0ZXJhbHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0UHJvZmlsZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gcHJvZmlsZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoUHJvZmlsZXIpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5zZXRQcm9maWxlcigoUHJvZmlsZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCX0KLQotCi0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvLyAqKioqKioqKioqIHZlcmlmeSBTZXNzaW9uQ3VzdG9taXplciBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0U2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCi0JCXRoaXMucHJvcGVydGllc1RvdGFsKys7Ci0JCXRoaXMudmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSwgKFN0cmluZykgdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cyhrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEsIHRydWUpOyAKLQkJdGhpcy52ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0U2Vzc2lvbkN1c3RvbWl6ZXJQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50KTsKLQkJdGhpcy52ZXJpZnlTZXNzaW9uQ3VzdG9taXplckV2ZW50KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2Vzc2lvbkN1c3RvbWl6ZXJFdmVudChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6YXRpb24pIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0U291cmNlKCk7Ci0JCWFzc2VydFRydWUoY3VzdG9taXphdGlvbi5zZXNzaW9uQ3VzdG9taXplckV4aXN0cygoU3RyaW5nKSBleHBlY3RlZFZhbHVlKSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogdmVyaWZ5IGVudGl0eSBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUyKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXkpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIG51bGwpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5Ci0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUV2ZW50KHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMudmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KHByb3BlcnR5TmFtZSwgZW50aXR5TmFtZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUpKTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeUN1c3RvbWl6YXRpb25FdmVudCIsIHByb3BlcnR5TmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q3VzdG9taXphdGlvblByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9jdXN0b21pemF0aW9uL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ0NWUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2N1c3RvbWl6YXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUN1c3RvbWl6YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5jdXN0b21pemF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VDdXN0b21pemF0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5jbGFzcyk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlQ3VzdG9taXphdGlvblRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGY0ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsLkdlbmVyYWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci0KLS8qKgotICogIEdlbmVyYWxBZGFwdGVyVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydGllczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSA9IEdlbmVyYWxQcm9wZXJ0aWVzLkVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUVfMiA9ICEgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRTsKLQotCQotCXB1YmxpYyBHZW5lcmFsUHJvcGVydGllc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzID0gdGhpcy5zdWJqZWN0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTsKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDI7IC8vIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLCBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCi0JCXJldHVybjsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUsCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwKLQkJCUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUsCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCi0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5nZW5lcmFsUHJvcGVydGllcy5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSkKLQkJCXRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnRpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTUxMzE1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2dlbmVyYWwvR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5nZW5lcmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbC5HZW5lcmFsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIEdlbmVyYWxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIEdlbmVyYWxQcm9wZXJ0aWVzIGdlbmVyYWxQcm9wZXJ0eTsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBleGNsdWRlRWNsaXBzZWxpbmtPcm1MaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5nZW5lcmFsUHJvcGVydHkgPSB0aGlzLnN1YmplY3QuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKTsgLy8gU3ViamVjdAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IGdlbmVyYWxQcm9wZXJ0eUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+KHRoaXMuZ2VuZXJhbFByb3BlcnR5KTsKLQkJCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyID0gdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBKGdlbmVyYWxQcm9wZXJ0eUhvbGRlcik7Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIpOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RHZW5lcmFsUHJvcGVydHkgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5nZW5lcmFsUHJvcGVydHk7IC8vIFN1YmplY3QKLQkJCi0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4gZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KSB0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShleGNsdWRlRWNsaXBzZWxpbmtPcm1BQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0R2VuZXJhbFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSk7Ci0JCQotCQlleGNsdWRlRWNsaXBzZWxpbmtPcm1BQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1MaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RHZW5lcmFsUHJvcGVydHkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UoZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwgCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmFsUHJvcGVydHk7Ci0JfQotCi0JLy8gKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBKFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmFsUHJvcGVydGllcz4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmFsUHJvcGVydGllcywgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRXhjbHVkZUVjbGlwc2VsaW5rT3JtQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlHZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy50aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKiAKLQkJdGhpcy52ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhbFByb3BlcnRpZXMuREVGQVVMVF9FWENMVURFX0VDTElQU0VMSU5LX09STSwgdGhpcy5nZW5lcmFsUHJvcGVydHkuZ2V0RGVmYXVsdEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqIAotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtID0gIUVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLnNldFZhbHVlKG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSk7Ci0JCXRoaXMudmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIEV4Y2x1ZGVFY2xpcHNlbGlua09ybSAqKioqKioqCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuZ2VuZXJhbFByb3BlcnR5LmdldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgpLCAKLQkJCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLCAKLQkJCUdlbmVyYWxQcm9wZXJ0aWVzLkVDTElQU0VMSU5LX0VYQ0xVREVfRUNMSVBTRUxJTktfT1JNKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvZ2VuZXJhbC9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwYmU1NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9nZW5lcmFsL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuZ2VuZXJhbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUdlbmVyYWxUZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlR2VuZXJhbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VHZW5lcmFsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZDI3NTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlTG9nZ2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VMb2dnaW5nVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZUxvZ2dpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvbG9nZ2luZy9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGExMDg2OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmcuTG9nZ2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmdMZXZlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTEVWRUxfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIExFVkVMX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19USU1FU1RBTVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFXzIgPSAhIFRJTUVTVEFNUF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfVEhSRUFEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRV8yID0gISBUSFJFQURfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19TRVNTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTRVNTSU9OX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0VTU0lPTl9URVNUX1ZBTFVFXzIgPSAhIFNFU1NJT05fVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENFUFRJT05TX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIgPSAhIEVYQ0VQVElPTlNfVEVTVF9WQUxVRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFID0gIkM6L3RlbXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIgPSAiQzovdG1wIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dHRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUl9URVNUX1ZBTFVFID0gTG9nZ2VyLmphdmFfbG9nZ2VyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfVEVTVF9WQUxVRV8yID0gImN1c3RvbS5sb2dnZXIudGVzdCI7Ci0JCi0JcHVibGljIExvZ2dpbmdBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVElNRVNUQU1QX0tFWSwgVElNRVNUQU1QX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVWRUxfS0VZLCBMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUSFJFQURfS0VZLCBUSFJFQURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0tFWSwgU0VTU0lPTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTlNfS0VZLCBFWENFUFRJT05TX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fS0VZLCBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMT0dHRVJfS0VZLCBMT0dHRVJfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxFVkVMX0tFWSwKLQkJCUxFVkVMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTEVWRUxfS0VZLAotCQkJTEVWRUxfVEVTVF9WQUxVRSwKLQkJCUxFVkVMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMRVZFTF9LRVksCi0JCQlMRVZFTF9URVNUX1ZBTFVFLAotCQkJTEVWRUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRpbWVzdGFtcCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUSU1FU1RBTVBfS0VZLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJlYWQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhSRUFEX0tFWSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjZXB0aW9ucyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05TX0tFWSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ0ZpbGVMb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExvZ0ZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgcHVLZXkgPSBMT0dfRklMRV9MT0NBVElPTl9LRVk7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0KLQkJLy8gU2V0IEZpbGVMb2NhdGlvbiB0byAiIiAmIHZlcmlmeSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkCi0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShwdUtleSwgICJwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcyBkb2Vzbid0IGNvbnRhaW5zOiAiKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICIiKTsKLQotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkocHVLZXksICAiUHJvcGVydHkgd2FzIG5vdCBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9nZ2VyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxPR0dFUl9LRVksCi0JCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkpOyAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJLy8gdmVyaWZ5IHNldCBlbnVtIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRMb2dnZXIoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgc2V0dGluZyBjdXN0b20gbG9nZ2VyIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRMb2dnZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gbG9nZ2VyLgotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0KLQkJLy8gdGVzdCBzZXQgKExvZ2dlcikgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJCi0JCS8vIHRlc3Qgc2V0IGVudW0gbGl0ZXJhbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEudG9TdHJpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodGVzdFZhbHVlMSkpOwotCi0JCS8vIHRlc3Qgc2V0IChTdHJpbmcpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxFVkVMX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMZXZlbCgoTG9nZ2luZ0xldmVsKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFRpbWVzdGFtcCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRUaHJlYWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFNlc3Npb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldEV4Y2VwdGlvbnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMb2dGaWxlTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkgewotCQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMZXZlbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0VGltZXN0YW1wKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRUaHJlYWQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRTZXNzaW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0RXhjZXB0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMb2dGaWxlTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldExvZ2dlcigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGV4cGVjdGVkVmFsdWVfID0gZXhwZWN0ZWRWYWx1ZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlOwotCQl9Ci0JCXN1cGVyLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZV8pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9sb2dnaW5nL0xvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjEwNzZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL2xvZ2dpbmcvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLQotLyoqCi0gKiBMb2dnaW5nVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRpbWVzdGFtcEhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGltZXN0YW1wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHRpbWVzdGFtcEV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCXB1YmxpYyBMb2dnaW5nVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubG9nZ2luZyA9IHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+KHRoaXMubG9nZ2luZyk7Ci0JCQotCQl0aGlzLnRpbWVzdGFtcEhvbGRlciA9IHRoaXMuYnVpbGRUaW1lc3RhbXBBQShsb2dnaW5nSG9sZGVyKTsKLQkJdGhpcy50aW1lc3RhbXBMaXN0ZW5lciA9IHRoaXMuYnVpbGRUaW1lc3RhbXBDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRpbWVzdGFtcEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aW1lc3RhbXBMaXN0ZW5lcik7Ci0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdExvZ2dpbmcgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5sb2dnaW5nOyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4gdGltZXN0YW1wQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4pIHRoaXMudGltZXN0YW1wSG9sZGVyOwotCQlhc3NlcnRUcnVlKHRpbWVzdGFtcEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RMb2dnaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSk7Ci0JCQotCQl0aW1lc3RhbXBBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aW1lc3RhbXBMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RMb2dnaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRpbWVzdGFtcEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19USU1FU1RBTVAsIAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotCi0JLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEFBKFByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGltZXN0YW1wKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRpbWVzdGFtcENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLnRpbWVzdGFtcEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKFRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKExvZ2dpbmcuREVGQVVMVF9USU1FU1RBTVAsIHRoaXMubG9nZ2luZy5nZXREZWZhdWx0VGltZXN0YW1wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKiogCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRpbWVzdGFtcEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaW1lc3RhbXAgPSAhVElNRVNUQU1QX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGltZXN0YW1wSG9sZGVyLnNldFZhbHVlKG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShuZXdUaW1lc3RhbXApOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRpbWVzdGFtcEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMubG9nZ2luZy5nZXRUaW1lc3RhbXAoKSwgCi0JCQl0aGlzLnRpbWVzdGFtcEhvbGRlciwgCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmEyM2YuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9KcHRFY2xpcHNlTGlua1BlcnNpc3RlbmNlT3B0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VPcHRpb25zVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9wdGlvbnNBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZU9wdGlvbnNUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkNzIyZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlRhcmdldERhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVGFyZ2V0U2VydmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBPcHRpb24gYWRhcHRlciB3aGVuIHRoZQotICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9wdGlvbnNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSA9ICJzZXNzaW9uLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbi1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSA9ICJzZXNzaW9ucy14bWwudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbnMteG1sLTIudGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfREFUQUJBU0VfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXREYXRhYmFzZSBUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSA9IFRhcmdldERhdGFiYXNlLmNsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0RGF0YWJhc2UudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFyZ2V0U2VydmVyIFRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSA9IFRhcmdldFNlcnZlci53ZWJsb2dpY185OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0U2VydmVyLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUVfMiA9ICEgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSA9ICJhY21lLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUE9SQUxfTVVUQUJMRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yID0gISBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgT3B0aW9uc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9OQU1FX0tFWSwgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05TX1hNTF9LRVksIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEFSR0VUX0RBVEFCQVNFX0tFWSwgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRBUkdFVF9TRVJWRVJfS0VZLCBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLCBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRFTVBPUkFMX01VVEFCTEVfS0VZLCBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVNTSU9OX05BTUVfS0VZLAotCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTlNfWE1MX0tFWSwKLQkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25zWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRUYXJnZXREYXRhYmFzZSgKLQkJCVRBUkdFVF9EQVRBQkFTRV9LRVksCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIHRhcmdldERhdGFiYXNlIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChUYXJnZXREYXRhYmFzZSkgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVGFyZ2V0U2VydmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFRhcmdldFNlcnZlcigKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgYW5kIGxpdGVyYWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFRhcmdldFNlcnZlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoVGFyZ2V0U2VydmVyKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRlbXBvcmFsTXV0YWJsZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGVtcG9yYWxNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFNlc3Npb25zWG1sKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VQcm9wZXJ0eShuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyUHJvcGVydHkobmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0RXZlbnRMaXN0ZW5lcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRUZW1wb3JhbE11dGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlUHJvcGVydHkoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJQcm9wZXJ0eShPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFNlc3Npb25zWG1sKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFRhcmdldFNlcnZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB8fAotCQkJcHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gdGhpcy5jb252ZXJ0VG9FY2xpcHNlTGlua1N0cmluZ1ZhbHVlKGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZShPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZykgKChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlKTsgLy8gYWxyZWFkeSBhIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9PcHRpb25zVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhNThhMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci0KLS8qKgotICogT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBvcHRpb25zSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPih0aGlzLm9wdGlvbnMpOwotCQkKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEob3B0aW9uc0hvbGRlcik7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RPcHRpb25zID0gKEFic3RyYWN0TW9kZWwpIHRoaXMub3B0aW9uczsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0T3B0aW9ucy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKTsKLQkJCi0JCWluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCAKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotCi0JLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCU9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMudGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzICoqKioqKiogCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCB0aGlzLm9wdGlvbnMuZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gIUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMsIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCksIAotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIAotCQkJT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vSnB0RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVNjaGVtYUdlbmVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdlNzQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL0pwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VTY2hlbWFHZW5lcmF0aW9uVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUyNjVjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL3NjaGVtYS9nZW5lcmF0aW9uL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5TY2hlbWFHZW5lcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBPdXRwdXRNb2RlIG1vZGVsIG9iamVjdCBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0gKiB3aGVuIHRoZSBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuZXJhdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERETF9HRU5FUkFUSU9OX1RZUEVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFID0gRGRsR2VuZXJhdGlvblR5cGUuZHJvcF9hbmRfY3JlYXRlX3RhYmxlczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRV8yID0gRGRsR2VuZXJhdGlvblR5cGUubm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9NT0RFX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0NSRUFURV9GSUxFX05BTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSA9ICJjcmVhdGUtZmlsZS1uYW1lLnRlc3QiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMiA9ICJjcmVhdGUtZmlsZS1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19EUk9QX0ZJTEVfTkFNRTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSA9ICJkcm9wLWZpbGUtbmFtZS50ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRV8yID0gImRyb3AtZmlsZS1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19BUFBMSUNBVElPTl9MT0NBVElPTjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSA9ICJDOi90ZW1wIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRV8yID0gIkM6L3RtcCI7Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0U2NoZW1hR2VuZXJhdGlvbigpOwotCQkKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBVIHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuIENhbm5vdCB1c2UKLQkgKiBQcm9wZXJ0eSBIb2xkZXIgdG8gaW5pdGlhbGl6ZSBiZWNhdXNlIGl0IGlzIG5vdCBjcmVhdGVkIHlldAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gOTsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA1OwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjAiLCAidmFsdWUuMCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KE9VVFBVVF9NT0RFX0tFWSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoT1VUUFVUX01PREVfVEVTVF9WQUxVRSkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERETF9HRU5FUkFUSU9OX1RZUEVfS0VZLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDUkVBVEVfRklMRV9OQU1FX0tFWSwgQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShEUk9QX0ZJTEVfTkFNRV9LRVksIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwgQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENyZWF0ZUZpbGVOYW1lICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIENyZWF0ZUZpbGVOYW1lIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCi0JICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3JlYXRlRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNyZWF0ZUZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDUkVBVEVfRklMRV9OQU1FX0tFWSwKLQkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSwKLQkJCUNSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBEcm9wRmlsZU5hbWUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgRHJvcEZpbGVOYW1lIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLQkgKiB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RHJvcEZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRFJPUF9GSUxFX05BTUVfS0VZLAotCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURyb3BGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRFJPUF9GSUxFX05BTUVfS0VZLCAKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUsIAotCQkJRFJPUF9GSUxFX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEFwcGxpY2F0aW9uTG9jYXRpb24gKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQXBwbGljYXRpb25Mb2NhdGlvbiBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldEFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQXBwbGljYXRpb25Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEVtcHR5QXBwbGljYXRpb25Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgcHVLZXkgPSBBUFBMSUNBVElPTl9MT0NBVElPTl9LRVk7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0KLQkJLy8gU2V0IEFwcGxpY2F0aW9uTG9jYXRpb24gdG8gIiIgJiB2ZXJpZnkgdGhhdCB0aGUgcHJvcGVydHkgaXMgZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkocHVLZXksICAicGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMgZG9lc24ndCBjb250YWluczogIik7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCAiIik7Ci0KLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KHB1S2V5LCAgIlByb3BlcnR5IHdhcyBub3QgZGVsZXRlZCIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSkpOwotCX0KLQotCS8vICoqKioqKioqKiogT3V0cHV0TW9kZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBPdXRwdXRNb2RlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLQkgKiB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3V0cHV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlPVVRQVVRfTU9ERV9LRVksCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCU9VVFBVVF9NT0RFX0tFWSwKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVPdXRwdXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlPVVRQVVRfTU9ERV9LRVksIAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSwgCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgRGRsR2VuZXJhdGlvblR5cGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24KLQkgKiBhZGFwdGVyIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXREZGxHZW5lcmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRGRsR2VuZXJhdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfS0VZLCAKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSwgCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldE91dHB1dE1vZGUoKE91dHB1dE1vZGUpIG5ld1ZhbHVlKTsKLQkJLy8gZWxzZSBpZiggcHJvcGVydHlOYW1lLmVxdWFscyggQ2FjaGluZy5DQUNIRV9TSVpFX1BST1BFUlRZKSkKLQkJLy8gVE9ETwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0RGRsR2VuZXJhdGlvblR5cGUoKERkbEdlbmVyYXRpb25UeXBlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0QXBwbGljYXRpb25Mb2NhdGlvbigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5DUkVBVEVfRklMRV9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRDcmVhdGVGaWxlTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5EUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0RHJvcEZpbGVOYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0RGRsR2VuZXJhdGlvblR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkFQUExJQ0FUSU9OX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0QXBwbGljYXRpb25Mb2NhdGlvbigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldENyZWF0ZUZpbGVOYW1lKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5EUk9QX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldERyb3BGaWxlTmFtZSgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUdlbmVyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwNTY1ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5EZGxHZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5zY2hlbWEuZ2VuZXJhdGlvbi5PdXRwdXRNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLlNjaGVtYUdlbmVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgbW9kZWwgb2JqZWN0IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLSAqIHdoZW4gdGhlIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBvdXRwdXRNb2RlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZGxHZW5UeXBlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDY7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMjsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoZGRsR2VuVHlwZUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiogKioqKioqIHRlc3QgbWV0aG9kcyAqKioqKioqICovCi0KLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotCSAqIHdoZW4gdGhlIFBVIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dE1vZGVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIpOwotCQlMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4ocHJvcGVydGllc0FkYXB0ZXIsIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSk7Ci0JCQotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkKLQkJLy8gQmFzaWMKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFHZW5lcmF0aW9uLml0ZW1Jc1Byb3BlcnR5KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSkpKTsKLQkJYXNzZXJ0RXF1YWxzKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob3V0cHV0TW9kZUtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBPdXRwdXRNb2RlCi0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZSBhZ2FpbgotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PihzdWJqZWN0SG9sZGVyLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJvcGVydGllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wcm9wZXJ0aWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9zY2hlbWEvZ2VuZXJhdGlvbi9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZGE2YWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2Uvc2NoZW1hL2dlbmVyYXRpb24vU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLnNjaGVtYS5nZW5lcmF0aW9uLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2Uuc2NoZW1hLmdlbmVyYXRpb24uU2NoZW1hR2VuZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotCi0vKioKLSAqIFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMKLSAqIAotICogVGVzdHMgdGhlIFByb3BlcnR5VmFsdWVNb2RlbCBvZiBTY2hlbWFHZW5lcmF0aW9uIG1vZGVsIGFuZCB0aGUgdXBkYXRlIG9mIHRoZQotICogUGVyc2lzdGVuY2VVbml0LgotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHNjaGVtYUdlbkhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGRkbEdlbmVyYXRpb25UeXBlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBkZGxHZW5lcmF0aW9uVHlwZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPdXRwdXRNb2RlPiBvdXRwdXRNb2RlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBvdXRwdXRNb2RlRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNjaGVtYUdlbiA9IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7IC8vIFN1YmplY3QKLQkJdGhpcy5zY2hlbWFHZW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+KHRoaXMuc2NoZW1hR2VuKTsKLQkJCi0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGRsR2VuZXJhdGlvblR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGRkbEdlbmVyYXRpb25UeXBlTGlzdGVuZXIpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb3V0cHV0TW9kZUxpc3RlbmVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG91dHB1dE1vZGVMaXN0ZW5lcik7Ci0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQotCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuOwotCX0KLQotCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4oc3ViamVjdEhvbGRlciwgU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKERkbEdlbmVyYXRpb25UeXBlIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXREZGxHZW5lcmF0aW9uVHlwZShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERkbEdlbmVyYXRpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE91dHB1dE1vZGU+IGJ1aWxkT3V0cHV0TW9kZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+KHN1YmplY3RIb2xkZXIsIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE91dHB1dE1vZGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE91dHB1dE1vZGUoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRPdXRwdXRNb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMub3V0cHV0TW9kZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpKTsKLQkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGVmYXVsdE91dHB1dE1vZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5lcmF0aW9uVHlwZSA9IERkbEdlbmVyYXRpb25UeXBlLmNyZWF0ZV90YWJsZXM7Ci0JCS8vIE1vZGlmeSB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld0RkbEdlbmVyYXRpb25UeXBlKSwKLQkJCWZhbHNlKTsKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobmV3RGRsR2VuZXJhdGlvblR5cGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCk7Ci0JCQotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3V0cHV0TW9kZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLnNldFZhbHVlKG5ld091dHB1dE1vZGUpOwotCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKG5ld091dHB1dE1vZGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMub3V0cHV0TW9kZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsIG51bGwsIGZhbHNlKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQkJYXNzZXJ0TnVsbChwcm9wZXJ0eSk7Ci0JCQotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5vdXRwdXRNb2RlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUpOwotCQlhc3NlcnROdWxsKHByb3BlcnR5KTsKLQl9Ci0KLQkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLwotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERkbEdlbmVyYXRpb25UeXBlKCksCi0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUoT3V0cHV0TW9kZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0T3V0cHV0TW9kZSgpLAotCQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhNTU3Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhRWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZihKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5yZXF1aXJlZEphcnNFeGlzdHMoKSkgewotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUud2FybmluZyhKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmVhOWZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NhY2hlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDYWNoZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZSh0eXBlID0gQ2FjaGVUeXBlLlNPRlQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2l6ZSA9IDUwKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5ID0gNTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2hhcmVkPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShhbHdheXNSZWZyZXNoPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShyZWZyZXNoT25seUlmTmV3ZXI9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZGlzYWJsZUhpdHM9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ2FjaGVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlVHlwZS5TT0ZULCBjYWNoZS5nZXRUeXBlKCkpOwotCQkKLQkJY2FjaGUuc2V0VHlwZShDYWNoZVR5cGUuV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZVR5cGUuV0VBSywgY2FjaGUuZ2V0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUodHlwZSA9IFdFQUspIiwgY3UpOwotCQkKLQkJY2FjaGUuc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIih0eXBlID0gV0VBSykiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIGNhY2hlLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGUuc2V0U2l6ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNpemUgPSA4MCkiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRTaXplKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHNpemUgPSA4MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQkJCi0JCWNhY2hlLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldFNoYXJlZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoc2hhcmVkPWZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCQkKLQkJY2FjaGUuc2V0U2hhcmVkKG51bGwpOwotCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwKSwgY2FjaGUuZ2V0RXhwaXJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIGNhY2hlLmdldEV4cGlyeSgpKTsKLQkJCi0JCWNhY2hlLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIGNhY2hlLmdldEV4cGlyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoZXhwaXJ5ID0gODApIiwgY3UpOwotCQkKLQkJY2FjaGUuc2V0RXhwaXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldEV4cGlyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoZXhwaXJ5ID0gODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydE5vdE51bGwodGltZU9mRGF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGUuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCWNhY2hlLnJlbW92ZUV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFsd2F5c1JlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEFsd2F5c1JlZnJlc2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJY2FjaGUuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGFsd2F5c1JlZnJlc2g9ZmFsc2UpIiwgY3UpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWNhY2hlLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0JCWNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE51bGwoY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJY2FjaGUuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShyZWZyZXNoT25seUlmTmV3ZXI9ZmFsc2UpIiwgY3UpOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmcmVzaE9ubHlJZk5ld2VyTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoUmVmcmVzaE9ubHlJZk5ld2VyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCWNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE51bGwoY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQkKLQkJY2FjaGUuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoZGlzYWJsZUhpdHM9ZmFsc2UpIiwgY3UpOwkJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGlzYWJsZUhpdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCQotCQljYWNoZS5zZXREaXNhYmxlSGl0cyhudWxsKTsKLQkJY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aENvb3JkaW5hdGlvblR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aENvb3JkaW5hdGlvblR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoZS5zZXRDb29yZGluYXRpb25UeXBlKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGNvb3JkaW5hdGlvblR5cGUgPSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUykiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGNvb3JkaW5hdGlvblR5cGUgPSBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUykiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE4Mjk0MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hhbmdlVHJhY2tpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ2hhbmdlVHJhY2tpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkdfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENoYW5nZVRyYWNraW5nIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2hhbmdlVHJhY2tpbmcoQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydE5vdE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQlhc3NlcnRFcXVhbHMoQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlleGlzdGVuY2VDaGVja2luZy5zZXRWYWx1ZShDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJYXNzZXJ0RXF1YWxzKENoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDaGFuZ2VUcmFja2luZyhBVFRSSUJVVEUpIiwgY3UpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKEFUVFJJQlVURSkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2hhbmdlVHJhY2tpbmciLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2hhbmdlVHJhY2tpbmcoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzRhMGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5zZXREYXRhVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRk9PXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldERhdGFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKSIsIGN1KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZSkiLCBjdSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2RjM2U3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29udmVydEFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIENvbnZlcnRBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KHZhbHVlPVwibXlDb252ZXJ0ZXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQodmFsdWU9XCJCYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiNWE4NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcz1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcz1CYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNvbnZlcnRlckNsYXNzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlcihuYW1lPVwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZmU3Y2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDdXN0b21pemVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQ3VzdG9taXplckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDdXN0b21pemVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDdXN0b21pemVyKEZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbWl6ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ3VzdG9taXplcihCYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDdXN0b21pemVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vLmNsYXNzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWVlMTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2IyNmUyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVdpdGhQcmltYXJ5S2V5QW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZVdpdGhQcmltYXJ5S2V5QW5ub3RhdGlvbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCWFzc2VydE5vdE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSkpOwotCQkKLQkJdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmQyNzUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HLCBFY2xpcHNlTGluay5FWElTVEVOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEV4aXN0ZW5jZUNoZWNraW5nIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARXhpc3RlbmNlQ2hlY2tpbmcoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWFzc2VydE5vdE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uIGV4aXN0ZW5jZUNoZWNraW5nID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlhc3NlcnRFcXVhbHMoRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZyA9IChFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlleGlzdGVuY2VDaGVja2luZy5zZXRWYWx1ZShFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKEV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFeGlzdGVuY2VDaGVja2luZyhBU1NVTUVfTk9OX0VYSVNURU5DRSkiLCBjdSk7Ci0JCQotCQlleGlzdGVuY2VDaGVja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoQVNTVU1FX05PTl9FWElTVEVOQ0UpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEV4aXN0ZW5jZUNoZWNraW5nIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEV4aXN0ZW5jZUNoZWNraW5nKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdkMDU4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luRmV0Y2hUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKb2luRmV0Y2hUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSm9pbkZldGNoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5PVVRFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0Tm90TnVsbChqb2luRmV0Y2gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCk7Ci0JCWFzc2VydEVxdWFscyhKb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luRmV0Y2hXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJYXNzZXJ0RXF1YWxzKEpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkZldGNoKElOTkVSKSIsIGN1KTsKLQkJCi0JCWpvaW5GZXRjaC5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKElOTkVSKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luRmV0Y2giLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkZldGNoKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGRlZjMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYW5nZVRyYWNraW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbnZlcnRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luRmV0Y2hUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdXRhYmxlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaXZhdGVPd25lZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUaW1lT2ZEYXlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NdXRhYmxlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjFiZjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNdXRhYmxlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTXV0YWJsZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlKHZhbHVlPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsJCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdXRhYmxlKHZhbHVlPWZhbHNlKSIsIGN1KTsKLQkJCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdXRhYmxlKGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATXV0YWJsZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2U2MzhiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9Rm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiYmFyXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGRlZmF1bHRPYmplY3RWYWx1ZSA9IFwiZlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPUJhci5jbGFzcykiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGRhdGFUeXBlPWludC5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRhdGFUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUJhci5jbGFzcykiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiaW50Iik7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPWludC5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGVmYXVsdE9iamVjdFZhbHVlID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0T2JqZWN0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRlZmF1bHRPYmplY3RWYWx1ZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydFRydWUoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZXMoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJiYXJcIiwgY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiQkFSXCIpLEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpfSkiLCBjdSk7Ci0KLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVzKCk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIikpIiwgY3UpOwotCi0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGNvbnZlcnNpb25WYWx1ZXMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoIk1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIil9KSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Qcml2YXRlT3duZWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZDQwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Qcml2YXRlT3duZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZU93bmVkVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFByaXZhdGVPd25lZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpdmF0ZU93bmVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcml2YXRlT3duZWQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uIHByaXZhdGVPd25lZCA9IChFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCWFzc2VydE5vdE51bGwocHJpdmF0ZU93bmVkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MGQ1Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkT25seVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkT25seSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOyAKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uIHJlYWRPbmx5ID0gKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQlhc3NlcnROb3ROdWxsKHJlYWRPbmx5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNmMyMDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZFRyYW5zZm9ybWVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZFRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3M9Rm9vLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZFRyYW5zZm9ybWVyKG1ldGhvZD1cInRyYW5zZm9ybWVyTWV0aG9kXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikJOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3M9QmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocmVhZFRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRyYW5zZm9ybWVyQ2xhc3MiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbiByZWFkVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRNZXRob2QoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lcihtZXRob2Q9XCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCByZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJcmVhZFRyYW5zZm9ybWVyLnNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZWFkVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtZXRob2QiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5ODVmZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RydWN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJCYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU3RydWN0Q29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29udmVydGVyIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU3RydWN0Q29udmVydGVyKG5hbWU9XCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGltZU9mRGF5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkMGRhZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUaW1lT2ZEYXlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVGltZU9mRGF5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhIb3VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KGhvdXI9NSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFLCBFY2xpcHNlTGluay5USU1FX09GX0RBWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlKGV4cGlyeVRpbWVPZkRheSA9IEBUaW1lT2ZEYXkobWludXRlPTUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KHNlY29uZD01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KG1pbGxpc2Vjb25kPTUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGltZU9mRGF5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEhvdXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhIb3VyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRIb3VyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRIb3VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoSG91cigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldEhvdXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShob3VyPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRIb3VyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihob3VyPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWludXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWludXRlKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRNaW51dGUoKSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0TWludXRlKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldE1pbnV0ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5KG1pbnV0ZT04MCkiLCBjdSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0TWludXRlKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRNaW51dGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG1pbnV0ZT04MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhTZWNvbmQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHRpbWVPZkRheS5nZXRTZWNvbmQoKSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0U2Vjb25kKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5KHNlY29uZD04MCkiLCBjdSk7Ci0JCQotCQl0aW1lT2ZEYXkuc2V0U2Vjb25kKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRTZWNvbmQoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHNlY29uZD04MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGltZU9mRGF5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWlsbGlzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaWxsaXNlY29uZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWlsbGlzZWNvbmQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1pbGxpc2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWlsbGlzZWNvbmQoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYzQwOTMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2Zvcm1hdGlvbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTiwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2Zvcm1hdGlvbihmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb24oKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2Uuc2V0UHJpbWFyeUFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04sIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwodHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbCh0cmFuc2Zvcm1hdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHJhbnNmb3JtYXRpb24iLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZDRhYzcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IEJhci5jbGFzcykiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoImludCIpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKGRhdGFUeXBlID0gaW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJkYXRhVHlwZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihvYmplY3RUeXBlID0gQmFyLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJpbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBpbnQuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MmJiZTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcyA9IEZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcInRyYW5zZm9ybWVyTWV0aG9kXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUiwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIoY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUikpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUikJOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuc2V0VHJhbnNmb3JtZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3MgPSBCYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNmb3JtZXJDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidHJhbnNmb3JtZXJDbGFzcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2Zvcm1lck1ldGhvZCIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5zZXRNZXRob2QoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuc2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWV0aG9kIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFUeXBlUmVzb3VyY2UoY3UpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLmZpZWxkcygpLm5leHQoKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLmFkZENvbHVtbigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiLCBjb2x1bW4gPSBAQ29sdW1uKSIsIGN1KTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcInRyYW5zZm9ybWVyTWV0aG9kXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiQkFSXCIpKSIsIGN1KTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIucmVtb3ZlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdldE5vbk51bGxDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTE2MDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjFfMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAiamF2YXgucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzEpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9FY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDFhYzcxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBFY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayAxLjEgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMUNvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjEgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIAotCQkJCUpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzFDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMS5TQ0hFTUFfVkVSU0lPTik7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMSBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8xX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmNzYxYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMS9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybS5KcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8xQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsxXzFDb3JlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1N2U2OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYxXzEuRWNsaXBzZUxpbmsxXzE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYxXzEuY29udGV4dC5FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmsxXzFPcm1YbWxSZXNvdXJjZTsKLQkKLQkKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5lY2xpcHNlTGluazFfMU9ybVhtbFJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGRvbid0IGNyZWF0ZSBkZWZhdWx0IG9ybS54bWwgLSBpbnN0ZWFkIGJ1aWxkIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uRkFMU0UpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QgPSBzdXBlci5idWlsZEpwYVByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwganBhQ29uZmlnKTsKLQkJCi0JCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJbmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcodGVzdEpwYVByb2plY3QpKTsKLQkJb3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQotCQlyZXR1cm4gdGVzdEpwYVByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkRWNsaXBzZUxpbmtPcm1Db25maWcoVGVzdEpwYVByb2plY3QgdGVzdEpwYVByb2plY3QpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSAKLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQl0ZXN0SnBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuVkVSU0lPTiwgRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT04pOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5lY2xpcHNlTGluazFfMU9ybVhtbFJlc291cmNlID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5lY2xpcHNlTGluazFfMU9ybVhtbFJlc291cmNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZGQ3YjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjFfMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2UuRGVmYXVsdEFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMU9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQkvLyBjcmVhdGUgYm90aCBvcm0ueG1sIGFuZCBlY2xpcHNlbGluay1vcm0ueG1sCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWxOb1VuZGVybHlpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKS5zZXROYW1lKCJub0phdmFBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdUeXBlV2hlbk1ldGFkYXRhQ29tcGxldGUoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlMigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmlzRmllbGQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnBlcnNpc3RhYmxlRmllbGRzKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCQotCQkvL3NwZWNpZmllZCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy9qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBzaG91bGQgYmUgPT0gdG8gamF2YSBjb250ZXh0IG1vZGVsIG9iamVjdAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCi0JCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgamF2YSBhY2Nlc3MgdHlwZSBGSUVMRCwgb3JtIGFjY2VzcyB0eXBlIFBST1BFUlRZLCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL3ZlcmlmeSB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyB1c2VkIGluIG9ybS4KLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWFzc2VydFRydWUoamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5wZXJzaXN0YWJsZVByb3BlcnRpZXMoKS5uZXh0KCksIGphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsvL2RlZmF1bHQgYWNjZXNzIHdpbGwgYmUgZmllbGQKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQyIik7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkIik7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1peGVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7Ci0JCQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzRmllbGQoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZpZWxkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUHJvcGVydHlJbkphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZ1Byb3BlcnR5QWNjZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1Byb3BlcnR5KCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzUHJvcGVydHkoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNQcm9wZXJ0eSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMS9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2ExZjE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsxXzFPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCS8vIGNyZWF0ZSBib3RoIG9ybS54bWwgYW5kIGVjbGlwc2VsaW5rLW9ybS54bWwKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0vLwkKLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVBY2Nlc3NUeXBlRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSwgIkFjY2Vzc1R5cGUiLCAiRklFTEQsIFBST1BFUlRZOyIpOwkKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUsICJBY2Nlc3MiLCAiQWNjZXNzVHlwZSB2YWx1ZSgpOyIpOwotLy8JCWNyZWF0ZUFjY2Vzc1R5cGVFbnVtKCk7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKTsKLS8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotLy8JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLS8vCQkJfQotLy8JCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLS8vCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJASWQiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBJZCIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpOwotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotLy9UT0RPIEFjY2VzcyBhbm5vdGF0aW9uIHRlc3QJCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzV2l0aEphdmFBbm5vdGF0aW9uc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotLy8JCQotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLS8vCQkKLS8vCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8KLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDI4MjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8xLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMV8xT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zaWVudCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8xL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NmM0MjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzEvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYxXzEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8xQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzFDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwkKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGluazFfMUNvcmVPcm1Db250ZXh0TW9kZWxUZXN0cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzIvY29udGV4dC9FY2xpcHNlTGluazFfMkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMi9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlZTcwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMi9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8yLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzIpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzIvY29udGV4dC9FY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YxXzIvY29udGV4dC9FY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5NjI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8yL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8yLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8yLkVjbGlwc2VMaW5rMV8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBFY2xpcHNlTGluazFfMkpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayAxLjIgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMkNvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjIgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIAotCQkJCUpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzJDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMi5TQ0hFTUFfVkVSU0lPTik7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMiBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8yL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92MV8yL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkZWU1OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjFfMi9jb250ZXh0L0pwdEVjbGlwc2VMaW5rMV8yQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52MV8yLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMV8yQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0RWNsaXBzZUxpbmsxXzJDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkvLwlzdWl0ZS5hZGRUZXN0KEpwdEVjbGlwc2VMaW5rMV8yQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGluazFfMkNvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlMTY5Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L0VjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8wKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9KcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9KcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjIxY2U3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhLkpwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtLkpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqICBKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsyXzBDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfMENvcmVDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MGRlMmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2UuRGVmYXVsdEFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlMyA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzKTsKLQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlMy5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCS8vYWRkIHRoZSBjb2xsZWN0aW9uIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGNvbGxlY3Rpb24gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCBjb2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgdGhlIGVudGl0eSBuYW1lLCB2ZXJpZnkgZGVmYXVsdCBjb2xsZWN0aW9uIHRhYmxlIG5hbWUgdXBkYXRlcwotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vX3Byb2plY3RzIiwgY29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCQotCQljb2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJY29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCS8vVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBjb2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0KLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotCi0KLQkJY29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24udW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjFiNzJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJBZGRyZXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PEZvbz4gZWxlbWVudENvbGxlY3Rpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRm9vLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLnNldFRhcmdldENsYXNzKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbWJlZGRhYmxlLCBkZWZhdWx0IHRhcmdldCBlbnRpdHkgc3RpbGwgZXhpc3RzLCB0aGlzIGNhc2UgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NOb25HZW5lcmljQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc0dlbmVyaWNDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NOb25HZW5lcmljTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NHZW5lcmljTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nKSB7Ci0JCXJldHVybiAoRW1iZWRkYWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWFwcGluZywgImdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXQgZW1iZWRkYWJsZSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQkJCi0JCS8vYWRkIHRhcmdldCBlbWJlZGRhYmxlIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVtYmVkZGFibGUgc2hvdWxkIHJlc29sdmUKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JCQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVtYmVkZGFibGVXaXRoQmFzaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0IGlzIGEgYmFzaWMgdHlwZSwgc28gcmVzb2x2ZWQgdGFyZ2V0IGVtYmVkZGFibGUgaXMgbnVsbAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5FTUJFRERBQkxFX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQltYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJBZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9IG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX2FkZHJlc3NlcyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX2FkZHJlc3NlcyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUubmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4pIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4pIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4pIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBzdGF0ZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJQmFzaWNNYXBwaW5nIGFiYnJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3RhdGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWJiciIpLmdldE1hcHBpbmcoKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy5zdGF0ZSkgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gU3RhdGUuYWJicgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJhYmJyIik7Ci0JCWFzc2VydEVxdWFscygiYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2NvbGxlY3Rpb24gdGFibGUgbmFtZQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MTEVDVElPTl9UQUJMRSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9wYXJjZWxzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgcHJvcGVydHlJbmZvRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBwYXJjZWxOdW1iZXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcHJvcGVydHlJbmZvRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxOdW1iZXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIxIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRjEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PMSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUjEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRjEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoInZhbHVlLnBhcmNlbE51bWJlciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDUsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUubmFtZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzaXplIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4pIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic2l6ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGF4IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4pIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4pIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWF0dHJpYnV0ZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDMsIDIsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUucGFyY2VsTnVtYmVyIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Gb28iKTsKLQkJCi0JCS8vSWYgdGhlcmUgaXMgYSBTdGFja092ZXJmbG93RXJyb3IgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IHRoZSBtYXBwaW5nCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI1NTk1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInt9Iik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCUphdmFFbnRpdHkgc3VwZXJjbGFzcyA9IChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLS8vCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigyLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7CQotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkub3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQl0eXBlUmVzb3VyY2UubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXR5cGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCi0JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQkKLS8vCQkvL1RPRE8gam9pbkNvbHVtbnMgZm9yIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzCi0vLy8vCUlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwotLy8vLwlJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKElNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCQotLy8vLwlJT25lVG9PbmVNYXBwaW5nIGFkZHJlc3NNYXBwaW5nID0gKElPbmVUb09uZU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLS8vLy8JSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGFkZHJlc3NNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVoiKTsKLS8vLy8JCi0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFaIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCi0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCi0vLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwlqYXZhRW50aXR5LmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCkuc2V0TmFtZSgiYWRkcmVzcyIpOwotLy8vLwlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSB0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gdHlwZVJlc291cmNlLmFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSAoSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJdHlwZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPikgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4pIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+KSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7CQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4pIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQlzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpOwotCQlQZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuc3BlY2lmaWVkQ2xhc3NSZWZzKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4pIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKHRydWUpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsICBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0LmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpLmdldFBhcmVudEVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjE5NTU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8SW50ZWdlciwgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFubm90YXRpb25UZXN0VHlwZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQltYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZzJfMCA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nMl8wID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJBZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3NBbm5vdGF0aW9uID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24pOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRRdWV1ZSIpOwotCQlNYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHF1ZXVlc01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInF1ZXVlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBqb2JzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIGpvYnNPcmRlckNvbHVtbiA9IGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOyAvL3RoZSBqb2luIHRhYmxlIG5hbWUKLQkJT3JkZXJhYmxlMl8wIHF1ZXVlc09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBxdWV1ZXNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgcXVldWVzT3JkZXJDb2x1bW4gPSBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWpvYnNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPVEhFUl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlxdWV1ZXNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KG1hcHBlZEJ5PVwicXVldWVzXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludEpvYiIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50UXVldWU+IHF1ZXVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWVzIik7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzc18iICsgVFlQRV9OQU1FLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZSBvZiBvd25pbmcgbWFueS10by1tYW55Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgb3duaW5nTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kpIG93bmluZ01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5UYWJsZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCBhdHRyaWJ1dGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLnNwZWNpZmllZENsYXNzUmVmcygpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgia2V5LmNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTBhNmUxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2UuRGVmYXVsdEFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQE1hcHNJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbWFueVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZFZhbHVlKCJmb28iKTsKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHJlc291cmNlVHlwZSA9IAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQkKLQkJKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RmFsc2UoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDA4NzNiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAUmVhZE9ubHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCS8vVE9ETyB0ZXN0IGluaGVyaXRpbmcgYSBkZWZhdWx0IHJlYWRvbmx5IGZyb20geW91IHN1cGVyY2xhc3MKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aFJlYWRPbmx5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCQkKLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJCi0JCXR5cGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uKTsKLQotCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21pemVyQ2xhc3NVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQl0eXBlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgdHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSB0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50VHlwZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldFJlc291cmNlUGVyc2lzdGVudFR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCAgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkSXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NjAxYTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlLkRlZmF1bHRBbm5vdGF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkJCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb01hbnlHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnkuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7IAkvLyAuZ2V0RWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb01hbnkuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJamF2YU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGphdmFPbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gamF2YU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJYXR0cmlidXRlUmVzb3VyY2UucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShtYXBwZWRCeT1cInF1ZXVlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcmludFF1ZXVlIHF1ZXVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5NYXBwZWRCeVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWUiKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vb3dpbmcgZW50aXR5IHRhYmxlIG5hbWUKLQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5UYWJsZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vam9pbiB0YWJsZSBuYW1lCi0KLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKChKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0c0pvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZVJlc291cmNlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgYXR0cmlidXRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBhZGRyZXNzRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBjaXR5TWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGFkZHJlc3NFbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIGF0dHJpYnV0ZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg3LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzaXplIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlTW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlhdHRyaWJ1dGVSZXNvdXJjZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQwZDVhZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2UuRGVmYXVsdEFubm90YXRpb25Xcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKG9ycGhhblJlbW92YWw9ZmFsc2UpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgcmVzb3VyY2VUeXBlID0gCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSByZXNvdXJjZVR5cGUgPSAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJLy8gdGhpcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIChpdCB3YXMgYSBiaXQgb2YgYSB0ZXN0aW5nIGhhY2sgYW55d2F5Li4uKQotCQkvLyBjb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJLy8gdGhlICpyZWFsKiB0ZXN0IGlzIHdoZXRoZXIgdGhlIElkIGFubm90YXRpb24gc3RpbGwgcmVzdWx0cyBpbiBhIDE6MSBtYXBwaW5nLi4uCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShudWxsKTsgIC8vIGNsZWFyIGFueSBtYXBwaW5nIGFubm90YXRpb24KLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSUQpOyAgLy8gYWRkIElkIGFubm90YXRpb24KLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFPbmVUb09uZU1hcHBpbmcyXzApOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTWFueVRvT25lTWFwcGluZzJfMCk7CQotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkT25lVG9PbmVHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIHR5cGVSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIGF0dHJpYnV0ZVJlc291cmNlLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgdHlwZVJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZVJlc291cmNlID0gdHlwZVJlc291cmNlLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOyAJLy8gLmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydFNhbWUob25lVG9PbmVNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGVSZXNvdXJjZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKS5wZXJzaXN0YWJsZUF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpLnBlcnNpc3RhYmxlQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9qYXZhL0pwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiNjVmYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGluazJfMEphdmFDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmsyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlmYjhhYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDb2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gcHJvamVjdHM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbGxlY3Rpb25UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFDb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJwcm9qZWN0cyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wICB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0KLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sbGVjdGlvblRhYmxlLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUudW5pcXVlQ29uc3RyYWludHMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgdmlydHVhbENvbGxlY3Rpb25UYWJsZSA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuaXNWaXJ0dWFsKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gKExpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PikgdmlydHVhbENvbGxlY3Rpb25UYWJsZS51bmlxdWVDb25zdHJhaW50cygpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVzKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBqYXZhQ29sbGVjdGlvblRhYmxlID0gamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSAoTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+KSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQl2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS51bmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTgyOGI5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5FY2xpcHNlTGluazJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGluazJfME9ybVhtbFJlc291cmNlOwotCQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmVjbGlwc2VMaW5rMl8wT3JtWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gc3VwZXIuYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKTsKLQkJLy8gZG9uJ3QgY3JlYXRlIGRlZmF1bHQgb3JtLnhtbCAtIGluc3RlYWQgYnVpbGQgZWNsaXBzZWxpbmstb3JtLnhtbAotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DUkVBVEVfT1JNX1hNTCwgQm9vbGVhbi5GQUxTRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqcGFDb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCA9IHN1cGVyLmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwotCQkKLQkJRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24gb3BlcmF0aW9uID0gCi0JCQluZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24oYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyh0ZXN0SnBhUHJvamVjdCkpOwotCQlvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCi0JCXJldHVybiB0ZXN0SnBhUHJvamVjdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCXRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazJfMC5TQ0hFTUFfVkVSU0lPTik7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19QRVJTSVNURU5DRV9VTklULCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmVjbGlwc2VMaW5rMl8wT3JtWG1sUmVzb3VyY2UgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmVjbGlwc2VMaW5rMl8wT3JtWG1sUmVzb3VyY2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNTQxYmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlLkRlZmF1bHRBbm5vdGF0aW9uV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzPVN0cmluZy5jbGFzcywgZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW49QENvbHVtbihuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdHJpbmc+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRm9vIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxGb28+IGVsZW1lbnRDb2xsZWN0aW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuc3BlY2lmaWVkQXR0cmlidXRlcygpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygibmV3VGFyZ2V0Q2xhc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRDbGFzcyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuQkFTSUNfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJb25lVG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5KCkpOy8vbm8gcHJpbWFyeSBrZXkgb24gYW4gZW1iZWRkYWJsZQotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHhtbE9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHhtbE9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgeG1sT25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHhtbE9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlvcmRlcmFibGUgPSAoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcmRlcmFibGUyXzApIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxWYWx1ZUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vdmlydHVhbCBhdHRydWJ0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUgQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vbm8gbG9uZ2VyIGFuIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPikgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSAoTGlzdEl0ZXJhdG9yPEF0dHJpYnV0ZU92ZXJyaWRlPikgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfU1RBVEVfQ09MVU1OIik7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gKExpc3RJdGVyYXRvcjxBdHRyaWJ1dGVPdmVycmlkZT4pIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIub3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IChMaXN0SXRlcmF0b3I8QXR0cmlidXRlT3ZlcnJpZGU+KSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vbm8gbG9uZ2VyIGFuIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIHNob3VsZCBoYXZlIG5vIGFmZmVjdCBvbiB0aGUgY29sbGVjdGlvbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQl2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkZvbyIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVsZW1lbnRDb2xsZWN0aW9uIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYXBwaW5nLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkuaGFzTmV4dCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjA0Mzg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZS5EZWZhdWx0QW5ub3RhdGlvbldyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUsIEpQQS5NQU5ZX1RPX09ORSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpOwotCQkJCXNiLmFwcGVuZCgiYWJzdHJhY3QiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkub3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5Lm92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIG9ybUVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLS8vVE9ETwotLy8JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQkKLS8vCQlJdGVyYXRvcjxQZXJzaXN0ZW50QXR0cmlidXRlPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG9ybUVudGl0eS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDEsIDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCU9ybUVudGl0eSBzdXBlcmNsYXNzID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQkKLQkJc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsJCi0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGVudGl0eS5vdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gb3JtRW50aXR5LmFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgxLCAwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLS8vCi0vLwkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8JCS8vQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLm92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5vdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJSXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnNwZWNpZmllZE92ZXJyaWRlcygpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuc3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsJCi0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5zcGVjaWZpZWRPdmVycmlkZXMoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0cmVldCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLmNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCXppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQljdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZpcnR1YWxPdmVycmlkZXMoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmlydHVhbE92ZXJyaWRlcygpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52aXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlMl8wID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZW50aXR5KS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tTWFwcGVkU3VwZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFiMWMzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkoZmV0Y2g9RmV0Y2hUeXBlLkVBR0VSLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNILCBDYXNjYWRlVHlwZS5ERVRBQ0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQl2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQltYW55VG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlNYW55VG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImpvYnMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgam9ic01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJam9ic01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWpvYnNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgicXVldWVzIik7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInF1ZXVlcyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBxdWV1ZXNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlnZXRPcm1YbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIHF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJCi0JCWpvYnNPcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPVEhFUl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlxdWV1ZXNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJxdWV1ZXMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCWpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxKb2JzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsSm9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCXF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlMiA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInF1ZXVlcyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsUXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbFF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcmRlcmFibGUyXzApIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhUXVldWVzTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpPSU5fVEFCTEUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJxdWV1ZXNcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50UXVldWU+IHF1ZXVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vYmVjb21lcyBhIDEtbSBieSBkZWZhdWx0Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL2VudGl0eSB0YWJsZSBjaGFuZ2VzIHRoZSBqb2luIHRhYmxlIGRlZmF1bHQgbmFtZQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCW9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLnNwZWNpZmllZEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2EyNWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUssIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcj4gb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5jdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuY3VzdG9tQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmN1c3RvbUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIudHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci50eXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIub2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5vYmplY3RUeXBlQ29udmVydGVycygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuYWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5zdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuc3RydWN0Q29udmVydGVycygpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5hbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnN0cnVjdENvbnZlcnRlcnMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUyXzAgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0KLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1N1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1Yk1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGphdmFDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJamF2YUNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21NYXBwZWRTdXBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgc3ViTWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgc3ViTWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDhjM2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFiYnI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkJCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBvcnBoYW5SZW1vdmFsID0gdHJ1ZSwgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNILCBDYXNjYWRlVHlwZS5ERVRBQ0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCi0JcHJpdmF0ZSBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbE9mKE9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZykgewotCQlyZXR1cm4gKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvTWFueVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FXyArICJTdGF0ZSIpOwotCi0JCU9uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhIGNvbXBsZXRlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgb3JtIG1vZGVsIGlnbm9yZXMgdGhlIGphdmEgYW5ub3RhdGlvbnMKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCXZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmNhbmRpZGF0ZU1hcEtleU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuY2FuZGlkYXRlTWFwS2V5TmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5jYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCW9uZVRvTWFueS5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCQotCQkvL3NldCBjdXN0b20gc3BlY2lmaWVkIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJqb2JzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoInF1ZXVlIik7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9IG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChPcm1QZXJzaXN0ZW50VHlwZSkgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUoInRlc3QuUHJpbnRKb2IiKTsKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImpvYnMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShtYXBwZWRCeT1cInF1ZXVlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcmludFF1ZXVlIHF1ZXVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDUpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJb3JtQ29sdW1uID0gYWRkcmVzc2VzTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldEZvcmVpZ25LZXlKb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy90ZXN0IHZpcnR1YWwgb3JtIG1hcHBpbmcsIHNldHRpbmcgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBqYXZhIG1hcHBpbmcKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsJCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQotCQkoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJam9pbkNvbHVtbiA9ICgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsJCQotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5Kb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy90ZXN0IHZpcnR1YWwgb3JtIG1hcHBpbmcsIHNldHRpbmcgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBqYXZhIG1hcHBpbmcKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUphdmFFbnRpdHkgYWRkcmVzc0VudGl0eSA9IChKYXZhRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSB0eXBlUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UucGVyc2lzdGFibGVBdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSBhdHRyaWJ1dGVSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQkvL292ZXJyaWRlIHRoZSBtYXBwaW5nIGluIG9ybS54bWwKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCSgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJT3JtRW50aXR5IG9ybUFkZHJlc3NFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0c0pvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9ICgoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQotCQkoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RmFsc2UoKChPcmRlcmFibGUyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJKChPcmRlcmFibGUyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCW9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCU9ybUVudGl0eSBvcm1BZGRyZXNzRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlvcm1BZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydFRydWUoKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRGYWxzZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjFiNTNkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzA7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUgQE1hcHNJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIG9ycGhhblJlbW92YWwgPSB0cnVlLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuSU5ORVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAUHJpdmF0ZU93bmVkKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJCi0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlyZXNvdXJjZU9uZVRvT25lLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlyZXNvdXJjZU9uZVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5jYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuY2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmNhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCUpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlID0gKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEludmVyc2VPcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gKChKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJOQU1FIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIklOVkVSU0VfTkFNRSIpOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuc3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gKChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkoKEphdmFFbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhT25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJLy9yZW1vdmUgbS1tIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93Ci0KLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5yZW1vdmVTdHJhdGVneSgpOwotCQl2aXJ0dWFsSm9pblRhYmxlID0gKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQl2aXJ0dWFsSm9pblRhYmxlID0gKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFX05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBUkdFVCIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX09STV9UQVJHRVQiLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKS5uZXh0KCk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMCkgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IAotCQkJdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKS5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCS8vVE9ETyBqYXZhIGRlZmF1bHQgY29sdW1ucyBuYW1lIGluIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkpvaW5Db2x1bW5Pd25lcgotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCi0JCWFzc2VydEZhbHNlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb3JtT25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VsaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L29ybS9FY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjAwYmRmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0VjbGlwc2VsaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlbGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUob3JtUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKG9ybVBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKSkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkZldGNoKEpvaW5GZXRjaFR5cGUuSU5ORVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQkKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCXJlc291cmNlTWFueVRvT25lLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFueVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU9uZVRvT25lLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGphdmFNYW55VG9PbmVNYXBwaW5nID0gKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKSk7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGUgb3JtSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9ICgoSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQ0FUQUxPRyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiU0NIRU1BIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJOQU1FIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZFUkVOQ0VEX05BTUUiKTsKLQkJSmF2YUpvaW5Db2x1bW4gaW52ZXJzZUphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIklOVkVSU0VfTkFNRSIpOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Kb2luVGFibGUuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWludmVyc2VPcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGUgb3JtSm9pblRhYmxlID0gKChPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgdG8gdHJ1ZSwgd2lsbCBpZ25vcmUgamF2YSBhbm5vdGF0aW9uIHNldHRpbmdzCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJLy9yZW1vdmUgbS1tIG1hcHBpbmcgZnJvbSB0aGUgb3JtLnhtbCBmaWxlCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJb3JtSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkucmVtb3ZlU3RyYXRlZ3koKTsKLQkJb3JtSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZSk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlvcm1Kb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEVfTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKE9ybUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQVJHRVQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9PUk1fVEFSR0VUIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlcygpLm5leHQoKTsKLQotCQlNYW55VG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS52aXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotCi0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgb3JtTWFueVRvT25lTWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmsyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmM5NTA1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZWxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlZWMzOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbjJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDb25uZWN0aW9uMl8wIGNvbm5lY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfTkFUSVZFX1NRTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRV8yID0gISBOQVRJVkVfU1FMX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUUgPSAiY29ubmVjdGlvbi5kcml2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFXzIgPSAiY29ubmVjdGlvbi5kcml2ZXIuMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0RSSVZFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0RSSVZFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24uZHJpdmVyIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VSTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVJMX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24udXJsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VTRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VU0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VU0VSX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24udXNlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfUEFTU1dPUkRfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi5wYXNzd29yZCI7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gKENvbm5lY3Rpb24yXzApIHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDg7IC8vIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgRWNsaXBzZUxpbmsgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1VSTF9LRVksIExFR0FDWV9VUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVUkxfS0VZLCBVUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfVVNFUl9LRVksIExFR0FDWV9VU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVNFUl9LRVksIFVTRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCBMRUdBQ1lfUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQQVNTV09SRF9LRVksIFBBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCQotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXJsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXNlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRQYXNzd29yZCgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVybCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVc2VyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogUHJvcGVydGllcyBOYW1lIE1pZ3JhdGlvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdERyaXZlclByb3BlcnR5TmFtZU1pZ3JhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIFZlcmlmeSBsZWdhY3kgZHJpdmVyIGV4aXN0cwotCQlhc3NlcnRUcnVlKCJMZWdhY3kgZHJpdmVyIG5vdCBleGlzdHMiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMoTEVHQUNZX0RSSVZFUl9LRVksIExFR0FDWV9EUklWRVJfVEVTVF9WQUxVRSkpOwotCQkKLQkJLy8gVmVyaWZ5IGRyaXZlciByZWFkIGluCi0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRyaXZlciByZWFkIiwgdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpLCBEUklWRVJfVEVTVF9WQUxVRSk7Ci0KLQkJLy8gQ2hhbmdlIGRyaXZlciB2YWx1ZQotCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKERSSVZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyBWZXJpZnkgZHJpdmVyIHZhbHVlIGNoYW5nZWQKLQkJYXNzZXJ0RXF1YWxzKCJEcml2ZXIgbm90IHNldCIsIHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKSwgRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JCWFzc2VydFRydWUoIlBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBub3Qgc2V0IiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFXzIpKTsKLQkJCi0JCS8vIFZlcmlmeSBsZWdhY3kgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX0RSSVZFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNOYW1lc01pZ3JhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBjb25uZWN0aW9uLmluaXRpYWxpemVQcm9wZXJ0aWVzKCkgb2NjdXJyZWQgYmVmb3JlIHRlc3QucHVQb3B1bGF0ZSgpIHRoZXJlZm9yZQotCQkvLyB3ZSBjYW5ub3QgdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbGVnYWN5IHByb3BlcnRpZXMgb25seSBleGlzdCBpbiB0aGUgeG1sCi0JCS8vIFZlcmlmeSB0aGF0IFVzZXIgJiBQYXNzd29yZCBleGlzdCBpbiBib3RoIGZvcm1zCi0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShVU0VSX0tFWSwgICJQcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShQQVNTV09SRF9LRVksICAiUHJvcGVydHkgbm90IGV4aXN0cyIpOwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoTEVHQUNZX1VTRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCQotCQkvLyBDaGFuZ2UgYSBwcm9wZXJ0eSB2YWx1ZSB0byB0cmlnZ2VyIG1pZ3JhdGlvbiByb3V0aW5lCi0JCXRoaXMuY29ubmVjdGlvbi5zZXROYXRpdmVTcWwoTkFUSVZFX1NRTF9URVNUX1ZBTFVFKTsKLQkJCi0JCS8vIFZlcmlmeSB0aGF0IGFsbCBsZWdhY3kgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX0RSSVZFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfVVJMX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9VU0VSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9QQVNTV09SRF9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JfQotCi0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI1MWZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UubG9nZ2luZy5Mb2dnaW5nTGV2ZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZS5sb2dnaW5nLkxvZ2dpbmcyXzA7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgTG9nZ2luZzJfMCBsb2dnaW5nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1FMX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19TUUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTUUxfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLm9mZjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTUUxfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05fTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1RSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuaW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19FVkVOVF9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5jb25maWc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0NPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lcjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmVzdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19RVUVSWV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5hbGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0NBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLnNldmVyZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC53YXJuaW5nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEFHQVRJT05fTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1BST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmluZm87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuY29uZmlnOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmZpbmU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfRUpCX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRUpCX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmFsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERNU19MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfRE1TX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5vZmY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRE1TX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLnNldmVyZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfRUpCX09SX01FVEFEQVRBX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC53YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQU1PREVMX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmNvbmZpZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZFUl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lcjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfUFJPUEVSVElFU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFID0gTG9nZ2luZ0xldmVsLmFsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLm9mZjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLndhcm5pbmc7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubG9nZ2luZyA9IChMb2dnaW5nMl8wKSB0aGlzLnN1YmplY3QuZ2V0TG9nZ2luZygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuU1FMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlRSQU5TQUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkVWRU5UX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkNPTk5FQ1RJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuUVVFUllfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuQ0FDSEVfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuUFJPUEFHQVRJT05fQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuU0VRVUVOQ0lOR19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5FSkJfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRE1TX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkVKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5NRVRBTU9ERUxfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuV0VBVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlBST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuU0VSVkVSX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE1OyAvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gMSBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNRTF9MT0dHSU5HX0tFWSwgU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVFJBTlNBQ1RJT05fTE9HR0lOR19LRVksIFRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRVZFTlRfTE9HR0lOR19LRVksIEVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ09OTkVDVElPTl9MT0dHSU5HX0tFWSwgQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFFVRVJZX0xPR0dJTkdfS0VZLCBRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX0xPR0dJTkdfS0VZLCBDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLCBQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFUVVFTkNJTkdfTE9HR0lOR19LRVksIFNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFSkJfTE9HR0lOR19LRVksIEVKQl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERNU19MT0dHSU5HX0tFWSwgRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZLCBFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShNRVRBTU9ERUxfTE9HR0lOR19LRVksIE1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZFUl9MT0dHSU5HX0tFWSwgV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUFJPUEVSVElFU19MT0dHSU5HX0tFWSwgUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFUlZFUl9MT0dHSU5HX0tFWSwgU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5sb2dnaW5nLmdldExldmVsKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0aGlzLmxvZ2dpbmcuc2V0TGV2ZWwocHJvcGVydHlOYW1lLCAoTG9nZ2luZ0xldmVsKSBuZXdWYWx1ZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogU3FsIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3FsTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNRTF9MT0dHSU5HX0tFWSwKLQkJCVNRTF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU1FMX0xPR0dJTkdfS0VZLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNRTF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNxbExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU1FMX0xPR0dJTkdfS0VZLAotCQkJU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNRTF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogVHJhbnNhY3Rpb24gTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2FjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSwKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSwKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVHJhbnNhY3Rpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEV2ZW50IExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXZlbnRMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVZFTlRfTE9HR0lOR19LRVksCi0JCQlFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVZFTlRfTE9HR0lOR19LRVksCi0JCQlFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUV2ZW50TG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFVkVOVF9MT0dHSU5HX0tFWSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBDb25uZWN0aW9uIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29ubmVjdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX0tFWSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNvbm5lY3Rpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19LRVksCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFF1ZXJ5IExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnlMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUVVFUllfTE9HR0lOR19LRVksCi0JCQlRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUVVFUllfTE9HR0lOR19LRVksCi0JCQlRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVF1ZXJ5TG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlRVUVSWV9MT0dHSU5HX0tFWSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBDYWNoZSBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX0xPR0dJTkdfS0VZLAotCQkJQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNBQ0hFX0xPR0dJTkdfS0VZLAotCQkJQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDYWNoZUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ0FDSEVfTE9HR0lOR19LRVksCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUHJvcGFnYXRpb24gTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wYWdhdGlvbkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSwKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSwKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfS0VZLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFNlcXVlbmNpbmcgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXF1ZW5jaW5nTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19LRVksCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfS0VZLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2VxdWVuY2luZ0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRUpCIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RUpCTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVKQl9MT0dHSU5HX0tFWSwKLQkJCUVKQl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRUpCX0xPR0dJTkdfS0VZLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVKQl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUVKQkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRUpCX0xPR0dJTkdfS0VZLAotCQkJRUpCX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVKQl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRE1TIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RE1TTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURNU19MT0dHSU5HX0tFWSwKLQkJCURNU19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRE1TX0xPR0dJTkdfS0VZLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCURNU19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURNU0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRE1TX0xPR0dJTkdfS0VZLAotCQkJRE1TX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCURNU19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRUpCIG9yIE1ldGFkYXRhIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RUpCT3JNZXRhZGF0YUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVksCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFSkJPck1ldGFkYXRhTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVksCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBNZXRhbW9kZWwgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRhbW9kZWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTUVUQU1PREVMX0xPR0dJTkdfS0VZLAotCQkJTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19LRVksCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTWV0YW1vZGVsTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19LRVksCi0JCQlNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBXZWF2ZXIgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2ZXJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVkVSX0xPR0dJTkdfS0VZLAotCQkJV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWRVJfTE9HR0lOR19LRVksCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmVyTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWRVJfTE9HR0lOR19LRVksCi0JCQlXRUFWRVJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0aWVzIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGVydGllc0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUFJPUEVSVElFU19MT0dHSU5HX0tFWSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVByb3BlcnRpZXNMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19LRVksCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFNlcnZlciBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlcnZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVJWRVJfTE9HR0lOR19LRVksCi0JCQlTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFUlZFUl9MT0dHSU5HX0tFWSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTZXJ2ZXJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFUlZFUl9MT0dHSU5HX0tFWSwKLQkJCVNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTY3NmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwudjJfMC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS52Ml8wLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5PcHRpb25zMl8wOwotCi0vKioKLSAqICBFY2xpcHNlTGlua09wdGlvbnMyXzBUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIE9wdGlvbnMyXzAgb3B0aW9uczsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBwcmVQZXJzaXN0RXZlbnQ7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlVXBkYXRlRXZlbnQ7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlUmVtb3ZlRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXBlcnNpc3RfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtcGVyc2lzdF9ncm91cCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXVwZGF0ZV9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXVwZGF0ZV9ncm91cCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXJlbW92ZV9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXJlbW92ZV9ncm91cCI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3B0aW9ucyA9IChPcHRpb25zMl8wKSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5vcHRpb25zLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNULCB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QsIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA1OyAvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gMSBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExPQ0tfVElNRU9VVF9LRVksIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFFVRVJZX1RJTUVPVVRfS0VZLCBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0KLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldExvY2tUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkgewotCQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0TG9ja1RpbWVvdXQoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFF1ZXJ5VGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIExvY2tUaW1lb3V0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9ja1RpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPQ0tfVElNRU9VVF9LRVksCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUXVlcnlUaW1lb3V0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnlUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVFVRVJZX1RJTUVPVVRfS0VZLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBzIGxpc3QgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uR3JvdXBzTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUxpc3RFdmVudHMoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMiwKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNUKTsKLQkJCi0JCXRoaXMudmVyaWZ5TGlzdEV2ZW50cygKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMiwKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QpOwotCQkKLQkJdGhpcy52ZXJpZnlMaXN0RXZlbnRzKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yLAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckV2ZW50KCkgewotCQlzdXBlci5jbGVhckV2ZW50KCk7Ci0JCXRoaXMucHJlUGVyc2lzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVVcGRhdGVFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlUmVtb3ZlRXZlbnQgPSBudWxsOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8vICoqKioqKioqKiogdmVyaWZ5IFZhbGlkYXRpb25Hcm91cCBwcm9wZXJ0eSAqKioqKioqKioqCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMiwgdHJ1ZSk7IAotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCsrOwotCQl0aGlzLnZlcmlmeVB1dFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZyl0ZXN0VmFsdWUxKSk7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5LCAoU3RyaW5nKXRlc3RWYWx1ZTEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZyl0ZXN0VmFsdWUxKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxLCB0cnVlKTsgCi0JCXRoaXMudmVyaWZ5UHV0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMSA9IChTdHJpbmcpdGVzdFZhbHVlMTsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTIgPSAoU3RyaW5nKXRlc3RWYWx1ZTI7Ci0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJdGhpcy5hZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDIpOwotCi0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMikpOwotCi0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpLmdldFZhbHVlKCk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTEpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMikgIT0gLTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUxID0gKFN0cmluZyl0ZXN0VmFsdWUxOwotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMiA9IChTdHJpbmcpdGVzdFZhbHVlMjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMik7Ci0KLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMikpOwotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUxKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTIpID09IC0xKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAwKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJCi0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlMaXN0RXZlbnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0ZXN0VmFsdWUsIFN0cmluZyBsaXN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5hZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZSk7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkuZ2V0TGlzdE5hbWUoKSwgbGlzdE5hbWUpOwotCi0JCS8vIHJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUpOwotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkuZ2V0TGlzdE5hbWUoKSwgbGlzdE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgdmFsdWUKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgKFN0cmluZykgZXhwZWN0ZWRWYWx1ZSkpOwotCQkgcmV0dXJuOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZCAqKioqKioqKioqCi0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQkKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnZhbGlkYXRpb25Hcm91cENoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRpb25Hcm91cENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZS5nZXRMaXN0TmFtZSgpOwotCQkKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCkpCi0JCQl0aGlzLnByZVBlcnNpc3RFdmVudCA9IGU7Ci0JCWVsc2UgaWYgKGxpc3ROYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNUKSkKLQkJCXRoaXMucHJlVXBkYXRlRXZlbnQgPSBlOwotCQllbHNlIGlmIChsaXN0TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCkpCi0JCQl0aGlzLnByZVJlbW92ZUV2ZW50ID0gZTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJhZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlIiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlRXhpc3RzKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5VmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGdldFZhbGlkYXRpb25Hcm91cFNpemUoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSAgdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc1NpemUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSAgdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5VmFsaWRhdGlvbkdyb3VwU2l6ZSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IGdldEV2ZW50Rm9yKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQlldmVudCA9IHRoaXMucHJlUGVyc2lzdEV2ZW50OwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVVcGRhdGVFdmVudDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQlldmVudCA9IHRoaXMucHJlUmVtb3ZlRXZlbnQ7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0RXZlbnRGb3IiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvdjJfMC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGI1ZmE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBvcHVsYXRlUHUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8yXzApOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQpIHN1cGVyLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC92Ml8wL2NvbnRleHQvcGVyc2lzdGVuY2UvSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2N2M4YzIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3YyXzAvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnYyXzAuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmsyXzBDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cwotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5jbGFzcyk7Ci0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGluazJfMENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzYjVkYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhNTE0ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhL2dlbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4NTc3Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2ZGRhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEphbiAxNSAxMToxMjoxNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhYjkxMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jTW9uIEp1bCAwNyAyMDoxMzoyNCBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDJkMGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5nZW47YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhkNGJmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1qYXZhY1NvdXJjZSA9IDEuNQotamF2YWNUYXJnZXQgPSAxLjUKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWE2NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL3Rlc3RzL2ludGVybmFsL0VudGl0eUdlblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU4NzBmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkVudGl0eUdlblRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudGl0eUdlblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTEoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1b28iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWU0KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUxKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVvbyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTMoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lNCgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBkZDg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0SnBhR2VuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkVudGl0eUdlblRvb2xzVGVzdHM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFHZW5UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpQVCBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlHZW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhR2VuVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGEwMjdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJnZW4tdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkpwdEpwYUdlblRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2ZWJmYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlZTFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNjRhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAwNyAxNDoyNzoxNiBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDljMTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jU3VuIE1heSAyNyAxNDo1NTowMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJmYTMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iNC4zLjEiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSIzLjMuMTAwIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjMuNC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYwYWEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4ODdhZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFVJIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNzc5MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybS5KcHRVaVBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIFVJIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVaVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYwYWZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1NYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IHRlc3RQcm9qZWN0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkV4dGVuc2lvblRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiZXh0ZW5zaW9uLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fQ0xBU1MgPSBFeHRlbnNpb25UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9JRCA9IEV4dGVuc2lvblRlc3RQbHVnaW4uUExVR0lOX0lEOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9JRCA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fQ0xBU1MgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1VJX1BMQVRGT1JNX0lEID0gVEVTVF9QTEFURk9STV9JRDsKLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMudGVzdFByb2plY3QuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcGFQbGF0Zm9ybU1hbmFnZXJJbXBsLmluc3RhbmNlKCkuYnVpbGRKcGFQbGF0Zm9ybUltcGxlbWVudGF0aW9uKHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjk2MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVBsYXRmb3JtVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VWlQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlQbGF0Zm9ybVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YmQ3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcxZTlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMgYW5kIG1vdmVkIHRvIGNvbW1vbiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jbGFzc3BhdGggYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWYyYzM1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jdnNpZ25vcmUgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk5NDk1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzM3MzRlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1R1ZSBTZXAgMTQgMDk6NDM6NDggRUVTVCAyMDEwCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhMTZjMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ2VmO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aTtidW5kbGUtdmVyc2lvbj0iWzAuOC4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW07YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhdHRlcm47YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC44LjAsMS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbCwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5kaWFsb2csCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWksCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlciwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbApkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg1YzM0ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotamF2YWNTb3VyY2UgPSAxLjUKLWphdmFjVGFyZ2V0ID0gMS41Ci1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2NvbXBvbmVudC54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDNhNGU1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC51aS5kaWFncmFtZWRpdG9yIj48ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+PGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz48cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuZGlhZ3JhbWVkaXRvciIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvQ29tcG91bmRLZXkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvQ29tcG91bmRLZXkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOThkMTNkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0NvbXBvdW5kS2V5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0VKQl8xNXgxNi5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9FSkJfMTV4MTYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmZlZjA1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0VKQl8xNXgxNi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9jbXBFbnRpdHlfb2JqLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2NtcEVudGl0eV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGVkMWY5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2NtcEVudGl0eV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9hdHRyaWJ1dGUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDFhNGMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfZW50aXR5LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3ODM4NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYWRkX2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYmFzaWMuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2Jhc2ljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0N2Q3NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYmFzaWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGFibGUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2Zjc4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC1pZC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQtaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM4ZTIxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC1pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTY2NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS1tYXBwaW5ncy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LW1hcHBpbmdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWM5Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LW1hcHBpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDZmNDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvaWQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2lkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwNWVjMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvaWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1jb250ZW50LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtZmlsZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU5ZjQ3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTEtZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMS1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNhYzAwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMS1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0yLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTItZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiM2QxNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTItZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODg1YjIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMS1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTEtZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0ZTJjYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMS1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTItZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0yLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MjgwMDcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTItZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFlMmI5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hcHBlZC1zdXBlcmNsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMzc2NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE5YzIzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLXR5cGUtbWFwcGluZy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC10eXBlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NDc4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLXR5cGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnktMS1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LTEtZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyZWY0OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnktMS1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOTAwMjcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTEtZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTEtZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5M2FjZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0xLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0yLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0yLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGE5YWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMi1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhlYzM2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS11bml0LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS11bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjNDVmNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UtdW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNjE2ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3JlbW92ZV9hdHRyaWJ1dGUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3JlbW92ZV9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDE2NmIzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9yZW1vdmVfYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC90cmFuc2llbnQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3RyYW5zaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWQ4M2QuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3RyYW5zaWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdmVyc2lvbi5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdmVyc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMmE4MTAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3ZlcnNpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3dhcm5pbmcuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3dhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDAwOWU5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC93YXJuaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3Jlc3RvcmUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvcmVzdG9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODE5ODQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvcmVzdG9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA4NTFhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZV9hbmRfcmVtb3ZlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmVfYW5kX3JlbW92ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MWQyMzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZV9hbmRfcmVtb3ZlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YzU1YTEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1kaWFncmFtZWRpdG9yLm5hbWUgPSBKUEEgRGlhZ3JhbSBFZGl0b3IKLWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0ubWVudS5sYWJlbCA9IE9wZW4gRGlhZ3JhbQotZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ubGFiZWwgPSBPcGVuIERpYWdyYW0KLWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0ucHJvamVjdC5tZW51LmxhYmVsID0gT3BlbiBEaWFncmFtCi1kaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLmFjdGlvbi5wcm9qZWN0LmxhYmVsID0gT3BlbiBEaWFncmFtCi1kaWFncmFtZWRpdG9yLnByZWZwYWdlID0gSlBBIERpYWdyYW0gRWRpdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MzQxN2QuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLQotICAgIDxjb3B5cmlnaHQ+Ci0gICAKLSAgICBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAgICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAgICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gICAKLSAgICBDb250cmlidXRvcnM6Ci0gICAgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gICAKLSAgICA8L2NvcHlyaWdodD4KLSAgIAotIC0tPgotPHBsdWdpbj4KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLSAgICAgIDxlZGl0b3IKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yIgotICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgIGljb249Imljb25zL2VudC9lbnRpdHkuZ2lmIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIgotICAgICAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IgotICAgICAgICAgICAgbmFtZT0iJWRpYWdyYW1lZGl0b3IubmFtZSI+Ci0gICAgICA8L2VkaXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gPGV4dGVuc2lvbgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgYWRhcHRhYmxlPSJmYWxzZSIKLSAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkub3BlbkRpYWdyYW1KcGEiCi0gICAgICAgICAgbmFtZUZpbHRlcj0iKiIKLSAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGUiPgotICAgICAgICAgIAotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJCTwvZW5hYmxlbWVudD4KLSAgICAgICA8bWVudQotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5vcGVuRGlhZ3JhbUpwYU1lbnUiCi0gICAgICAgICAgICAgbGFiZWw9IiVkaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLm1lbnUubGFiZWwiPgotICAgICAgIDwvbWVudT4KLSAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWkuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZSIKLSAgICAgICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5vcGVuRGlhZ3JhbUpwYUFjdGlvbiIKLSAgICAgICAgICAgICBsYWJlbD0iJWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0uYWN0aW9uLmxhYmVsIj4KLSAgICAgICA8L2FjdGlvbj4KLSAgICA8L29iamVjdENvbnRyaWJ1dGlvbj4KLSAgICA8b2JqZWN0Q29udHJpYnV0aW9uCi0gICAgICAgICAgYWRhcHRhYmxlPSJ0cnVlIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5vcGVuRGlhZ3JhbU9uSnBhUHJvamVjdCIKLSAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCTxlbmFibGVtZW50PgotCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJPC9lbmFibGVtZW50PgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtT25KcGFQcm9qZWN0QWN0aW9uIgotICAgICAgICAgICAgIGxhYmVsPSIlZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ucHJvamVjdC5sYWJlbCIKLSAgICAgICAgICAgICBtZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotIDwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAJPHBhZ2UKLSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5FZGl0b3JzIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIgotICAgICAgICBuYW1lPSIlZGlhZ3JhbWVkaXRvci5wcmVmcGFnZSI+Ci0gICAJPC9wYWdlPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgIDxpbml0aWFsaXplcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICA8L2luaXRpYWxpemVyPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICA8cGFnZQotICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUHJvamVjdFByb3BlcnRpZXMiCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvcGVydHlwYWdlIgotICAgICAgICAgbmFtZT0iJWRpYWdyYW1lZGl0b3IucHJlZnBhZ2UiPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+IAkJICAgICAgICAKLQkJICAgICAgICAgIDxvcj4KLQkJCQkgICAgPHRlc3QKLQkJCQkJICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCSAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJICAgICB2YWx1ZT0ianB0LmpwYToxLjAiPgotCQkJCQk8L3Rlc3Q+Ci0JCQkJCTx0ZXN0Ci0JCQkJCSAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkgICAgIHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCSAgICAgdmFsdWU9ImpwdC5qcGE6Mi4wIj4KLQkJCQkJPC90ZXN0PgotCQkJCSAgPC9vcj4JCi0JCSAgICAgICAgPC9hZGFwdD4gCi0JCQk8L2VuYWJsZWRXaGVuPiAgICAgICAgIAotICAgPC9wYWdlPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZGlhZ3JhbVR5cGVQcm92aWRlcnMiPgotICAgPGRpYWdyYW1UeXBlUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyIj4KLSAgICAgIDxkaWFncmFtVHlwZQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLkpQQUVkaXRvckRpYWdyYW1UeXBlIj4KLSAgICAgIDwvZGlhZ3JhbVR5cGU+Ci0gICAgICA8aW1hZ2VQcm92aWRlcgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXIiPgotICAgICAgPC9pbWFnZVByb3ZpZGVyPgotICAgPC9kaWFncmFtVHlwZVByb3ZpZGVyPgotPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZGlhZ3JhbVR5cGVzIj4KLSAgIDxkaWFncmFtVHlwZQotICAgICAgICAgZGVzY3JpcHRpb249IlRoaXMgaXMgdGhlIGRpYWdyYW0gdHlwZSBmb3IgdGhlIEpQQSBlZGl0b3IiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuSlBBRWRpdG9yRGlhZ3JhbVR5cGUiCi0gICAgICAgICBuYW1lPSJKUEEgZWRpdG9yIGRpYWdyYW0gdHlwZSIKLSAgICAgICAgIHR5cGU9IkpQQSBEaWFncmFtIj4KLSAgIDwvZGlhZ3JhbVR5cGU+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5pbWFnZVByb3ZpZGVycyI+Ci0gICA8aW1hZ2VQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXIiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciI+Ci0gICA8L2ltYWdlUHJvdmlkZXI+Ci08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3BlcnR5dGVzdGVyLkpwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3RlciIKLSAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLkpwYU5vZGUiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIgotICAgICAgcHJvcGVydGllcz0ianBhUHJvamVjdEZhY2V0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5dGVzdGVyLkpwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3RlciI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BvbS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJhNzE4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQkKLQk8cGFyZW50PgotCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aV9wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0JCTxncm91cElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpPC9ncm91cElkPgotCQk8dmVyc2lvbj4wLjUuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQkJPHJlbGF0aXZlUGF0aD4uLi8uLi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5yZWxlbmcvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotCTwvcGFyZW50PgotCQotCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpPC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KLQk8bmFtZT5KUEEgRGlhZ3JhbSBFZGl0b3IgUGx1Zy1pbjwvbmFtZT4JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9KUEFEaWFncmFtRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OThhNGIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRGVmYXVsdEVkaXREb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwucGFydHMuQ29ubmVjdGlvbkVkaXRQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkRlZmF1bHRKcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWkuSlBBRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUNoZWNrU3VtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQURpYWdyYW1FZGl0b3IgZXh0ZW5kcyBEaWFncmFtRWRpdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIGlucHV0SnB0VHlwZTsKLQlwcml2YXRlIElTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSBqcGFTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLQotCXB1YmxpYyBKUEFEaWFncmFtRWRpdG9yKCkgewotCQl0aGlzKG5ldyBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeUltcGwoKSk7Ci0JCWVkaXREb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcyk7Ci0JfQotCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3IoSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IGpwYVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuanBhU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgPSBqcGFTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLQkJZWRpdERvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpIHN1cGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewkJCi0JCWlmKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHModHlwZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVXaXRob3V0RW50aXRpZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIERpYWdyYW0gZCA9IGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGQpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmFzc2lnbkVudGl0eVNoYXBlc01ENVN0cmluZ3MoZCwgTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkKSk7Ci0JCQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBkLmdldENoaWxkcmVuKCk7Ci0JCQkJSXRlcmF0b3I8U2hhcGU+IGNoSXQgPSBjaGlsZHJlbi5pdGVyYXRvcigpOwotCQkJCWJvb2xlYW4gc2F2ZSA9IHRydWU7Ci0JCQkJd2hpbGUgKGNoSXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUNvbnRhaW5lclNoYXBlIHNoID0gKENvbnRhaW5lclNoYXBlKWNoSXQubmV4dCgpOwotCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZ2V0RmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoKTsKLQkJCQkJU3RyaW5nIGVudE5hbWUgPSBKUEFFZGl0b3JVdGlsLmdldFRleHQoanB0KTsKLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IEpQQUVkaXRvclV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoY3UuaGFzVW5zYXZlZENoYW5nZXMoKSkgewotCQkJCQkJCWVudE5hbWUgPSAiKiAiICsgZW50TmFtZTsgCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzYXZlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlByb2JsZW0gd2l0aCBjb21waWxhdGlvbiB1bml0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUhlYWRlcihzaCwgZW50TmFtZSk7Ci0JCQkJfQotCQkJCXdycC5zZXRPYmoobmV3IEJvb2xlYW4oc2F2ZSkpOwotCQkJfQotCQl9KTsJCQotCQlpZiAoKEJvb2xlYW4pd3JwLmdldE9iaigpKQotCQkJc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgRGlhZ3JhbSBkID0gZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJLy9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGQpOwotCQlpZiAoKGQgPT0gbnVsbCkgfHwgKHRlZCA9PSBudWxsKSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKChkID09IG51bGwpID8gIkRpYWdyYW0gaXMgbnVsbCIgOiAiVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gaXMgbnVsbCIpOwkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQluZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7ICAgIAkJCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJSlBBQ2hlY2tTdW0uSU5TVEFOQ0UoKS5hc3NpZ25FbnRpdHlTaGFwZXNNRDVTdHJpbmdzKGQsIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZCkpOwotCQkJCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZC5nZXRDaGlsZHJlbigpOwotCQkJCUl0ZXJhdG9yPFNoYXBlPiBjaEl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hJdC5oYXNOZXh0KCkpIHsKLQkJCQkJU2hhcGUgc2ggPSBjaEl0Lm5leHQoKTsKLQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkJLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQkJCWlmIChqcHQgIT0gbnVsbCkKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQlSZXNvdXJjZSByZXMgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRSZXNvdXJjZUJ5RGlhZ3JhbShkKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQkvL2RvU2F2ZShtb25pdG9yKTsKLQkJCQkJcmVzLnNhdmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IHNhdmUgdGhlIGRpYWdyYW0iKTsJLy8kTk9OLU5MUy0xJAotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOyAJCi0JCQkJfQotCQkJCSovCi0JCQkJCi0JCQl9Ci0JCX0pOwotCQlzdXBlci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRleHRNZW51UHJvdmlkZXIgY3JlYXRlQ29udGV4dE1lbnVQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyKGdldEdyYXBoaWNhbFZpZXdlcigpLAotCQkJCWdldEFjdGlvblJlZ2lzdHJ5KCksCi0JCQkJZ2V0Q29uZmlndXJhdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0V2l0aEZpbGVFZGl0b3JJbnB1dChmaW5hbCBJRWRpdG9yU2l0ZSBzaXRlLAotCQkJZmluYWwgSUZpbGUgZW50aXR5RmlsZSkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBudWxsOwotCQl0cnkgewkJCQotCQkJUHJvZ3Jlc3NNb25pdG9yRGlhbG9nIGRpYWxvZyA9IG5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2l0ZQotCQkJCQkuZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cucnVuKHRydWUsIGZhbHNlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCQltb25pdG9yLmJlZ2luVGFzaygKLQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFEaWFncmFtRWRpdG9yX3dhaXRpbmdGb3JNb2luLAotCQkJCQkJCUlQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7CQkJCQkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWlucHV0SnB0VHlwZSA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKEphdmFDb3JlCi0JCQkJCS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eUZpbGUpKTsKLQkJCXNldFBhcnRQcm9wZXJ0eSgKLQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLk9QRU5fV0hPTEVfUEVSU0lTVEVOQ0VfVU5JVF9FRElUT1JfUFJPUEVSVFksCi0JCQkJCWlucHV0SnB0VHlwZS5nZXROYW1lKCkpOwotCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGlucHV0SnB0VHlwZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCVN0cmluZyBkaWFncmFtVVJJID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuY3JlYXRlRGlhZ3JhbVBhdGgocGVyc2lzdGVuY2VVbml0KS50b1N0cmluZygpOwotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZGVmYXVsdFRyYW5zRWRpdERvbWFpbiA9IChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilpbnB1dEpwdFR5cGUuCi0JCQkJCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0QWRhcHRlcihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5jbGFzcyk7Ci0JCQlkaWFncmFtID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuY3JlYXRlRGlhZ3JhbShwZXJzaXN0ZW5jZVVuaXQsIDEwLCB0cnVlKTsKLQkJCUpQQURpYWdyYW1FZGl0b3JJbnB1dCBkaWFncmFtSW5wdXQgPSBuZXcgSlBBRGlhZ3JhbUVkaXRvcklucHV0KGRpYWdyYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkgICBkaWFncmFtVVJJLCAKLQkJCQkJCQkJCQkJCQkJCQkJCSAgIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIAotCQkJCQkJCQkJCQkJCQkJCQkJICAgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlci5JRCwgCi0JCQkJCQkJCQkJCQkJCQkJCQkgICBmYWxzZSk7Ci0JCQlNb2RlbEludGVncmF0aW9uVXRpbC5tYXBEaWFncmFtVG9Qcm9qZWN0KGRpYWdyYW0sIHBlcnNpc3RlbmNlVW5pdAotCQkJCQkuZ2V0SnBhUHJvamVjdCgpKTsKLQkJCXN1cGVyLmluaXQoc2l0ZSwgZGlhZ3JhbUlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQlNb2RlbEludGVncmF0aW9uVXRpbC5yZW1vdmVEaWFncmFtUHJvamVjdE1hcHBpbmcoZGlhZ3JhbSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsLnJlbW92ZURpYWdyYW1Qcm9qZWN0TWFwcGluZyhkaWFncmFtKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsCi0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsLnJlbW92ZURpYWdyYW1Qcm9qZWN0TWFwcGluZyhkaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJSUZpbGUgZW50aXR5RmlsZSA9IChJRmlsZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCQotCQlpZiAoZW50aXR5RmlsZSAhPSBudWxsICYmIGVudGl0eUZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWluaXRXaXRoRmlsZUVkaXRvcklucHV0KHNpdGUsIGVudGl0eUZpbGUpOwotCQl9IGVsc2UKLQkJCXN1cGVyLmluaXQoc2l0ZSwgaW5wdXQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYXRvcjxJU3RydWN0dXJlZFNlbGVjdGlvbj4gaXRlciA9IHN0cnVjdFNlbC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCl7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCl7Ci0JCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uRWRpdFBhcnQgPSAgKENvbm5lY3Rpb25FZGl0UGFydCkgKGVkaXRQYXJ0KTsKLQkJCQkJY29ubmVjdGlvbkVkaXRQYXJ0LnJlbW92ZUVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX0JFTkRQT0lOVFNfUk9MRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsJCQkKLQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IGdldEpwYVNlbGVjdGlvbk1hbmFnZXIocGFydCk7Ci0JCQlPYmplY3QgbSA9ICgoRWRpdFBhcnQpIG8pLmdldE1vZGVsKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChtIGluc3RhbmNlb2YgUGljdG9ncmFtRWxlbWVudCkgewotCQkJCU9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KAotCQkJCQkJCQkoUGljdG9ncmFtRWxlbWVudCkgbSk7Ci0JCQkJaWYgKChibyA9PSBudWxsKSB8fCAoIShibyBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZU5vZGUpKSkKLQkJCQkJcmV0dXJuOwotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKAotCQkJCQkJKEpwYVN0cnVjdHVyZU5vZGUpIGJvKSwgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25NYW5hZ2VyIGdldEpwYVNlbGVjdGlvbk1hbmFnZXIoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4ganBhU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihwYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IHsKLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnlJbXBsIGltcGxlbWVudHMKLQkJCUlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSB7Ci0KLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJcmV0dXJuIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJfQotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJjYjNmYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIHBsdWdpbjsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlPcHRpb25hbE1lc3NhZ2VEaWFsb2cuc2V0RGlhbG9nRW5hYmxlZChKUEFFZGl0b3JDb25zdGFudHMuSlBBX1NVUFBPUlRfRElBTE9HX0lELCB0cnVlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9kaWFsb2cvU2VsZWN0VHlwZURpYWxvZy5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2RpYWxvZy9TZWxlY3RUeXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTEzZDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2RpYWxvZy9TZWxlY3RUeXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmRpYWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLktleVN0cm9rZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5rZXlzLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRpdGxlQXJlYURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5Db250ZW50UHJvcG9zYWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LklDb250ZW50UHJvcG9zYWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5TaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5UZXh0Q29udGVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBTZWxlY3RUeXBlRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQlwcm90ZWN0ZWQgTGFiZWwgbGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgdGV4dDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0JcHJvdGVjdGVkIENvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgY29udGVudFByb3Bvc2FsQWRhcHRlcjsKLQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIEtleVN0cm9rZSBrcyA9IG51bGw7Ci0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCWtzID0gS2V5U3Ryb2tlLmdldEluc3RhbmNlKCJDdHJsK1NwYWNlIik7CQkJLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBjcmVhdGUga2V5c3Ryb2tlIG9iamVjdCIpOwkvLyROT04tTkxTLTEkCi0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSAKLQl9Ci0JCi0JcHVibGljIFNlbGVjdFR5cGVEaWFsb2coU3RyaW5nIG1lc3NhZ2UsCi0JCQkJCQkJU3RyaW5nIGluaXRpYWxUeXBlKSB7Ci0JCXN1cGVyKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQl0aGlzLnRpdGxlID0gSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGl0bGU7Ci0JCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCXRoaXMudHlwZSA9IGluaXRpYWxUeXBlOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbnRyb2wgY29udGVudHMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotICAgICAgICBpbml0aWFsaXplQ29udHJvbHMoKTsKLSAgICAgICAgdmFsaWRhdGVQYWdlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZW50czsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLSAgICAgICAgc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotICAgICAgICBzaGVsbC5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1dpbmRvd1RpdGxlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0JcHJvdGVjdGVkIFBvaW50IGdldEluaXRpYWxTaXplKCkgewotCQlyZXR1cm4gbmV3IFBvaW50KGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDMyMCksCi0JCQkJCQkgY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDEyMCkpOwotCX0gICAgCi0gICAgCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCXR5cGUgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0JCQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzaXphYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX3R5cGVMYWJlbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl0ZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZUJ0bihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuVHh0KTsKLQkJYnJvd3NlQnV0dG9uLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuRGVzYyk7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlJSmF2YVNlYXJjaFNjb3BlIHNjb3BlPSBTZWFyY2hFbmdpbmUuY3JlYXRlV29ya3NwYWNlU2NvcGUoKTsKLQkJCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwkJCQkKLQkJCQlTZWxlY3Rpb25EaWFsb2cgZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJZCA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCksIAotCQkJCQlzZXJ2aWNlLCAKLQkJCQkJc2NvcGUsIAotCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQUxMX1RZUEVTLCAKLQkJCQkJZmFsc2UsIAotCQkJCQl0ZXh0LmdldFRleHQoKS50cmltKCkpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGNyZWF0ZSB0eXBlIHNlbGFjdGlvbiBkaWFsb2cgaW5zdGFuY2UiKTsJLy8kTk9OLU5MUy0xJAotCQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJZC5vcGVuKCk7Ci0JCQkJT2JqZWN0W10gcmVzID0gZC5nZXRSZXN1bHQoKTsgCi0JCQkJaWYgKHJlcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJT2JqZWN0W10gb2JqID0gZC5nZXRSZXN1bHQoKTsKLQkJCQlpZiAob2JqID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlJVHlwZSB0cCA9IChJVHlwZSkgb2JqWzBdOwotCQkJCXRleHQuc2V0VGV4dCh0cC5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJdGV4dC5zZXRTZWxlY3Rpb24oMCwgdHAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkubGVuZ3RoKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCkgewotCQlTaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlciBjb250UHJvdmlkZXIgPSBuZXcgU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1JVElWRV9UWVBFU19BTkRfV1JBUFBFUlMpOwotCQljb250UHJvdmlkZXIuc2V0RmlsdGVyaW5nKHRydWUpOwotCQkKLQkJY29udGVudFByb3Bvc2FsQWRhcHRlciA9IG5ldyBDb250ZW50UHJvcG9zYWxBZGFwdGVyKAotCQkJCXRleHQsCi0JCQkJbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCAKLQkJCQljb250UHJvdmlkZXIsCi0JCQkJa3MsCi0JCQkJbmV3IGNoYXJbXSB7J2InLCAnYycsICdkJywgJ2knLCAnZicsICdsJywgJ3MnLCAnaicsICdCJywgJ0MnLCAnRCcsICdJJywgJ0YnLCAnTCcsICdTJywgJ0onfSk7Ci0JCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIuc2V0RW5hYmxlZCh0cnVlKTsKLQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRQcm9wb3NhbEFjY2VwdGFuY2VTdHlsZShDb250ZW50UHJvcG9zYWxBZGFwdGVyLlBST1BPU0FMX1JFUExBQ0UpOwotCQlyZXR1cm4gY29udFByb3ZpZGVyOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudENvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICAgICAgR3JpZExheW91dCByb3dMYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7Ci0gICAgICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudENvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgIAotICAgICAgICBHcmlkRGF0YSBkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0gICAgICAgIGQuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgICAgIGQuaGVpZ2h0SGludCA9IDQwMDsKLSAgICAgICAgY29tcG9zaXRlLnNldExheW91dERhdGEoZCk7Ci0gICAgICAgIAotIAkJcm93TGF5b3V0Lm1hcmdpbkxlZnQgPSA1OwotIAkJcm93TGF5b3V0Lm1hcmdpblRvcCA9IDU7Ci0gCQlyb3dMYXlvdXQubWFyZ2luUmlnaHQgPSA1OwotIAkJcm93TGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDMwOwotIAkJCi0gCQljb21wb3NpdGUuc2V0TGF5b3V0KHJvd0xheW91dCk7Ci0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoNDAsMjApOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJY3JlYXRlVGV4dEZpZWxkKGNvbXBvc2l0ZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoMzAwLCAxNyk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkNFTlRFUjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0ZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXNldERpYWxvZ0NvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLQkJCX0JCQkKLQkJfSk7Ci0JCWNyZWF0ZUJyb3dzZUJ0bihjb21wb3NpdGUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKDEwMCwgMjUpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkxFRlQ7Ci0JCWRhdGEubWluaW11bVdpZHRoID0gODA7Ci0JCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCi0JCWNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBwYXJlbnRDb21wb3NpdGU7Ci0JfQotCQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29udHJvbHMoKSB7Ci0gICAgICAgIHNldFRpdGxlKHRpdGxlKTsKLSAgICAgICAgc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgdGV4dC5zZXRUZXh0KHR5cGUpOwotICAgICAgICB0ZXh0LnNldFNlbGVjdGlvbigwLCB0eXBlLmxlbmd0aCgpKTsKLSAgICAgICAgc2V0RGlhbG9nQ29tcGxldGUodmFsaWRhdGVQYWdlKCkpOwotICAgIH0JCi0JCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0RGlhbG9nQ29tcGxldGUoYm9vbGVhbiB2YWx1ZSkgewotICAgICAgICB0aGlzLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHZhbHVlKTsKLSAgICB9CQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCVN0cmluZyB0eXBlID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfZW1wdHlUeXBlRXJyb3JUZXh0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlJU3RhdHVzIHN0YXQgPSBnZXRTdGF0dXMoKTsKLQkJaWYgKHN0YXQuaXNPSygpKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRNZXNzYWdlKG1lc3NhZ2UsCUlNZXNzYWdlLk5PTkUpOwotCQl9IGVsc2UgeyAKLQkJCXNldE1lc3NhZ2Uoc3RhdC5nZXRNZXNzYWdlKCksIElNZXNzYWdlLkVSUk9SKTsKLQkJfQotCQlyZXR1cm4gKHN0YXQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cygpIHsKLSAgICAJU3RyaW5nIHR5cGUgPSB0ZXh0LmdldFRleHQoKS50cmltKCk7Ci0gICAgCVN0cmluZ1tdIHR5cGVzID0gdHlwZS5zcGxpdCgiWzw+XFxbXFxdLF0iKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotICAgIAkJdHlwZSA9IHR5cGVzW2ldLnRyaW0oKTsKLQkJCUlTdGF0dXMgc3RhdCA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSh0eXBlLCBKYXZhQ29yZS5WRVJTSU9OXzFfNiwgSmF2YUNvcmUuVkVSU0lPTl8xXzYpOwotCQkJYm9vbGVhbiBpc1ByaW1pdGl2ZSA9IEpQQUVkaXRvckNvbnN0YW50cy5QUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVC5jb250YWlucyh0eXBlKTsKLQkJCWlmIChpc1ByaW1pdGl2ZSB8fCAoc3RhdC5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuRVJST1IpKQotCQkJCWNvbnRpbnVlOwotCQkJcmV0dXJuIHN0YXQ7Ci0gICAgCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0Rpc3BsYXlGYWNhZGUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvRGlzcGxheUZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMxYjg1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvRGlzcGxheUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRGlzcGxheUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1wdWJsaWMgY2xhc3MgRGlzcGxheUZhY2FkZSBpbXBsZW1lbnRzIElEaXNwbGF5RmFjYWRlIHsKLQotCXB1YmxpYyB2b2lkIGFzeW5jRXhlYyhSdW5uYWJsZSBydW5uYWJsZSkgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9FY2xpcHNlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0VjbGlwc2VGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxZGUwZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0VjbGlwc2VGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSURpc3BsYXlGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKYXZhQ29yZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklTdGF0aWNJREU7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlRmFjYWRlIGltcGxlbWVudHMgSUVjbGlwc2VGYWNhZGUgewotCi0JcHVibGljIHN0YXRpYyBFY2xpcHNlRmFjYWRlIElOU1RBTkNFID0gbmV3IEVjbGlwc2VGYWNhZGUoKTsKLQkKLQlwcml2YXRlIEVjbGlwc2VGYWNhZGUoKSB7Ci0JfQotCi0JcHVibGljIElKYXZhQ29yZUZhY2FkZSBnZXRKYXZhQ29yZSgpIHsKLQkJcmV0dXJuIG5ldyBKYXZhQ29yZUZhY2FkZSgpOwotCX0KLQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSURpc3BsYXlGYWNhZGUgZ2V0RGlzcGxheSgpIHsKLQkJcmV0dXJuIG5ldyBEaXNwbGF5RmFjYWRlKCk7Ci0JfQotCQotCXB1YmxpYyBJU3RhdGljSURFIGdldElERSgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNJREUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0phdmFDb3JlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0phdmFDb3JlRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzA2OGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9KYXZhQ29yZUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKYXZhQ29yZUZhY2FkZTsKLQotcHVibGljIGNsYXNzIEphdmFDb3JlRmFjYWRlIGltcGxlbWVudHMgSUphdmFDb3JlRmFjYWRlIHsKLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvU3RhdGljSURFLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL1N0YXRpY0lERS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmIzMjU0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvU3RhdGljSURFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JU3RhdGljSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotcHVibGljIGNsYXNzIFN0YXRpY0lERSBpbXBsZW1lbnRzIElTdGF0aWNJREUgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZQotCSAqIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLklTdGF0aWNJREUjb3BlbkVkaXRvcihvcmcuZWNsaXBzZQotCSAqIC5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKElGaWxlIGZpbGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUlERS5vcGVuRWRpdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkKLQkJCQkuZ2V0QWN0aXZlUGFnZSgpLCBmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGE1YzYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuZ2VvbWV0cnkuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmRhdGF0eXBlcy5JRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgSUFkZEZlYXR1cmUgewotCi0JaW50W10gbG93ZXJFZGdlcyA9IG5ldyBpbnRbMjAwXTsgCi0JaW50IG51bUluQVJvdzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9GUk9NX0VER0VfSCA9IDUwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBESVNUX0ZST01fRURHRV9WID0gNTA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERJU1RfSCA9IDEwMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9WID0gMTAwOwotCQotCXB1YmxpYyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY3R4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlEaWFncmFtIGQgPSBnZXREaWFncmFtKCk7Ci0JCUpwYVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldEpQQVByb2plY3QoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBwcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKS5wZXJzaXN0ZW5jZVVuaXRzKCkubmV4dCgpOwotCQkKLQkJCi0JCVBvaW50IGxvd2VzdFJpZ2h0ZXN0UG9pbnRPZkV4aXN0aW5nRGlhZ3JhbSA9IGdldExvd2VzdFJpZ2h0ZXN0UG9pbnQoZCk7Ci0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0JCQlsb3dlckVkZ2VzW2ldID0gbG93ZXN0UmlnaHRlc3RQb2ludE9mRXhpc3RpbmdEaWFncmFtLnkgKyAKLQkJCQkJCQkJKCgoaSAlIDIgPT0gMCkgPyAxIDogMikgKiAKLQkJCQkJCQkJKChsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSA9PSAwKSA/IAotCQkJCQkJCQkJRElTVF9GUk9NX0VER0VfViA6IAotCQkJCQkJCQkJRElTVF9WKSk7Ci0JCX0KLQkJSURpbWVuc2lvbiBkaW0gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbUVkaXRvcigpLmdldEN1cnJlbnRTaXplKCk7Ci0JCWludCBkV2lkdGggPSBkaW0uZ2V0V2lkdGgoKTsKLQkJbnVtSW5BUm93ID0gKGRXaWR0aCAtIERJU1RfRlJPTV9FREdFX0ggLSAyMCArIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEgpLyhKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIICsgRElTVF9IKTsKLQkJbnVtSW5BUm93ID0gKG51bUluQVJvdyA+IDApID8gbnVtSW5BUm93IDogMTsKLQkJCi0JCWxvd2VyRWRnZXNbMF0gPSBsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSArICgobG93ZXN0UmlnaHRlc3RQb2ludE9mRXhpc3RpbmdEaWFncmFtLnkgPT0gMCkgPyBESVNUX0ZST01fRURHRV9WIDogRElTVF9WKTsJCQotCQkKLQkJZm9yIChJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gdW5pdC5jbGFzc1JlZnMoKTsgY2xhc3NSZWZzLmhhc05leHQoKTspIHsKLQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJCWlmIChjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSAhPSBudWxsKSB7IC8vIG51bGwgaWYKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQkJCWlmIChqcHQuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSB7Ci0JCQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkJaWYgKHBlICE9IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCWZpbmFsIEFkZENvbnRleHQgY3R4ID0gbmV3IEFkZENvbnRleHQoKTsKLQkJCQkJY3R4LnNldFRhcmdldENvbnRhaW5lcihkKTsKLQkJCQkJY3R4LnNldE5ld09iamVjdChqcHQpOwotCQkJCQkKLQkJCQkJSW5kZXhBbmRMb3dlckVkZ2UgaWUgPSBnZXRNaW5Mb3dlckVkZ2UoKTsKLQkJCQkJCi0JCQkJCWludCB4ID0gRElTVF9GUk9NX0VER0VfSCArIGllLmluZGV4ICogKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEggKyBESVNUX0gpOwotCQkJCQljdHguc2V0TG9jYXRpb24oeCwgaWUubG93ZXJFZGdlKTsKLQkJCQkJZmluYWwgQWRkSlBBRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQkJCi0JCQkJCWZpbmFsIERpYWdyYW0gdGFyZ2V0RGlhZ3JhbSA9IChEaWFncmFtKSBjdHguZ2V0VGFyZ2V0Q29udGFpbmVyKCk7Ci0JCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKHRhcmdldERpYWdyYW0pOwotCQkJCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQkJCWZ0LmFkZChjdHgpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWxvd2VyRWRnZXNbaWUuaW5kZXhdID0gZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCkgKyBlbnRpdHlTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpICsgRElTVF9WOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JfQotCQotCXByaXZhdGUgSW5kZXhBbmRMb3dlckVkZ2UgZ2V0TWluTG93ZXJFZGdlKCkgewotCQlJbmRleEFuZExvd2VyRWRnZSByZXMgPSBuZXcgSW5kZXhBbmRMb3dlckVkZ2UoKTsKLQkJcmVzLmxvd2VyRWRnZSA9IDEwMDAwMDAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUluQVJvdzsgaSsrKSB7Ci0JCQlpZiAobG93ZXJFZGdlc1tpXSA8IHJlcy5sb3dlckVkZ2UpIHsKLQkJCQlyZXMubG93ZXJFZGdlID0gbG93ZXJFZGdlc1tpXTsKLQkJCQlyZXMuaW5kZXggPSBpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRUYXJnZXRKUEFQcm9qZWN0KCkgewotCQlyZXR1cm4gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldExvd2VzdFJpZ2h0ZXN0UG9pbnQoRGlhZ3JhbSBkKSB7IAotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSBkLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotCQlpbnQgeCA9IDA7Ci0JCWludCB5ID0gMDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0JCQlpbnQgcmlnaHRFZGdlID0gc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRYKCkgKyAKLQkJCQkJCQlzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCk7Ci0JCQl4ID0gTWF0aC5tYXgoeCwgcmlnaHRFZGdlKTsKLQkJCWludCBsb3dlckVkZ2UgPSBzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKSArCi0JCQkJCQkJIHNoLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCk7Ci0JCQl5ID0gTWF0aC5tYXgoeSwgbG93ZXJFZGdlKTsKLQkJfQotCQl4ID0gTWF0aC5tYXgoeCwgMyAqIChESVNUX0ggKyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIKSk7Ci0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBDdXN0b21Db250ZXh0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBJbmRleEFuZExvd2VyRWRnZSB7Ci0JCWludCBpbmRleDsKLQkJaW50IGxvd2VyRWRnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGQ5ZTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEFkZFNoYXBlRmVhdHVyZSB7Ci0KLQlwcml2YXRlIElBZGRGZWF0dXJlIGdyYXBoaWNhbEFkZDsKLQotCXByaXZhdGUgSUN1c3RvbUZlYXR1cmUgZXhwYW5kQ29tcGFydG1lbnRGZWF0dXJlOwotCi0JcHVibGljIEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQl0aGlzKGZwLCBuZXcgR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZShmcCksIG5ldyBFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZShmcCkpOwotCX0KLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIElBZGRGZWF0dXJlIGdyYXBoaWNhbEFkZCwgSUN1c3RvbUZlYXR1cmUgZXhwYW5kRmVhdHVyZSkgewotCQlzdXBlcihmcCk7Ci0JCXRoaXMuZ3JhcGhpY2FsQWRkID0gZ3JhcGhpY2FsQWRkOwotCQlleHBhbmRDb21wYXJ0bWVudEZlYXR1cmUgPSBleHBhbmRGZWF0dXJlOwotCX0KLQotCXB1YmxpYyBQaWN0b2dyYW1FbGVtZW50IGFkZChmaW5hbCBJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCU9iamVjdCBvID0gY29udGV4dC5nZXROZXdPYmplY3QoKTsKLQkJaWYgKCEobyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZmluYWwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0ciA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgbzsKLS8vCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXR0ci5nZXRQYXJlbnQoKSk7Ci0KLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucHV0S2V5VG9CdXNpbmVzc09iamVjdChnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChuZXdBdHRyKSwgbmV3QXR0cik7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QobmV3QXR0cik7IAotCQlpZiAocGUgIT0gbnVsbCkgCi0JCQlyZXR1cm4gcGU7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSk7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IGdyYXBoaWNhbEFkZChjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpLCBuZXdBdHRyKTsKLQkJCQlleHBhbmQobmV3QXR0cik7Ci0JCQkJZW5hYmxlRGlyZWN0QWZ0ZXJBZGRpbmcodGV4dFNoYXBlKTsKLQkJCQl3cnAuc2V0T2JqKHRleHRTaGFwZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gKFBpY3RvZ3JhbUVsZW1lbnQpd3JwLmdldE9iaigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUNvbnRhaW5lclNoYXBlIGF0dHJpYnV0ZVNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanBhKTsKLQotCQlJQ3VzdG9tQ29udGV4dCBjdXN0b21Db250ZXh0ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IGF0dHJpYnV0ZVNoYXBlLmdldENvbnRhaW5lcigpIH0pOwotCQlleHBhbmRDb21wYXJ0bWVudEZlYXR1cmUuZXhlY3V0ZShjdXN0b21Db250ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGdyYXBoaWNhbEFkZChDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cikgewotCQlBZGRDb250ZXh0IGNvbnRleHQgPSBuZXcgQWRkQ29udGV4dCgpOwotCQljb250ZXh0LnNldE5ld09iamVjdChuZXdBdHRyKTsKLQkJY29udGV4dC5zZXRUYXJnZXRDb250YWluZXIoZW50aXR5U2hhcGUpOwotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGdyYXBoaWNhbEFkZC5hZGQoY29udGV4dCk7Ci0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZURpcmVjdEFmdGVyQWRkaW5nKENvbnRhaW5lclNoYXBlIHRleHRTaGFwZSkgewotCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHRleHRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0JCWlmIChncmFwaGljc0FsZ29yaXRobSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSBncmFwaGljc0FsZ29yaXRobTsKLQkJCUlEaXJlY3RFZGl0aW5nSW5mbyBkaXJlY3RFZGl0aW5nSW5mbyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpcmVjdEVkaXRpbmdJbmZvKCk7Ci0JCQlkaXJlY3RFZGl0aW5nSW5mby5zZXRNYWluUGljdG9ncmFtRWxlbWVudCh0ZXh0U2hhcGUpOwotCQkJZGlyZWN0RWRpdGluZ0luZm8uc2V0UGljdG9ncmFtRWxlbWVudCh0ZXh0U2hhcGUpOwotCQkJZGlyZWN0RWRpdGluZ0luZm8uc2V0R3JhcGhpY3NBbGdvcml0aG0odGV4dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJT2JqZWN0IG8gPSBjb250ZXh0LmdldE5ld09iamVjdCgpOwotCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg3MTY3OS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuT3JpZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5JUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuUHJlZGVmaW5lZENvbG9yZWRBcmVhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUFkZEVudGl0eUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50cy5TaGFwZVR5cGU7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoeyAicmVzdHJpY3Rpb24iIH0pCi1wdWJsaWMgY2xhc3MgQWRkSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0QWRkU2hhcGVGZWF0dXJlIHsKLQotCXByaXZhdGUgSVBlVXRpbEZhY2FkZSBmYWNhZGU7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlOwotCXByaXZhdGUgc3RhdGljIENvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGU7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZTsKLQotCi0JcHVibGljIEFkZEpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JCWZhY2FkZSA9IG5ldyBQZVV0aWxGYWNhZGUoKTsKLQl9Ci0KLQlwdWJsaWMgQWRkSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBJUGVVdGlsRmFjYWRlIGZhY2FkZSkgewotCQlzdXBlcihmcCk7Ci0JCXRoaXMuZmFjYWRlID0gZmFjYWRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCU9iamVjdCBuZXdPYmogPSBjb250ZXh0LmdldE5ld09iamVjdCgpOwotCi0JCWlmIChuZXdPYmogaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCWlmIChjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpIGluc3RhbmNlb2YgRGlhZ3JhbSkgewotCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBuZXdPYmo7Ci0JCQkJcmV0dXJuIGNoZWNrSlBURm9yQWRkaW5nKGpwdCk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgSUNvbXBpbGF0aW9uVW5pdCkgewotCQkJaWYgKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IChJQ29tcGlsYXRpb25Vbml0KSBuZXdPYmo7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCQlyZXR1cm4gY2hlY2tKUFRGb3JBZGRpbmcoanB0KTsKLQkJCX0KLQkJfSBpZiAobmV3T2JqIGluc3RhbmNlb2YgU291cmNlVHlwZSkgewotCQkJaWYgKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9ICgoU291cmNlVHlwZSluZXdPYmopLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKUEFFZGl0b3JVdGlsLmdldEpQVHlwZShjdSk7Ci0JCQkJcmV0dXJuIGNoZWNrSlBURm9yQWRkaW5nKGpwdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjaGVja0pQVEZvckFkZGluZyhKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlQaWN0b2dyYW1FbGVtZW50W10gcGljdG9ncmFtcyA9IGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJLmdldEFsbFBpY3RvZ3JhbUVsZW1lbnRzRm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJSnBhUHJvamVjdCBwcm9qID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCQlpZiAocHJvaiAhPSBudWxsKQotCQkJaWYgKHByb2ogIT0ganB0LmdldEpwYVByb2plY3QoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAocGljdG9ncmFtcyA9PSBudWxsKSB8fCAocGljdG9ncmFtcy5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBQaWN0b2dyYW1FbGVtZW50IGFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJT2JqZWN0IG5ld09iaiA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBuZXdPYmo7Ci0JCQlpZiAoanB0LmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCQkJanB0ID0gY3JlYXRlRW50aXR5RnJvbUV4aXN0aW5nTWFwcGVkU3VwZXJjbGFzcyhmcCwganB0KTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIG5ld09iajsKLQkJCWpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCWlmIChqcHQuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJCQlqcHQgPSBjcmVhdGVFbnRpdHlGcm9tRXhpc3RpbmdNYXBwZWRTdXBlcmNsYXNzKGZwLCBqcHQpOwotCQkJfQotCi0JCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgU291cmNlVHlwZSkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9ICgoU291cmNlVHlwZSluZXdPYmopLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJanB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotCQl9Ci0JCWZpbmFsIERpYWdyYW0gdGFyZ2V0RGlhZ3JhbSA9IChEaWFncmFtKSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQkJCQotCSAgICBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGZhY2FkZS5jcmVhdGVDb250YWluZXJTaGFwZSh0YXJnZXREaWFncmFtLCB0cnVlKTsKLQkJCi0JCWNyZWF0ZUVudGl0eVJlY3RhbmdsZShjb250ZXh0LCBlbnRpdHlTaGFwZSwKLQkJCQkJCQkJdGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJbGluayhlbnRpdHlTaGFwZSwganB0KTsKLQkJU2hhcGUgc2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVTaGFwZShlbnRpdHlTaGFwZSwgZmFsc2UpOwotCQlQb2x5bGluZSBoZWFkZXJCb3R0b21MaW5lID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoc2hhcGUsIG5ldyBpbnRbXSB7IDAsCi0JCQkJMzAsIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEgsIDMwIH0pOwotCQloZWFkZXJCb3R0b21MaW5lCi0JCQkJLnNldEZvcmVncm91bmQobWFuYWdlQ29sb3IoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfQ09MT1IpKTsKLQkJaGVhZGVyQm90dG9tTGluZS5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfV0lEVEgpOwotCi0JCWFkZEhlYWRlcihqcHQsIGVudGl0eVNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIKTsKLQkJCi0JCWNyZWF0ZUNvbXBhcnRtZW50cyhjb250ZXh0LCBqcHQsIGVudGl0eVNoYXBlKTsKLQkJZmlsbENvbXBhcnRtZW50cyhqcHQsZW50aXR5U2hhcGUpOwotCQkKLQkJU3RyaW5nIGtleSA9IGZwLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChmcC5nZXRCdXNpbmVzc09iamVjdEZvcktleShrZXkpID09IG51bGwpCi0JCQlmcC5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGtleSwganB0KTsKLQotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDaG9wYm94QW5jaG9yKGVudGl0eVNoYXBlKTsKLQkJZW50aXR5U2hhcGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJbGF5b3V0UGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0KLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZnApOwotCQl1cGRhdGVGZWF0dXJlLnJlY29ubmVjdChqcHQpOwotCQotCQlyZXR1cm4gZW50aXR5U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGUgY3JlYXRlRW50aXR5RnJvbUV4aXN0aW5nTWFwcGVkU3VwZXJjbGFzcygKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUNyZWF0ZUNvbnRleHQgY29udCA9IG5ldyBDcmVhdGVDb250ZXh0KCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWNrYWdlTmFtZSA9IGdldE1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlRGVjbGFyYXRpb24oZnAsIGpwdCwKLQkJCQkJcGFja2FnZU5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzUHJpbWFyeUtleSA9IGhhc01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5QXR0cmlidXRlKGpwdCk7Ci0KLQkJQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSBjcmVhdGVGZWF0dXJlID0gbmV3IENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoZnAsCi0JCQkJdHJ1ZSwganB0LmdldE5hbWUoKSwgcGFja2FnZU5hbWUsIGhhc1ByaW1hcnlLZXkpOwotCQlPYmplY3RbXSBvYmplY3RzID0gY3JlYXRlRmVhdHVyZS5jcmVhdGUoY29udCk7Ci0JCWlmIChvYmplY3RzLmxlbmd0aCAhPSAwKSB7Ci0JCQlPYmplY3Qgb2JqID0gb2JqZWN0c1swXTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGpwdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IGl0ZXIgPSAoKEphdmFNYXBwZWRTdXBlcmNsYXNzKSBqcHQKLQkJCQkuZ2V0TWFwcGluZygpKS5hbGxBdHRyaWJ1dGVNYXBwaW5ncygpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZU1hcHBpbmcgbWFwID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAobWFwLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYXBwZWRTdXBlcmNsYXNzUGFja2FnZURlY2xhcmF0aW9uKAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCVN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRGVjbGFyYXRpb25bXSBwYWNrYWdlcyA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpCi0JCQkJLmdldFBhY2thZ2VEZWNsYXJhdGlvbnMoKTsKLQkJaWYgKHBhY2thZ2VzLmxlbmd0aCA+IDApIHsKLQkJCUlQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2wgPSBwYWNrYWdlc1swXTsKLQkJCXBhY2thZ2VOYW1lID0gcGFja2FnZURlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcGFja2FnZU5hbWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb21wYXJ0bWVudHMoSUFkZENvbnRleHQgY29udGV4dCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUNvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKSB7Ci0JCXByaW1hcnlTaGFwZSA9IGNyZWF0ZUNvbXBhcnRtZW50UmVjdGFuZ2xlKGVudGl0eVNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQsIEpQQUVkaXRvck1lc3NhZ2VzLkFkZEpQQUVudGl0eUZlYXR1cmVfcHJpbWFyeUtleXNTaGFwZSk7Ci0JCXJlbGF0aW9uU2hhcGUgPSBjcmVhdGVDb21wYXJ0bWVudFJlY3RhbmdsZShlbnRpdHlTaGFwZSwgR3JhcGhpY3NVcGRhdGVyLmdldE5leHRDb21wYXJ0bWVudFkocHJpbWFyeVNoYXBlKSArIEpQQUVkaXRvckNvbnN0YW50cy5TRVBBUkFUT1JfSEVJR0hULAotCQkJCSBKUEFFZGl0b3JNZXNzYWdlcy5BZGRKUEFFbnRpdHlGZWF0dXJlX3JlbGF0aW9uQXR0cmlidXRlc1NoYXBlcyk7Ci0JCWJhc2ljU2hhcGUgPSBjcmVhdGVDb21wYXJ0bWVudFJlY3RhbmdsZShlbnRpdHlTaGFwZSwgR3JhcGhpY3NVcGRhdGVyLmdldE5leHRDb21wYXJ0bWVudFkocmVsYXRpb25TaGFwZSkgKyBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCwgSlBBRWRpdG9yTWVzc2FnZXMuQWRkSlBBRW50aXR5RmVhdHVyZV9iYXNpY0F0dHJpYnV0ZXNTaGFwZXMpOwotCQlpZiAoSUFkZEVudGl0eUNvbnRleHQuY2xhc3MuaXNJbnN0YW5jZShjb250ZXh0KSkgewotCQkJSUFkZEVudGl0eUNvbnRleHQgZW50aXR5Q29udGV4dCA9IChJQWRkRW50aXR5Q29udGV4dCkgY29udGV4dDsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQocHJpbWFyeVNoYXBlLCBlbnRpdHlDb250ZXh0LmlzUHJpbWFyeUNvbGxhcHNlZCgpKTsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoYmFzaWNTaGFwZSwgZW50aXR5Q29udGV4dC5pc0Jhc2ljQ29sbGFwc2VkKCkpOwotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChyZWxhdGlvblNoYXBlLCBlbnRpdHlDb250ZXh0LmlzUmVsYXRpb25Db2xsYXBzZWQoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKHByaW1hcnlTaGFwZSwgZmFsc2UpOwotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChiYXNpY1NoYXBlLCBmYWxzZSk7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKHJlbGF0aW9uU2hhcGUsIGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWxsQ29tcGFydG1lbnRzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKSB7Ci0JCVN0cmluZ1tdIHByaW1hcnlLZXlBbm5vdGF0aW9ucyA9IG5ldyBTdHJpbmdbXSB7SlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fSUQsIEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0VNQkVEREVEX0lEfTsKLQkJZm9yKFN0cmluZyBhbm5vdGF0aW9uIDogcHJpbWFyeUtleUFubm90YXRpb25zKXsKLQkJCWFkZENvbXBhcnRtZW50Q2hpbGRyZW4ocHJpbWFyeVNoYXBlLCBqcHQsIGFubm90YXRpb24pOwotCQl9Ci0JCVN0cmluZ1tdIHJlbGF0aW9uQW5ub3RhdGlvbnMgPSBuZXcgU3RyaW5nW10ge0pQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSwgCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUsIEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19NQU5ZLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkV9OwotCSAgICBmb3IoU3RyaW5nIGFubm90YXRpb24gOiByZWxhdGlvbkFubm90YXRpb25zKXsKLQkJICAgYWRkQ29tcGFydG1lbnRDaGlsZHJlbihyZWxhdGlvblNoYXBlLCBqcHQsIGFubm90YXRpb24pOwotCSAgICB9Ci0gICAgICAgIGFkZEJhc2ljQXR0cmlidXRlcyhiYXNpY1NoYXBlLCBqcHQpOwotICAgICAgICBHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCX0KLQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgY3JlYXRlQ29tcGFydG1lbnRSZWN0YW5nbGUoCi0JCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgaW50IHksIFN0cmluZyBhdHRyaWJUeHQpIHsKLQkJaW50IHdpZHRoID0gZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKAotCQkJCWVudGl0eVNoYXBlLCBmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyU2hhcGUsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLkNPTVBBUlRNRU5UCi0JCQkJCQkudG9TdHJpbmcoKSk7Ci0JCVJlY3RhbmdsZSByZWN0ID0gYWRkQ29tcGFydG1lbnRSZWN0YW5nbGUoeSwgd2lkdGgsIGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCWFkZENvbXBhcnRtZW50SGVhZGVyVGV4dChhdHRyaWJUeHQsIHdpZHRoLCByZWN0KTsKLQkJCi0JCVVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgdXBkYXRlRmVhdHVyZSA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCi0JCXVwZGF0ZUZlYXR1cmUuYWRkU2VwYXJhdG9yc1RvU2hhcGUoY29udGFpbmVyU2hhcGUpOwotCQkKLQkJcmV0dXJuIGNvbnRhaW5lclNoYXBlOwotCX0KLQotCXByaXZhdGUgUmVjdGFuZ2xlIGFkZENvbXBhcnRtZW50UmVjdGFuZ2xlKGludCB5LCBpbnQgd2lkdGgsCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlSZWN0YW5nbGUgcmVjdCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVJlY3RhbmdsZShjb250YWluZXJTaGFwZSk7Ci0JCXJlY3Quc2V0RmlsbGVkKGZhbHNlKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShmYWxzZSk7Ci0JCXJlY3Quc2V0SGVpZ2h0KDApOwotCQlyZWN0LnNldFdpZHRoKHdpZHRoKTsKLQkJcmVjdC5zZXRYKDApOwotCQlyZWN0LnNldFkoeSk7Ci0JCWNvbnRhaW5lclNoYXBlLnNldEFjdGl2ZSh0cnVlKTsKLQkJcmV0dXJuIHJlY3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbXBhcnRtZW50SGVhZGVyVGV4dChTdHJpbmcgYXR0cmliVHh0LCBpbnQgd2lkdGgsCi0JCQlSZWN0YW5nbGUgcmVjdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCVRleHQgdGV4dCA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmcCwgcmVjdCwgYXR0cmliVHh0KTsKLQkJdGV4dC5nZXRGb250KCkuc2V0U2l6ZSg3KTsKLQkJdGV4dC5nZXRGb250KCkuc2V0SXRhbGljKHRydWUpOwotCQl0ZXh0LmdldEZvbnQoKS5zZXRCb2xkKGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgodGV4dCwgd2lkdGgpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbkFuZFNpemUodGV4dCwgMCwgMiwgd2lkdGgsCi0JCQkJMTMpOwotCQl0ZXh0LnNldEhvcml6b250YWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX0NFTlRFUik7Ci0JCXRleHQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX0NFTlRFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbXBhcnRtZW50Q2hpbGRyZW4oCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCVN0cmluZyBhdHRyaWJ1dGVBbm5vdGF0aW9ucykgewotCQlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXNJdGVyYXRvciA9IGpwdAotCQkJCS5hdHRyaWJ1dGVzKCk7Ci0JCXdoaWxlIChhdHRyaWJ1dGVzSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzSXRlcmF0b3IubmV4dCgpOwotCQkJSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKGF0dHJpYnV0ZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoYXR0cmlidXRlQW5ub3RhdGlvbnMpKSB7Ci0JCQkJYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQlhZGRBdHRyaWJ1dGVzKGNvbnRhaW5lclNoYXBlLCBhdHRyaWJ1dGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEJhc2ljQXR0cmlidXRlcyhDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCl7Ci0JCUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzSXRlcmF0b3IgPSBqcHQuYXR0cmlidXRlcygpOwotCQl3aGlsZShhdHRyaWJ1dGVzSXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMoYXR0cmlidXRlKTsKLQkJCWlmKCEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fSUQpKSYmICEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKSAmJiAhKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpICYmIAotCQkJCQkhKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgJiYgIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpJiYKLQkJCQkJIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgfHwgYW5ub3RhdGlvbnMuaXNFbXB0eSgpKXsKLQkJCQlhdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCWFkZEF0dHJpYnV0ZXMoY29udGFpbmVyU2hhcGUsIGF0dHJpYnV0ZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlcyhDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwKLQkJCUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCWFkZEF0dHJpYnV0ZShqcGEsIGVudGl0eVNoYXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgSVBlVXRpbEZhY2FkZSB7Ci0JCXB1YmxpYyBDb250YWluZXJTaGFwZSBjcmVhdGVDb250YWluZXJTaGFwZShEaWFncmFtIGRpYWdyYW0sIGJvb2xlYW4gYik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSb3VuZGVkUmVjdGFuZ2xlIGNyZWF0ZUVudGl0eVJlY3RhbmdsZShJQWRkQ29udGV4dCBjb250ZXh0LAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIERpYWdyYW0gZGlhZ3JhbSkgewotCi0JCVJvdW5kZWRSZWN0YW5nbGUgZW50aXR5UmVjdGFuZ2xlID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUm91bmRlZFJlY3RhbmdsZSgKLQkJCQllbnRpdHlTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9DT1JORVJfV0lEVEgsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9DT1JORVJfSEVJR0hUKTsKLQkJZW50aXR5UmVjdGFuZ2xlCi0JCQkJLnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoZGlhZ3JhbSwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfQ09MT1IpKTsKLQkJZW50aXR5UmVjdGFuZ2xlCi0JCQkJLnNldEJhY2tncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoZGlhZ3JhbSwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CQUNLR1JPVU5EKSk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFJlbmRlcmluZ1N0eWxlKGVudGl0eVJlY3RhbmdsZS5nZXRQaWN0b2dyYW1FbGVtZW50KCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSwgCi0JCQkJUHJlZGVmaW5lZENvbG9yZWRBcmVhcy5nZXRBZGFwdGVkR3JhZGllbnRDb2xvcmVkQXJlYXMoSVByZWRlZmluZWRSZW5kZXJpbmdTdHlsZS5CTFVFX1dISVRFX0dMT1NTX0lEKSk7Ci0JCWVudGl0eVJlY3RhbmdsZS5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfV0lEVEgpOwotCQllbnRpdHlSZWN0YW5nbGUuc2V0TGluZVN0eWxlKExpbmVTdHlsZS5TT0xJRCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShlbnRpdHlSZWN0YW5nbGUsIGNvbnRleHQKLQkJCQkuZ2V0WCgpLCBjb250ZXh0LmdldFkoKSwKLQkJCQkoY29udGV4dC5nZXRXaWR0aCgpID09IC0xKSA/IEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEgKLQkJCQkJCTogY29udGV4dC5nZXRXaWR0aCgpLAotCQkJCShjb250ZXh0LmdldEhlaWdodCgpID09IC0xKSA/IEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfSEVJR0hUCi0JCQkJCQk6IGNvbnRleHQuZ2V0SGVpZ2h0KCkpOwotCQlyZXR1cm4gZW50aXR5UmVjdGFuZ2xlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFBlVXRpbEZhY2FkZSBpbXBsZW1lbnRzIElQZVV0aWxGYWNhZGUgewotCQlwdWJsaWMgQ29udGFpbmVyU2hhcGUgY3JlYXRlQ29udGFpbmVyU2hhcGUoRGlhZ3JhbSBkaWFncmFtLCBib29sZWFuIGIpIHsKLQkJCXJldHVybiBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZShkaWFncmFtLCB0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgYWRkSGVhZGVyKEphdmFQZXJzaXN0ZW50VHlwZSBhZGRlZFdyYXBwZXIsCi0JCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgaW50IHdpZHRoKSB7Ci0KLQkJQ29udGFpbmVyU2hhcGUgaGVhZGVySWNvblNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoCi0JCQkJZW50aXR5U2hhcGUsIGZhbHNlKTsKLQkJUmVjdGFuZ2xlIGljb25SZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGhlYWRlckljb25TaGFwZSk7Ci0JCWljb25SZWN0LnNldEZpbGxlZChmYWxzZSk7Ci0JCWljb25SZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJaWNvblJlY3Quc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1JFQ1RfSEVJR0hUKTsKLQkJaWNvblJlY3Quc2V0WCgwKTsKLQkJaWNvblJlY3Quc2V0V2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9JQ09OX1JFQ1RfV0lEVEgpOwotCQlpY29uUmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9JQ09OX1JFQ1RfSEVJR0hUKTsKLQkJaWNvblJlY3Quc2V0WSgwKTsKLQkJSW1hZ2UgaGVhZGVySWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LAotCQkJCUpQQUVkaXRvckltYWdlUHJvdmlkZXIuSlBBX0VOVElUWSk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShoZWFkZXJJY29uLCAKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9IRUFERVJfWCwKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9IRUFERVJfWSwKLQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9XSURUSCwgCi0JCQkJCQkJCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fSEVJR0hUKTsKLQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShoZWFkZXJJY29uU2hhcGUsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKSk7Ci0KLQkJQ29udGFpbmVyU2hhcGUgZW50aXR5SGVhZGVyVGV4dFNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoZW50aXR5U2hhcGUsIGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkKLQkJCQkuc2V0UHJvcGVydHlWYWx1ZShlbnRpdHlIZWFkZXJUZXh0U2hhcGUsCi0JCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFLCBTaGFwZVR5cGUuSEVBREVSCi0JCQkJCQkJCS50b1N0cmluZygpKTsKLQkJUmVjdGFuZ2xlIGhlYWRlclJlY3QgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoZW50aXR5SGVhZGVyVGV4dFNoYXBlKTsKLQkJaGVhZGVyUmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQloZWFkZXJSZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJaGVhZGVyUmVjdC5zZXRXaWR0aCh3aWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCQloZWFkZXJSZWN0LnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9IRUlHSFQpOwotCQloZWFkZXJSZWN0LnNldFkoMik7Ci0JCWhlYWRlclJlY3Quc2V0WChKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9YKTsKLQotCQlTdHJpbmcgaGVhZGVyVGV4dFN0cmluZyA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChhZGRlZFdyYXBwZXIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGFkZGVkV3JhcHBlcik7Ci0JCUpQQUVkaXRvclV0aWwuYmVjb21lV29ya2luZ0NvcHkoY3UpOwotCQloZWFkZXJUZXh0U3RyaW5nID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChoZWFkZXJUZXh0U3RyaW5nKTsgCi0JCXRyeSB7Ci0JCQlpZiAoY3UuaGFzVW5zYXZlZENoYW5nZXMoKSkgewotCQkJCWhlYWRlclRleHRTdHJpbmcgPSAiKiAiICsgaGVhZGVyVGV4dFN0cmluZzsJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNoZWNrIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHVuc2F2ZWQgY2hhbmdlcyIpOwkvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCSAKLQkJfQotCQlUZXh0IGhlYWRlclRleHRPYmogPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVEZWZhdWx0VGV4dChoZWFkZXJSZWN0LAotCQkJCWhlYWRlclRleHRTdHJpbmcpOwotCQloZWFkZXJUZXh0T2JqCi0JCQkJLnNldEZvcmVncm91bmQobWFuYWdlQ29sb3IoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9URVhUX0ZPUkVHUk9VTkQpKTsKLQkJaGVhZGVyVGV4dE9iai5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9MRUZUKTsKLQkJaGVhZGVyVGV4dE9iai5zZXRWZXJ0aWNhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfVE9QKTsKLQkJaGVhZGVyVGV4dE9iai5nZXRGb250KCkuc2V0Qm9sZCh0cnVlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKGhlYWRlclRleHRPYmosIDEsIDIsCi0JCQkJd2lkdGgsIDIwKTsKLQotCQlyZXR1cm4gZW50aXR5SGVhZGVyVGV4dFNoYXBlOwotCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhLAotCQkJQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCWZwLnB1dEtleVRvQnVzaW5lc3NPYmplY3QoZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QocGEpLCBwYSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXBhLmdldFBhcmVudCgpOwotCQlTdHJpbmcga2V5ID0gZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJaWYgKGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSkgPT0gbnVsbCkKLQkJCWZwLnB1dEtleVRvQnVzaW5lc3NPYmplY3Qoa2V5LCBqcHQpOwotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShmcCk7Ci0gICAgICAgIHVwZGF0ZUZlYXR1cmUuYWRkQXR0cmlidXRlcyhjb21wYXJ0bWVudFNoYXBlLmdldENvbnRhaW5lcigpLCBwYSk7Ci0JCXVwZGF0ZUZlYXR1cmUgPSBudWxsOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZFJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDRjYzIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpci5VTkk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZS5NQU5ZX1RPX01BTlk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZS5NQU5ZX1RPX09ORTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlLk9ORV9UT19NQU5ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGUuT05FX1RPX09ORTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkQmVuZHBvaW50RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZEJlbmRwb2ludENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLQotcHVibGljIGNsYXNzIEFkZFJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0QWRkRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFNUQVJUX0NPRUZGSUNJRU5UID0gMC4xOwotCi0JcHJpdmF0ZSBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltYWdlQ3JlYXRvcjsKLQlwcml2YXRlIElKUEFFZGl0b3JVdGlsIGpwYUVkaXRvclV0aWw7IAotCi0gICAgcHVibGljIEFkZFJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBKUEFFZGl0b3JJbWFnZUNyZWF0b3IoKSwgbmV3IEpQQUVkaXRvclV0aWxJbXBsKCkpOwotCX0KLQotCXB1YmxpYyBBZGRSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgCi0JCQkJCQkJICBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltYWdlQ3JlYXRvciwgCi0JCQkJCQkJICBJSlBBRWRpdG9yVXRpbCBqcGFFZGl0b3JVdGlsKSB7Ci0gICAgICAgIHN1cGVyKGZwKTsKLQkJdGhpcy5pbWFnZUNyZWF0b3IgPSBpbWFnZUNyZWF0b3I7Ci0JCXRoaXMuanBhRWRpdG9yVXRpbCA9IGpwYUVkaXRvclV0aWw7Ci0gICAgfQotIAotICAgIHB1YmxpYyBQaWN0b2dyYW1FbGVtZW50IGFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGZpbmFsIElBZGRDb25uZWN0aW9uQ29udGV4dCBhZGRDb25Db250ZXh0ID0gKElBZGRDb25uZWN0aW9uQ29udGV4dCkgY29udGV4dDsKLQkJZmluYWwgSVJlbGF0aW9uIHJlbGF0aW9uID0gKElSZWxhdGlvbikgY29udGV4dC5nZXROZXdPYmplY3QoKTsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbSgpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJUmVjb3JkaW5nQ29tbWFuZCByYyA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihhZGRDb25Db250ZXh0LCByZWxhdGlvbiwgZGlhZ3JhbSk7Ci0JCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNvbm5lY3Rpb25MaW5lKGRpYWdyYW0sIGNvbm5lY3Rpb24pOwotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLnB1dEtleVRvQnVzaW5lc3NPYmplY3QocmVsYXRpb24uZ2V0SWQoKSwgcmVsYXRpb24pOwotCQkJCWxpbmsoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoY29ubmVjdGlvbik7Ci0JCQkJd3JwLnNldE9iaihjb25uZWN0aW9uKTsKLQkJCX0JCQkKLQkJfTsKLQkJdHJ5IHsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUocmMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQotCQl9Ci0JCQotCQlyZXR1cm4gKFBpY3RvZ3JhbUVsZW1lbnQpd3JwLmdldE9iaigpOwotICAgIH0KLSAgICAgICAgCi0JcHJpdmF0ZSBGcmVlRm9ybUNvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihJQWRkQ29ubmVjdGlvbkNvbnRleHQgYWRkQ29uQ29udGV4dCwgSVJlbGF0aW9uIHJlbGF0aW9uLAotCQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtKSB7Ci0gICAgICAgIEZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGVVdGlsKCkuY3JlYXRlRnJlZUZvcm1Db25uZWN0aW9uKGRpYWdyYW0pOwotICAgICAgICBjb25uZWN0aW9uLnNldFN0YXJ0KGFkZENvbkNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpOwotICAgICAgICBjb25uZWN0aW9uLnNldEVuZChhZGRDb25Db250ZXh0LmdldFRhcmdldEFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICBjb25uZWN0aW9uLnNldEFjdGl2ZSh0cnVlKTsgICAgICAgIAotICAgICAgICBMaXN0PFBvaW50PiBwb2ludHMgPSBqcGFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoY29ubmVjdGlvbiwgcmVsYXRpb24uZ2V0T3duZXIoKSA9PSByZWxhdGlvbi5nZXRJbnZlcnNlKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBvaW50cy5zaXplKCk7IGkrKykgewotICAgICAgICAJUG9pbnQgcCA9IHBvaW50cy5nZXQoaSk7Ci0gICAgICAgIAlBZGRCZW5kcG9pbnRDb250ZXh0IGN0eCA9IG5ldyBBZGRCZW5kcG9pbnRDb250ZXh0KGNvbm5lY3Rpb24sIHAueCwgcC55LCBpKTsKLSAgICAgICAgICAgIElBZGRCZW5kcG9pbnRGZWF0dXJlIGZ0ID1nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRBZGRCZW5kcG9pbnRGZWF0dXJlKGN0eCk7Ci0gICAgICAgICAgICBmdC5hZGRCZW5kcG9pbnQoY3R4KTsKLSAgICAgICAgfQkJCi0gICAgICAgIGFkZERlY29yYXRvcnMoY29ubmVjdGlvbiwgcmVsYXRpb24pOyAKLSAgICAgICAgYWRkVGV4dERlY29yYXRvcnMoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVjb3JhdG9ycyhGcmVlRm9ybUNvbm5lY3Rpb24gY29ubmVjdGlvbiwgSVJlbGF0aW9uIHJlbGF0aW9uKSB7Ci0JCVJlbERpciBkaXJlY3Rpb24gPSByZWxhdGlvbi5nZXRSZWxEaXIoKTsKLQkJUmVsVHlwZSB0eXBlID0gcmVsYXRpb24uZ2V0UmVsVHlwZSgpOwotCQlpZiAoT05FX1RPX09ORS5lcXVhbHModHlwZSkpIHsKLQkJCWFkZE9uZVRvT25lRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE9ORV9UT19NQU5ZLmVxdWFscyh0eXBlKSAmJiBVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCWFkZE9uZVRvTWFueURlY29yYXRvcihjb25uZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0gZWxzZSBpZiAoTUFOWV9UT19PTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRNYW55VG9PbmVEZWNvcmF0b3IoY29ubmVjdGlvbiwgZGlyZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0gZWxzZSBpZiAoTUFOWV9UT19NQU5ZLmVxdWFscyh0eXBlKSkgewotCQkJYWRkTWFueVRvTWFueURlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkVGV4dERlY29yYXRvcnMoRnJlZUZvcm1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIElSZWxhdGlvbiByZWxhdGlvbikgewotCQlSZWxEaXIgZGlyZWN0aW9uID0gcmVsYXRpb24uZ2V0UmVsRGlyKCk7Ci0JCVJlbFR5cGUgdHlwZSA9IHJlbGF0aW9uLmdldFJlbFR5cGUoKTsKLQkJaWYgKE9ORV9UT19PTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRPbmVUb09uZVRleHREZWNvcmF0b3IoY29ubmVjdGlvbiwgZGlyZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0gZWxzZSBpZiAoT05FX1RPX01BTlkuZXF1YWxzKHR5cGUpICYmIFVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJYWRkT25lVG9NYW55VGV4dERlY29yYXRvcihjb25uZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0gZWxzZSBpZiAoTUFOWV9UT19PTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRNYW55VG9PbmVUZXh0RGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fTUFOWS5lcXVhbHModHlwZSkpIHsKLQkJCWFkZE1hbnlUb01hbnlUZXh0RGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9Ci0JfQkKLQotCi0JcHJpdmF0ZSB2b2lkIGFkZE9uZVRvT25lRGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCWRvdWJsZSBzdGFydENvZWZmaWNpZW50ID0gU1RBUlRfQ09FRkZJQ0lFTlQ7Ci0JCWRvdWJsZSBlbmRDb2VmZmljaWVudCA9IDEuMCAtIHN0YXJ0Q29lZmZpY2llbnQ7CQotCQlpbnQgbGVuID0gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsJCQotCQlpZiAoVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBpbWFnZUNyZWF0b3IuY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsJCQkJCi0JCX0gCi0JfQotICAgICAgICAKLQlwcml2YXRlIHZvaWQgYWRkT25lVG9NYW55RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBJUmVsYXRpb24gcmVsKSB7Ci0JCWRvdWJsZSBzdGFydENvZWZmaWNpZW50ID0gU1RBUlRfQ09FRkZJQ0lFTlQ7Ci0JCWRvdWJsZSBlbmRDb2VmZmljaWVudCA9IDEuMCAtIHN0YXJ0Q29lZmZpY2llbnQ7Ci0JCWludCBsZW4gPSBKUEFFZGl0b3JVdGlsLmNhbGNDb25uZWN0aW9uTGVuZ3RoKGMpOwotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQl9Ci0gICAgICAgICAgICAgICAgCi0JcHJpdmF0ZSB2b2lkIGFkZE1hbnlUb09uZURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwotCQlpbnQgbGVuID0gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsJCQotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQxID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZU1hbnlTdGFydERlY29yYXRvcihjLCBzdGFydENvZWZmaWNpZW50KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZDEuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKGxlbi8xMCksIDApOwotCQlpZiAoVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQyID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCk7Ci0JCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkMi5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQoLWxlbi8xMCksIDApOwotCQl9IAotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgYWRkTWFueVRvTWFueURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwkJCi0JCWludCBsZW4gPSBKUEFFZGl0b3JVdGlsLmNhbGNDb25uZWN0aW9uTGVuZ3RoKGMpOwkJCi0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZDEgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKGMsIHN0YXJ0Q29lZmZpY2llbnQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkMS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLE1hdGgucm91bmQobGVuLzEwKSwgMCk7Ci0JCWlmIChVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55RW5kV2l0aEFycm93RGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQkJfSBlbHNlIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55RW5kRGVjb3JhdG9yKGMsIGVuZENvZWZmaWNpZW50KTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQkJfQotICAgIH0KLSAKLQkKLQkKLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkT25lVG9PbmVUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhID0gbnVsbDsKLQkJQm9vbGVhbiBvcHRpb25hbDsKLQkJYm9vbGVhbiBpc09wdGlvbmFsID0gZmFsc2U7Ci0JCWlmIChSZWxEaXIuVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlpc09wdGlvbmFsID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2UgPSByZWwuZ2V0SW52ZXJzZSgpLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKTsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2UuZ2V0UGFyZW50KCkpOwotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IGludmVyc2UuZ2V0TWFwcGluZygpOwotCQkJYSA9IChPbmVUb09uZUFubm90YXRpb24pbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCW9wdGlvbmFsID0gYS5nZXRPcHRpb25hbCgpOwotCQkJCWlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7Ci0JCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCBpc09wdGlvbmFsID8gSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fT05FIDogSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX09ORSwgMC4wKTsJCQkJCi0JCQl9Ci0JCX0KLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXIgPSByZWwuZ2V0T3duZXIoKS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlvd25lci51cGRhdGUoKTsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IG93bmVyLmdldE1hcHBpbmcoKTsgIAotCQlhID0gKE9uZVRvT25lQW5ub3RhdGlvbiltYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CQkKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJb3B0aW9uYWwgPSBhLmdldE9wdGlvbmFsKCk7Ci0JCWlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7CQkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCBpc09wdGlvbmFsID8gSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fT05FIDogSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX09ORSwgMS4wKTsJCQkJCQkJCQkgCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpLCAwLjApOwkJCQkKLQkJaWYgKCFVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCksIDEuMCk7CQkJCQotCQl9Ci0JfQotICAgICAgICAKLQlwcml2YXRlIHZvaWQgYWRkT25lVG9NYW55VGV4dERlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGMsIEpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX09ORSwgMC4wKTsKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAxLjApOwkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIDAuMCk7CQkJCQkJCi0JfQotICAgICAgICAgICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRNYW55VG9PbmVUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fTiwgMC4wKTsKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIDAuMCk7CQkJCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lciA9IHJlbC5nZXRPd25lcigpLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBvd25lci5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gYSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKW1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJaWYgKGEgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCUJvb2xlYW4gb3B0aW9uYWwgPSBhLmdldE9wdGlvbmFsKCk7Ci0JCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvcHRpb25hbCA9PSBudWxsKSA/IHRydWUgOiBvcHRpb25hbC5ib29sZWFuVmFsdWUoKTsJCQotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGMsIGlzT3B0aW9uYWwgPwotCQkJCQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUgOgotCQkJCQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfT05FLCAxLjApOwotCQlpZiAoIVVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCByZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSwgMS4wKTsKLQkJfQotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgYWRkTWFueVRvTWFueVRleHREZWNvcmF0b3IoRnJlZUZvcm1Db25uZWN0aW9uIGMsIFJlbERpciBkaXJlY3Rpb24sIElSZWxhdGlvbiByZWwpIHsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAwLjApOwkJCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fTiwgMS4wKTsJCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpLCAwLjApOwotCQlpZiAoIVVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihjLCByZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSwgMS4wKTsJCi0JCX0KLSAgICB9Ci0KLQkKLQkKLQkKLQkKLQkKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElBZGRDb25uZWN0aW9uQ29udGV4dCAmJiBjb250ZXh0LmdldE5ld09iamVjdCgpIGluc3RhbmNlb2YgSVJlbGF0aW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLSAgICAKLX0KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ4ODUyNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdENyZWF0ZUZlYXR1cmUgewotCQotCXB1YmxpYyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlciwgIiIsICIiKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZShJQ3JlYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gY3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVOZXdBdHRyaWJ1dGUoanB0LCBmYWxzZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmV3QXR0ck5hbWUpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChuZXdBdHRyID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsgCi0JCQluZXdBdHRyID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG5ld0F0dHJOYW1lKTsKLQkJCWlmIChuZXdBdHRyID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVGhyZWFkIHNsZWVwIGludGVycnVwdGVkIik7CS8vJE5PTi1OTFMtMSQgCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJY250Kys7Ci0JCX0KLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuYWRkQWRkSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXR0ci5nZXRQYXJlbnQoKSwgbmV3QXR0ci5nZXROYW1lKCkpOwotCQlhZGRHcmFwaGljYWxSZXByZXNlbnRhdGlvbihjb250ZXh0LCBuZXdBdHRyKTsKLSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlyZWN0RWRpdGluZ0luZm8oKS5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0gICAgICAgIElDb21waWxhdGlvblVuaXQgY3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmZvcm1hdENvZGUoY3UsIHdzKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtuZXdBdHRyfTsKLQl9CQotCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uTGFiZWw7ICAJCQkKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOyAgCi0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA2MDZmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5pbnRlcm5hbC5mZWF0dXJlcy5jb250ZXh0LmltcGwuYmFzZS5QaWN0b2dyYW1FbGVtZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBleHRlbmRzIERlZmF1bHREZWxldGVGZWF0dXJlIHsKLQotCXByaXZhdGUgU3RyaW5nIGF0dHJOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocHJvdmlkZXIpOwotCX0JCi0JCQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UXVlc3Rpb25Ub1VzZXIoKSB7Ci0gICAgCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfZGVsZXRlQXR0cmlidXRlUXVlc3Rpb24sIG5ldyBPYmplY3RbXSB7YXR0ck5hbWV9KTsgCi0gICAgfQotCQotCQotCXB1YmxpYyBib29sZWFuIGNhblVuZG8oSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJOYW1lKENvbnRhaW5lclNoYXBlIHRleHRTaGFwZSkgewotCQlTdHJpbmcgdHh0ID0gKChUZXh0KSh0ZXh0U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApKSkuZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIGF0dHJOYW1lID0gdHh0LnN1YnN0cmluZyh0eHQuaW5kZXhPZignOicpICsgMSk7Ci0JCWF0dHJOYW1lID0gYXR0ck5hbWUudHJpbSgpOwkKLQkJcmV0dXJuIGF0dHJOYW1lOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUF0dHJpYnV0ZShDb250YWluZXJTaGFwZSBwZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZS5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKSk7CQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlQXR0cmlidXRlKGpwdCwgYXR0ck5hbWUsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQl9CQotCQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCWRlbGV0ZShjb250ZXh0LCB0cnVlKTsKLSAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJlRGVsZXRlKElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIucHJlRGVsZXRlKGNvbnRleHQpOwotCX0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoSURlbGV0ZUNvbnRleHQgY29udGV4dCwgYm9vbGVhbiBoYXZlVG9Bc2spIHsKLQkJUGljdG9ncmFtRWxlbWVudENvbnRleHQgY3R4ID0gKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KWNvbnRleHQ7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IChDb250YWluZXJTaGFwZSljdHguZ2V0UGljdG9ncmFtRWxlbWVudCgpOwkKLQkJaWYgKCh0ZXh0U2hhcGUgPT0gbnVsbCkgfHwgdGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGdldEF0dHJOYW1lKHRleHRTaGFwZSk7Ci0JCXRoaXMuYXR0ck5hbWUgPSBhdHRyTmFtZTsKLSAgICAJaWYgKGhhdmVUb0FzaykgewotICAgIAkJaWYgKCFnZXRVc2VyRGVjaXNpb24oKSkgewotICAgIAkJCXJldHVybjsKLSAgICAJCX0KLSAgICAJfSAgICAJCi0gICAgCQotICAgICAgICBwcmVEZWxldGUoY29udGV4dCk7IAotICAgICAgICBpZiAodGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkgPT0gbnVsbCl7Ci0gICAgICAgIAlyZXR1cm47Ci0gICAgICAgIH0gICAgICAgIAotCQlkZWxldGVBdHRyaWJ1dGUodGV4dFNoYXBlLCBhdHRyTmFtZSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgZGVsZXRlQnVzaW5lc3NPYmplY3RzKE9iamVjdFtdIGJ1c2luZXNzT2JqZWN0cykgewotICAgICAgICBpZiAoYnVzaW5lc3NPYmplY3RzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoT2JqZWN0IGJvIDogYnVzaW5lc3NPYmplY3RzKSB7Ci0gICAgICAgICAgICAgICAgZGVsZXRlQnVzaW5lc3NPYmplY3QoYm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAgICAKLQkJCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw7IAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247IAotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZmUwYjMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgaW1wbGVtZW50cyBJQ3VzdG9tRmVhdHVyZXsKLQkKLQlwdWJsaWMgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCWZpbmFsIEVMaXN0PFNoYXBlPiBlbnRTaGFwZXMgPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlmb3IgKGZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgZWwgOiBlbnRTaGFwZXMpIHsKLQkJCQkJU3RyaW5nIGNvbGxhcHNlRmVhdHVyZXMgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQlpZiAoY29sbGFwc2VGZWF0dXJlcyA9PSBudWxsKSB7CQotCQkJCSAgICAgICAgR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IGVsLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQkJCQlhbGdvLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpOwotCQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShlbCwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTLCBTdHJpbmcudmFsdWVPZihKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpKTsKLQkJCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoKENvbnRhaW5lclNoYXBlKSBlbCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsJCQkJCQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9KTsJCi0JCQkJCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYjljNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlewotCi0JcHVibGljIENvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgZWwgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKClbMF07Ci0JCQotCQlmaW5hbCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZWw7Ci0JCWZpbmFsIENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlID0gY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCQotCQlmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBhbGdvID0gZWwuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnbyk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJICAgIGFsZ28uc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9NSU5fSEVJR0hUKTsKLQkJCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUsIHRydWUpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoZW50aXR5U2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpIHsKLQkJCVBpY3RvZ3JhbUVsZW1lbnRbXSBwZXMgPSAoKElDdXN0b21Db250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotCQkJaWYgKHBlcyAhPSBudWxsICYmIHBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYm9vbGVhbiBjb2xsYXBzZVBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKGJvICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbGxhcHNlUG9zc2libGUpIHsKLQkJCQkJCWlmKCFHcmFwaGljc1VwZGF0ZXIuaXNDb2xsYXBzZWQoKENvbnRhaW5lclNoYXBlKXBlKSkgewotCQkJCQkJCWNvbGxhcHNlUG9zc2libGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb2xsYXBzZVBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2MTNjMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgaW1wbGVtZW50cyBJQ3VzdG9tRmVhdHVyZXsKLQkKLQlwdWJsaWMgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCQkKLSAgICAgICAgZmluYWwgR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IGVsLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgICAgIAotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJYWxnby5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKTsKLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMsIFN0cmluZy52YWx1ZU9mKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVCkpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoKENvbnRhaW5lclNoYXBlKSBlbCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpIHsKLQkJCVBpY3RvZ3JhbUVsZW1lbnRbXSBwZXMgPSAoKElDdXN0b21Db250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotCQkJaWYgKHBlcyAhPSBudWxsICYmIHBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYm9vbGVhbiBjb2xsYXBzZVBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKCEoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb2xsYXBzZVBvc3NpYmxlKSB7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5KHBlLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQljb2xsYXBzZVBvc3NpYmxlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29sbGFwc2VQb3NzaWJsZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNWExMjguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuc2VhcmNoLkphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXN0cmljdGlvbiIgfSkKLXB1YmxpYyBjbGFzcyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDcmVhdGVGZWF0dXJlIHsKLQkKLQlwcml2YXRlIFN0cmluZyBQRVJTSVNURU5DRV9QUk9WSURFUl9MSUJSQVJZX1NUUklORyA9ICJqYXZheC9wZXJzaXN0ZW5jZS8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCXByaXZhdGUgYm9vbGVhbiBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZDsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZTsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZTsKLQlwcml2YXRlIGJvb2xlYW4gaGFzUHJpbWFyeWtleTsKLQotCi0JcHVibGljIENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgICAgICBzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlTmFtZSwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlRGVzY3JpcHRpb24pOwotICAgIH0KLQkKLQlwdWJsaWMgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJYm9vbGVhbiBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJU3RyaW5nIG1hcHBlZFN1cGVyQ2xhc3NQYWNrYWdlKSB7Ci0JCXRoaXMoZnAsIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCQltYXBwZWRTdXBlckNsYXNzUGFja2FnZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUpIHsKLQkJdGhpcyhmcCwgaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIG1hcHBlZFN1cGVyY2xhc3NOYW1lLCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCVN0cmluZyBtYXBwZWRTdXBlckNsYXNzUGFja2FnZSwgYm9vbGVhbiBoYXNQcmltYXJ5S2V5KSB7Ci0JCXRoaXMoZnApOwotCQl0aGlzLmlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkID0gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQ7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzc05hbWUgPSBtYXBwZWRTdXBlcmNsYXNzTmFtZTsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzUGFja2FnZSA9IG1hcHBlZFN1cGVyQ2xhc3NQYWNrYWdlOwotCQl0aGlzLmhhc1ByaW1hcnlrZXkgPSBoYXNQcmltYXJ5S2V5OwotCX0KLQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBjcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSB0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCWlmICgoc2hhcGVzID09IG51bGwpIHx8IChzaGFwZXMuc2l6ZSgpID09IDApKSB7Ci0JCQlqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgewotCQkJU2hhcGUgc2ggPSBzaGFwZXMuZ2V0KDApOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoKTsKLQkJCWlmIChqcHQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotCQkJanBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl0YXJnZXRQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCX0gICAgCQotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhqcGFQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCVN0cmluZyBlbnRpdHlOYW1lID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLgotCQkJCQkJCQlnZW5lcmF0ZVVuaXF1ZUVudGl0eU5hbWUoanBhUHJvamVjdCwgCi0JCQkJCQkJCQkJCQkJCSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBwcm9wcyksIAotCQkJCQkJCQkJCQkJCQkgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAKLQotCQlpZighY2hlY2tJc1NldFBlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5KGpwYVByb2plY3QpKXsKLQkJCVNoZWxsIHNoZWxsID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yU3RhdHVzTXNnKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZ1RpdGxlLCAKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZywgc3RhdHVzKTsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCX0KLQkJCi0JCWlmICghSnB0SnBhQ29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXModGFyZ2V0UHJvamVjdCkpIHsKLQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihqcGFQcm9qZWN0LCBlbnRpdHlOYW1lKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmNyZWF0ZUVudGl0eUluUHJvamVjdCh0YXJnZXRQcm9qZWN0LCBlbnRpdHlOYW1lLCBqcGFQcmVmZXJlbmNlU3RvcmUsIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIGhhc1ByaW1hcnlrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSBhbiBlbnRpdHkgaW4gdGhlIHByb2plY3QgIiArIHRhcmdldFByb2plY3QuZ2V0TmFtZSgpKTsJLy8kTk9OLU5MUy0xJAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7IAotCQl9Ci0JCQotCQkKLQkJdHJ5IHsKLQkJCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCByZWZyZXNoIHRoZSBwcm9qZWN0Iik7CS8vJE5PTi1OTFMtMSQKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOyAKLQkJfQotCQkKLQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gbGl0ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkucGVyc2lzdGVuY2VVbml0cygpOwkJCi0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IGxpdC5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXB1LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eU5hbWUpOwotCi0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKGpwdCA9PSBudWxsKSAmJiAoY250IDwgMjUpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVGhyZWFkIHNsZWVwIGludGVycnVwdGVkIik7CS8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkKLQkJCX0KLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5TmFtZSk7Ci0JCQljbnQrKzsKLQkJfQkJCi0JCQotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCWFkZEdyYXBoaWNhbFJlcHJlc2VudGF0aW9uKGNvbnRleHQsIGpwdCk7Ci0JICAgICAgICBJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JICAgICAgICBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuZm9ybWF0Q29kZShjdSwgd3MpOwkJCQotCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7IGpwdCB9OwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJUaGUgSlBBIGVudGl0eSAiICsgZW50aXR5TmFtZSArICIgY291bGQgbm90IGJlIGNyZWF0ZWQiKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlFeGNlcHRpb24gZSA9IG5ldyBFeGNlcHRpb24oKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0JCQotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHt9OwotICAgIH0KLSAgICAgICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5BRERfSlBBX0VOVElUWTsKLSAgICB9Ci0gICAgCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0gICAgICAgIAotICAgICAgICAKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0VGFyZ2V0SlBBUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVQcm92aWRlcigpLmdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKS5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1BlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5SW5DbGFzc3BhdGgoU3RyaW5nIGNsYXNzUGF0aEVudHJ5KSB7Ci0JCXRyeSB7Ci0JCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGNsYXNzUGF0aEVudHJ5KTsKLQkJCUVudW1lcmF0aW9uPEphckVudHJ5PiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKLQotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlKYXJFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFscyhQRVJTSVNURU5DRV9QUk9WSURFUl9MSUJSQVJZX1NUUklORykpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tJc1NldFBlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUphdmFTZWFyY2hTY29wZSBzY29wZSA9IChKYXZhU2VhcmNoU2NvcGUpIFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlib29sZWFuIGlzQWRkZWQgPSBmYWxzZTsKLQotCQlJUGF0aFtdIHBhdGhzID0gc2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCWlmIChpc1BlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5SW5DbGFzc3BhdGgocGF0aC50b1N0cmluZygpKSkgewotCQkJCWlzQWRkZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FkZGVkOwotCX0KLQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzZDgyMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0gCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotICAKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlIGV4dGVuZHMKLQkJQWJzdHJhY3RDcmVhdGVGZWF0dXJlIHsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcigKLQkJCQlmcCwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZU5hbWUsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBjcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSB0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKQotCQkJCS5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCWlmICgoc2hhcGVzID09IG51bGwpIHx8IChzaGFwZXMuc2l6ZSgpID09IDApKSB7Ci0JCQlqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgewotCQkJU2hhcGUgc2ggPSBzaGFwZXMuZ2V0KDApOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJaWYgKGpwdCA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCQlqcGFQcm9qZWN0ID0ganB0LmdldEpwYVByb2plY3QoKTsKLQkJCXRhcmdldFByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJfQotCQkKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKQotCQkJCS5nZXRKUEFFZGl0b3JVdGlsKCkKLQkJCQkuZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZSgKLQkJCQkJCWpwYVByb2plY3QsCi0JCQkJCQlKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBwcm9wcyksCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQotCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVSZWdpc3RlckVudGl0eUluWE1MSm9iKGpwYVByb2plY3QsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQkJfQotCQkJCQotCi0JCXRyeSB7Ci0JCQl0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCS5nZXRKUEFFZGl0b3JVdGlsKCkKLQkJCQkJLmNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KHRhcmdldFByb2plY3QsCi0JCQkJCQkJbWFwcGVkU3VwZXJjbGFzc05hbWUsIGpwYVByZWZlcmVuY2VTdG9yZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLmVycgotCQkJCQkucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSBhbiBlbnRpdHkgaW4gdGhlIHByb2plY3QgIiArIHRhcmdldFByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQlDcmVhdGVKUEFFbnRpdHlGZWF0dXJlIGNyZWF0ZUVudGl0eUZlYXR1cmUgPSBuZXcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSgKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSwgdHJ1ZSwgbWFwcGVkU3VwZXJjbGFzc05hbWUpOwotCQlyZXR1cm4gY3JlYXRlRW50aXR5RmVhdHVyZS5jcmVhdGUoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotCQlyZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5BRERfSU5IRVJJVEVEX0VOVElUWTsKLQl9Ci0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0VGFyZ2V0SlBBUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVQcm92aWRlcigpLmdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKQotCQkJCS5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmQzYjA3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMKLQkJQ3JlYXRlTWFueVRvTWFueVJlbGF0aW9uRmVhdHVyZSB7Ci0KLQlwdWJsaWMgQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55QmlEaXJGZWF0dXJlTmFtZSwgIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFueVRvTWFueUJpRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQkKLQkJCi0JCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG93bmVyQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBvd25lckF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0KLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoaW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMik7CQkKLQkJCi0JCU1hbnlUb01hbnlCaURpclJlbGF0aW9uIHJlbCA9IG5ldyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQotCX0JCi0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fTUFOWV8yX0RJUjsKLSAgICB9CQkJCQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NzQzODguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotCi0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb01hbnlSZWxhdGlvbkZlYXR1cmUgCi0JCWV4dGVuZHMJQ3JlYXRlUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoZnAsIG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzIyZTIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcwotCQlDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVOYW1lLCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQkKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBhdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgYXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQkJTWFueVRvTWFueVVuaURpclJlbGF0aW9uIHJlbGF0aW9uID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIGF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWxhdGlvbjsJCQotCX0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9NQU5ZX1RPX01BTllfMV9ESVI7Ci0gICAgfQkJCQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMxY2E5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMKLQkJQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVCaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIE1hbnlUb09uZUJpRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIAotCQkJUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNvdXJjZSkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCh0YXJnZXQpKTsJCQotCQkKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgb3duZXJBdHRyaWJ1dGVUZXh0LCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyKTsJCQotCQkKLQkJTWFueVRvT25lQmlEaXJSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvT25lQmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fT05FXzJfRElSOwotICAgIH0JCQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODIwNjAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcwlDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIzOWY3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMKLQkJQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFueVRvT25lVW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7Ci0JCQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBhdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgYXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQkJTWFueVRvT25lVW5pRGlyUmVsYXRpb24gcmVsYXRpb24gPSBuZXcgTWFueVRvT25lVW5pRGlyUmVsYXRpb24oZnAsIG93bmVyLCBpbnZlcnNlLCBhdHRyaWJ1dGVUZXh0LCB0cnVlLCAKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQob3duZXIpLAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChpbnZlcnNlKSk7Ci0JCXJldHVybiByZWxhdGlvbjsKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fT05FXzFfRElSOwotICAgIH0JCQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb01hbnlSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWM5ZWU3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotCi1hYnN0cmFjdCBjbGFzcyBDcmVhdGVPbmVUb01hbnlSZWxhdGlvbkZlYXR1cmUgCi0JCWV4dGVuZHMJQ3JlYXRlUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVPbmVUb01hbnlSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihmcCwgbmFtZSwgZGVzY3JpcHRpb24pOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjMyMDQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcwotCQlDcmVhdGVPbmVUb01hbnlSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9NYW55VW5pRGlyRmVhdHVyZU5hbWUsICAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT25lVG9NYW55VW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIAotCQkJUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNvdXJjZSkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCh0YXJnZXQpKTsJCi0JCQkJCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCQotCQlTdHJpbmcgYXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQkJT25lVG9NYW55VW5pRGlyUmVsYXRpb24gcmVsYXRpb24gPSBuZXcgT25lVG9NYW55VW5pRGlyUmVsYXRpb24oZnAsIG93bmVyLCBpbnZlcnNlLCBhdHRyaWJ1dGVUZXh0LCB0cnVlLCAKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQob3duZXIpLAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChpbnZlcnNlKSk7Ci0JCXJldHVybiByZWxhdGlvbjsJCi0JfQkKLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0gICAgICAgIHJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fT05FX1RPX01BTllfMV9ESVI7Ci0gICAgfQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2QxNWU5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUgewotCQotCXB1YmxpYyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVCaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT25lVG9PbmVCaURpclJlbGF0aW9uIGNyZWF0ZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIFBpY3RvZ3JhbUVsZW1lbnQgc291cmNlLCAKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQkKLQkKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgb3duZXJBdHRyaWJ1dGVUZXh0LCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyKTsJCQotCQkKLQkJT25lVG9PbmVCaURpclJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb09uZUJpRGlyUmVsYXRpb24oZnAsIG93bmVyLCBpbnZlcnNlLCBvd25lckF0dHJpYnV0ZVRleHQsIGludmVyc2VBdHRyaWJ1dGVUZXh0LCB0cnVlLCAKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQob3duZXIpLAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChpbnZlcnNlKSk7IAotCQlyZXR1cm4gcmVsOwkJCi0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9PTkVfVE9fT05FXzJfRElSOwotICAgIH0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDQ4MjUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLQotYWJzdHJhY3QgY2xhc3MgQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUgCi0JCWV4dGVuZHMgQ3JlYXRlUmVsYXRpb25GZWF0dXJlIHsKLQkKLQlwdWJsaWMgQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihmcCwgbmFtZSwgZGVzY3JpcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQwOGI5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZSB7Ci0JCi0JcHVibGljIENyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWUsIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uKTsgCi0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT25lVG9PbmVVbmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQkJCQkJCQkJCQkJCVBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwotCQkKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gbmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJU3RyaW5nIGF0dHJpYlR4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQkJT25lVG9PbmVVbmlEaXJSZWxhdGlvbiByZXMgPSBuZXcgT25lVG9PbmVVbmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIGF0dHJpYlR4dCwgdHJ1ZSwgCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KG93bmVyKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoaW52ZXJzZSkpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0gICAgICAgIHJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fT05FX1RPX09ORV8xX0RJUjsKLSAgICB9CQotCQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgyZDA1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0Q3JlYXRlQ29ubmVjdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotCi0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDcmVhdGVSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihmcCwgbmFtZSwgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZShJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgc291cmNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHRhcmdldCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0UGVyc2lzdGVudFR5cGUoY29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0JICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCkgewotCSAgICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblN0YXJ0Q29ubmVjdGlvbihJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCkgewotCSAgICBpZiAoZ2V0UGVyc2lzdGVudFR5cGUoY29udGV4dC5nZXRTb3VyY2VBbmNob3IoKSkgIT0gbnVsbCkgCi0JICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvbiBjcmVhdGUoSUNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQpIHsKLQkgICAgQ29ubmVjdGlvbiBuZXdDb25uZWN0aW9uID0gbnVsbDsKLQkgICAgUGVyc2lzdGVudFR5cGUgc291cmNlID0gZ2V0UGVyc2lzdGVudFR5cGUoY29udGV4dC5nZXRTb3VyY2VBbmNob3IoKSk7Ci0JICAgIFBlcnNpc3RlbnRUeXBlIHRhcmdldCA9IGdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotCSAgICBpZiAoc291cmNlICE9IG51bGwgJiYgdGFyZ2V0ICE9IG51bGwpIHsKLQkgICAgCUFic3RyYWN0UmVsYXRpb24gcmVsID0gY3JlYXRlUmVsYXRpb24oZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkuZ2V0UGFyZW50KCksIAotCSAgICAJCQkJCQkJCQkJCQkJY29udGV4dC5nZXRUYXJnZXRBbmNob3IoKS5nZXRQYXJlbnQoKSk7Ci0JICAgICAgICBBZGRDb25uZWN0aW9uQ29udGV4dCBhZGRDb250ZXh0ID0KLQkgICAgICAgICAgICBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoY29udGV4dC5nZXRTb3VyY2VBbmNob3IoKSwgY29udGV4dAotCSAgICAgICAgICAgICAgICAuZ2V0VGFyZ2V0QW5jaG9yKCkpOwotCSAgICAgICAgYWRkQ29udGV4dC5zZXROZXdPYmplY3QocmVsKTsKLQkgICAgICAgIG5ld0Nvbm5lY3Rpb24gPQotCSAgICAgICAgICAgIChDb25uZWN0aW9uKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5hZGRJZlBvc3NpYmxlKGFkZENvbnRleHQpOwotCSAgICB9ICAgIAotCSAgICByZXR1cm4gbmV3Q29ubmVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUGVyc2lzdGVudFR5cGUgY2xhc3MgYmVsb25naW5nIHRvIHRoZSBhbmNob3IsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoQW5jaG9yIGFuY2hvcikgewotCSAgICBpZiAoYW5jaG9yICE9IG51bGwpIHsKLQkgICAgICAgIE9iamVjdCByZWZPYmplY3QgPQotCSAgICAgICAgICAgIGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChhbmNob3IuZ2V0UGFyZW50KCkpOwotCSAgICAgICAgaWYgKHJlZk9iamVjdCBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0JICAgICAgICAgICAgcmV0dXJuIChQZXJzaXN0ZW50VHlwZSkgcmVmT2JqZWN0OwotCSAgICAgICAgfQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IE9uZVRvT25lUmVsYXRpb24gYmV0d2VlbiB0d28gUGVyc2lzdGVudFR5cGUgY2xhc3Nlcy4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWJzdHJhY3RSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQkJCQkJCQkJCQkJCQkgICBQaWN0b2dyYW1FbGVtZW50IHRhcmdldCk7Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7IAotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZUpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZUpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1Mjk2ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EZWxldGVKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmZlYXR1cmVzLkRlZmF1bHREZWxldGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0RGVsZXRlRmVhdHVyZSB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZSA9IG51bGw7Ci0JcHVibGljIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7CQkKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGZpbmFsIElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgIAkKLSAgICAJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJZW50aXR5TmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0gICAgCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBlKTsKLSAgICAJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJZGVsZXRlRWwoY29udGV4dCk7Ci0JCQl9Ci0JCX0pOwotICAgIAkKLSAgICB9Ci0gICAgCQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUVsKElEZWxldGVDb250ZXh0IGNvbnRleHQpewotICAgIAlzdXBlci5kZWxldGUoY29udGV4dCk7Ci0gICAgfQotCQotICAgIHByb3RlY3RlZCB2b2lkIGRlbGV0ZUJ1c2luZXNzT2JqZWN0KE9iamVjdCBibykgewotICAgIAlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gbnVsbDsKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBibzsKLQkJCQotCQkKLQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0JCQkKLQkJCQotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZm9yY2VTYXZlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVFbnRpdHlDbGFzcyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCWlmICghSnB0SnBhQ29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoanB0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihqcGFQcm9qZWN0LCBuYW1lKTsKLQkJCX0KLQkJCQkJCQotCQl9IAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRRdWVzdGlvblRvVXNlcigpIHsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXR5UXVlc3Rpb24sIG5ldyBPYmplY3RbXSB7IGVudGl0eU5hbWUgfSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0JCSAgICAKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EZWxldGVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWNkZTI3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5EZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5CaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuVW5pZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0RGVsZXRlRmVhdHVyZXsKLQkKLQlwcml2YXRlIHN0YXRpYyBJSlBBRWRpdG9yVXRpbCB1dCA9IG51bGw7Ci0JCQotCXB1YmxpYyBEZWxldGVSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JCXV0ID0gZnAuZ2V0SlBBRWRpdG9yVXRpbCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5EZWxldGUoSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdWVzdGlvblRvVXNlcigpIHsKLSAgICAJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkRlbGV0ZVJlbGF0aW9uRmVhdHVyZV9kZWxldGVSZWxhdGlvblF1ZXN0aW9uOwotICAgIH0KLQkKLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBidXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQgPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICBpZiAoYnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghZ2V0VXNlckRlY2lzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmVEZWxldGUoY29udGV4dCk7Ci0gICAgICAgIEFic3RyYWN0UmVsYXRpb24gcmVsID0gKEFic3RyYWN0UmVsYXRpb24pYnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50OwotCQkKLSAgICAgICAgaWYgKHJlbCBpbnN0YW5jZW9mIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24pIHsKLSAgICAgICAgCVVuaWRpcmVjdGlvbmFsUmVsYXRpb24gcmVsYXRpb24gPSAoVW5pZGlyZWN0aW9uYWxSZWxhdGlvbilyZWw7Ci0gICAgICAgIAlDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZmVhdCA9IG5ldyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgIAkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gcmVsYXRpb24uZ2V0QW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0gICAgCQlQaWN0b2dyYW1FbGVtZW50IHRleHRTaGFwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdHRyaWJ1dGUpOwotICAgIAkJSURlbGV0ZUNvbnRleHQgZGVsQ3R4ID0gbmV3IERlbGV0ZUNvbnRleHQodGV4dFNoYXBlKTsgICAgCQkKLSAgICAJCWZlYXQuZGVsZXRlKGRlbEN0eCwgZmFsc2UpOwotICAgIAl9ICAgIAkKLQotICAgICAgICBpZiAocmVsIGluc3RhbmNlb2YgQmlkaXJlY3Rpb25hbFJlbGF0aW9uKSB7IAkJCQotICAgICAgICAJQmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlbGF0aW9uID0gKEJpZGlyZWN0aW9uYWxSZWxhdGlvbikocmVsKTsKLSAgICAgICAgCUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0ID0gbmV3IENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIAkKLSAgICAJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXR0cmlidXRlID0gcmVsYXRpb24uZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLSAgICAJCVBpY3RvZ3JhbUVsZW1lbnQgb3duZXJBdHRyaWJ1dGVUZXh0U2hhcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qob3duZXJBdHRyaWJ1dGUpOwotICAgIAkJSURlbGV0ZUNvbnRleHQgZGVsZXRlT3duZXJBdHRyaWJ1dGVDb250ZXh0ID0gbmV3IERlbGV0ZUNvbnRleHQob3duZXJBdHRyaWJ1dGVUZXh0U2hhcGUpOwotICAgIAkJZmVhdC5kZWxldGUoZGVsZXRlT3duZXJBdHRyaWJ1dGVDb250ZXh0LCBmYWxzZSk7Ci0gICAgCQkKLSAgICAJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBdHRyaWJ1dGUgPSByZWxhdGlvbi5nZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0gICAgCQlQaWN0b2dyYW1FbGVtZW50IGludmVyc2VBdHRyaWJ1dGVUZXh0U2hhcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoaW52ZXJzZUF0dHJpYnV0ZSk7Ci0gICAgCQlJRGVsZXRlQ29udGV4dCBkZWxldGVJbnZlcnNlQXR0cmlidXRlQ29udGV4dCA9IG5ldyBEZWxldGVDb250ZXh0KGludmVyc2VBdHRyaWJ1dGVUZXh0U2hhcGUpOwotICAgIAkJZmVhdC5kZWxldGUoZGVsZXRlSW52ZXJzZUF0dHJpYnV0ZUNvbnRleHQsIGZhbHNlKTsgICAgCQkKLSAgICAJfSAgICAJCi0KLSAgICAgICAgcG9zdERlbGV0ZShjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIElSZW1vdmVDb250ZXh0IHJjID0gbmV3IFJlbW92ZUNvbnRleHQocGUpOwotICAgICAgICBJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgICAgICBJUmVtb3ZlRmVhdHVyZSByZW1vdmVGZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbW92ZUZlYXR1cmUocmMpOwotICAgICAgICBpZiAocmVtb3ZlRmVhdHVyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmVGZWF0dXJlLnJlbW92ZShyYyk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIAotICAgIH0JCi0gICAgCi0JcHVibGljIHZvaWQgcG9zdERlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIElSZWxhdGlvbiByZWwgPSAoSVJlbGF0aW9uKWJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudDsJCi0JCUlXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChyZWwuZ2V0T3duZXIoKSk7CQkKLSAgICAgICAgdXQub3JnYW5pemVJbXBvcnRzKGN1LCB3cyk7ICAgICAgICAKLQkJaWYgKHJlbCBpbnN0YW5jZW9mIEJpZGlyZWN0aW9uYWxSZWxhdGlvbikgewotCQkJY3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQocmVsLmdldEludmVyc2UoKSk7Ci0JCQl1dC5vcmdhbml6ZUltcG9ydHMoY3UsIHdzKTsgIAotCQl9Ci0JfQotICAgIAotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9ICAgIAotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGUyNjg3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGlyZWN0RWRpdGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdERpcmVjdEVkaXRpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0RGlyZWN0RWRpdGluZ0ZlYXR1cmUgewotCQotCXByaXZhdGUgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IGZhbHNlOwotCi0JcHVibGljIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RWRpdGluZ1R5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1RFWFQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRGlyZWN0RWRpdChJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxWYWx1ZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS4KLQkJCQkJCQkJCQkJZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJaXNNZXRob2RBbm5vdGF0ZWQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChqcGEpOwotCQlUZXh0IHR4dCA9IChUZXh0KSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0JCVN0cmluZyB2YWx1ZSA9ICB0eHQuZ2V0VmFsdWUoKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKQotCQkJdmFsdWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUodmFsdWUpOwkJCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNoZWNrVmFsdWVWYWxpZChTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkKLQkJCXZhbHVlID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHZhbHVlKTsJCQotCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUZpZWxkTmFtZSh2YWx1ZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN0YXR1cyA9IGNoZWNrRHVwbGljYXRlQXR0cmlidXRlKHZhbHVlLCBjb250ZXh0KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0R1cGxpY2F0ZUF0dHJpYnV0ZShTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkQXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0FsID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSgoSmF2YVBlcnNpc3RlbnRUeXBlKW9sZEF0LmdldFBhcmVudCgpKS5nZXRBdHRyaWJ1dGVOYW1lZCh2YWx1ZSk7Ci0JCWlmIChuZXdBbCAhPSBudWxsICYmICFuZXdBbC5lcXVhbHMob2xkQXQpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2F0dHJpYnV0ZUV4aXN0cywgdmFsdWUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkKLQkJCXZhbHVlID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHZhbHVlKTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQotCQlJUmVsYXRpb24gcmVsID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUob2xkQXQpOwotCQlTdHJpbmcgaW52ZXJzZUpQVE5hbWUgPSBudWxsOwotCQlpZiAoQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UocmVsKSkgCi0JCQlpbnZlcnNlSlBUTmFtZSA9IHJlbC5nZXRJbnZlcnNlKCkuZ2V0TmFtZSgpOwotCQlpZiAob2xkQXQuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm47Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShvbGRBdCwgdmFsdWUsIGludmVyc2VKUFROYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQotCQlpZiAocGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0JCWZpbmFsIFN0cmluZyBuZXdWYWx1ZSA9IHZhbHVlOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGFsZyk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCSgoVGV4dCkgYWxnKS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTJlOGQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURpcmVjdEVkaXRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3REaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLQotcHVibGljIGNsYXNzIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3REaXJlY3RFZGl0aW5nRmVhdHVyZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWxsb3dlZCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMTIzNDU2Nzg5MF8iOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCSAgICBzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RWRpdGluZ1R5cGUoKSB7Ci0JICAgIHJldHVybiBUWVBFX1RFWFQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkRpcmVjdEVkaXQoSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlKElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JICAgIFNoYXBlIHNoID0gKFNoYXBlKWNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCSAgICBDb250YWluZXJTaGFwZSBjc2ggPSBzaC5nZXRDb250YWluZXIoKTsKLQkgICAgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzaCk7Ci0JICAgIHJldHVybiBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoanB0KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY2hlY2tWYWx1ZVZhbGlkKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJLy9DU04gIzEzMDU2NjQgMjAxMAotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JICAgIENvbnRhaW5lclNoYXBlIGNzaCA9ICgoU2hhcGUpcGUpLmdldENvbnRhaW5lcigpOwkgICAgCi0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3NoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihqcHQuZ2V0TmFtZSgpKTsKLQkgICAgUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBqcHQuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0gICAgICAgIAotCSAgICBmb3IoSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IHVuaXQuY2xhc3NSZWZzKCk7IGNsYXNzUmVmcy5oYXNOZXh0KCk7KXsKLQkgICAgCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkgICAgCWlmKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLmVxdWFscyhwYWNrYWdlTmFtZSArIFNpZ25hdHVyZS5DX0RPVCArIHZhbHVlKSAmJiAhKEpQQUVkaXRvclV0aWwuZ2V0VGV4dChqcHQpLmVxdWFscyh2YWx1ZSkpKXsKLQkJICAgIAlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfZHVwbGljYXRlRW50aXR5TmFtZSwgcGFja2FnZU5hbWUrdmFsdWUpOwotCi0JICAgIAl9Ci0JICAgIH0KLQkgICAgCi0JICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA8IDEpCi0JICAgICAgICByZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfY2xhc3NOYW1lTXNnOyAKLQkgICAgaWYgKHZhbHVlLmNvbnRhaW5zKCIgIikpIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIHJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9zY3BhY2VzTm90QWxsb3dlZE1zZzsgCi0JICAgIGlmICh2YWx1ZS5jb250YWlucygiXG4iKSkgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnOwotCSAgICBpZih2YWx1ZS5jb250YWlucygieyIpIHx8IHZhbHVlLmNvbnRhaW5zKCJ9IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgICAJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c7Ci0JICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoKCk7IGkrKykgewotCSAgICAJaWYgKGFsbG93ZWQuaW5kZXhPZih2YWx1ZS5jaGFyQXQoaSkpIDwgMCkKLQkgICAgCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfaW52YWxpZFN5bWJvbHNNc2csIHZhbHVlKTsJCi0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkgICAgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCSAgICBDb250YWluZXJTaGFwZSBjc2ggPSAoKFNoYXBlKXBlKS5nZXRDb250YWluZXIoKTsKLQkgICAgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzaCk7Ci0JICAgIFByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQotCSAgICBTdHJpbmcgc3BlY2lmaWVkRW50aXR5TWFwcGluZ05hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRTcGVjaWZpZWRFbnRpdHlOYW1lKGpwdCk7Ci0JICAgIGlmKHNwZWNpZmllZEVudGl0eU1hcHBpbmdOYW1lID09IG51bGwpewotCSAgICAJUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZSBmdCA9IG5ldyBSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpLCB2YWx1ZSk7Ci0JICAgIAlmdC5leGVjdXRlKGpwdCk7Ci0JICAgIAlyZXR1cm47Ci0JICAgIH0gZWxzZSB7Ci0JICAgIAotCSAgICBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVFbnRpdHkoanB0LCB2YWx1ZSk7Ci0vLwkgICAgUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMoanB0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZG9lc0RpcmVjdGVFZGl0aW5nQWZmZWN0Q2xhc3NOYW1lQnlEZWZhdWx0KGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCBwcm9wcykpIHsKLQkJCQlSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlIGZ0ID0gbmV3IFJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIHZhbHVlKTsKLQkJCQlmdC5leGVjdXRlKGpwdCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JICAgIAotCSAgICBmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJKChUZXh0KSBhbGcpLnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfSk7CSAgICAKLQkgICAgCi0JICAgIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXRzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UmVsYXRlZEF0dHJpYnV0ZXMoanB0KTsKLQkgICAgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXRzLml0ZXJhdG9yKCk7Ci0JICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkgICAgCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCSAgICAJUGljdG9ncmFtRWxlbWVudCBwZWwgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCSAgICAJU3RyaW5nIG5ld0F0TmFtZSA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWUpOwotCSAgICAJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGF0KSkgCi0JICAgIAkJbmV3QXROYW1lID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5ld0F0TmFtZSk7Ci0JICAgIAluZXdBdE5hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVBdHRyaWJ1dGUoYXQsIG5ld0F0TmFtZSwganB0LmdldE5hbWUoKSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpLmdldE5hbWUoKTsKLQkJCQotCSAgICAJZmluYWwgR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IHBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0TmFtZSA9IG5ld0F0TmFtZTsKLQkgIAkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkaXQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLQkgIAkJdGVkaXQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWRpdCkgewotCSAgCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCSAgCQkJCSgoVGV4dCkgYWxnbykuc2V0VmFsdWUoYXR0TmFtZSk7Ci0JICAJCQl9Ci0JICAJCX0pOwkgCi0JICAgIH0KLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXNjYXJkQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXNjYXJkQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjQ5NjIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgY2xhc3MgRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSBleHRlbmRzIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSB7Ci0KLQlwdWJsaWMgRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb25maXJtYXRpb25UZXh0KCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQ29uZmlybWF0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJTWVzc2FnZURpYWxvZyBkbGcgPSBuZXcgTWVzc2FnZURpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRTaGVsbHMoKVswXSwgCi0JCQkJCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnUsIAotCQkJCQkJCQkJCQkJbnVsbCwgZ2V0Q29uZmlybWF0aW9uVGV4dCgpLCAwLCAKLQkJCQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7SlBBRWRpdG9yTWVzc2FnZXMuQlROX09LLCBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fQ0FOQ0VMfSwgRGlhbG9nLkNBTkNFTCk7Ci0JCWlmIChkbGcub3BlbigpICE9IERpYWxvZy5PSykKLQkJCXJldHVybjsJCQotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSB0aGlzLmdldERpYWdyYW0oKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoID0gaXQubmV4dCgpOwotCQkJUmVzdG9yZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgUmVzdG9yZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJSUN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHNoIH0pOwotCQkJZnQuZXhlY3V0ZShjdHgpOwotCQkJYWxsU2hhcGVzLmFkZChzaCk7Ci0JCX0KLQkJc3VwZXIuZXhlY3V0ZShjb250ZXh0KTsKLQl9CQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9FeHBhbmRBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1MzEzOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9FeHBhbmRBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlewotCQkKLQlwdWJsaWMgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlFTGlzdDxTaGFwZT4gc2hhcGVzID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoUGljdG9ncmFtRWxlbWVudCBlbCA6IHNoYXBlcykgewkJCQotCQkJCQlTdHJpbmcgY29sbGFwc2VGZWF0dXJlcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoZWwsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCQkJCWlmIChjb2xsYXBzZUZlYXR1cmVzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCQkJCQlpZihibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7Ci0JCQkJCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGVsOwkKLQkJCQkJCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlIZWlndGgoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY29udGFpbmVyU2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2U0MzAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmV7Ci0JCi0JcHVibGljIEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCi0JCU9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCWludCBwaWN0b2dyYW1IZWlnaHQgPSBKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfTUlOX0hFSUdIVDsKLQkJaW50IG5ld0hlaWdodCA9IEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9CVVRUT01fT0ZGU0VUOwotCQlmaW5hbCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZWw7Ci0JCWlmKG9iID09IG51bGwpCi0JCQluZXdIZWlnaHQgPSBHcmFwaGljc1VwZGF0ZXIuaW5jcmVhc2VDb21wYXJ0bWVudEhlaWd0aChjb250YWluZXJTaGFwZSwgbmV3SGVpZ2h0KTsKLQkJZmluYWwgaW50IHBpY3RIZWlnaHQgPSBwaWN0b2dyYW1IZWlnaHQgKyBuZXdIZWlnaHQ7Ci0gICAgICAgIGZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgICAgICBmaW5hbCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGNvbnRhaW5lclNoYXBlLmdldENvbnRhaW5lcigpOwotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLSAgICAgICAgdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCSAgICAgICAgYWxnby5zZXRIZWlnaHQocGljdEhlaWdodCk7Ci0JCSAgICAgICAgaW50IGhlaWdodCA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKwotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIAotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVDsKLQkJICAgICAgICAKLQkJICAgICAgICBpZihoZWlnaHQ+ZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSl7Ci0JCSAgICAgICAgCUlDdXN0b21Db250ZXh0IGNvbnQgPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHtlbnRpdHlTaGFwZX0pOwotCQkgICAgICAgIAlJQ3VzdG9tRmVhdHVyZSBleHBhbmRFbnRpdHkgPSBuZXcgRXhwYW5kRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCSAgICAgICAgCWV4cGFuZEVudGl0eS5leGVjdXRlKGNvbnQpOwotCQkgICAgICAgIH0KLQkJICAgICAgICBHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUsIGZhbHNlKTsKLQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGVudGl0eVNoYXBlLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwkJCQkKLQkJCX0KLSAgICAgICAgfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElDdXN0b21Db250ZXh0KSB7Ci0JCQlQaWN0b2dyYW1FbGVtZW50W10gcGVzID0gKChJQ3VzdG9tQ29udGV4dCkgY29udGV4dCkuZ2V0UGljdG9ncmFtRWxlbWVudHMoKTsKLQkJCWlmIChwZXMgIT0gbnVsbCAmJiBwZXMubGVuZ3RoID4gMCkgewotCQkJCWJvb2xlYW4gZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcGVzW2ldOwotCQkJCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJCQlpZiAoYm8gIT0gbnVsbCkgewotCQkJCQkJZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCQlpZiAoR3JhcGhpY3NVcGRhdGVyLmlzQ29sbGFwc2VkKChDb250YWluZXJTaGFwZSlwZSkpIHsKLQkJCQkJCQlleHBhbmRQb3NzaWJsZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwMjBiNS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9FeHBhbmRFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIEV4cGFuZEVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmV7Ci0JCQotCXB1YmxpYyBFeHBhbmRFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBlbCA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXTsKLQotCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoZWwpOwotCQlpZihibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7Ci0JCWZpbmFsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBlbDsKLQkKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oY29udGFpbmVyU2hhcGUpOwotCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCi0JCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlTaGFwZShjb250YWluZXJTaGFwZSk7Ci0JCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlIZWlndGgoY29udGFpbmVyU2hhcGUpOwotCQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5yZW1vdmVQcm9wZXJ0eShlbCwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQotCQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGNvbnRhaW5lclNoYXBlLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpIHsKLQkJCVBpY3RvZ3JhbUVsZW1lbnRbXSBwZXMgPSAoKElDdXN0b21Db250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotCQkJaWYgKHBlcyAhPSBudWxsICYmIHBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYm9vbGVhbiBleHBhbmRQb3NzaWJsZSA9IGZhbHNlOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBwZXNbaV07Ci0JCQkJCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCQkJCWlmICghKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCWlmICghZXhwYW5kUG9zc2libGUpIHsKLQkJCQkJCVByb3BlcnR5IHByb3BlcnR5ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHkocGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCQkJCQlpZiAocHJvcGVydHkgIT0gbnVsbCkgewotCQkJCQkJCWV4cGFuZFBvc3NpYmxlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXhwYW5kUG9zc2libGUpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVkM2U4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHMuU2hhcGVUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RBZGRTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIEdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKGZpbmFsIElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbnRpdHlTaGFwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJU3RyaW5nIHR4dCA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChuZXdBdHRyKTsKLQkJCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG5ld0F0dHIpOwotCQkJCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IG51bGw7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGVudGl0eVNoYXBlKTsKLQkJCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCXRleHRTaGFwZSA9IGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShlbnRpdHlTaGFwZSwgdHh0LCBhbm5vdHMsIHByaW1hcnlTaGFwZSwgcmVsYXRpb25TaGFwZSwgYmFzaWNTaGFwZSk7Ci0JCQkJbGluayh0ZXh0U2hhcGUsIG5ld0F0dHIpOwotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXdycC5zZXRPYmoodGV4dFNoYXBlKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIChQaWN0b2dyYW1FbGVtZW50KXdycC5nZXRPYmooKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgU3RyaW5nIHR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90cywKLQkJCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSwgQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSwgQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpZiAoYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSB8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcHJpbWFyeVNoYXBlKTsKLQkJfSBlbHNlIGlmIChhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKQotCQkJCXx8IGFubm90cy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkKLQkJCQl8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpCi0JCQkJfHwgYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcmVsYXRpb25TaGFwZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgYmFzaWNTaGFwZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvU2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIFN0cmluZyB0eHQsIEhhc2hTZXQ8U3RyaW5nPiBhbm5vdHMsCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpbnQgY2hpbGRyZW5TaXplQmVmb3JlID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0JCWludCBjb250YWluZXJIZWlnaHRCZWZvcmUgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpOwotCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGUoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGNvbnRhaW5lclNoYXBlLCB0eHQsIGFubm90cyk7Ci0KLQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUNvbnRhaW5lcihjb250YWluZXJTaGFwZSwgY2hpbGRyZW5TaXplQmVmb3JlLCBjb250YWluZXJIZWlnaHRCZWZvcmUpOwotCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCi0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgYWRkQXR0cmlidXRlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJU3RyaW5nIGF0dHJpYlR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB7Ci0KLQkJaW50IHdpZHRoID0gY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlDb250YWluZXJTaGFwZSBpY29uU2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZShjb250YWluZXJTaGFwZSwgZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGljb25TaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKSk7Ci0JCWludCBhdHRyaWJJbmRleCA9IGZwLmdldEF0dHJpYnNOdW0oY29udGFpbmVyU2hhcGUpOwotCQlSZWN0YW5nbGUgaWNvblJlY3QgPSBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmFkZFJlY3RhbmdsZUZvckljb24oaWNvblNoYXBlLCBhdHRyaWJJbmRleCk7Ci0JCUltYWdlIGljb24gPSBudWxsOwotCQlPYmplY3Qgb2IgPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlvYjsKLQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCk7IAotCQlib29sZWFuIGlzQ29sbGVjdGlvbiA9IGlzTWV0aG9kQW5ub3RhdGVkID8gCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNHZXR0ZXJNZXRob2RSZXR1cm5UeXBlQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCkgOgotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCk7IAotCQlpZiAoaXNDb2xsZWN0aW9uICYmIGFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fVU5NQVBQRUQpOwotCQl9IGVsc2V7Ci0JCSAgICBpY29uID0gSlBBRWRpdG9yVXRpbC5jcmVhdGVBdHRyaWJ1dGVJY29uKGljb25SZWN0LCBhbm5vdGF0aW9ucyk7Ci0JCX0KLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKGljb24sIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1gsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1ksCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fV0lEVEgsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX0hFSUdIVCk7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKGNvbnRhaW5lclNoYXBlLCBmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUodGV4dFNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFLCBTaGFwZVR5cGUuQVRUUklCVVRFLnRvU3RyaW5nKCkpOwotCQlSZWN0YW5nbGUgdGV4dFJlY3RhbmdsZSA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkUmVjdGFuZ2xlRm9yVGV4dCh0ZXh0U2hhcGUsIGF0dHJpYkluZGV4LCB3aWR0aCk7Ci0JCXRleHRTaGFwZS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCVRleHQgdGV4dCA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmcCwgdGV4dFJlY3RhbmdsZSwgYXR0cmliVHh0KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgodGV4dCwgd2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKHRleHQsIDEsIC0yLCB3aWR0aAotCQkJCS0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUiwgSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9SRUNUX0hFSUdIVCk7Ci0JCWZwLmluY3JlYXNlQXR0cmlic051bShjb250YWluZXJTaGFwZSk7Ci0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTliZTE3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLWNsYXNzIEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHVibGljIEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldElubmVyUGljdG9ncmFtRWxlbWVudCgpOwotCQlpZiAocGUgPT0gbnVsbCkgCi0JCQlyZXR1cm47Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9ICBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCVNoYXBlIHNoID0gKFNoYXBlKSBwZTsKLQkJCQlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJCWlmICgoYm8gPT0gbnVsbCkgfHwgKCFKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MuaXNJbnN0YW5jZShibykpKQotCQkJCQlyZXR1cm47Ci0JCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIHBlOwotCQkJCUNvbnRhaW5lclNoYXBlIHByaW1TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGVudGl0eVNoYXBlKTsKLQotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4ocHJpbVNoYXBlKTsKLQkJCQlyZW1vdmVDb21wYXJ0bWVudENoaWxkcmVuKHJlbGF0aW9uU2hhcGUpOwotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4oYmFzaWNTaGFwZSk7Ci0KLQkJCQlyZWFkZENvbXBhcnRtZW50c0NoaWxkcmVuKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvLCBlbnRpdHlTaGFwZSwgcHJpbVNoYXBlLCByZWxhdGlvblNoYXBlLCBiYXNpY1NoYXBlKTsKLQotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXJlY29ubmVjdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibyk7Ci0JCQl9Ci0JCX0pOwkJCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvbm5lY3QoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGZwKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJQWRkUmVsYXRpb25GZWF0dXJlIHJlbEYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1NvdXJjZSA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCQlBbmNob3JDb250YWluZXIgYWNUYXJnZXQgPSAoQW5jaG9yQ29udGFpbmVyKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoYWNTb3VyY2UuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpLCBhY1RhcmdldAotCQkJCQkuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCXJlbEYuYWRkKGN0eCk7Ci0vLwkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIHJlYWRkQ29tcGFydG1lbnRzQ2hpbGRyZW4oSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsCi0JCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUsIENvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUsIENvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUpIHsKLQotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCXVwZGF0ZUZlYXR1cmUuYWRkU2VwYXJhdG9yc1RvU2hhcGUocHJpbWFyeVNoYXBlKTsKLQkJdXBkYXRlRmVhdHVyZS5hZGRTZXBhcmF0b3JzVG9TaGFwZShyZWxhdGlvblNoYXBlKTsKLQkJdXBkYXRlRmVhdHVyZS5hZGRTZXBhcmF0b3JzVG9TaGFwZShiYXNpY1NoYXBlKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZUl0ZXIgPSBqYXZhUGVyc2lzdGVudFR5cGUuYXR0cmlidXRlcygpOwotCQl3aGlsZSAoYXR0cmlidXRlSXRlci5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUl0ZXIubmV4dCgpOwotCQkJdXBkYXRlRmVhdHVyZS5hZGRBdHRyaWJ1dGVzKGVudGl0eVNoYXBlLCBhdHRyaWJ1dGUpOwotCi0JCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5yZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoYXR0cmlidXRlKTsKLQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmFkZEpQVEZvclVwZGF0ZShqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb21wYXJ0bWVudENoaWxkcmVuKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpIHsKLQkJaW50IHkgPSAwOwotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXcgQXJyYXlMaXN0PFNoYXBlPihjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCkpLnNpemUoKTsgaSsrKSB7Ci0JCQlTaGFwZSBzaGFwZSA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q2hpbGRyZW4oKS5nZXQoaSk7Ci0JCQl5ID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KHNoYXBlKTsKLQkJfQotCQlmb3IgKGludCBpID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QXR0cmlic051bShjb21wYXJ0bWVudFNoYXBlKTsgaSA+IDA7IGktLSkgewotCQkJU2hhcGUgc2hhcGUgPSBjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCkuZ2V0KGkpOwotCQkJeSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpOwotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChzaGFwZSk7Ci0JCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5kZWNyZWFzZUF0dHJpYnNOdW0oY29tcGFydG1lbnRTaGFwZSk7Ci0JCX0KLQkJY2hpbGRyZW4gPSBjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCXNoaWZ0VXBMb3dlckF0dHJpYnMoeSwgY2hpbGRyZW4pOwotCQljb21wYXJ0bWVudFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0SGVpZ2h0KDApOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2hpZnRVcExvd2VyQXR0cmlicyhpbnQgeSwgTGlzdDxTaGFwZT4gY2hpbGRyZW4pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJU2hhcGUgc2hwID0gY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKHNocCAhPSBudWxsKSB7Ci0JCQkJaW50IGdyWSA9IGNoaWxkcmVuLmdldChpKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJCQlpZiAoZ3JZID4geSkgewotCQkJCQljaGlsZHJlbi5nZXQoaSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRZKGdyWSAtIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQKTsKLQkJCQl9Ci0JCQkJY2hpbGRyZW4uZ2V0KGkpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoY2hpbGRyZW4uZ2V0KGkpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0pQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODBlOTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuRGVmYXVsdE1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZTsKLQotcHVibGljIGNsYXNzIEpQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSBleHRlbmRzCi0JCURlZmF1bHRNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUgewotCi0JcHVibGljIEpQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3IoCi0JCQlJTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZWFlNGYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTGF5b3V0SlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZGF0YXR5cGVzLklEaW1lbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTGF5b3V0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0TGF5b3V0RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotCi0KLXB1YmxpYyBjbGFzcyBMYXlvdXRKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RMYXlvdXRGZWF0dXJlIHsKLQotCXByaXZhdGUgSVBlU2VydmljZVV0aWwgcGVVdGlsID0gbnVsbDsKLQotICAgIHB1YmxpYyBMYXlvdXRKUEFFbnRpdHlGZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAgICAgc3VwZXIoZnApOwotICAgICAgICBwZVV0aWwgPSBmcC5nZXRQZVV0aWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5MYXlvdXQoSUxheW91dENvbnRleHQgY29udGV4dCkgewotICAgICAgICBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIHJldHVybiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxheW91dChJTGF5b3V0Q29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkID0gZmFsc2U7Ci0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBjb250ZXh0Ci0JCQkJLmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJR3JhcGhpY3NBbGdvcml0aG0gY29udGFpbmVyR2EgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCi0JCWlmKGNvbnRhaW5lckdhLmdldEhlaWdodCgpIDwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKXsKLQkJCWNvbnRhaW5lckdhLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpOwotCQl9Ci0JCQotCQljb25maWd1cmVFbnRpdHlDb2xsYXBzZUV4cGFuZFByb3BlcnR5KGNvbnRhaW5lclNoYXBlLCBjb250YWluZXJHYSk7Ci0JCQotCQlpZiAoY29udGFpbmVyR2EuZ2V0V2lkdGgoKSA8IEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX1dJRFRIKSB7Ci0JCQljb250YWluZXJHYS5zZXRXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9XSURUSCk7Ci0JCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCWludCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lckdhLmdldFdpZHRoKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoYXBlID0gaXRlci5uZXh0KCk7Ci0JCQlhbnl0aGluZ0NoYW5nZWQgPSBsYXlvdXRDb250YWluZXJFbnRpdHlDaGlsZHJlbihhbnl0aGluZ0NoYW5nZWQsCi0JCQkJCWNvbnRhaW5lcldpZHRoLCBzaGFwZSk7Ci0KLQkJfQotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHBlVXRpbC5nZXRQcm9wZXJ0eShjb250YWluZXJTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCUlHcmFwaGljc1VwZGF0ZXIgZ3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRHcmFwaGljc1VwZGF0ZXIoKTsKLQkJCWd1LnVwZGF0ZUVudGl0eUhlaWd0aChjb250YWluZXJTaGFwZSk7Ci0JCX0KLQotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLSAgICAKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlRW50aXR5Q29sbGFwc2VFeHBhbmRQcm9wZXJ0eSgKLQkJCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLCBHcmFwaGljc0FsZ29yaXRobSBjb250YWluZXJHYSkgewotCQlpZihjb250YWluZXJHYS5nZXRIZWlnaHQoKSA9PSBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpewotCQkJcGVVdGlsLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyU2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUywgU3RyaW5nLnZhbHVlT2YoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKSk7Ci0JCX0KLQkJZWxzZSBpZihjb250YWluZXJHYS5nZXRIZWlnaHQoKT5KUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQpewotCQkJcGVVdGlsLnJlbW92ZVByb3BlcnR5KGNvbnRhaW5lclNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxheW91dENvbnRhaW5lckVudGl0eUNoaWxkcmVuKGJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkLAotCQkJaW50IGNvbnRhaW5lcldpZHRoLCBTaGFwZSBzaGFwZSkgewotCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUlEaW1lbnNpb24gc2l6ZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNhbGN1bGF0ZVNpemUoZ3JhcGhpY3NBbGdvcml0aG0pOwotCQlpZiAoY29udGFpbmVyV2lkdGggIT0gc2l6ZS5nZXRXaWR0aCgpKSB7Ci0JCQlpZiAoZ3JhcGhpY3NBbGdvcml0aG0gaW5zdGFuY2VvZiBQb2x5bGluZSkgewotCQkJCWFueXRoaW5nQ2hhbmdlZCA9IGxheW91dFBvbHlsaW5lKGNvbnRhaW5lcldpZHRoLAotCQkJCQkJZ3JhcGhpY3NBbGdvcml0aG0pOwotCQkJfSBlbHNlIGlmIChncmFwaGljc0FsZ29yaXRobSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotCQkJCQotCQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCQkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ3JhID0gcmVjdC5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCQkJSXRlcmF0b3I8R3JhcGhpY3NBbGdvcml0aG0+IGl0ID0gZ3JhLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlHcmFwaGljc0FsZ29yaXRobSBnciA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKGdyIGluc3RhbmNlb2YgSW1hZ2UpewotCQkJCQkJbGF5b3V0SGVhZGVySWNvbihzaGFwZSwgZ3JhcGhpY3NBbGdvcml0aG0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGdyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJVGV4dCB0eHQgPSAoVGV4dCkgZ3I7Ci0JCQkJCQlpZighdHh0LmdldEZvbnQoKS5pc0l0YWxpYygpKXsKLQkJCQkJCSAgICBsYXlvdXRIZWFkZXJUZXh0KGNvbnRhaW5lcldpZHRoLCBncmFwaGljc0FsZ29yaXRobSwgZ3IpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJbGF5b3V0QXR0cmlidXRlc0dyb3Vwcyhhbnl0aGluZ0NoYW5nZWQsIGdyLCBjb250YWluZXJXaWR0aCk7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQotCQkJCX0KLQkJCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQkJfSAKLQkJfQotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRIZWFkZXJUZXh0KGludCBjb250YWluZXJXaWR0aCwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtLCBHcmFwaGljc0FsZ29yaXRobSBncikgewotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChncmFwaGljc0FsZ29yaXRobSwKLQkJCQkJCWNvbnRhaW5lcldpZHRoIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyLCBjb250YWluZXJXaWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRIZWFkZXJJY29uKFNoYXBlIHNoYXBlLAotCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpY3NBbGdvcml0aG0pIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gaGVhZGVySWNvbkdyYXBoaWNzQWxnID0gc2hhcGUKLQkJCQkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfSUNPTl9SRUNUX1dJRFRIKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoaGVhZGVySWNvbkdyYXBoaWNzQWxnLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX0lDT05fUkVDVF9IRUlHSFQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsYXlvdXRQb2x5bGluZShpbnQgY29udGFpbmVyV2lkdGgsCi0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSkgewotCQlib29sZWFuIGFueXRoaW5nQ2hhbmdlZDsKLQkJUG9seWxpbmUgaGVhZGVyQm90dG9tTGluZSA9IChQb2x5bGluZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCVBvaW50IHNlY29uZFBvaW50ID0gaGVhZGVyQm90dG9tTGluZS5nZXRQb2ludHMoKS5nZXQoMSk7Ci0JCVBvaW50IG5ld1NlY29uZFBvaW50ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9pbnQoLyogaGVhZGVyQm90dG9tTGluZSwgKi8KLQkJCQljb250YWluZXJXaWR0aCwgc2Vjb25kUG9pbnQuZ2V0WSgpKTsKLQkJaGVhZGVyQm90dG9tTGluZS5nZXRQb2ludHMoKS5zZXQoMSwgbmV3U2Vjb25kUG9pbnQpOwotCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQlyZXR1cm4gYW55dGhpbmdDaGFuZ2VkOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRBdHRyaWJ1dGVzR3JvdXBzKGJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkLCBHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSwKLQkJCWludCBjb250YWluZXJXaWR0aCkgewotCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoZ3JhcGhpY3NBbGdvcml0aG0pOwotCQlsYXlvdXRDb25jcmV0ZUNvbXBhcnRtZW50U2hhcGUoYW55dGhpbmdDaGFuZ2VkLCBjb250YWluZXJTaGFwZSwgY29udGFpbmVyV2lkdGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRDb25jcmV0ZUNvbXBhcnRtZW50U2hhcGUoYm9vbGVhbiBhbnl0aGluZ0NoYW5nZWQsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJaW50IGNvbnRhaW5lcldpZHRoKSB7Ci0KLQkJbGF5b3V0Q29tcGFydG1lbnRTaGFwZShjb250YWluZXJTaGFwZSwgY29udGFpbmVyV2lkdGgpOwotCi0JCUl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSkgewotCQkJU2hhcGUgc2hhcGUgPSBpdGVyLm5leHQoKTsKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCWlmIChncmFwaGljc0FsZ29yaXRobSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotCQkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSkgZ3JhcGhpY3NBbGdvcml0aG07Ci0JCQkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ3JhID0gcmVjdC5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCQkJaWYoZ3JhLmlzRW1wdHkoKSl7Ci0JCQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWNzQWxnb3JpdGhtLCBjb250YWluZXJXaWR0aCk7Ci0JCQkJfQotCQkJCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdCA9IGdyYS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3IgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChnciBpbnN0YW5jZW9mIEltYWdlKSB7Ci0JCQkJCQlsYXlvdXRBdHRyaWJ1dGVJY29uKHNoYXBlLCBncmFwaGljc0FsZ29yaXRobSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGdyIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJbGF5b3V0QXR0cmlidXRlVGV4dChjb250YWluZXJXaWR0aCwgZ3JhcGhpY3NBbGdvcml0aG0sIGdyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlhbnl0aGluZ0NoYW5nZWQgPSB0cnVlOwotCQkJfSAKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRBdHRyaWJ1dGVUZXh0KGludCBjb250YWluZXJXaWR0aCwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtLCBHcmFwaGljc0FsZ29yaXRobSBncikgewotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChncmFwaGljc0FsZ29yaXRobSwKLQkJCQkJCWNvbnRhaW5lcldpZHRoIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyLAotCQkJCQkJY29udGFpbmVyV2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0QXR0cmlidXRlSWNvbihTaGFwZSBzaGFwZSwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtKSB7CQkKLQkJR3JhcGhpY3NBbGdvcml0aG0gaGVhZGVySWNvbkdyYXBoaWNzQWxnID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGhlYWRlckljb25HcmFwaGljc0FsZywgSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dENvbXBhcnRtZW50U2hhcGUoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsCi0JCQlpbnQgY29udGFpbmVyV2lkdGgpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpYyA9IGNvbnRhaW5lclNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdyYXBoaWNzID0gZ3JhcGhpYy5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdGVyYXRvciA9IGdyYXBoaWNzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gaXRlcmF0b3IubmV4dCgpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpYywgY29udGFpbmVyV2lkdGgpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sIGNvbnRhaW5lcldpZHRoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOWU2MzkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0TW92ZVNoYXBlRmVhdHVyZTsKLQotLyoKLSAqIFRoZSBhdHRyaWJ1dGUgc2hhcGVzIChyZXNpZGluZyB3aXRoaW4gdGhlIGVudGl0eSBzaGFwZXMpIAotICogYXJlIE5PVCBzdXBwb3NlZCB0byBiZSBtb3ZlYWJsZSAoYXQgbGVhc3QgLSBub3QgYnkgCi0gKiBkcmFnLWFuZC1kcm9wKS4gVGhlIG9ubHkgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIAotICogZGlzYWJsZSB0aGlzIGFiaWxpdHkKLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBNb3ZlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIERlZmF1bHRNb3ZlU2hhcGVGZWF0dXJlIHsKLQlwdWJsaWMgTW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTW92ZVNoYXBlKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJcmV0dXJuIGZhbHNlOwotICAgIH0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBlMGRmMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcucmVvcmcuUmVvcmdNb3ZlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIE1vdmVFbnRpdHlGZWF0dXJlIGV4dGVuZHMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIHsJCi0JCi0JcHVibGljIE1vdmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JCVJlb3JnTW92ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVvcmdNb3ZlQWN0aW9uKHdzKTsKLQkJZXhlY3V0ZShjb250ZXh0LCBhY3Rpb24sIGN1KTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eVNoYXBlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eVNoYXBlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE2N2E3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVFbnRpdHlTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0TW92ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgTW92ZUVudGl0eVNoYXBlRmVhdHVyZSBleHRlbmRzIERlZmF1bHRNb3ZlU2hhcGVGZWF0dXJlIHsKLQotCXB1YmxpYyBNb3ZlRW50aXR5U2hhcGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQWxsQmVuZHBvaW50cyhJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RNb3ZlU2hhcGUoSU1vdmVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlDb250YWluZXJTaGFwZSBjcyA9IChDb250YWluZXJTaGFwZSljb250ZXh0LmdldFNoYXBlKCk7Ci0JCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY3MsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCUNvbGxlY3Rpb248Q29udGFpbmVyU2hhcGU+IGNzcyA9IEpQQUVkaXRvclV0aWwuZ2V0UmVsYXRlZFNoYXBlcyhjcyk7Ci0JCUl0ZXJhdG9yPENvbnRhaW5lclNoYXBlPiBjc0l0ID0gY3NzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjc0l0Lmhhc05leHQoKSkgewotCQkJQ29udGFpbmVyU2hhcGUgY3MxID0gY3NJdC5uZXh0KCk7Ci0JCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGNzMSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIHRydWUpOwotCQl9Ci0JfQkKLQkKLQkJQE92ZXJyaWRlCi0JIAlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbE1vdmUoZmluYWwgSU1vdmVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCSAJCVBpY3RvZ3JhbUVsZW1lbnQgZWwgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbCk7Ci0JIAkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JIAkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkgCQkJICAgbW92ZShjb250ZXh0KTsKLQkgCQkJfQotCSAJCX0pOwotCSAJfQotCSAJCi0JIAlwdWJsaWMgdm9pZCBtb3ZlKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpewotCSAJCXN1cGVyLmludGVybmFsTW92ZShjb250ZXh0KTsKLQkgCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWY3M2M1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL09wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIE9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS4KLQkJCQkJc2hvd1ZpZXcoSlBBRWRpdG9yQ29uc3RhbnRzLklEX1ZJRVdfSlBBX0RFVEFJTFMpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IG9wZW4gSlBBIERldGFpbHMgdmlldyIpOwkvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL09wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Yjg2ZTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLgotCQkJCQlzaG93VmlldyhKUEFFZGl0b3JDb25zdGFudHMuSURfVklFV19NSU5JQVRVUkUpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IG9wZW4gTWluaWF0dXJlIHZpZXciKTsJLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJCQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTdhNTIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5kaWFsb2cuU2VsZWN0VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhY2VySSB0cmFjZXIgPSBUcmFjaW5nTWFuYWdlci5nZXRUcmFjZXIoUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5jbGFzcyk7CQkJCQotCQotCXB1YmxpYyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXTsKLQkJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJaWYgKChibyA9PSBudWxsKSB8fCAoIShibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSkpCi0JCQkJcmV0dXJuOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpYm87Ci0JCVN0cmluZyB0eXBlTmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoanBhKTsKLQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RleHQsIAotCQkJCWpwYS5nZXROYW1lKCksIEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoKChQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSkpOwkJCi0JCVNlbGVjdFR5cGVEaWFsb2cgZCA9IG5ldyBTZWxlY3RUeXBlRGlhbG9nKG1zZywgdHlwZU5hbWUpOwotCQlpZiAoZC5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5ld1R5cGVOYW1lID0gZC5nZXRUeXBlTmFtZSgpOwotCQlTdHJpbmdbXSBhdHRyaWJ1dGVUeXBlVHlwZU5hbWVzID0gSlBBRWRpdG9yVXRpbC5nZXRHZW5lcmljc0VsZW1lbnRUeXBlcyhuZXdUeXBlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVUeXBlVHlwZU5hbWVzICE9IG51bGwpCi0JCQluZXdUeXBlTmFtZSA9IG5ld1R5cGVOYW1lLnN1YnN0cmluZygwLCBuZXdUeXBlTmFtZS5pbmRleE9mKCc8JykpLnRyaW0oKTsKLQkJCi0JCWdldEZlYXR1cmVQcm92aWRlcigpLmFkZEFkZElnbm9yZSgoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSwganBhLmdldE5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSA9IGpwYS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuYWRkUmVtb3ZlSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcnBhLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQgPSBqcGEuaXNQcm9wZXJ0eSgpOwotCi0JCUxpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25TdHJpbmdzKGpwYSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUF0dHJpYnV0ZSgoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSwganBhLmdldE5hbWUoKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7CQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVBTmV3QXR0cmlidXRlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLAotCQkJCWpwYS5nZXROYW1lKCksIG5ld1R5cGVOYW1lLCBhdHRyaWJ1dGVUeXBlVHlwZU5hbWVzLCBqcGEuZ2V0TmFtZSgpLCBhbm5vdGF0aW9ucywKLQkJCQlmYWxzZSwgaXNNZXRob2RBbm5vdGF0ZWQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucmVwbGFjZUF0dHJpYnV0ZShqcGEsIG5ld0F0KTsKLSAgICAgICAgSVdvcmtiZW5jaFNpdGUgd3MgPSAoKElFZGl0b3JQYXJ0KWdldERpYWdyYW1FZGl0b3IoKSkuZ2V0U2l0ZSgpOwotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXQuZ2V0UGFyZW50KCkpOwotICAgICAgICBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuZm9ybWF0Q29kZShjdSwgd3MpOwkJCQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbWFrZVJlbGF0aW9ucyhnZXRGZWF0dXJlUHJvdmlkZXIoKSwgCi0JCQkJKChTaGFwZSlwZSkuZ2V0Q29udGFpbmVyKCksIChKYXZhUGVyc2lzdGVudFR5cGUpbmV3QXQuZ2V0UGFyZW50KCkpOwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWQ1NzMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5TZWxlY3Rpb25EaXNwYXRjaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuQWRkRW50aXR5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIHsKLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHMgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIGhhc05hbWVBbm5vdGF0aW9uID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCWlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkpCi0gICAgCQlyZXR1cm4gZmFsc2U7Ci0gICAgCUlDdXN0b21Db250ZXh0IGN0eCA9IChJQ3VzdG9tQ29udGV4dCljb250ZXh0OwotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gY3R4LmdldElubmVyUGljdG9ncmFtRWxlbWVudCgpOwotICAgIAlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpYm87Ci0gICAgCQloYXNOYW1lQW5ub3RhdGlvbiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc05hbWVBbm5vdGF0aW9uKGpwdCk7Ci0gICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAJfQotICAgIAlpZiAocGUgaW5zdGFuY2VvZiBTaGFwZSkgewotICAgIAkJQ29udGFpbmVyU2hhcGUgY3MgPSAoKFNoYXBlKXBlKS5nZXRDb250YWluZXIoKTsKLSAgICAJCWlmIChjcyA9PSBudWxsKQotICAgIAkJCXJldHVybiBmYWxzZTsKLSAgICAgCQlibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjcyk7Ci0gICAgICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAgICAgCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotICAgICAgICAJCWhhc05hbWVBbm5vdGF0aW9uID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaGFzTmFtZUFubm90YXRpb24oanB0KTsKLSAgICAgICAgCQlyZXR1cm4gdHJ1ZTsKLSAgICAgICAgCX0KLSAgICAJfSAgICAJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQsIFNlbGVjdGlvbkRpc3BhdGNoQWN0aW9uIGFjdGlvbiwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbCA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1KTsKLQkJZmluYWwgU2hhcGUgcGljdCA9IChTaGFwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuCi0JCQkJCQkJCQlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdCk7Ci0JCWZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQlmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCk7Ci0JCWZpbmFsIEpQQVByb2plY3RMaXN0ZW5lciBsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcihzKTsKLQkJanB0LmdldEpwYVByb2plY3QoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCVNob3dCdXN5IHNob3dCdXN5ID0gbmV3IFNob3dCdXN5KHMpOwotCQlKUEFTb2x2ZXIuaWdub3JlRXZlbnRzID0gdHJ1ZTsKLQkJZmluYWwgU3RyaW5nIG9sZE5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQkKLQkJdHJ5IHsKLQkJCWFjdGlvbi5ydW4oc2VsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9IAotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc2hvd0J1c3kpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJSlBBU29sdmVyLmlnbm9yZUV2ZW50cyA9IGZhbHNlOwotCQlmaW5hbCBib29sZWFuIHJlbmFtZSA9IFJlbmFtZUVudGl0eUZlYXR1cmUuY2xhc3MuaXNJbnN0YW5jZSh0aGlzKTsKLQkJCi0JCWlmICghc2hvd0J1c3kuaXNNb3ZlZCgpKSAKLQkJCXJldHVybjsKLQkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBpY3QpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlyZW1hcEVudGl0eShvbGROYW1lLCBwaWN0LCBwdSwgcmVuYW1lLCBsc25yLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmV3TmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlmaW5hbCBTdHJpbmcgb2xkTmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0JCWZpbmFsIFNoYXBlIHBpY3QgPSAoU2hhcGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuCi0JCQkJCQkJCQlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdCk7CQkKLQkJZmluYWwgUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwdCk7Ci0JCWZpbmFsIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgwKTsKLQkJZmluYWwgSlBBUHJvamVjdExpc3RlbmVyIGxzbnIgPSBuZXcgSlBBUHJvamVjdExpc3RlbmVyKHMpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJU2hvd0J1c3kgc2hvd0J1c3kgPSBuZXcgU2hvd0J1c3kocyk7Ci0JCUpQQVNvbHZlci5pZ25vcmVFdmVudHMgPSB0cnVlOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVFbnRpdHlDbGFzcyhqcHQsIG5ld05hbWUsIGdldEZlYXR1cmVQcm92aWRlcigpKTsJCQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc2hvd0J1c3kpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJSlBBU29sdmVyLmlnbm9yZUV2ZW50cyA9IGZhbHNlOwkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBpY3QpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlyZW1hcEVudGl0eShvbGROYW1lLCBwaWN0LCBwdSwgdHJ1ZSwgbHNuciwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbWFwRW50aXR5KGZpbmFsIFN0cmluZyBvbGROYW1lLAotCQkJCQkJCQkgICBmaW5hbCBTaGFwZSBwaWN0LAotCQkJCQkJCQkgICBmaW5hbCBQZXJzaXN0ZW5jZVVuaXQgcHUsCi0JCQkJCQkJCSAgIGZpbmFsIGJvb2xlYW4gcmVuYW1lLAotCQkJCQkJCQkgICBmaW5hbCBKUEFQcm9qZWN0TGlzdGVuZXIgbHNuciwKLQkJCQkJCQkJICAgZmluYWwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXB1LmdldEpwYVByb2plY3QoKS51cGRhdGVBbmRXYWl0KCk7Ci0JCQkJZmluYWwgaW50IHggPSBwaWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WCgpOwotCQkJCWZpbmFsIGludCB5ID0gcGljdC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJCQlmaW5hbCBpbnQgd2lkdGggPSBwaWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0V2lkdGgoKTsKLQkJCQlmaW5hbCBpbnQgaGVpZ2h0ID0gcGljdC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpOwkJCi0JCQkJCi0JCQkJZmluYWwgQ29udGFpbmVyU2hhcGUgY3MgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZShmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpLCAKLQkJCQkJCXRydWUpOwotCQkJCWNzLnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCi0JCQkJQWRkQ29udGV4dCBjb250ID0gbmV3IEFkZENvbnRleHQoKTsKLQkJCQljb250LnNldFgoeCk7Ci0JCQkJY29udC5zZXRZKHkpOwotCQkJCWNvbnQuc2V0V2lkdGgod2lkdGgpOwotCQkJCWNvbnQuc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCQkJUm91bmRlZFJlY3RhbmdsZSByZWN0ID0gQWRkSlBBRW50aXR5RmVhdHVyZS5jcmVhdGVFbnRpdHlSZWN0YW5nbGUoY29udCwgY3MsIGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOyAJCi0JCQkJcmVjdC5zZXRGaWxsZWQodHJ1ZSk7Ci0JCQkJCi0JCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQocGljdCk7IAotCQkJCVJlbW92ZUpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZShmcCk7Ci0JCQkJCi0JCQkJYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkID0gSlBBRWRpdG9yQ29uc3RhbnRzLlRSVUVfU1RSSU5HLmVxdWFscyhHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3QsIEpQQUVkaXRvckNvbnN0YW50cy5QUklNQVJZX0NPTExBUFNFRCkpOwotCQkJCWJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0NPTExBUFNFRCkpOwotCQkJCWJvb2xlYW4gYmFzaWNDb2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLkJBU0lDX0NPTExBUFNFRCkpOwotCi0JCQkJQWRkRW50aXR5Q29udGV4dCBhZGRDdHggPSBuZXcgQWRkRW50aXR5Q29udGV4dChwcmltYXJ5Q29sbGFwc2VkLCByZWxhdGlvbkNvbGxhcHNlZCwgYmFzaWNDb2xsYXBzZWQpOwotCQkJCVN0cmluZyBuZXdKUFROYW1lID0gbHNuci5nZXROZXdKUFROYW1lKCk7Ci0JCQkJCi0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0pQVCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpQVChuZXdKUFROYW1lLCBwdSk7Ci0JCQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLCBvbGROYW1lKTsKLQkJCQl9CQkJCQkJCQkJCi0JCQkJaWYgKHJlbmFtZSkgewotCQkJCQlTdHJpbmcgdGFibGVOYW1lID0gSlBBRWRpdG9yVXRpbC5mb3JtVGFibGVOYW1lKG5ld0pQVCk7Ci0JCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnNldFRhYmxlTmFtZShuZXdKUFQsIHRhYmxlTmFtZSk7Ci0JCQkJfQotCQkJCWFkZEN0eC5zZXROZXdPYmplY3QobmV3SlBUKTsKLQkJCQlhZGRDdHguc2V0VGFyZ2V0Q29udGFpbmVyKGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotCQkJCWFkZEN0eC5zZXRYKHgpOwotCQkJCWFkZEN0eC5zZXRZKHkpOwotCQkJCWFkZEN0eC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJYWRkQ3R4LnNldEhlaWdodChoZWlnaHQpOwotCQkJCUFkZEpQQUVudGl0eUZlYXR1cmUgZnQxID0gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUoZnApOwotCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCWZ0MS5hZGQoYWRkQ3R4KTsKLQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KG5ld0pQVCk7Ci0JCQkJZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW1FZGl0b3IoKS5zZXRQaWN0b2dyYW1FbGVtZW50Rm9yU2VsZWN0aW9uKHBlKTsKLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNzKTsJCi0JCQkJCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBuZXdKUFQpOwotCQkJCWlmICghSnB0SnBhQ29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMobmV3SlBULmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLCBuZXdKUFROYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQl9Ci0JCi0JCi0JCi0JcHJvdGVjdGVkIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JfQkKLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0JY2xhc3MgU2hvd0J1c3kgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgU2VtYXBob3JlIHM7Ci0JCWJvb2xlYW4gbW92ZWQgPSBmYWxzZTsKLQkJU2hvd0J1c3koU2VtYXBob3JlIHMpIHsKLQkJCXRoaXMucyA9IHM7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJbW92ZWQgPSBzLnRyeUFjcXVpcmUoMiwgNCwgVGltZVVuaXQuU0VDT05EUyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJUaHJlYWQgaW50ZXJydXB0ZWQiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CQkJCQkKLQkJCX0KLQkJfQotCi0JCWJvb2xlYW4gaXNNb3ZlZCgpIHsKLQkJCXJldHVybiBtb3ZlZDsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBjbGFzcyBKUEFQcm9qZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwcml2YXRlIFNlbWFwaG9yZSBzID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgbmV3SnB0TmFtZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgSlBBUHJvamVjdExpc3RlbmVyKFNlbWFwaG9yZSBzKSB7Ci0JCQl0aGlzLnMgPSBzOwotCQl9Ci0JCQkJCQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCUl0ZXJhdG9yPD8+IGl0ID0gZXZlbnQuZ2V0SXRlbXMoKS5pdGVyYXRvcigpOwotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlKcGFGaWxlIGpwYUZpbGUgPSAoSnBhRmlsZSlvOwotCQkJCi0JCQlKcHRSZXNvdXJjZU1vZGVsIHJtID0ganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQlpZiAocm0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5jbGFzcy5pc0luc3RhbmNlKHJtKSkKLQkJCQlyZXR1cm47Ci0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA9IChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQpcm07Ci0JCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0ganJjdS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7CQkJCi0JCQluZXdKcHROYW1lID0ganJwdC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlzLnJlbGVhc2UoKTsKLQkJCWlmICgoYXRzID09IG51bGwpIHx8IGhhc05hbWVBbm5vdGF0aW9uKQotCQkJCXJldHVybjsKLQkJCWZpbmFsIEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdGVyID0gYXRzLml0ZXJhdG9yKCk7Ci0JCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBhdE9sZFRvTmV3TmFtZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3U2VsZkF0cyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpIGF0LmdldFBhcmVudCgpKTsKLQkJCQkJCWlmICghY3UuZXhpc3RzKCkpIHsKLQkJCQkJCQlhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlhdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShuZXdKcHROYW1lKS5nZXRBdHRyaWJ1dGVOYW1lZChhdC5nZXROYW1lKCkpOwotCQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVuYW1lQXR0cmlidXRlKGF0LCBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KG5ld0pwdE5hbWUpLCBuZXdKcHROYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJCQkJYXRPbGRUb05ld05hbWUucHV0KGF0LmdldE5hbWUoKSwgbmV3QXQuZ2V0TmFtZSgpKTsKLQkJCQkJCQluZXdTZWxmQXRzLmFkZChuZXdBdCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShhdCwgSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChuZXdKcHROYW1lKSwgbmV3SnB0TmFtZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdHIgPSAgbmV3U2VsZkF0cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBpdHIubmV4dCgpOwotCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIChKYXZhUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpOwotCQkJCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbSA9IGF0LmdldE1hcHBpbmcoKTsKLQkJCQkJCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSBtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJCQkJCQkJCQotCQkJCQkJaWYobWFwcGluZ0Fubm90YXRpb24gPT0gbnVsbCl7Ci0JCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGdldEZlYXR1cmVQcm92aWRlcigpLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKTsKLQkJCQkJCQltYXBwaW5nQW5ub3RhdGlvbiA9IG0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCQkJCX0JCi0JCQkJCQlpZiAobWFwcGluZ0Fubm90YXRpb24gPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlpZiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZ0Fubm90YXRpb24pKSB7Ci0JCQkJCQkJT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIG93bmFibGVNYXBwaW5nQW5ub3RhdGlvbiA9IChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pbWFwcGluZ0Fubm90YXRpb247Ci0JCQkJCQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gb3duYWJsZU1hcHBpbmdBbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCQkJaWYgKG9sZE1hcHBlZEJ5ICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIG5ld01hcHBlZEJ5ID0gYXRPbGRUb05ld05hbWUuZ2V0KG9sZE1hcHBlZEJ5KTsKLQkJCQkJCQkJaWYgKG5ld01hcHBlZEJ5ICE9IG51bGwpCi0JCQkJCQkJCQlvd25hYmxlTWFwcGluZ0Fubm90YXRpb24uc2V0TWFwcGVkQnkobmV3TWFwcGVkQnkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9CQkJCQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgYXJnMCkgewotCQkJcy5yZWxlYXNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgYXJnMCkge30KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmV3SlBUTmFtZSgpIHsKLQkJCXJldHVybiBuZXdKcHROYW1lOwotCQl9Ci0JCQotCi0JfTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMjVhYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHJvdGVjdGVkIFNldDxTaGFwZT4gYWxsU2hhcGVzID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0JCi0JcHVibGljIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb25maXJtYXRpb25UZXh0KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSBhbGxTaGFwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0JCQlmaW5hbCBSZW1vdmVKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZUpQQUVudGl0eUZlYXR1cmUodGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlmaW5hbCBJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChzaCk7Ci0JCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY3R4LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJCQotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4ocGUpOwotCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQlmdC5yZW1vdmUoY3R4KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGFhYTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZW1vdmVGZWF0dXJlIHsKLQkKLSAgICBwdWJsaWMgUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlzdXBlcihmcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJU2V0PFNoYXBlPiBzaGFwZXNGb3JEZWxldGlvbiA9IG5ldyBIYXNoU2V0PFNoYXBlPigpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJSUZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIAkJTGlzdDxTaGFwZT4gbHN0ID0gKChDb250YWluZXJTaGFwZSlwZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAJCWZvciAoaW50IGkgPSBsc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAJCQlTaGFwZSB0ZXh0U2hhcGUgPSBsc3QuZ2V0KGkpOwotICAgIAkJCU9iamVjdCBvID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0gICAgCQkJaWYgKChvICE9IG51bGwpICYmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0gICAgCQkJCXNoYXBlc0ZvckRlbGV0aW9uLmFkZCh0ZXh0U2hhcGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlc0ZvckRlbGV0aW9uLml0ZXJhdG9yKCk7Ci0gICAgCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGYgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmcCwgZmFsc2UsIHRydWUpOwotCQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGl0Lm5leHQoKSk7Ci0JCQkJZi5yZW1vdmUoY3R4KTsgICAgCQkJCi0gICAgCQl9Ci0gICAgCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5yZW1vdmUoKChQZXJzaXN0ZW50VHlwZSlibykuZ2V0TmFtZSgpLCB0cnVlKTsgCi0gICAgCX0gCQkJCi0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmYxM2QuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGV4dGVuZHMgRGVmYXVsdFJlbW92ZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBib29sZWFuIHNraXBSZW1vdmVSZWxhdGlvbnMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gc2tpcENyZWF0ZVJlbGF0aW9ucyA9IGZhbHNlOwotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ3VzdG9tRmVhdHVyZSBncmFwaGljYWxSZW1vdmU7Ci0KLQlwdWJsaWMgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBHcmFwaGljYWxSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKGZwKSk7Ci0JfQotCi0JcHVibGljIFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgYm9vbGVhbiBza2lwUmVtb3ZlUmVsYXRpb25zLCBib29sZWFuIHNraXBDcmVhdGVSZWxhdGlvbnMpIHsKLQkJdGhpcyhmcCk7Ci0JCXRoaXMuc2tpcFJlbW92ZVJlbGF0aW9ucyA9IHNraXBSZW1vdmVSZWxhdGlvbnM7Ci0JCXRoaXMuc2tpcENyZWF0ZVJlbGF0aW9ucyA9IHNraXBDcmVhdGVSZWxhdGlvbnM7Ci0JfQotCi0JcHVibGljIFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgSUN1c3RvbUZlYXR1cmUgZ3JhcGhpY2FsUmVtb3ZlKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdGhpcy5ncmFwaGljYWxSZW1vdmUgPSBncmFwaGljYWxSZW1vdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0S2V5KFN0cmluZyBrZXkpIHsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVSZW1vdmUoSVJlbW92ZUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCWlmIChwZSA9PSBudWxsKSB7Ci0gICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oIlBpY3RvZ3JhbUVsZW1lbnQgaXMgbnVsbFxuIik7CQkvLyROT04tTkxTLTEkCi0JCQluZXcgRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7ICAgIAkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlPYmplY3QgYm8gPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQlpZihibyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYm87Ci0JCQkKLQkJCUhhc2hTZXQ8U3RyaW5nPiBpZ25vcmVzID0gKChKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIGdldEZlYXR1cmVQcm92aWRlcigpKS5nZXRBZGRJZ25vcmUoKTsKLQkJCWlmICghaWdub3Jlcy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBpZ25vcmVzLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBpdGVyU3RyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpdGVyU3RyLmVuZHNXaXRoKGpwYS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZ25vcmVzLnJlbW92ZShpdGVyU3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCk7Ci0JCQlmcC5yZW1vdmUoZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoYm8pKTsKLQkJCWlmICghc2tpcFJlbW92ZVJlbGF0aW9ucykgewotCQkJCUlSZWxhdGlvbiByZWwgPSBmcC5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCQkJCXJlbW92ZVJlbGF0aW9uKHJlbCk7Ci0JCQl9Ci0JCX0KLQotCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9ICgoQ29udGFpbmVyU2hhcGUpIHBlKS5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLQkJdHJ5ewotCQlncmFwaGljYWxSZW1vdmVBdHRyaWJ1dGUoZW50aXR5U2hhcGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZShQaWN0b2dyYW1FbGVtZW50IHBlKSB7Ci0JCUN1c3RvbUNvbnRleHQgY3VzdG9tQ29udGV4dCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCWN1c3RvbUNvbnRleHQuc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJZ3JhcGhpY2FsUmVtb3ZlLmV4ZWN1dGUoY3VzdG9tQ29udGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVJlbGF0aW9uKElSZWxhdGlvbiByZWwpIHsKLQkJaWYgKHJlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb25uZWN0aW9uIGNvbm4gPSAoQ29ubmVjdGlvbikgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbCk7Ci0JCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoY29ubik7Ci0JCVJlbW92ZVJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlmdC5yZW1vdmUoY3R4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwb3N0UmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKHNraXBDcmVhdGVSZWxhdGlvbnMpCi0JCQlyZXR1cm47Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGdldEZlYXR1cmVQcm92aWRlcigpLCBqcHQpOwotCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkKLQkJCQkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdGVyID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSBpdGVyLm5leHQoKTsKLQkJCUNvbnRhaW5lclNoYXBlIG93bmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCgKLQkJCQkJcmVsLmdldE93bmVyKCkpOwotCQkJQ29udGFpbmVyU2hhcGUgaW52ZXJzZVNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoCi0JCQkJCXJlbC5nZXRJbnZlcnNlKCkpOwotCQkJQWRkQ29ubmVjdGlvbkNvbnRleHQgY250eCA9IG5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihvd25lclNoYXBlKSwgSlBBRWRpdG9yVXRpbAotCQkJCQkuZ2V0QW5jaG9yKGludmVyc2VTaGFwZSkpOwotCQkJY250eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJZnQuYWRkKGNudHgpOwotLy8JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGpwdCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDdmZWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZW1vdmVGZWF0dXJlIHsKLQkKLQkKLSAgICBwdWJsaWMgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0gICAgCXN1cGVyKGZwKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHJlUmVtb3ZlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgIAkJCQotLy8JCVJlc3RvcmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLS8vCQlJQ3VzdG9tQ29udGV4dCBjdXN0b21Db250ZXh0ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHBlIH0pOwotLy8JCWZ0LmV4ZWN1dGUoY3VzdG9tQ29udGV4dCk7Ci0gICAgCQotICAgIAlmaW5hbCBPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgIAlTZXQ8U2hhcGU+IHNoYXBlc0ZvckRlbGV0aW9uID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0gICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpYm87Ci0gICAgCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZXN0b3JlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkJCi0gICAgCQlJRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0gICAgCQlMaXN0PFNoYXBlPiBsc3QgPSAoKENvbnRhaW5lclNoYXBlKXBlKS5nZXRDaGlsZHJlbigpOwotICAgIAkJZm9yIChpbnQgaSA9IGxzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgIAkJCVNoYXBlIHRleHRTaGFwZSA9IGxzdC5nZXQoaSk7Ci0gICAgCQkJT2JqZWN0IG8gPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGV4dFNoYXBlKTsKLSAgICAJCQlpZiAoKG8gIT0gbnVsbCkgJiYgKG8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkpIHsKLSAgICAJCQkJc2hhcGVzRm9yRGVsZXRpb24uYWRkKHRleHRTaGFwZSk7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzRm9yRGVsZXRpb24uaXRlcmF0b3IoKTsKLSAgICAJCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJCVJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZiA9IG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKGZwLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoaXQubmV4dCgpKTsKLQkJCQlmLnJlbW92ZShjdHgpOyAgICAJCQkKLSAgICAJCX0KLSAgICAJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgCQkvLy0tV29ya2Fyb3VuZCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI4MTM0NQotICAgIAkJLy9Kb2Igam9iID0gbmV3IEpvYigiUmVtb3ZlIEpQQSBlbnRpdHkiKSB7CQkJCS8vJE5PTi1OTFMtMSQKLQkJCS8vCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJICAgIAkJU3RyaW5nIG5hbWUgPSAoKFBlcnNpc3RlbnRUeXBlKWJvKS5nZXROYW1lKCk7Ci0JCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLnJlbW92ZShuYW1lLCB0cnVlKTsKLQkJCQkJLy9yZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCAKLQkJCQkJLy8JICBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCS8vCSAgbmFtZSArICIgaXMgcmVtb3ZlZCIpOyAJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJICAKLQkJCS8vCX0KLSAgICAJCS8vfTsKLSAgICAJCS8vam9iLnNjaGVkdWxlKCk7Ci0gICAgCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAl9IAkJCQotICAgIH0KLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ29udGV4dCBjdHgpIHsKLQkJaWYgKCFJUmVtb3ZlQ29udGV4dC5jbGFzcy5pc0luc3RhbmNlKGN0eCkpIAotCQkJcmV0dXJuOwotCQlJUmVtb3ZlQ29udGV4dCBjb250ZXh0ID0gKElSZW1vdmVDb250ZXh0KWN0eDsgCi0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKCFKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MuaXNJbnN0YW5jZShibykpCi0gICAgCQlyZXR1cm47Ci0gICAgCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotCQlpZiAoSlBBRWRpdG9yVXRpbC5pc0VudGl0eU9wZW5FbHNld2hlcmUoanB0LCB0cnVlKSkgewotCQkJU3RyaW5nIHNob3J0RW50TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoSlBBRWRpdG9yTWVzc2FnZXMuUmVtb3ZlSlBBRW50aXR5RmVhdHVyZV9kaXNjYXJkV2FybmluZ01zZywgc2hvcnRFbnROYW1lKTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFTb2x2ZXJfY2xvc2VFZGl0b3JzLCBudWxsLCBtZXNzYWdlLAotCQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLCBuZXcgU3RyaW5nW117SlBBRWRpdG9yTWVzc2FnZXMuQlROX09LLCBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fQ0FOQ0VMfSwgMCkgewotCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJcmV0dXJuIFNXVC5DTE9TRSAKLQkJCQkJfCBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0JCQkJCXwgU1dULkFQUExJQ0FUSU9OX01PREFMCi0JCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7fX07Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQkKLQkJCQlyZXR1cm47ICAgIAkJCQotCQl9CQkKLQkJc3VwZXIuZXhlY3V0ZShjb250ZXh0KTsKLQl9Ci0JCi0JCi0JCi0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjczZTFkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JUmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RGZWF0dXJlIGltcGxlbWVudHMgSVJlbW92ZUZlYXR1cmUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gTWVzc2FnZXMuRGVmYXVsdFJlbW92ZUZlYXR1cmVfMF94ZmxkOwkKLQotCXB1YmxpYyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQkKLQotICAgIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKGJvIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGlvbikgewotICAgIAkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSAoQWJzdHJhY3RSZWxhdGlvbilibzsKLSAgICAJCWdldEZlYXR1cmVQcm92aWRlcigpLnJlbW92ZShyZWwuZ2V0SWQoKSk7Ci0gICAgCX0gICAgCQotICAgIH0gICAgCi0gICAgICAgIAotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShmaW5hbCBJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICghZ2V0VXNlckRlY2lzaW9uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwcmVSZW1vdmUoY29udGV4dCk7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJaWYgKHBlID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwZSk7Ci0JCVJlY29yZGluZ0NvbW1hbmQgcmMgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlpZiAocGUgaW5zdGFuY2VvZiBTaGFwZSkgewotCQkJCQlTaGFwZSBzaGFwZSA9IChTaGFwZSkgcGU7Ci0JCQkJCXJlbW92ZUFsbENvbm5lY3Rpb25zKHNoYXBlKTsKLQkJCQl9Ci0JCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCQkJcG9zdFJlbW92ZShjb250ZXh0KTsKLQkJCX0KLQkJfTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUocmMpOwotCX0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb25uZWN0aW9ucyhTaGFwZSBzaGFwZSkgewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlmb3IgKEl0ZXJhdG9yPEFuY2hvcj4gaXRlciA9IHNoYXBlLmdldEFuY2hvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFuY2hvciBhbmNob3IgPSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXRlcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBbGxDb25uZWN0aW9ucyhhbmNob3IpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGNvbm5lY3Rpb24uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlJUmVtb3ZlQ29udGV4dCByYyA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbm5lY3Rpb24pOwotCQkJCQlJUmVtb3ZlRmVhdHVyZSByZW1vdmVGZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbW92ZUZlYXR1cmUocmMpOwotCQkJCQlpZiAocmVtb3ZlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCQlDb25uZWN0aW9uRGVjb3JhdG9yIGRlY29yYXRvcnNbXSA9IGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoKS50b0FycmF5KG5ldyBDb25uZWN0aW9uRGVjb3JhdG9yWzBdKTsKLQkJCQkJCWZvciAoQ29ubmVjdGlvbkRlY29yYXRvciBkZWNvcmF0b3IgOiBkZWNvcmF0b3JzKSB7Ci0JCQkJCQkJaWYgKGRlY29yYXRvciAhPSBudWxsICYmIChkZWNvcmF0b3IuZVJlc291cmNlKCkgIT0gbnVsbCkpIHsKLQkJCQkJCQkJRWNvcmVVdGlsLmRlbGV0ZShkZWNvcmF0b3IsIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJlbW92ZUZlYXR1cmUucmVtb3ZlKHJjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBvc3RSZW1vdmUoSVJlbW92ZUNvbnRleHQgY29udGV4dCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FOwotCX0KLQkJCi0gICAgCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0gICAgCi0gICAgCi0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJUmVtb3ZlQ29udGV4dCkgewotCQkJcmVtb3ZlKChJUmVtb3ZlQ29udGV4dCljb250ZXh0KTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZGEzZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW5hbWVFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFbnRpdHlGZWF0dXJlIGV4dGVuZHMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIHsKLQotCXB1YmxpYyBSZW5hbWVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUlXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLQkJUmVuYW1lQWN0aW9uIGFjdGlvbiA9IG5ldyBSZW5hbWVBY3Rpb24od3MpOwotCQlhdHMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRSZWxhdGVkQXR0cmlidXRlcyhqcHQpOwotCQlleGVjdXRlKGNvbnRleHQsIGFjdGlvbiwgY3UpOwkJCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhiZTdjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUgZXh0ZW5kcyBSZWZhY3RvckVudGl0eUZlYXR1cmUgewotCQotCXByaXZhdGUgU3RyaW5nIG5ld05hbWUgPSBudWxsOwotCi0JcHVibGljIFJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZnApOwotCQl0aGlzLm5ld05hbWUgPSBuZXdOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCWF0cyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFJlbGF0ZWRBdHRyaWJ1dGVzKGpwdCk7Ci0JCWV4ZWN1dGUobmV3IEN1c3RvbUNvbnRleHQoKSwgbmV3TmFtZSwgY3UsIGpwdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIG5vdCB1c2VkCi0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzaXplQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzaXplQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwOGFiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlc2l6ZVNoYXBlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRSZXNpemVTaGFwZUZlYXR1cmU7Ci0KLQotcHVibGljIGNsYXNzIFJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUgIGV4dGVuZHMgRGVmYXVsdFJlc2l6ZVNoYXBlRmVhdHVyZSB7Ci0KLQlwdWJsaWMgUmVzaXplQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVzaXplU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUpQQUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmNTliOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXNpemVKUEFFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZXNpemVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVzaXplU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgUmVzaXplSlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZXNpemVTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIFJlc2l6ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgICAgICBzdXBlcihmcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2FuUmVzaXplU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGJvb2xlYW4gY2FuUmVzaXplID0gc3VwZXIuY2FuUmVzaXplU2hhcGUoY29udGV4dCk7Ci0gICAgICAgIGlmIChjYW5SZXNpemUpIHsKLSAgICAgICAgCVNoYXBlIHNoYXBlID0gY29udGV4dC5nZXRTaGFwZSgpOwotICAgICAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoYXBlKTsgICAgICAgCQotICAgICAgICAgICAgaWYgKGJvID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChibyBpbnN0YW5jZW9mIFBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgICAgICAgICAJUGVyc2lzdGVudFR5cGUgYyA9IChQZXJzaXN0ZW50VHlwZSkgYm87Ci0gICAgICAgICAgICAgICAgaWYgKGMuZ2V0TmFtZSgpICE9IG51bGwgJiYgCi0gICAgICAgICAgICAgICAgCQljLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhblJlc2l6ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FuUmVzaXplOwotICAgIH0KLSAgICAKLQlwcml2YXRlIHZvaWQgcmVzaXplQ29udGFpbmVyU2hhcGUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyLnJlc2l6ZVNoYXBlKGNvbnRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2l6ZVNoYXBlKGZpbmFsIElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IChDb250YWluZXJTaGFwZSkgY29udGV4dC5nZXRTaGFwZSgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbnRpdHlTaGFwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCXJlc2l6ZUNvbnRhaW5lclNoYXBlKGNvbnRleHQpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoZW50aXR5U2hhcGUsCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLSAgICAKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc3RvcmVFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXN0b3JlRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWE4MzBhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc3RvcmVFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBSZXN0b3JlRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0JCi0JcHVibGljIFJlc3RvcmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdKTsKLQkJaWYgKEpQQUVkaXRvclV0aWwuaXNFbnRpdHlPcGVuRWxzZXdoZXJlKGpwdCwgdHJ1ZSkpIHsKLQkJCVN0cmluZyBzaG9ydEVudE5hbWUgPSBKUEFFZGl0b3JVdGlsCi0JCQkJCS5jdXRGcm9tTGFzdERvdChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKQotCQkJCQkJCS5nZXRFbnRpdHlOYW1lKGpwdCkpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZywgc2hvcnRFbnROYW1lKTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBU29sdmVyX2Nsb3NlRWRpdG9ycywgbnVsbCwgbWVzc2FnZSwKLQkJCQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQluZXcgU3RyaW5nW10geyBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0sgfSwgMCkgewotCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJcmV0dXJuIFNXVC5DTE9TRSB8IFNXVC5USVRMRSB8IFNXVC5CT1JERVIKLQkJCQkJCQl8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IGdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlc3RvcmVFbnRpdHlDbGFzcyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsJCQotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMTkwMmQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSBleHRlbmRzIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSB7Ci0KLQlwdWJsaWMgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb25maXJtYXRpb25UZXh0KCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQ29uZmlybWF0aW9uOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlNZXNzYWdlRGlhbG9nIGRsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFNoZWxscygpWzBdLCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnUsIAotCQkJCW51bGwsIGdldENvbmZpcm1hdGlvblRleHQoKSwgMCwgCi0JCQkJbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0ssIEpQQUVkaXRvck1lc3NhZ2VzLkJUTl9DQU5DRUx9LCBEaWFsb2cuQ0FOQ0VMKTsKLQkJaWYgKGRsZy5vcGVuKCkgIT0gRGlhbG9nLk9LKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSB0aGlzLmdldERpYWdyYW0oKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoID0gaXQubmV4dCgpOwotCQkJU2F2ZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJSUN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHNoIH0pOwotCQkJZnQuZXhlY3V0ZShjdHgpOwotCQkJYWxsU2hhcGVzLmFkZChzaCk7Ci0JCX0KLQkJc3VwZXIuZXhlY3V0ZShjb250ZXh0KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1NhdmVFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNThkNDcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHVibGljIFNhdmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZm9yY2VTYXZlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0JCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0M2I5YzguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvVXBkYXRlQXR0cmlidXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5PcmllbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHVibGljIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVjb25uZWN0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVscyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnByb2R1Y2VBbGxSZWxhdGlvbnMoanB0LCBmcCk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJQWRkUmVsYXRpb25GZWF0dXJlIHJlbEYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1NvdXJjZSA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCQlBbmNob3JDb250YWluZXIgYWNUYXJnZXQgPSAoQW5jaG9yQ29udGFpbmVyKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQlpZiAoKGFjU291cmNlICE9IG51bGwpICYmIChhY1RhcmdldCAhPSBudWxsKSkgeyAKLQkJCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoYWNTb3VyY2UuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpLCBhY1RhcmdldAotCQkJCQkuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQljdHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCQkJcmVsRi5hZGQoY3R4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSB0aGUge0BsaW5rIEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmV9Ci0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCUdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgcmVtb3ZlID0gbmV3IEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlyZW1vdmUuZXhlY3V0ZShjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBVc2UgR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZQotCSAqIEBwYXJhbSBlbnRpdHlTaGFwZQotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBDb250YWluZXJTaGFwZSBhZGRBdHRyaWJ1dGVzKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyKSB7Ci0JCUFkZENvbnRleHQgY29udGV4dCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ld0F0dHIpOwotCQljb250ZXh0LnNldFRhcmdldENvbnRhaW5lcihlbnRpdHlTaGFwZSk7Ci0JCUdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJcmV0dXJuIChDb250YWluZXJTaGFwZSkgZmVhdHVyZS5hZGQoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGV4dCBhZGRUZXh0KElGZWF0dXJlUHJvdmlkZXIgZnAsIFJlY3RhbmdsZSB0ZXh0UmVjdGFuZ2xlLCBTdHJpbmcgdHh0KSB7Ci0JCVRleHQgdGV4dCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZURlZmF1bHRUZXh0KHRleHRSZWN0YW5nbGUsIHR4dCk7Ci0JCUNvbG9yIGNvbG9yID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1RFWFRfRk9SRUdST1VORCk7Ci0JCXRleHQuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCXRleHQuc2V0SG9yaXpvbnRhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfTEVGVCk7Ci0JCXRleHQuc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX1RPUCk7Ci0JCXRleHQuZ2V0Rm9udCgpLnNldEJvbGQodHJ1ZSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVjdGFuZ2xlIGFkZFJlY3RhbmdsZUZvclRleHQoQ29udGFpbmVyU2hhcGUgY3MsIGludCBhdHRyaWJJbmRleCwgaW50IHdpZHRoKSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGNzKTsKLQkJcmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJcmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9SRUNUX0hFSUdIVCk7Ci0JCXJlY3Quc2V0V2lkdGgod2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJcmVjdC5zZXRYKEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVfVEVYVF9SRUNUX1gpOwotCQlyZWN0Ci0JCQkJLnNldFkoSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfVE9QX09GRlNFVCArIGF0dHJpYkluZGV4Ci0JCQkJCQkqIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQKTsKLQkJcmV0dXJuIHJlY3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgYWRkUmVjdGFuZ2xlRm9ySWNvbihDb250YWluZXJTaGFwZSBjcywgaW50IGF0dHJpYkluZGV4KSB7Ci0JCVJlY3RhbmdsZSByZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGNzKTsKLQkJcmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJcmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9IRUlHSFQpOwotCQlyZWN0LnNldFgoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9MRUZUX09GRlNFVCk7Ci0JCXJlY3Quc2V0V2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fUkVDVF9XSURUSCk7Ci0JCXJlY3QKLQkJCQkuc2V0WShKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19UT1BfT0ZGU0VUICsgYXR0cmliSW5kZXgKLQkJCQkJCSogSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVApOwotCQlyZXR1cm4gcmVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTZXBhcmF0b3JzVG9TaGFwZShDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlKSB7Ci0JCWFkZFNlcGFyYXRvclRvQ29sbGVjdGlvbihjb21wYXJ0bWVudFNoYXBlLCAwKTsKLQkJYWRkU2VwYXJhdG9yVG9Db2xsZWN0aW9uKGNvbXBhcnRtZW50U2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9NSU5fSEVJR0hUKTsKLQl9Ci0KLQlwcml2YXRlIFNoYXBlIGFkZFNlcGFyYXRvclRvQ29sbGVjdGlvbihDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgaW50IHkpIHsKLQkJZmluYWwgaW50IHdpZHRoID0gY29udGFpbmVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlTaGFwZSBzaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZVNoYXBlKGNvbnRhaW5lclNoYXBlLCBmYWxzZSk7Ci0JCVJlY3RhbmdsZSByZWN0YW5nbGUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoc2hhcGUpOwotCQlyZWN0YW5nbGUuc2V0Rm9yZWdyb3VuZChtYW5hZ2VDb2xvcihKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0JBQ0tHUk9VTkQpKTsKLQkJcmVjdGFuZ2xlLnNldEJhY2tncm91bmQobWFuYWdlQ29sb3IoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfQ09MT1IpKTsKLQkJcmVjdGFuZ2xlLnNldExpbmVWaXNpYmxlKGZhbHNlKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0U2l6ZShyZWN0YW5nbGUsIHdpZHRoLCBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShyZWN0YW5nbGUsIDAsIHksIHdpZHRoLCBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCk7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9KUEFFZGl0b3JNZXNzYWdlcy5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2kxOG4vSlBBRWRpdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4ODc2Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9KUEFFZGl0b3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvck1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRKUEFFbnRpdHlGZWF0dXJlX2Jhc2ljQXR0cmlidXRlc1NoYXBlczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEpQQUVudGl0eUZlYXR1cmVfcHJpbWFyeUtleXNTaGFwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEpQQUVudGl0eUZlYXR1cmVfcmVsYXRpb25BdHRyaWJ1dGVzU2hhcGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25MYWJlbDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9kZWxldGVBdHRyaWJ1dGVRdWVzdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVEaWFncmFtSm9iX2NyZWF0ZURpYWdyYW1Kb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZURpYWdyYW1Kb2JfZ2V0SlBBRGlhZ3JhbU1vbml0b3JUYXNrTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZ1RpdGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvclN0YXR1c01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVCaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvTWFueVVuaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb09uZVVuaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXR5UXVlc3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlUmVsYXRpb25GZWF0dXJlX2RlbGV0ZVJlbGF0aW9uUXVlc3Rpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfY2xhc3NOYW1lTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9kdXBsaWNhdGVFbnRpdHlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX3NwYWNlc05vdEFsbG93ZWRNc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfY2xhc3NOYW1lTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX3NjcGFjZXNOb3RBbGxvd2VkTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2ludmFsaWRTeW1ib2xzTXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFEaWFncmFtRWRpdG9yX3dhaXRpbmdGb3JNb2luOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUZXh0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX3BhZ2VEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25UaXR0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VUb1VzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZFBhY2thZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRUYWJsZU5hbWVQcmVmaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3NUb29sdGlwOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUZpZWxkQmFzZWRBY2Nlc3NCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VtcHR5Rm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByb3BlcnR5UGFnZV9vbmVUb01hbnlPbGRTdHlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUNvbXBhcnRUb29sVGlwOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQWxsRW50aXRpZXNNZW51SXRlbURlc2NyOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3VzdG9tU3ViTWVudURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2N1c3RvbVN1Yk1lbnVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvblRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVuYW1lRW50aXR5Q2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfbW92ZUVudGl0eUNsYXNzOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXc7IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5KUEFEZXRhaWxzVmlld0Rlc2M7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlld0Rlc2M7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybjsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW1EZXNjcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRDb21wYXJ0VG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eU1lbnVJdGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eW1lbnVJdGVtRGVzY3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtRGVzY3I7CQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGVEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNBY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0NvbmZpcm1hdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNDb25maXJtYXRpb247CQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfY2FudE1ha2VEaWFncmFtV3JpdGFibGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlIYXNUb0FkZE1zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9qcGFTdXBwb3J0V2FybmluZ01zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdE1zZzsgCi0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuVHh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfYnJvd3NlQnRuRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX3R5cGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dXaW5kb3dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2ludmFsaWRUeXBlTXNnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19pbnZhbGlkVHlwZU1zZ1RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19lbXB0eVR5cGVFcnJvclRleHQ7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX2Z1bGxuYW1lVG9vbHRpcFRleHQ7CQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclV0aWxfYXBwbHlDaGFuZ2VzSm9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX2luaGVyaXRUeXBlVG9vbHRpcFRleHQ7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWxldHRlQ29tcGFydG1lbnRfQ29ubmVjdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFsZXR0ZUNvbXBhcnRtZW50X09iamVjdHM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFTb2x2ZXJfY2xvc2VFZGl0b3JzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUpQQUVudGl0eUZlYXR1cmVfZGlzY2FyZFdhcm5pbmdNc2c7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQlROX09LOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJUTl9DQU5DRUw7CQotCQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEpQQUVkaXRvck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEpQQUVkaXRvck1lc3NhZ2VzKCkgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9pMThuL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYTFmMjAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA8Y29weXJpZ2h0PgotIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIwotIyA8L2NvcHlyaWdodD4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRKUEFFbnRpdHlGZWF0dXJlX2Jhc2ljQXR0cmlidXRlc1NoYXBlcz1PdGhlciBBdHRyaWJ1dGVzCi1BZGRKUEFFbnRpdHlGZWF0dXJlX3ByaW1hcnlLZXlzU2hhcGU9UHJpbWFyeSBLZXkKLUFkZEpQQUVudGl0eUZlYXR1cmVfcmVsYXRpb25BdHRyaWJ1dGVzU2hhcGVzPVJlbGF0aW9uIEF0dHJpYnV0ZXMKLUNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbj1DcmVhdGUgYSBuZXcgYXR0cmlidXRlIG9mIHRoaXMgZW50aXR5LgotQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkxhYmVsPUNyZWF0ZSBBdHRyaWJ1dGUKLQotQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgb2YgdGhpcyBlbnRpdHkuCi1DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw9Q3JlYXRlIEF0dHJpYnV0ZQotQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2RlbGV0ZUF0dHJpYnV0ZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGRlbGV0ZSBhdHRyaWJ1dGUgInswfSI/Ci0KLUNyZWF0ZURpYWdyYW1Kb2JfY3JlYXRlRGlhZ3JhbUpvYk5hbWU9Q3JlYXRpbmcgZGlhZ3JhbSBmb3I6IHswfS4uLgotQ3JlYXRlRGlhZ3JhbUpvYl9nZXRKUEFEaWFncmFtTW9uaXRvclRhc2tOYW1lPUdldCBKUEEgRGlhZ3JhbQotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZz1FbnRpdHkgY291bGQgbm90IGJlIGNyZWF0ZWQuCi1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnVGl0bGU9Q2Fubm90IENyZWF0ZSBFbnRpdHkKLUNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfY3JlYXRlRW50aXR5RXJyb3JTdGF0dXNNc2c9UGVyc2lzdGVuY2UgcHJvdmlkZXIgbGlicmFyeSBpcyBub3QgaW50byB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4KLUNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5LgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlTmFtZT1KYXZhIEVudGl0eQotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nRGVzY3JpcHRpb249U2VsZWN0IGEgSlBBIHByb2plY3QgdG8gY29udGFpbiB0aGUgZW50aXR5LgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nVGl0bGU9U2VsZWN0IEpQQSBQcm9qZWN0Ci1DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5IHRoYXQgd2lsbCBpbmhlcml0IGEgbmV3IE1hcHBlZCBTdXBlcmNsYXNzLgotQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVOYW1lPUluaGVyaXRlZCBFbnRpdHkKLQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lPU1hbnktdG8tTWFueQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG1hbnktdG8tbWFueSByZWxhdGlvbi4KLQotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgbWFueS10by1tYW55IHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZU5hbWU9TWFueS10by1NYW55Ci0KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgYmlkaXJlY3Rpb25hbCBtYW55LXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWU9TWFueS10by1PbmUKLQotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IHVuaWRpcmVjdGlvbmFsIG1hbnktdG8tb25lIHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lPU1hbnktdG8tT25lCi0KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyB1bmlkaXJlY3Rpb25hbCBvbmUtdG8tbWFueSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tTWFueQotCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG9uZS10by1vbmUgcmVsYXRpb24uCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tT25lCi0KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWU9T25lLXRvLU9uZQotCi1EZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0eVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGRlbGV0ZSBlbnRpdHkgInswfSIgZnJvbSB0aGUgSlBBIG1vZGVsPwotCi1EZWxldGVSZWxhdGlvbkZlYXR1cmVfZGVsZXRlUmVsYXRpb25RdWVzdGlvbj1EbyB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByZWxhdGlvbj8KLQotRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzPUF0dHJpYnV0ZSB3aXRoIG5hbWUgInswfSIgYWxyZWFkeSBleGlzdHMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9jbGFzc05hbWVNc2c9RW50ZXIgYW4gYXR0cmlidXRlIG5hbWUuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZz1Zb3UgY2Fubm90IHVzZSBsaW5lIGJyZWFrcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9zcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi0KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c9WW91IGNhbm5vdCB1c2UgYnJhY2VzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZz1FbnRlciBhbiBlbnRpdHkgbmFtZS4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2R1cGxpY2F0ZUVudGl0eU5hbWU9RW50aXR5IHdpdGggbmFtZSAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIGxpbmUgYnJlYWtzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX3NjcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBlbnRpdHkgbmFtZXMuCi1EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9pbnZhbGlkU3ltYm9sc01zZz0iezB9IiBpcyBub3QgYSB2YWxpZCBlbnRpdHkgbmFtZS4KLQotSnBhQXJ0aWZhY3RGYWN0b3J5X0Nhbk5vdENoZWNrUmV0dXJuVHlwZT1DYW5ub3QgY2hlY2sgdGhlIHJldHVybiB0eXBlCi0KLUpQQURpYWdyYW1FZGl0b3Jfd2FpdGluZ0Zvck1vaW49V2FpdGluZyBmb3IgTU9JTiBjb25uZWN0aW9uIGluaXRpYWxpemF0aW9uLi4uCi0KLUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGl0bGU9Q2Fubm90IFNhdmUgUHJvcGVydGllcwotSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUZXh0PVRoZSBKUEEgZGlhZ3JhbSBwcm9wZXJ0aWVzIGNvdWxkIG5vdCBiZSBzYXZlZAotCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfcGFnZURlc2NyaXB0aW9uPURlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3I6Ci1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvbkRlc2NyaXB0aW9uPVJlbGF0aW9uIGF0dHJpYnV0ZXMsIHdoaWNoIHlvdSBnZW5lcmF0ZSB1c2luZyB0aGUgSlBBIGVkaXRvcixcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdG8gYmUgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHR5cGUuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvblRpdHRsZT1EZWZhdWx0IENvbGxlY3Rpb24gVHlwZQotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnPUVudGl0aWVzLCB3aGljaCB5b3UgZ2VuZXJhdGUgdXNpbmcgdGhlIEpQQSBlZGl0b3IgcGFsZXR0ZSxcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZCBwYWNrYWdlLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2c9RW50aXRpZXMsIHdoaWNoIHlvdSBoYXZlIGNyZWF0ZWQsIHVzaW5nIHRoZSBKUEEgZWRpdG9yIHBhbGV0dGUsIGFyZSBhdXRvbWF0aWNhbGx5XG5hbm5vdGF0ZWQgd2l0aCBAVGFibGUobmFtZT0uLi4pLCB3aGVyZSB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaXMgYSByZXN1bHQgb2ZcbmNvbmNhdGVuYXRpb24gb2YgdGhlIGdpdmVuIHByZWZpeCBhbmQgdGhlIG5hbWUgb2YgdGhlIGVudGl0eS4gSWYgeW91IHNldFxuYSBibGFuayBwcmVmaXgsIHRoZSBuZXdseSBjcmVhdGVkIGVudGl0aWVzIGFyZSBub3QgYW5ub3RhdGVkIHdpdGggQFRhYmxlLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbD1EZWZhdWx0ICZ0YWJsZSBuYW1lIHByZWZpeDoKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZVRvVXNlPURlZmF1bHQgJkphdmEgcGFja2FnZSBmb3IgbmV3IGVudGl0aWVzOgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRQYWNrYWdlPSJ7MH0iIGlzIG5vdCBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkVGFibGVOYW1lUHJlZml4PVRhYmxlIG5hbWUgcHJlZml4IG1heSBjb250YWluIGxldHRlcnMsIGRpZ2l0cyBhbmQgdW5kZXJzY29yZXMgb25seSwgYW5kIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBkaWdpdC4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzPSZFZGl0aW5nIHRoZSBlbnRpdHkgbmFtZSBpbiB0aGUgZGlhZ3JhbSBhZmZlY3RzIHRoZSBjbGFzcyBuYW1lIGluIHRoZSBzb3VyY2UgZmlsZQotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3NUb29sdGlwPUlmIHRoaXMgb3B0aW9uIGlzIGNoZWNrZWQgYW5kIHRoZSBlbnRpdHkgbmFtZSBpcyBhcHBvaW50ZWRcbmJ5IHRoZSBARW50aXR5IGFubm90YXRpb24sIGRpcmVjdCBlbnRpdHkgbmFtZSBlZGl0aW5nIHdpbGxcbmFmZmVjdCB0aGUgYW5ub3RhdGlvbiBhbmQgd2lsbCBjYXVzZSBjbGFzcyBuYW1lIHJlZmFjdG9yaW5nLlxuSWYgdGhpcyBvcHRpb24gaXMgdW5jaGVja2VkLCBkaXJlY3QgZWRpdGluZyB3aWxsIGFmZmVjdCB0aGVcbmFubm90YXRpb24gb25seS4gSWYgdGhlIGVudGl0eSBuYW1lIGlzIG5vdCBhcHBvaW50ZWQgYnkgdGhlXG5ARW50aXR5IGFubm90YXRpb24sIGRpcmVjdCBlZGl0aW5nIHdpbGwgY2F1c2UgY2xhc3MgbmFtZVxucmVmYWN0b3JpbmcgcmVnYXJkbGVzcyB0aGlzIG9wdGlvbiBpcyBjaGVja2VkIG9yIG5vdC4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBUb29sdGlwPUVudGl0aWVzLCB3aGljaCB5b3UgZ2VuZXJhdGUgdXNpbmcgdGhlIEpQQSBlZGl0b3IgcGFsZXR0ZSxcbmFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFjY2Vzcy4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBMYWJlbD1FbnRpdHkgYWNjZXNzIHR5cGUKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlGaWVsZEJhc2VkQWNjZXNzQnV0dG9uTGFiZWw9JkZpZWxkLWJhc2VkCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsPSZQcm9wZXJ0eS1iYXNlZAotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcD1UaGUgbmV3bHkgY3JlYXRlZCBkaWFncmFtIGZpbGUocykgd2lsbCBiZSBzdG9yZWQgaW4gdGhpcyBmb2xkZXIKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbExhYmVsPUZvbGRlciBmb3IgJmRpYWdyYW1zOgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRGb2xkZXI9VGhlIGZvbGRlciBuYW1lIG11c3QgYmUgcHJlY2VkZWQgYnkgInswfSIuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW1wdHlGb2xkZXI9VGhlIGZvbGRlciBuYW1lIGZvciBkaWFncmFtcyBtdXN0IG5vdCBiZSBlbXB0eS4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZT0mT25lLXRvLU1hbnkgdW5pZGlyZWN0aW9uYWwgb2xkIChKUEEgMS4wKSBzdHlsZSByZWxhdGlvbnMgaW4gSlBBIDIuMCBwcm9qZWN0cyAKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZVRvb2x0aXA9SWYgdGhpcyBvcHRpb24gaXMgY2hlY2tlZCwgdGhlIG5ld2x5IGNyZWF0ZWQgT25lLXRvLU1hbnlcbnVuaWRpcmVjdGlvbmFsIHJlbGF0aW9ucyBpbiBKUEEgMi4wIHByb2plY3RzIHdpbGwgYmUgb2xkXG4oSlBBIDEuMCkgc3R5bGUuICBJLmUuLCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIHdpbGxcbmJlIGNyZWF0ZWQgd2l0aG91dCBASm9pbkNvbHVtbihzKSBhbm5vdGF0aW9uLgotCi1KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGU9Jk9uZS10by1NYW55IHVuaWRpcmVjdGlvbmFsIG9sZCAoSlBBIDEuMCkgc3R5bGUgcmVsYXRpb25zCi1KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwPUlmIHRoaXMgb3B0aW9uIGlzIGNoZWNrZWQsIHRoZSBuZXdseSBjcmVhdGVkIE9uZS10by1NYW55XG51bmlkaXJlY3Rpb25hbCByZWxhdGlvbnMgd2lsbCBiZSBvbGQgKEpQQSAxLjApIHN0eWxlLlxuSS5lLiwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyB3aWxsIGJlIGNyZWF0ZWQgd2l0aG91dFxuQEpvaW5Db2x1bW4ocykgYW5ub3RhdGlvbi4KLQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbT1Db2xsYXBzZSBBdHRyaWJ1dGVzIEdyb3VwCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUF0dHJHcm91cE1lbnVJdGVtRGVzY3I9Q29sbGFwc2UgdGhlIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUNvbXBhcnRUb29sVGlwPURvdWJsZSBjbGljayB0byBjb2xsYXBzZSAiezB9IiBhdHRyaWJ1dGVzIGdyb3VwLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbT1Db2xsYXBzZSBFbnRpdHkKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW1EZXNjcj1Db2xsYXBzZSBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW09Q29sbGFwc2UgQWxsCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcj1Db2xsYXBzZSBhbGwgZW50aXRpZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgYXR0cmlidXRlIG9mIHRoaXMgZW50aXR5LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw9Q3JlYXRlIEF0dHJpYnV0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3VzdG9tU3ViTWVudURlc2NyaXB0aW9uPUN1c3RvbSBmZWF0dXJlcyBzdWJtZW51Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jdXN0b21TdWJNZW51VGV4dD1DdXN0b20KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPURlbGV0ZSB0aGlzIGF0dHJpYnV0ZSBmcm9tIHRoZSBtb2RlbC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsPURlbGV0ZSBBdHRyaWJ1dGUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uPVJlbW92ZSB0aGlzIEpQQSBlbnRpdHkgZnJvbSB0aGUgZGlhZ3JhbSBhbmQgZGVsZXRlIGl0IGZyb20gdGhlIEpQQSBtb2RlbC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkxhYmVsPURlbGV0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbT1EaXNjYXJkIENoYW5nZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW1EZXNjcj1EaXNjYXJkIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBKUEEgZW50aXR5IGFmdGVyIHRoZSBsYXN0IHNhdmluZy4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uRGVzY3JpcHRpb249RGlzY2FyZCBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgSlBBIGVudGl0eSBhZnRlciB0aGUgbGFzdCBzYXZpbmcgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaWFncmFtLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlRW50aXR5RnJvbURpYWdyYW1CdXR0b25MYWJlbD1EaXNjYXJkIENoYW5nZXMgYW5kIFJlbW92ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvblRleHQ9U2F2ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZUJ1dHRvbkRlc2NyaXB0aW9uPVNhdmUgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlTWVudUl0ZW09U2F2ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtRGVzY3I9U2F2ZSBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgSlBBIGVudGl0eS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25UZXh0PURpc2NhcmQgQ2hhbmdlcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVzdG9yZUJ1dHRvbkRlc2NyaXB0aW9uPURpc2NhcmQgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkgYWZ0ZXIgdGhlIGxhc3Qgc2F2aW5nLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvblRleHQ9U2F2ZSBBbmQgUmVtb3ZlCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uRGVzY3JpcHRpb249U2F2ZSBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgZW50aXR5IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlhZ3JhbS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllcz1TaG93IEFsbCBFbnRpdGllcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzRGVzYz1TaG93IGFsbCBlbnRpdGllcyB3aXRoaW4gdGhlIHByb2plY3Qgb24gdGhlIGRpYWdyYW0uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnU9UmVmYWN0b3IgRW50aXR5IENsYXNzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW5hbWVFbnRpdHlDbGFzcz1SZW5hbWUuLi4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX21vdmVFbnRpdHlDbGFzcz1Nb3ZlLi4uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXc9T3BlbiBKUEEgRGV0YWlscyBWaWV3Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXdEZXNjPU9wZW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcgdG8gdmlldy9tb2RpZnkgdGhlIGRldGFpbHMgb2YgdGhlIHNlbGVjdGVkIHBlcnNpc3RlbnQgb2JqZWN0LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXc9T3BlbiBNaW5pYXR1cmUgVmlldyAKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3RGVzYz1PcGVuIHRoZSBNaW5pYXR1cmUgdmlldyB0byBkaXNwbGF5IHRoZSBkaWFncmFtIGluIGEgbGFyZ2VyIHNjYWxlLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuPUFwcGx5IFRlbXBsYXRlLi4uIAotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuRGVzYz1BcHBseSBUZW1wbGF0ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtPUV4cGFuZCBBdHRyaWJ1dGVzIEdyb3VwCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW1EZXNjcj1FeHBhbmQgdGhlIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRDb21wYXJ0VG9vbFRpcD1Eb3VibGUgY2xpY2sgdG8gZXhwYW5kICJ7MH0iIGF0dHJpYnV0ZXMgZ3JvdXAuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHlNZW51SXRlbT1FeHBhbmQgRW50aXR5Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHltZW51SXRlbURlc2NyPUV4cGFuZCBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtPUV4cGFuZCBBbGwKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcj1FeHBhbmQgYWxsIGVudGl0aWVzLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlPVJlZmFjdG9yIEF0dHJpYnV0ZSBUeXBlLi4uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGVEZXNjPUNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQWxsRW50aXRpZXNNZW51PVJlbW92ZSBBbGwgRW50aXRpZXMgRnJvbSBEaWFncmFtCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNBY3Rpb249Li4uYW5kIFNhdmUgQ2hhbmdlcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQWN0aW9uPS4uLmFuZCBEaXNjYXJkIENoYW5nZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0NvbmZpcm1hdGlvbj1EbyB5b3Ugd2FudCB0byBzYXZlIHRoZSBjaGFuZ2VzIGFuZCByZW1vdmUgYWxsIGVudGl0aWVzIGZyb20gdGhlIGRpYWdyYW0/Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmREaXNjYXJkQWxsRW50aXRpZXNDb25maXJtYXRpb249RG8geW91IHdhbnQgdG8gZGlzY2FyZCB0aGUgY2hhbmdlcyBhbmQgcmVtb3ZlIGFsbCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtPwotCi1KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlVGl0bGU9Q2FuJ3QgTWFrZSBEaWFncmFtIFdyaXRhYmxlCi1KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlTXNnPUNhbm5vdCBtYWtlIHRoZSBKUEEgZGlhZ3JhbSBmaWxlIHdyaXRhYmxlOlxuXG57MH0KLUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5VGl0bGU9SlBBIERpYWdyYW0gUmVhZC1Pbmx5Ci1KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seU1zZz1UaGUgSlBBIGRpYWdyYW0gZmlsZSBpcyByZWFkLW9ubHkgYW5kIGNhbm5vdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwuIEluIG9yZGVyIHRvIG9wZW4gdGhlIGRpYWdyYW0sIHRoZSBKUEEgZWRpdG9yIG11c3QgbWFrZSB0aGlzIGZpbGUgd3JpdGFibGUuCi1KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seUhhc1RvQWRkTXNnPUNhbm5vdCBzaG93IHRoZSBzZWxlY3RlZCBlbnRpdHkgaW4gdGhlIEpQQSBkaWFncmFtLCBiZWNhdXNlIHRoZSBkaWFncmFtIGZpbGUgaXMgcmVhZC1vbmx5LiBJbiBvcmRlciB0byBzaG93IHRoZSBlbnRpdHksIHRoZSBKUEEgZWRpdG9yIG11c3QgbWFrZSB0aGlzIGZpbGUgd3JpdGFibGUuCi0KLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZ1RpdGxlPUNhbm5vdCBPcGVuIERpYWdyYW0KLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZz1DYW5ub3Qgb3BlbiB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yCi1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nVGl0bGU9SlBBIFN1cHBvcnQKLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdNc2c9SlBBIERpYWdyYW0gRWRpdG9yIHN1cHBvcnRzIEpQQSAxLjAgb25seS4gV2hlbiB5b3UgdXNlIGl0IHdpdGggSlBBIDIuMCBlbmFibGVkIHByb2plY3RzIHlvdSBzaG91bGQgdmlzdWFsaXplIEpQQSAxLjAgY29tcGxpYW50IGVudGl0aWVzIG9ubHkuIE90aGVyd2lzZSwgdGhlIGVkaXRvciBiZWhhdmlvciB3aWxsIGJlY29tZSBlcnJhdGljLiAKLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfbm9QZXJzaXN0ZW5jZVVuaXRUaXRsZT1ObyBQZXJzaXN0ZW5jZSBVbml0Ci1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0TXNnPVRoZSBKUEEgRGlhZ3JhbSBFZGl0b3IgY2FuIG5vdCBiZSBvcGVuLCBiZWNhdXNlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGRvZXMgbm90IGV4aXN0IG9yIGlzIGNvcnJ1cHRlZC4gCi0KLUpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dD1cIENsYXNzIE5hbWU6IHswfSAKLUpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0PVwgVHlwZTogezB9IAotSlBBRWRpdG9yVXRpbF9hcHBseUNoYW5nZXNKb2JOYW1lPUFwcGx5IGNoYW5nZXMgdG8gcGVyc2lzdGVuY2UueG1sLgotSlBBRWRpdG9yVXRpbF9pbmhlcml0VHlwZVRvb2x0aXBUZXh0PVwgQ2xhc3MgTmFtZTogezB9IFxuIFRoaXMgZW50aXR5IGluaGVyaXRzIHsxfQotCi1QYWxldHRlQ29tcGFydG1lbnRfQ29ubmVjdGlvbnM9UmVsYXRpb25zCi1QYWxldHRlQ29tcGFydG1lbnRfT2JqZWN0cz1FbnRpdGllcwotCi1CVE5fT0s9T0sKLUJUTl9DQU5DRUw9Q2FuY2VsCi0KLVNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RleHQ9U2VsZWN0IGEgcHJpbWl0aXZlIHR5cGUgZm9yIHRoZSBhdHRyaWJ1dGUgInswfSIgb2YgdGhlIGVudGl0eSAiezF9IiBvciBjaG9vc2UgdGhlICJCcm93c2UiIGJ1dHRvbiB0byBzZWxlY3QgYSBjbGFzcyB0eXBlLgotU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5UeHQ9JkJyb3dzZS4uLgotU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5EZXNjPUJyb3dzZSB0byBzZWxlY3QgYSBjbGFzcy4KLVNlbGVjdFR5cGVEaWFsb2dfdHlwZUxhYmVsPSZUeXBlOgotU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nV2luZG93VGl0bGU9U2VsZWN0IFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RpdGxlPVNlbGVjdCBOZXcgQXR0cmlidXRlIFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfaW52YWxpZFR5cGVNc2dUaXRsZT1JbnZhbGlkIFR5cGUKLVNlbGVjdFR5cGVEaWFsb2dfaW52YWxpZFR5cGVNc2dUZXh0PSJ7MH0iIGlzIG5vdCB2YWxpZCBqYXZhIHR5cGUgb3IgcHJpbWl0aXZlLgotU2VsZWN0VHlwZURpYWxvZ19lbXB0eVR5cGVFcnJvclRleHQ9VGhlIG5ldyB0eXBlIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkKLQotSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZz1UaGUgZW50aXR5ICJ7MH0iIGlzIG9wZW4gZWxzZXdoZXJlIHdpdGggaWRlbnRpY2FsIGNoYW5nZXMuIFVzaW5nIHRoaXMgYnV0dG9uIHdpbGwgbm90IGxvc2UgdGhvc2UgY2hhbmdlcy4gQ2xvc2UgdGhlIG90aGVyIGVkaXRvcihzKSwgd2hlcmUgdGhlIGVudGl0eSAiezB9IiBpcyBvcGVuIGFuZCB0cnkgYWdhaW4hCi1KUEFTb2x2ZXJfY2xvc2VFZGl0b3JzPUNsb3NlIEVkaXRvcnMgIAotCi1SZW1vdmVKUEFFbnRpdHlGZWF0dXJlX2Rpc2NhcmRXYXJuaW5nTXNnPVRoZSBlbnRpdHkgInswfSIgaXMgb3BlbiBlbHNld2hlcmUgd2l0aCBpZGVudGljYWwgY2hhbmdlcy4gVXNpbmcgdGhpcyBidXR0b24gd2lsbCByZW1vdmUgdGhlIGVudGl0eSBmcm9tIHRoZSBkaWFncmFtLCBidXQgd2lsbCBub3QgbG9zZSB0aG9zZSBjaGFuZ2VzLiBJbiBvcmRlciB0byBsb3NlIHRoZSBjaGFuZ2VzIHlvdSBuZWVkIGZpcnN0IHRvIGNsb3NlIHRoZSBvdGhlciBlZGl0b3IocyksIHdoZXJlIHRoZSBlbnRpdHkgInswfSIgaXMgb3BlbiBhbmQgdHJ5IGFnYWluIVxuXG5EbyB5b3Ugd2FudCB0byBjb250aW51ZSB3aXRoIHJlbW92aW5nIGFueXdheT8KLQotCi0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MGRhMmUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRGlhZ3JhbUVkaXRvcklucHV0OwotCi0KLXB1YmxpYyBjbGFzcyBKUEFEaWFncmFtRWRpdG9ySW5wdXQgZXh0ZW5kcyBEaWFncmFtRWRpdG9ySW5wdXQgCi0JCQkJCQkJCQlpbXBsZW1lbnRzIElKUEFEaWFncmFtRWRpdG9ySW5wdXQgewotCQotCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCXByaXZhdGUgU3RyaW5nIHByb2plY3ROYW1lOwotCQotCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3JJbnB1dChEaWFncmFtIGRpYWdyYW0sIAotCQkJCQkJCQkgU3RyaW5nIGRpYWdyYW1VcmlTdHJpbmcsIAotCQkJCQkJCQkgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZG9tYWluLCAKLQkJCQkJCQkJIFN0cmluZyBwcm92aWRlcklkLCAKLQkJCQkJCQkJIGJvb2xlYW4gZGlzcG9zZUVkaXRpbmdEb21haW4pIHsKLQkJCi0JCXN1cGVyKGRpYWdyYW1VcmlTdHJpbmcsIGRvbWFpbiwgcHJvdmlkZXJJZCwgZGlzcG9zZUVkaXRpbmdEb21haW4pOwotCQl0aGlzLmRpYWdyYW0gPSBkaWFncmFtOyAKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZGlhZ3JhbSkuZ2V0TmFtZSgpOwkJCi0JfQotCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3JJbnB1dChEaWFncmFtIGRpYWdyYW0sCi0JCQkJCQkJCSBVUkkgZGlhZ3JhbVVyaSwgCi0JCQkJCQkJCSBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIAotCQkJCQkJCQkgU3RyaW5nIHByb3ZpZGVySWQsIAotCQkJCQkJCQkgYm9vbGVhbiBkaXNwb3NlRWRpdGluZ0RvbWFpbikgewotCQkKLQkJc3VwZXIoZGlhZ3JhbVVyaSwgZG9tYWluLCBwcm92aWRlcklkLCBkaXNwb3NlRWRpdGluZ0RvbWFpbik7Ci0JCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0pLmdldE5hbWUoKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoRU9iamVjdC5jbGFzcykpIHsKLQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCX0gCi0JCWlmIChhZGFwdGVyLmVxdWFscyhEaWFncmFtLmNsYXNzKSkgewotCQkJcmV0dXJuIGdldERpYWdyYW0oKTsKLQkJfQotCQlpZiAoYWRhcHRlci5lcXVhbHMoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uY2xhc3MpKQotCQkJcmV0dXJuIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIEpQQURpYWdyYW1FZGl0b3JJbnB1dCBjcmVhdGVFZGl0b3JJbnB1dChEaWFncmFtIGRpYWdyYW0sIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgU3RyaW5nIHByb3ZpZGVySWQsCi0JCQlib29sZWFuIGRpc3Bvc2VFZGl0aW5nRG9tYWluKSB7Ci0JCWZpbmFsIFJlc291cmNlIHJlc291cmNlID0gZGlhZ3JhbS5lUmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlmaW5hbCBTdHJpbmcgZnJhZ21lbnQgPSByZXNvdXJjZS5nZXRVUklGcmFnbWVudChkaWFncmFtKTsKLQkJZmluYWwgVVJJIGZyYWdtZW50VXJpID0gcmVzb3VyY2UuZ2V0VVJJKCkuYXBwZW5kRnJhZ21lbnQoZnJhZ21lbnQpOwotCQlKUEFEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0OwotCQlkaWFncmFtRWRpdG9ySW5wdXQgPSBuZXcgSlBBRGlhZ3JhbUVkaXRvcklucHV0KGRpYWdyYW0sIGZyYWdtZW50VXJpLCBkb21haW4sIHByb3ZpZGVySWQsIGRpc3Bvc2VFZGl0aW5nRG9tYWluKTsKLQkJcmV0dXJuIGRpYWdyYW1FZGl0b3JJbnB1dDsKLQl9Ci0JCi0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3N2FiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5JTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgewotCQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfR0VORVJBVEVEID0gIkNPREVfR0VORVJBVEVEIjsgCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfQ0xJQ0sgPSAiRE9VQkxFX0NMSUNLIjsJCS8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSgpIHt9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyBpbnRlbmRlZCBzb2xlbHkgZm9yIHRoZSB0ZXN0IHB1cnBvc2VzCi0JICogIAotCSAqIEBwYXJhbSBmcCB0aGUgZmVhdHVyZSBwcm92aWRlcgotCSAqLwotCXB1YmxpYyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJdGhpcy5mcCA9IGZwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJSUZpbGVFZGl0b3JJbnB1dCBmaWxlSW5wdXQgPSAoSUZpbGVFZGl0b3JJbnB1dCkgaW5wdXQ7Ci0JCQlJRmlsZSBlbnRpdHlGaWxlID0gZmlsZUlucHV0LmdldEZpbGUoKTsKLQkJCWlmKCFlbnRpdHlGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphdmEiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVF1YWxpZmllZE5hbWUgcW4gPSBuZXcgUXVhbGlmaWVkTmFtZShudWxsLCBET1VCTEVfQ0xJQ0spOwotCQkJCWlmICgidHJ1ZSIuZXF1YWxzKGVudGl0eUZpbGUuZ2V0U2Vzc2lvblByb3BlcnR5KHFuKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQllbnRpdHlGaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShxbiwgbnVsbCk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgZ2V0IHNlc3Npb24gcHJvcGVydHkgRE9VQkxFX0NMSUNLIik7CS8vJE5PTi1OTFMtMSQKLQkJCQllMS5wcmludFN0YWNrVHJhY2UoKTsJCi0JCQl9Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgaW5wdXRKcHRUeXBlID0gbnVsbDsgCi0JCQkKLQkJCWlmIChmcCA9PSBudWxsKSB7Ci0JCQkJaW5wdXRKcHRUeXBlID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlucHV0SnB0VHlwZSA9IGZwLmdldEpQQUVkaXRvclV0aWwoKS5nZXRKUFR5cGUoSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKSk7Ci0JCQl9Ci0JCQlpZiAoaW5wdXRKcHRUeXBlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGlucHV0SnB0VHlwZS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCk7Ci0KLQkJCXRyeSB7Ci0JCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCk7Ci0JCQkJaWYgKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUpQQURpYWdyYW1FZGl0b3JJbnB1dCkgewotCQkJCQlJSlBBRGlhZ3JhbUVkaXRvcklucHV0IGpwSW5wdXQgPSAoSUpQQURpYWdyYW1FZGl0b3JJbnB1dCkgZWRpdG9ySW5wdXQ7Ci0JCQkJCURpYWdyYW0gZGlhZ3JhbSA9IGpwSW5wdXQuZ2V0RGlhZ3JhbSgpOwotCQkJCQlpZiAoZGlhZ3JhbSAhPSBudWxsKSB7Ci0JCQkJCQkKLQkJCQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gbnVsbDsKLQkJCQkJCUlEaWFncmFtVHlwZVByb3ZpZGVyIGRpYWdyYW1Qcm92aWRlciA9IG51bGw7Ci0JCQkJCQlpZiAoZnAgIT0gbnVsbCkgewotCQkJCQkJCWZlYXR1cmVQcm92aWRlciA9IHRoaXMuZnA7Ci0JCQkJCQkJZGlhZ3JhbVByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZGlhZ3JhbVByb3ZpZGVyID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvdmlkZXJCeURpYWdyYW0oZGlhZ3JhbSk7Ci0JCQkJCQkJZmVhdHVyZVByb3ZpZGVyID0gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpZGlhZ3JhbVByb3ZpZGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCQkJCQkJfQotCQkJCQkJSU1vZGVsSW50ZWdyYXRpb25VdGlsIG1vaW5JbnRlZ3JhdGlvblV0aWwgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpOwotCQkJCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0RnJvbUVkaXRvciA9IG1vaW5JbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtKTsKLQkJCQkJCWlmIChqcGFQcm9qZWN0LmVxdWFscyhqcGFQcm9qZWN0RnJvbUVkaXRvcikpIHsKLQkJCQkJCQlpZiAoZmlsZUlucHV0LmdldE5hbWUoKSAhPSBDT0RFX0dFTkVSQVRFRCkgCi0JCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChpbnB1dEpwdFR5cGUpOwotCQkJCQkJCWlmIChwZSAhPSBudWxsKSB7Ci0JCQkJCQkJCWRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkuc2V0UGljdG9ncmFtRWxlbWVudEZvclNlbGVjdGlvbihwZSk7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlJQ3VzdG9tRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpOwotCQkJCQkJCUN1c3RvbUNvbnRleHQgY29udGV4dCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQkJCQkJZmVhdHVyZS5leGVjdXRlKGNvbnRleHQpOwotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIElKUEFEaWFncmFtRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiBlZGl0b3JSZWYuZ2V0UGFydE5hbWUoKS5lcXVhbHMoKChJSlBBRGlhZ3JhbUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFhNTM1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL09wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2JDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBsYXRmb3JtLklEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmVkaXRvci5EaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JY29uQW5kTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuQ3JlYXRlRGlhZ3JhbUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoeyAidW51c2VkIiwgInJlc3RyaWN0aW9uIiB9KQotcHVibGljIGNsYXNzIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCQkJCi0JcHJpdmF0ZSBjbGFzcyBPcGVuRWRpdG9yUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByaXZhdGUgRGlhZ3JhbSBkaWFncmFtOwotCi0JCXByaXZhdGUgT3BlbkVkaXRvclJ1bm5hYmxlKERpYWdyYW0gZGlhZ3JhbSkgewotCQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsLm1hcERpYWdyYW1Ub1Byb2plY3QoZGlhZ3JhbSwganBhUHJvamVjdCk7CQkJCi0JCQlvcGVuRGlhZ3JhbUVkaXRvcihkaWFncmFtKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbUVkaXRvciBvcGVuRGlhZ3JhbUVkaXRvcihEaWFncmFtIGRpYWdyYW0pIHsKLQotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0pOwotCQlpZiAoIUpQQUVkaXRvclV0aWwuY2hlY2tKUEFGYWNldFZlcnNpb24oanBhUHJvamVjdCwgIjEuMCIpKSB7CQkJCQkvLyROT04tTkxTLTEkCi0JCQlib29sZWFuIHdhc0VuYWJsZWQgPSBPcHRpb25hbE1lc3NhZ2VEaWFsb2cuaXNEaWFsb2dFbmFibGVkKEpQQUVkaXRvckNvbnN0YW50cy5KUEFfU1VQUE9SVF9ESUFMT0dfSUQpOwotCQkJaW50IGJ0bkluZGV4ID0gT3B0aW9uYWxNZXNzYWdlRGlhbG9nLm9wZW4oSlBBRWRpdG9yQ29uc3RhbnRzLkpQQV9TVVBQT1JUX0RJQUxPR19JRCwgCi0JCQkJCQkJCQkgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTaGVsbHMoKVswXSwgCi0JCQkJCQkJCQkgICBKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nVGl0bGUsIAotCQkJCQkJCQkJICAgRGlzcGxheS5nZXREZWZhdWx0KCkuZ2V0U3lzdGVtSW1hZ2UoU1dULklDT05fV0FSTklORyksCi0JCQkJCQkJCQkgICBKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nTXNnLCAKLQkJCQkJCQkJCSAgIDAsIAotCQkJCQkJCQkJICAgbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0t9LCAKLQkJCQkJCQkJCSAgIDApOwotCQl9Ci0JCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oKGRpYWdyYW0uZVJlc291cmNlKCkuZ2V0UmVzb3VyY2VTZXQoKSkpOyAKLQkJZmluYWwgSlBBRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1FZGl0b3JJbnB1dCA9IEpQQURpYWdyYW1FZGl0b3JJbnB1dC5jcmVhdGVFZGl0b3JJbnB1dChkaWFncmFtLCBkZWZhdWx0VHJhbnNFZGl0RG9tYWluLCBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyLklELCBmYWxzZSk7IAotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWZpbmFsIElXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQl0cnkgewotCQkJZmluYWwgSUVkaXRvclBhcnQgZWRpdG9yUGFydCA9IElERS5vcGVuRWRpdG9yKHdvcmtiZW5jaFBhZ2UsIGRpYWdyYW1FZGl0b3JJbnB1dCwgSlBBRGlhZ3JhbUVkaXRvci5JRCk7Ci0JCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIEpQQURpYWdyYW1FZGl0b3IpIHsJCQkJCi0JCQkJSlBBRGlhZ3JhbUVkaXRvciByZXQgPSAoSlBBRGlhZ3JhbUVkaXRvcikgZWRpdG9yUGFydDsKLQkJCQl3cnAuc2V0T2JqKHJldCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5hZGRXb3JrYmVuY2hMaXN0ZW5lciggbmV3IElXb3JrYmVuY2hMaXN0ZW5lcigpIHsKLQkJCQkgICAgcHVibGljIGJvb2xlYW4gcHJlU2h1dGRvd24oIElXb3JrYmVuY2ggd29ya2JlbmNoLCBib29sZWFuIGZvcmNlZCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJICAgIAl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9yKCBlZGl0b3JQYXJ0LCB0cnVlKTsKLQkJCQkgICAgICAgIHJldHVybiB0cnVlOwotCQkJCSAgICB9Ci0JCQkJIAotCQkJCSAgICBwdWJsaWMgdm9pZCBwb3N0U2h1dGRvd24oIElXb3JrYmVuY2ggd29ya2JlbmNoICl7Ci0JCQkJIAotCQkJCSAgICB9Ci0JCQkJfSk7Ci0JCQkJLy9DU04gIzEzMDU4NTAgMjAxMAotCQkJCS8vaWYocmV0LmlzRGlydHkoKSkKLQkJCQkvLwlyZXQuZG9TYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IG9wZW4gSlBBIGVkaXRvciIpOwkvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CQotCQlyZXR1cm4gKEpQQURpYWdyYW1FZGl0b3Ipd3JwLmdldE9iaigpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX09QRU5JTkdfRElBR1JBTSA9IEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZzsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCXByaXZhdGUgV2Vha1JlZmVyZW5jZTxJU2VsZWN0aW9uPiBzZWxlY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxJU2VsZWN0aW9uPihudWxsKTsgCi0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQlzaGVsbCA9IHRhcmdldFBhcnQuZ2V0U2l0ZSgpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotICAgICAgICB0cnkgeyAgICAgIAkKLSAgICAgICAgCXBlcnNpc3RlbmNlVW5pdCA9IG9idGFpbkpwYVByb2plY3RBbmRQZXJzaXN0ZW5jZVVuaXQoc2VsZWN0aW9uUmVmLmdldCgpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWhhbmRsZUV4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgCi0JCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0VGl0bGUsCi0JCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX25vUGVyc2lzdGVuY2VVbml0TXNnKTsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBDcmVhdGVEaWFncmFtSm9iIGNyZWF0ZURpYWdyYW1SdW5uYWJsZSA9IG5ldyBDcmVhdGVEaWFncmFtSm9iKHBlcnNpc3RlbmNlVW5pdCwgMTAsIHRydWUpOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXNoZWxsLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgT3BlbkVkaXRvclJ1bm5hYmxlKGNyZWF0ZURpYWdyYW1SdW5uYWJsZS5nZXREaWFncmFtKCkpKTsKLQkJCX0KLQkJfSk7Ci0JCWNyZWF0ZURpYWdyYW1SdW5uYWJsZS5zZXRVc2VyKHRydWUpOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzZWxlY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxJU2VsZWN0aW9uPihzZWxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgb2J0YWluSnBhUHJvamVjdEFuZFBlcnNpc3RlbmNlVW5pdChJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLSAgICAgICAgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIEpwYU5vZGUpIHsKLSAgICAgICAgCWpwYVByb2plY3QgPSAoKEpwYU5vZGUpZmlyc3RFbGVtZW50KS5nZXRKcGFQcm9qZWN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCWpwYVByb2plY3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KChJUHJvamVjdClmaXJzdEVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JfQotCQkKLQotCXByaXZhdGUgdm9pZCBoYW5kbGVFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKEVSUk9SX09QRU5JTkdfRElBR1JBTSk7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbmV3IEVyclN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBlLnRvU3RyaW5nKCksIGUpOwotCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZ1RpdGxlLCAKLQkJCQlFUlJPUl9PUEVOSU5HX0RJQUdSQU0sIHN0YXR1cyk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRXJyU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQkJCi0JCXB1YmxpYyBFcnJTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlzdXBlcihzZXZlcml0eSwgbWVzc2FnZSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJfQotCQkKLQkJcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3QgPSBnZXRFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7Ci0JCQlJU3RhdHVzW10gcmVzID0gbmV3IElTdGF0dXNbc3QgPT0gbnVsbCA/IDAgOiBzdC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdC5sZW5ndGg7IGkrKykgCi0JCQkJcmVzW2ldID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBzdFtpXS50b1N0cmluZygpKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0NyZWF0ZURpYWdyYW1Kb2IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvQ3JlYXRlRGlhZ3JhbUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA1YmZkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvQ3JlYXRlRGlhZ3JhbUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVEaWFncmFtSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8vcHJpdmF0ZSBDb25uZWN0aW9uIG1vaW5Db25uZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0JcHJpdmF0ZSBpbnQgZ3JpZDsKLQlwcml2YXRlIGJvb2xlYW4gc25hcDsKLQkKLQkvKgotCXB1YmxpYyBDb25uZWN0aW9uIGdldE1vaW5Db25uZWN0aW9uKCkgewotCQlyZXR1cm4gbW9pbkNvbm5lY3Rpb247Ci0JfQotCSovCi0JCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHVibGljIENyZWF0ZURpYWdyYW1Kb2IoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgaW50IGdyaWQsIGJvb2xlYW4gc25hcCkgewotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVEaWFncmFtSm9iX2NyZWF0ZURpYWdyYW1Kb2JOYW1lLCBuZXcgT2JqZWN0W10geyBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpfSkpOyAKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXQ7Ci0JCXRoaXMuZ3JpZCA9IGdyaWQ7Ci0JCXRoaXMuc25hcCA9IHNuYXA7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvL0lQcm9qZWN0IHByb2plY3QgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJdHJ5ewotCQkJbW9uaXRvci5iZWdpblRhc2soSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlRGlhZ3JhbUpvYl9nZXRKUEFEaWFncmFtTW9uaXRvclRhc2tOYW1lLCAzKTsgCi0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCS8vbW9pbkNvbm5lY3Rpb24gPSBDb25uZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNvbm5lY3Rpb24ocHJvamVjdCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWRpYWdyYW0gPSBNb2RlbEludGVncmF0aW9uVXRpbC5jcmVhdGVEaWFncmFtKHBlcnNpc3RlbmNlVW5pdCwgZ3JpZCwgc25hcCk7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0lNb2RlbEludGVncmF0aW9uVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9JTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU4YzZjZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0lNb2RlbEludGVncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLQotcHVibGljIGludGVyZmFjZSBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgewotCXB1YmxpYyBKcGFQcm9qZWN0IGdldFByb2plY3RCeURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyMzc3NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3JGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEludGVncmF0aW9uVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0ZJTEVfRVhURU5TSU9OID0gInhtaSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9ESUFHUkFNX1RZUEUgPSAiSlBBIERpYWdyYW0iOyAJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTX0ZPTERFUiA9ICJzcmMiOwkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFdlYWtIYXNoTWFwPERpYWdyYW0sIFdlYWtSZWZlcmVuY2U8SnBhUHJvamVjdD4+IGRpYWdyYW1zVG9Qcm9qZWN0cyA9IG5ldyBXZWFrSGFzaE1hcDxEaWFncmFtLCBXZWFrUmVmZXJlbmNlPEpwYVByb2plY3Q+PigpOwotCXByaXZhdGUgc3RhdGljIFdlYWtIYXNoTWFwPERpYWdyYW0sIFdlYWtSZWZlcmVuY2U8SlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcj4+IGRpYWdyYW1zVG9Qcm92aWRlcnMgPSBuZXcgV2Vha0hhc2hNYXA8RGlhZ3JhbSwgV2Vha1JlZmVyZW5jZTxKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyPj4oKTsKLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPERpYWdyYW0sIFJlc291cmNlPiBkaWFncmFtc1RvUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8RGlhZ3JhbSwgUmVzb3VyY2U+KCk7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGNyZWF0ZURpYWdyYW1QYXRoKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgICAgSVByb2plY3QgcHJvamVjdCA9IHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCSAgICBJUGF0aCBwcm9qZWN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkgICAgU3RyaW5nIGRpYWdyYW1OYW1lID0gcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKTsKLQkJSVBhdGggcGF0aCA9IGdldERpYWdyYW1zRm9sZGVyUGF0aChwcm9qZWN0KS5hcHBlbmQoZGlhZ3JhbU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oRElBR1JBTV9GSUxFX0VYVEVOU0lPTik7Ci0JCXBhdGggPSBwcm9qZWN0UGF0aC5hcHBlbmQocGF0aCk7Ci0JICAgIHJldHVybiBwYXRoOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgRGlhZ3JhbSBjcmVhdGVEaWFncmFtKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIAotCQkJCQkJCQkJCWludCBncmlkLCAKLQkJCQkJCQkJCQlib29sZWFuIHNuYXApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhdGggcGF0aCA9IGNyZWF0ZURpYWdyYW1QYXRoKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCURpYWdyYW0gZCA9IGNyZWF0ZURpYWdyYW0ocGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCksIHBhdGgsIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIGdyaWQsIHNuYXApOyAKLQkgICAgcmV0dXJuIGQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVdlYWtSZWZlcmVuY2U8SnBhUHJvamVjdD4gcmVmID0gZGlhZ3JhbXNUb1Byb2plY3RzLmdldChkaWFncmFtKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZGVmYXVsdFRyYW5zRWRpdERvbWFpbiA9IChUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbilyZWYuZ2V0KCkuZ2V0UHJvamVjdCgpLmdldEFkYXB0ZXIoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uY2xhc3MpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGRlZmF1bHRUcmFuc0VkaXREb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmV0dXJuIHJlc291cmNlU2V0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBXcnAgewotCQlwcml2YXRlIE9iamVjdCBvOwotCQlwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLQkJCXJldHVybiBvOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRPYmplY3QoT2JqZWN0IG8pIHsKLQkJCXRoaXMubyA9IG87Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oSVByb2plY3QgcHJvamVjdCwgCi0JCQkJCQkJCQkgSVBhdGggZGlhZ3JhbUZpbGVOYW1lLAotCQkJCQkJCQkJIFN0cmluZyBkaWFncmFtTmFtZSwKLQkJCQkJCQkJCSBpbnQgZ3JpZCwgCi0JCQkJCQkJCQkgYm9vbGVhbiBzbmFwKSB7Ci0JCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gRGlhZ3JhbUVkaXRvckZhY3RvcnkuY3JlYXRlUmVzb3VyY2VTZXRBbmRFZGl0aW5nRG9tYWluKCk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlJRmlsZSBkaWFncmFtRmlsZSA9IHByb2plY3QuZ2V0RmlsZShkaWFncmFtRmlsZU5hbWUucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7Ci0JCUlQYXRoIGRpYWdyYW1GaWxlUGF0aCA9IGRpYWdyYW1GaWxlLmdldEZ1bGxQYXRoKCk7Ci0KLQkJU3RyaW5nIHBhdGhOYW1lID0gZGlhZ3JhbUZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCVVSSSByZXNvdXJjZVVSSSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHBhdGhOYW1lLCB0cnVlKTsKLQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShyZXNvdXJjZVVSSSk7Ci0JCS8vcmVzb3VyY2Uuc2V0VHJhY2tpbmdNb2RpZmljYXRpb24oZmFsc2UpOwotCQkJLy8oUmVzb3VyY2VTZXRNYW5hZ2VyLmdldFByb2plY3RGb3JSZXNvdXJjZVNldChyZXNvdXJjZVNldCkpOwotCQlkZWZhdWx0VHJhbnNFZGl0RG9tYWluLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQoZGVmYXVsdFRyYW5zRWRpdERvbWFpbikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2UubG9hZChudWxsKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGRpYWdyYW0gZmlsZSBkb2VzIG5vdCBleGlzdC4gSXQgd2lsbCBiZSBjcmVhdGVkIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJcmV0dXJuIGNyZWF0ZU5ld0RpYWdyYW0oZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgcmVzb3VyY2VTZXQsIHJlc291cmNlLCBkaWFncmFtTmFtZSwgZ3JpZCwgc25hcCk7Ci0JCQotCQlFTGlzdDxFT2JqZWN0PiBvYmpzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJaWYgKG9ianMgPT0gbnVsbCkgCi0JCQlyZXR1cm4gY3JlYXRlTmV3RGlhZ3JhbShkZWZhdWx0VHJhbnNFZGl0RG9tYWluLCByZXNvdXJjZVNldCwgcmVzb3VyY2UsIGRpYWdyYW1OYW1lLCBncmlkLCBzbmFwKTsKLQkJSXRlcmF0b3I8RU9iamVjdD4gaXQgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKChvYmogPT0gbnVsbCkgJiYgIURpYWdyYW0uY2xhc3MuaXNJbnN0YW5jZShvYmopKQotCQkJCWNvbnRpbnVlOwotCQkJRGlhZ3JhbSBkID0gKERpYWdyYW0pb2JqOwotCQkJZGlhZ3JhbXNUb1Jlc291cmNlcy5wdXQoZCwgcmVzb3VyY2UpOwotCQkJZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJcmV0dXJuIGQ7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5ld0RpYWdyYW0oZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgcmVzb3VyY2VTZXQsIHJlc291cmNlLCBkaWFncmFtTmFtZSwgZ3JpZCwgc25hcCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW0gY3JlYXRlTmV3RGlhZ3JhbShUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCQkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCQkJCQkJCQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCQkJCQkJCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSwKLQkJCQkJCQkJCQkJZmluYWwgaW50IGdyaWQsIAotCQkJCQkJCQkJCQlmaW5hbCBib29sZWFuIHNuYXApIHsKLQkJZmluYWwgV3JwIHdycCA9IG5ldyBXcnAoKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKGVkaXRpbmdEb21haW4pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZURpYWdyYW0oSlBBX0RJQUdSQU1fVFlQRSwgZGlhZ3JhbU5hbWUsIGdyaWQsIHNuYXApOwotCQkJCXdycC5zZXRPYmplY3QoZGlhZ3JhbSk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQoZGlhZ3JhbSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzb3VyY2Uuc2F2ZShDb2xsZWN0aW9ucy5FTVBUWV9NQVApOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgY3JlYXRlIG5ldyBkaWFncmFtIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9CQkJCQotCQkJfQotCQl9KTsJCi0JCWVkaXRpbmdEb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZmx1c2goKTsKLQkJbWFwRGlhZ3JhbVRvUHJvamVjdCgoRGlhZ3JhbSl3cnAuZ2V0T2JqZWN0KCksIHJlc291cmNlKTsKLQkJcmV0dXJuIChEaWFncmFtKXdycC5nZXRPYmplY3QoKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJlc291cmNlRm9sZGVyUGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBnZXRFTUZSZXNvdXJjZUZvbGRlclBhdGgocHJvamVjdCk7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldEVNRlJlc291cmNlRm9sZGVyUGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBwcm9qZWN0LmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS5hcHBlbmQoREVGQVVMVF9SRVNfRk9MREVSKTsJCQotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXREaWFncmFtc0ZvbGRlclBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsJCQotCQlyZXR1cm4gbmV3IFBhdGgoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0Rm9sZGVyKHByb2plY3QsIHByb3BzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYXBEaWFncmFtVG9Qcm9qZWN0KERpYWdyYW0gZGlhZ3JhbSwgSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWRpYWdyYW1zVG9Qcm9qZWN0cy5wdXQoZGlhZ3JhbSwgbmV3IFdlYWtSZWZlcmVuY2U8SnBhUHJvamVjdD4ocHJvamVjdCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFwRGlhZ3JhbVRvUHJvamVjdChEaWFncmFtIGRpYWdyYW0sIFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWRpYWdyYW1zVG9SZXNvdXJjZXMucHV0KGRpYWdyYW0sIHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKcGFQcm9qZWN0IHJlbW92ZURpYWdyYW1Qcm9qZWN0TWFwcGluZyhEaWFncmFtIGRpYWdyYW0pIHsKLQkJV2Vha1JlZmVyZW5jZTxKcGFQcm9qZWN0PiByZWYgPSBkaWFncmFtc1RvUHJvamVjdHMucmVtb3ZlKGRpYWdyYW0pOwotCQlkaWFncmFtc1RvUHJvdmlkZXJzLnJlbW92ZShkaWFncmFtKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWYuZ2V0KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgcmVtb3ZlRGlhZ3JhbVJlc291cmNlTWFwcGluZyhEaWFncmFtIGRpYWdyYW0pIHsKLQkJcmV0dXJuIGRpYWdyYW1zVG9SZXNvdXJjZXMucmVtb3ZlKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIEpwYVByb2plY3QgZ2V0UHJvamVjdEJ5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJV2Vha1JlZmVyZW5jZTxKcGFQcm9qZWN0PiByZWYgPSBkaWFncmFtc1RvUHJvamVjdHMuZ2V0KGRpYWdyYW0pOwotCQlpZiAocmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZi5nZXQoKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlQnlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSkgewotCQlyZXR1cm4gZGlhZ3JhbXNUb1Jlc291cmNlcy5nZXQoZGlhZ3JhbSk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgZ2V0UHJvdmlkZXJCeURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVdlYWtSZWZlcmVuY2U8SlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcj4gcmVmID0gZGlhZ3JhbXNUb1Byb3ZpZGVycy5nZXQoZGlhZ3JhbSk7Ci0JCWlmIChyZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVmLmdldCgpOwkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYXBEaWFncmFtVG9Qcm92aWRlcihEaWFncmFtIGRpYWdyYW0sIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJZGlhZ3JhbXNUb1Byb3ZpZGVycy5wdXQoZGlhZ3JhbSwgbmV3IFdlYWtSZWZlcmVuY2U8SlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcj4ocHJvdmlkZXIpKTsKLQl9Ci0JCi0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9Nb2RlbEludGVncmF0aW9uVXRpbEltcGwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMTBiOGMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9Nb2RlbEludGVncmF0aW9uVXRpbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEludGVncmF0aW9uVXRpbEltcGwgaW1wbGVtZW50cyBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgewotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldFByb2plY3RCeURpYWdyYW0oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXJldHVybiBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU1ZmI2MS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRElBR1JBTV9GT0xERVIgCQkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmRpYWdyYW1mb2xkZXIiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSAJCQkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHRQYWNrYWdlIjsJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYIAkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmVudGl0eS5kZWZhdWx0VGFibGVOYW1lUHJlZml4IjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FIAkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHREaXJlY3RFZGl0Q2xhc3NOYW1lIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSAJCQk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdEVudGl0eUFjY2Vzc1R5cGUiOwkvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRkFVTFRfQ09MTEVDVElPTl9UWVBFIAk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdENvbGxlY3Rpb25UeXBlIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PTkVfVE9fTUFOWV9PTERfU1RZTEUJICAJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHRPbmVUb01hbnlPbGRTdHlsZSI7CQkJLy8kTk9OLU5MUy0xJAotCQotCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0RJQUdSQU1fRk9MREVSCQkgCT0gImRpYWdyYW1zIjsJCQkvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTF9FTlRJVFlfUEFDS0FHRSAJCQk9ICJvcmcucGVyc2lzdGVuY2UiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX1BSRUZJWCAJCQkJCT0gIlRfIjsJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEIAkJPSAiZmllbGQiOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRCAJPSAicHJvcGVydHkiOwkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFIAk9ICJjb2xsZWN0aW9uIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0xJU1RfVFlQRSAJCQk9ICJsaXN0IjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX1NFVF9UWVBFIAkJCT0gInNldCI7CQkJLy8kTk9OLU5MUy0xJAotCi0JCi0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlOwotCi0JcHVibGljIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplcigpIHsKLQkJc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQotCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCQotCXB1YmxpYyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQl0aGlzLnN0b3JlID0gc3RvcmU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciMKLQkgKiBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0RJQUdSQU1fRk9MREVSLCBQUk9QRVJUWV9WQUxfRElBR1JBTV9GT0xERVIpOwkJCi0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UsIFBST1BFUlRZX1ZBTF9FTlRJVFlfUEFDS0FHRSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVgsIFBST1BFUlRZX1ZBTF9QUkVGSVgpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSwgUFJPUEVSVFlfVkFMX0FDQ0VTU19GSUVMRF9CQVNFRCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUsIFBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRSwgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VzUGFnZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDYzMjE0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkJvb2xlYW5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLkZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5SYWRpb0dyb3VwRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5TdHJpbmdGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZQotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCUZJQ1RJVkVfUFJPSkVDVF9OQU1FID0gIlBST0pFQ1QgTkFNRSI7CQkvLyROT04tTkxTLTEkIAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAJQ09MTEVDVElJT05fVFlQRSA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCUxJU1RfVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCVNFVF9UWVBFID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciAJCWZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkOwotCXByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3IgCQlmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZDsKLQlwcml2YXRlIFN0cmluZ0ZpZWxkRWRpdG9yIAkJZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXg7Ci0JcHJpdmF0ZSBKUEFCb29sZWFuRmllbGRFZGl0b3IgCWRpcmVjdEVkaXRBZmZlY3RzQ2xhc3M7Ci0JcHJpdmF0ZSBSYWRpb0dyb3VwRmllbGRFZGl0b3IgCWVudGl0eUFjY2Vzc1R5cGVDaG9vc2VyOwotCXByaXZhdGUgUmFkaW9Hcm91cEZpZWxkRWRpdG9yICAgZGVmYXVsdENvbGxlY3Rpb25UeXBlQ2hvb3NlcjsKLQlwcml2YXRlIEpQQUJvb2xlYW5GaWVsZEVkaXRvciAJb25lVG9NYW55T2xkU3R5bGU7Ci0KLQlwdWJsaWMgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX3BhZ2VEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmllbGRFZGl0b3JzKCkgewotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0RmllbGRFZGl0b3JQYXJlbnQoKTsKLQkJY3JlYXRlRm9sZGVyRmllbGQocGFyZW50KTsKLQkJY3JlYXRlRW50aXR5UGFja2FnZUZpZWxkKHBhcmVudCk7Ci0JCWNyZWF0ZVRhYmxlTmFtZUZpZWxkKHBhcmVudCk7Ci0JCQotCQlkaXJlY3RFZGl0QWZmZWN0c0NsYXNzID0gbmV3IEpQQUJvb2xlYW5GaWVsZEVkaXRvcigiIiwJLy8kTk9OLU5MUy0xJCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzcywgCi0JCQkJQm9vbGVhbkZpZWxkRWRpdG9yLkRFRkFVTFQsIHBhcmVudCk7Ci0JCWRpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0UHJlZmVyZW5jZU5hbWUoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUpOwotCQlkaXJlY3RFZGl0QWZmZWN0c0NsYXNzLmdldENoZWNrQm94KHBhcmVudCkuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RpcmVjdEVkaXRBZmZlY3RzQ2xhc3NUb29sdGlwKTsKLQkJYWRkRmllbGQoZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyk7CQkKLQkJZW50aXR5QWNjZXNzVHlwZUNob29zZXIgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfQUNDRVNTX1RZUEUsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cExhYmVsLAotCQkJCTEsCi0JCQkgICAgbmV3IFN0cmluZ1tdW10gewotCQkJCQl7SlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUZpZWxkQmFzZWRBY2Nlc3NCdXR0b25MYWJlbCwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUR9LAotCQkJCQl7SlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eVByb3BlcnR5QmFzZWRBY2Nlc3NCdXR0b25MYWJlbCwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfUFJPUEVSVFlfQkFTRUR9fSwJCQkJCi0JCQkJCXBhcmVudCwgdHJ1ZSk7Ci0JCWVudGl0eUFjY2Vzc1R5cGVDaG9vc2VyLnNldFByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWVudGl0eUFjY2Vzc1R5cGVDaG9vc2VyLmdldFJhZGlvQm94Q29udHJvbChwYXJlbnQpLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBUb29sdGlwKTsKLQkJYWRkRmllbGQoZW50aXR5QWNjZXNzVHlwZUNob29zZXIpOwotCQkKLQkJCi0JCQotCQlkZWZhdWx0Q29sbGVjdGlvblR5cGVDaG9vc2VyID0gbmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcigKLQkJCQlKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25UaXR0bGUsCi0JCQkJMSwKLQkJCSAgICBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJCXtDT0xMRUNUSUlPTl9UWVBFLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0NPTExFQ1RJT05fVFlQRX0sCi0JCQkJCXtMSVNUX1RZUEUsIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfTElTVF9UWVBFfSwJCQotCQkJCQl7U0VUX1RZUEUsIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfU0VUX1RZUEV9fSwKLQkJCQkJcGFyZW50LCB0cnVlKTsKLQkJZGVmYXVsdENvbGxlY3Rpb25UeXBlQ2hvb3Nlci5zZXRQcmVmZXJlbmNlU3RvcmUoZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlkZWZhdWx0Q29sbGVjdGlvblR5cGVDaG9vc2VyLmdldFJhZGlvQm94Q29udHJvbChwYXJlbnQpLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0Q29sbGVjdGlvblR5cGVTZWN0aW9uRGVzY3JpcHRpb24pOwotCQlhZGRGaWVsZChkZWZhdWx0Q29sbGVjdGlvblR5cGVDaG9vc2VyKTsKLQkJCi0JCW9uZVRvTWFueU9sZFN0eWxlID0gbmV3IEpQQUJvb2xlYW5GaWVsZEVkaXRvcigiIiwJLy8kTk9OLU5MUy0xJCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGUsIAotCQkJCUJvb2xlYW5GaWVsZEVkaXRvci5ERUZBVUxULCBwYXJlbnQpOwotCQlvbmVUb01hbnlPbGRTdHlsZS5zZXRQcmVmZXJlbmNlTmFtZShKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfT05FX1RPX01BTllfT0xEX1NUWUxFKTsKLQkJb25lVG9NYW55T2xkU3R5bGUuZ2V0Q2hlY2tCb3gocGFyZW50KS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwKTsKLQkJYWRkRmllbGQob25lVG9NYW55T2xkU3R5bGUpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvbGRlckZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQgPSBuZXcgQ3VzdG9tU3RyaW5nRmllbGRFZGl0b3IoCi0JCQkJSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbExhYmVsLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmFsdWUoKSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0Rm9sZGVyKElQYXRoLlNFUEFSQVRPUiArIEZJQ1RJVkVfUFJPSkVDVF9OQU1FICsgSVBhdGguU0VQQVJBVE9SCi0JCQkJCQkJCQkJCQkJICsgZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQuZ2V0U3RyaW5nVmFsdWUoKS50cmltKCksIEZJQ1RJVkVfUFJPSkVDVF9OQU1FKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJCi0JCWZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkLmdldFRleHRDb250cm9sKHBhcmVudCkuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQuZ2V0TGFiZWxDb250cm9sKHBhcmVudCkuCi0JCXNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXApOwotCQlhZGRGaWVsZChmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZCk7Ci0JCQotCQkKLQkJZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQgPSBuZXcgQ3VzdG9tU3RyaW5nRmllbGRFZGl0b3IoCi0JCQkJSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZVRvVXNlLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSB7Ci0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlVmFsdWUoKSB7Ci0JCQkJCQlyZXR1cm4gdmFsaWRhdGVEZWZhdWx0UGFja2FnZShmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRTdHJpbmdWYWx1ZSgpLnRyaW0oKSk7Ci0JCQkJCX0JCi0JCQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW50aXR5UGFja2FnZUZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQkKLQkJZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0TGFiZWxDb250cm9sKHBhcmVudCkuCi0JCQkJc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJYWRkRmllbGQoZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRhYmxlTmFtZUZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXggPSBuZXcgQ3VzdG9tU3RyaW5nRmllbGRFZGl0b3IoCi0JCQkJSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYLAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lTGFiZWwsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWYWx1ZSgpIHsKLQkJCQkJCXJldHVybiB2YWxpZGF0ZVRhYmxlTmFtZVByZWZpeChmRGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRTdHJpbmdWYWx1ZSgpLnRyaW0oKSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWZEZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFRleHRDb250cm9sKHBhcmVudCkuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCQotCQlmRGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRMYWJlbENvbnRyb2wocGFyZW50KS4KLQkJCQlzZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZVByZWZpeE1zZyk7Ci0JCWFkZEZpZWxkKGZEZWZhdWx0VGFibGVOYW1lUHJlZml4KTsKLQkJCi0JCQotCQkKLQkJZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0VGV4dENvbnRyb2wocGFyZW50KS4KLQkJCQlzZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFRhYmxlTmFtZVByZWZpeE1zZyk7CQkKLQl9Ci0JCi0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRGVmYXVsdEZvbGRlcihTdHJpbmcgZGVmYXVsdEZvbGRlciwgU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCWRlZmF1bHRGb2xkZXIgPSBkZWZhdWx0Rm9sZGVyLnRyaW0oKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZGVmYXVsdEZvbGRlcikpIAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCSAgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQkgIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbXB0eUZvbGRlcik7Ci0JCWRlZmF1bHRGb2xkZXIgPSBJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0TmFtZSArIElQYXRoLlNFUEFSQVRPUiArIGRlZmF1bHRGb2xkZXI7IAotCQlpZiAoIWRlZmF1bHRGb2xkZXIuc3RhcnRzV2l0aChJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0TmFtZSArIElQYXRoLlNFUEFSQVRPUikpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKLQkJCQkJCQkgIEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELCAKLQkJCQkJCQkgIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkRm9sZGVyLCAKLQkJCQkJCQkJCSAgCQkJICAgSVBhdGguU0VQQVJBVE9SICsgcHJvamVjdE5hbWUgKyBJUGF0aC5TRVBBUkFUT1IpKTsKLQkJSVN0YXR1cyByZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVQYXRoKGRlZmF1bHRGb2xkZXIsIElSZXNvdXJjZS5GT0xERVIpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlRGVmYXVsdFBhY2thZ2UoU3RyaW5nIGRlZmF1bHRQYWNrYWdlKSB7Ci0JCUlTdGF0dXMgdmFsaWRhdGVEZWZhdWx0UGFja2FnZVN0YXR1cyA9IEphdmFDb252ZW50aW9ucwotCQkJCS52YWxpZGF0ZVBhY2thZ2VOYW1lKGRlZmF1bHRQYWNrYWdlLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSwKLQkJCQkJCUphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJaWYgKHZhbGlkYXRlRGVmYXVsdFBhY2thZ2VTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSAKLQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRQYWNrYWdlU3RhdHVzOyAKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlBBRGlhZ3JhbUVkaXRvci5JRCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZVRhYmxlTmFtZVByZWZpeChTdHJpbmcgdGFibGVOYW1lUHJlZml4KSB7Ci0JCVN0cmluZyBzID0gdGFibGVOYW1lUHJlZml4OwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpQQURpYWdyYW1FZGl0b3IuSUQsIG51bGwpOwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQocy5jaGFyQXQoMCkpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkVGFibGVOYW1lUHJlZml4LCAKLQkJCQkJdGFibGVOYW1lUHJlZml4KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpQQURpYWdyYW1FZGl0b3IuSUQsIG1lc3NhZ2UpOwkJCQkJCQotCQl9CQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgY2ggPSBzLmNoYXJBdChpKTsKLQkJCWlmICghQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjaCkgJiYgKGNoICE9ICdfJykpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkVGFibGVOYW1lUHJlZml4LCAKLQkJCQkJCXRhYmxlTmFtZVByZWZpeCk7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlBBRGlhZ3JhbUVkaXRvci5JRCwgbWVzc2FnZSk7CQkJCQkJCi0JCQl9CQotCQl9Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEpQQURpYWdyYW1FZGl0b3IuSUQsIG51bGwpOwkKLQl9CQotCQotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDdXN0b21TdHJpbmdGaWVsZEVkaXRvciBleHRlbmRzIFN0cmluZ0ZpZWxkRWRpdG9yIHsKLQkJcHVibGljIEN1c3RvbVN0cmluZ0ZpZWxkRWRpdG9yKFN0cmluZyBwcm9wZXJ0eU5hbWUsCi0JCQkJCQkJCQkgICBTdHJpbmcgbGFiZWxOYW1lLAotCQkJCQkJCQkJICAgQ29tcG9zaXRlIGZpZWxkRWRpdG9yUGFyZW50KSB7Ci0JCQkKLQkJCXN1cGVyKHByb3BlcnR5TmFtZSwgbGFiZWxOYW1lLCBmaWVsZEVkaXRvclBhcmVudCk7Ci0JCX0KLQkJCi0JCVN0cmluZyBtc2c7Ci0JCVN0cmluZyBwcmVmaXhNc2c7Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVja1N0YXRlKCkgewotCQkJSVN0YXR1cyBzdGF0ID0gdmFsaWRhdGVWYWx1ZSgpOwotCQkJaWYgKHN0YXQuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHN0YXQuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwkJCQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBkb0NoZWNrU3RhdGUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQkKLQkJCQkKLQkJYWJzdHJhY3QgcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWYWx1ZSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgY2xhc3MgSlBBQm9vbGVhbkZpZWxkRWRpdG9yIGV4dGVuZHMgQm9vbGVhbkZpZWxkRWRpdG9yIHsKLQkJcHVibGljIEpQQUJvb2xlYW5GaWVsZEVkaXRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGxhYmVsVGV4dCwgaW50IHN0eWxlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihuYW1lLCBsYWJlbFRleHQsIHN0eWxlLCBwYXJlbnQpOwotCQl9Ci0JCQkJCi0JCXB1YmxpYyBCdXR0b24gZ2V0Q2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQkJcmV0dXJuIGdldENoYW5nZUNvbnRyb2wocGFyZW50KTsKLQkJfQkJCi0JfQotCQotICAgIHN5bmNocm9uaXplZCBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgCQotICAgIAlJU3RhdHVzIHN0YXRGb2xkZXIgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuCi0gICAgCQkJCQkJCXZhbGlkYXRlRGVmYXVsdEZvbGRlcihmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZC5nZXRUZXh0Q29udHJvbChnZXRGaWVsZEVkaXRvclBhcmVudCgpKS5nZXRUZXh0KCkudHJpbSgpLCAKLSAgICAJCQkJCQkJRklDVElWRV9QUk9KRUNUX05BTUUpOwotICAgIAlJU3RhdHVzIHN0YXRQYWNrID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLgotICAgIAkJCQkJCQl2YWxpZGF0ZURlZmF1bHRQYWNrYWdlKGZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldFRleHRDb250cm9sKGdldEZpZWxkRWRpdG9yUGFyZW50KCkpLmdldFRleHQoKS50cmltKCkpOwotICAgIAkKLSAgICAJSVN0YXR1cyBzdGF0UHJlZiA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS4KLSAgICAJCQkJCQkJdmFsaWRhdGVUYWJsZU5hbWVQcmVmaXgoZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0VGV4dENvbnRyb2woZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgCQotICAgIAlpZiAoc3RhdEZvbGRlci5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0Rm9sZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gICAgCSAgICAJCi0gICAgCWlmIChzdGF0UGFjay5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0UGFjay5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9IAotICAgIAlpZiAoc3RhdFByZWYuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdFByZWYuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0gICAgCXNldFZhbGlkKHRydWUpOwotICAgIAlpZiAoc3RhdFBhY2suZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsgICAJCQotICAgIAkJc2V0TWVzc2FnZShzdGF0UGFjay5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJaWYgKHN0YXRQcmVmLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7ICAgCQkKLSAgICAJCXNldE1lc3NhZ2Uoc3RhdFByZWYuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCXNldE1lc3NhZ2UobnVsbCwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHlwYWdlL0pQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzJiYjJiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotcHVibGljIGNsYXNzIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfU0VUVElOR1NfUEFUSCA9ICIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIjsJLy8kTk9OLU5MUy0xJDsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKUEExMFByb2plY3QgPSBmYWxzZTsJCQkJLy8kTk9OLU5MUy0xJDsKLQkKLQlwcml2YXRlIFByb3BlcnRpZXMgZWRpdG9yUHJvcHM7Ci0JCi0JcHJpdmF0ZSBUZXh0IHR4dERlZmF1bHRGb2xkZXJGaWVsZDsKLQlwcml2YXRlIFRleHQgdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZDsKLQlwcml2YXRlIFRleHQgdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeDsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3M7Ci0JcHJpdmF0ZSBHcm91cCBncm91cEFjY2Vzc1R5cGU7Ci0JcHJpdmF0ZSBHcm91cCBncm91cENvbGxlY3Rpb25UeXBlOwotCXByaXZhdGUgQnV0dG9uIGJ0bkZpZWxkQmFzZWRBY2Nlc3M7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuUHJvcGVydHlCYXNlZEFjY2VzczsKLQlwcml2YXRlIEJ1dHRvbiBidG5Db2xsZWN0aW9uVHlwZTsKLQlwcml2YXRlIEJ1dHRvbiBidG5MaXN0VHlwZTsKLQlwcml2YXRlIEJ1dHRvbiBidG5TZXRUeXBlOwotCXByaXZhdGUgQnV0dG9uIGNoZWNrT25lVG9NYW55T2xkU3R5bGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvcHNNb2RpZmllZCA9IGZhbHNlOwotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIFFVQUxJRklFUiAJCQkJCQkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIjsJCQkJCQkvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUgkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJkaWFncmFtRm9sZGVyIik7CQkJLy8kTk9OLU5MUy0xJDsJCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfREVGQVVMVF9QQUNLQUdFIAkJCQk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImRlZmF1bHRQYWNrYWdlIik7CQkJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RFRkFVTFRfVEFCTEVfTkFNRV9QUkVGSVggCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiZGVmYXVsdFRhYmxlTmFtZVByZWZpeCIpOwkvLyROT04tTkxTLTEkOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RJUkVDVF9FRElUX0FGRkVDVFNfQ0xBU1MgCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyIpOwkvLyROT04tTkxTLTEkOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0FDQ0VTU19UWVBFIAkJCQkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJhY2Nlc3NUeXBlIik7CQkJCS8vJE5PTi1OTFMtMSQ7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfQ09MTEVDVElPTl9UWVBFIAkJCQk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImNvbGxlY3Rpb25UeXBlIik7CQkJLy8kTk9OLU5MUy0xJDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUJCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAib25lVG9NYW55T2xkU3R5bGUiKTsJCS8vJE5PTi1OTFMtMSQ7Ci0JCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElTVF9UWVBFID0gImphdmEudXRpbC5MaXN0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9UWVBFID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZUNvbnRhaW5lcihwYXJlbnQpOwotCQlwcm9qZWN0ID0gKElQcm9qZWN0KWdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJaXNKUEExMFByb2plY3QgPSBKUEFFZGl0b3JVdGlsLmNoZWNrSlBBRmFjZXRWZXJzaW9uKHByb2plY3QsICIxLjAiKTsJCQkJLy8kTk9OLU5MUy0xJDsJCQotCQlsb2FkUHJvcGVydGllcygpOwotCQljcmVhdGVEZWZhdWx0Rm9sZGVyQ29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVEZWZhdWx0UGFja2FnZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVmYXVsdFRhYmxlTmFtZVByZWZpeENvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGlyZWN0RWRpdEFmZmVjdHNDbGFzc0NvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlQWNjZXNzVHlwZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVmYXVsdENvbGxlY3Rpb25UeXBlQ29udHJvbChjb21wb3NpdGUpOwotCQlpZiAoIWlzSlBBMTBQcm9qZWN0KQotCQkJY3JlYXRlT25lVG9NYW55T2xkU3R5bGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0Rm9sZGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxibERlZmF1bHRGb2xkZXIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuRklMTCk7IAotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sTGFiZWwpOwotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldExheW91dERhdGEoZ2QpOwkKLQkJdHh0RGVmYXVsdEZvbGRlckZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBTV1QuRklMTCk7Ci0JCWxibERlZmF1bHRGb2xkZXIuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eHREZWZhdWx0Rm9sZGVyRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCSAgICBTdHJpbmcgZGVmYXVsdEZvbGRlciA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUi5nZXRMb2NhbE5hbWUoKSk7Ci0JICAgIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5zZXRUZXh0KGRlZmF1bHRGb2xkZXIpOwotCSAgICB0eHREZWZhdWx0Rm9sZGVyRmllbGQuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JICAgIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCQotCQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdFBhY2thZ2VDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGJsRGVmYXVsdFBhY2thZ2UgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuRklMTCk7IAotCQlsYmxEZWZhdWx0UGFja2FnZS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZVRvVXNlKTsKLQkJbGJsRGVmYXVsdFBhY2thZ2Uuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGJsRGVmYXVsdFBhY2thZ2Uuc2V0TGF5b3V0RGF0YShnZCk7CQotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBTV1QuRklMTCk7Ci0JCWxibERlZmF1bHRQYWNrYWdlLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZU1zZyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9QQUNLQUdFLmdldExvY2FsTmFtZSgpKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5zZXRUZXh0KGRlZmF1bHRQYWNrYWdlTmFtZSk7Ci0JCXR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0VGFibGVOYW1lUHJlZml4Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxibERlZmF1bHRUYWJsZU5hbWVQcmZpeCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5GSUxMKTsgCi0JCWxibERlZmF1bHRUYWJsZU5hbWVQcmZpeC5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lTGFiZWwpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0TGF5b3V0RGF0YShnZCk7CQotCQl0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JICAgIFN0cmluZyBkZWZhdWx0VGFibGVOYW1lUHJlZml4ID0gIGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9UQUJMRV9OQU1FX1BSRUZJWC5nZXRMb2NhbE5hbWUoKSk7Ci0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguc2V0VGV4dChkZWZhdWx0VGFibGVOYW1lUHJlZml4KTsJCi0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQl0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQkJCQotCQl9KTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGlyZWN0RWRpdEFmZmVjdHNDbGFzc0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuQ0hFQ0spOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyk7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzc1Rvb2x0aXApOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQkKLQkJYm9vbGVhbiBkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfRElSRUNUX0VESVRfQUZGRUNUU19DTEFTUy5nZXRMb2NhbE5hbWUoKSkpOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsKLQkJY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9uZVRvTWFueU9sZFN0eWxlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNoZWNrT25lVG9NYW55T2xkU3R5bGUgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuQ0hFQ0spOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJvcGVydHlQYWdlX29uZVRvTWFueU9sZFN0eWxlKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQotCQlib29sZWFuIGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCkpKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRTZWxlY3Rpb24oZGVmYXVsdERpcmVjdEVkaXRBZmZlY3RzQ2xhc3MpOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsJCQkKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRDb2xsZWN0aW9uVHlwZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlncm91cENvbGxlY3Rpb25UeXBlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgMCk7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvblRpdHRsZSk7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0TGF5b3V0KGdsKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUgPSBlZGl0b3JQcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQotCQljcmVhdGVDb2xsZWN0aW9uVHlwZUJ1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0Q29sbGVjdGlvblR5cGUpOwotCQljcmVhdGVMaXN0VHlwZUJ1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0Q29sbGVjdGlvblR5cGUpOwotCQljcmVhdGVTZXRUeXBlQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSk7Ci0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc1R5cGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJZ3JvdXBBY2Nlc3NUeXBlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgMCk7Ci0JCWdyb3VwQWNjZXNzVHlwZS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBMYWJlbCk7Ci0JCWdyb3VwQWNjZXNzVHlwZS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwVG9vbHRpcCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwQWNjZXNzVHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5udW1Db2x1bW5zID0gMTsKLQkJZ3JvdXBBY2Nlc3NUeXBlLnNldExheW91dChnbCk7Ci0JCQotCQlTdHJpbmcgZGVmYXVsdEFjY2Vzc1R5cGUgPSBlZGl0b3JQcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0FDQ0VTU19UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJCi0JCWNyZWF0ZUZpZWxkQWNjZXNzQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRBY2Nlc3NUeXBlKTsKLQkJY3JlYXRlUHJvcGVydHlBY2Nlc3NCdXR0b24oY29tcG9zaXRlLCBnZCwgZGVmYXVsdEFjY2Vzc1R5cGUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29sbGVjdGlvblR5cGVCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZERhdGEgZ2QsIFN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUpIHsKLQkJYnRuQ29sbGVjdGlvblR5cGUgPSBuZXcgQnV0dG9uKGdyb3VwQ29sbGVjdGlvblR5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuQ29sbGVjdGlvblR5cGUuc2V0VGV4dChDT0xMRUNUSU9OX1RZUEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuQ29sbGVjdGlvblR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJYnRuQ29sbGVjdGlvblR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTGlzdFR5cGVCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZERhdGEgZ2QsIFN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUpIHsKLQkJYnRuTGlzdFR5cGUgPSBuZXcgQnV0dG9uKGdyb3VwQ29sbGVjdGlvblR5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuTGlzdFR5cGUuc2V0VGV4dChMSVNUX1RZUEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlidG5MaXN0VHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuTGlzdFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9MSVNUX1RZUEUpKTsKLQkJYnRuTGlzdFR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlU2V0VHlwZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkRGF0YSBnZCwgU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSkgewotCQlidG5TZXRUeXBlID0gbmV3IEJ1dHRvbihncm91cENvbGxlY3Rpb25UeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0blNldFR5cGUuc2V0VGV4dChTRVRfVFlQRSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ0blNldFR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ0blNldFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9TRVRfVFlQRSkpOwotCQlidG5TZXRUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpZWxkQWNjZXNzQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdEFjY2Vzc1R5cGUpIHsKLQkJYnRuRmllbGRCYXNlZEFjY2VzcyA9IG5ldyBCdXR0b24oZ3JvdXBBY2Nlc3NUeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3Muc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5RmllbGRCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuRmllbGRCYXNlZEFjY2Vzcy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuRmllbGRCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEKSk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvcGVydHlBY2Nlc3NCdXR0b24oQ29tcG9zaXRlIGNvbXBvc2l0ZSwgR3JpZERhdGEgZ2QsIFN0cmluZyBkZWZhdWx0QWNjZXNzVHlwZSkgewotCQlidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzID0gbmV3IEJ1dHRvbihncm91cEFjY2Vzc1R5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlQcm9wZXJ0eUJhc2VkQWNjZXNzQnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzLnNldExheW91dERhdGEoZ2QpOwkKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEKSk7Ci0JCWJ0blByb3BlcnR5QmFzZWRBY2Nlc3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwkJCi0JfQotCQotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkgICAgU3RyaW5nIGRlZmF1bHRGb2xkZXIgPSBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSKTsKLQkJdHh0RGVmYXVsdEZvbGRlckZpZWxkLnNldFRleHQoZGVmYXVsdEZvbGRlcik7CQkKLQkgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSA9IHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UpOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLnNldFRleHQoZGVmYXVsdFBhY2thZ2VOYW1lKTsJCQotCSAgICBTdHJpbmcgZGVmYXVsdFRhYmxlTmFtZVByZWZpeCA9ICBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYKTsKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRUZXh0KGRlZmF1bHRUYWJsZU5hbWVQcmVmaXgpOwkJICAKLQkgICAgYm9vbGVhbiBkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IHN0b3JlLmdldEJvb2xlYW4oSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJUkVDVF9FRElUX0NMQVNTX05BTUUpOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsKLQkJU3RyaW5nIGRlZmF1bHRBY2Nlc3NUeXBlID0gc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfQUNDRVNTX1RZUEUpOwotCQlidG5GaWVsZEJhc2VkQWNjZXNzLnNldFNlbGVjdGlvbihkZWZhdWx0QWNjZXNzVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUQpKTsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEKSk7CQkKLQkJU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSA9IHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0NPTExFQ1RJT05fVFlQRSkpOwotCQlidG5MaXN0VHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0xJU1RfVFlQRSkpOwkJCi0JCWJ0blNldFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9TRVRfVFlQRSkpOwotCSAgICBib29sZWFuIGRlZmF1bHRPbmVUb01hbnlPbGRTdHlsZSA9IHN0b3JlLmdldEJvb2xlYW4oSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRSk7Ci0JICAgIGlmICghaXNKUEExMFByb2plY3QpCi0JICAgIAljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldFNlbGVjdGlvbihkZWZhdWx0T25lVG9NYW55T2xkU3R5bGUpOwkJCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotICAgIH0KLSAgICAKLSAgICBzeW5jaHJvbml6ZWQgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQYWdlKCkgewotICAgIAlJU3RhdHVzIHN0YXRGb2xkZXIgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UudmFsaWRhdGVEZWZhdWx0Rm9sZGVyKHR4dERlZmF1bHRGb2xkZXJGaWVsZC5nZXRUZXh0KCkudHJpbSgpLCAKLSAgICAJCQkJCQkJCQkJCQkJCQkJCQlwcm9qZWN0LmdldE5hbWUoKSk7Ci0gICAgCUlTdGF0dXMgc3RhdFBhY2sgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UudmFsaWRhdGVEZWZhdWx0UGFja2FnZSh0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldFRleHQoKS50cmltKCkpOwotICAgIAlJU3RhdHVzIHN0YXRQcmVmID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLnZhbGlkYXRlVGFibGVOYW1lUHJlZml4KHR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgCWlmIChzdGF0Rm9sZGVyLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRGb2xkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfSAgICAJICAgIAkKLSAgICAJaWYgKHN0YXRQYWNrLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRQYWNrLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gCi0gICAgCWlmIChzdGF0UHJlZi5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0UHJlZi5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCXNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAJc2V0VmFsaWQodHJ1ZSk7Ci0gICAgCWlmIChzdGF0UGFjay5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeyAgIAkJCi0gICAgCQlzZXRNZXNzYWdlKHN0YXRQYWNrLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlpZiAoc3RhdFByZWYuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsgICAJCQotICAgIAkJc2V0TWVzc2FnZShzdGF0UHJlZi5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0gICAgCXNhdmVTZXR0aW5nc0lmTW9kaWZpZWQoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotICAgIAlyZXR1cm4gc2F2ZVNldHRpbmdzSWZNb2RpZmllZCgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gc2F2ZVNldHRpbmdzSWZNb2RpZmllZCgpIHsKLSAgICAJaWYgKHByb3BzTW9kaWZpZWQpIHsKLSAgICAJCWJvb2xlYW4gc2F2ZWQgPSBzYXZlU2V0dGluZ3MoKTsKLSAgICAJCXByb3BzTW9kaWZpZWQgPSAhc2F2ZWQ7Ci0gICAgCQlyZXR1cm4gc2F2ZWQ7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlU2V0dGluZ3MoKSB7Ci0gICAgCXB1dE5ld1ZhbHNJblByb3BzKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChQUk9KRUNUX1NFVFRJTkdTX1BBVEgpOwotCQlJRmlsZSBxdWFydHpEYXRhWE1MRmlsZSA9IHByb2plY3QuZ2V0RmlsZShwYXRoKTsJCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHF1YXJ0ekRhdGFYTUxGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsgCi0JCXRyeSB7Ci0JCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOyAKLQkJCWVkaXRvclByb3BzLnN0b3JlKG9zLCAiVGhpcyBmaWxlIGNvbnRhaW5zIEpQQSBEaWFncmFtIEVkaXRvciBzZXR0aW5ncyIpOwkvLyROT04tTkxTLTEkOwotCQkJb3MuY2xvc2UoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCAKLQkJCQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGl0bGUsIAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUZXh0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcHV0TmV3VmFsc0luUHJvcHMoKSB7Ci0JCWVkaXRvclByb3BzLnB1dChQUk9QX0RFRkFVTFRfRElBR1JBTV9GT0xERVIuZ2V0TG9jYWxOYW1lKCksIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfREVGQVVMVF9QQUNLQUdFLmdldExvY2FsTmFtZSgpLCB0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldFRleHQoKS50cmltKCkpOwotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9ERUZBVUxUX1RBQkxFX05BTUVfUFJFRklYLmdldExvY2FsTmFtZSgpLCB0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFRleHQoKS50cmltKCkpOwotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9ESVJFQ1RfRURJVF9BRkZFQ1RTX0NMQVNTLmdldExvY2FsTmFtZSgpLCAiIiArIGNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5nZXRTZWxlY3Rpb24oKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JCWVkaXRvclByb3BzLnB1dChQUk9QX0FDQ0VTU19UWVBFLmdldExvY2FsTmFtZSgpLCBidG5GaWVsZEJhc2VkQWNjZXNzLmdldFNlbGVjdGlvbigpID8gSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUQgOiBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRCk7CQkKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpLCBnZXRDb2xsZWN0aW9uUHJvcGVydHkoKSk7Ci0JCWlmICghaXNKUEExMFByb2plY3QpCi0JCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCksICIiICsgY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5nZXRTZWxlY3Rpb24oKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JfQotCQotCQotCXByaXZhdGUgU3RyaW5nIGdldENvbGxlY3Rpb25Qcm9wZXJ0eSgpewotCQlpZiAoYnRuQ29sbGVjdGlvblR5cGUuZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEU7Ci0JCWVsc2UgaWYgKGJ0bkxpc3RUeXBlLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfTElTVF9UWVBFOwotCQllbHNlIGlmIChidG5TZXRUeXBlLmdldFNlbGVjdGlvbigpKQotCQkJcmV0dXJuIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfU0VUX1RZUEU7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlRGVmYXVsdFByb3BzKCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BzKHN0b3JlKTsKLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgUHJvcGVydGllcyBjcmVhdGVEZWZhdWx0UHJvcHMoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlQcm9wZXJ0aWVzIGVkaXRvckRlZmF1bHRQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7IAotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSKSk7CQkKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfREVGQVVMVF9QQUNLQUdFLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFKSk7Ci0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0RFRkFVTFRfVEFCTEVfTkFNRV9QUkVGSVguZ2V0TG9jYWxOYW1lKCksIHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVgpKTsKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfRElSRUNUX0VESVRfQUZGRUNUU19DTEFTUy5nZXRMb2NhbE5hbWUoKSwgIiIgKyBzdG9yZS5nZXRCb29sZWFuKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0FDQ0VTU19UWVBFLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSkpOwkJCi0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ERUZBVUxUX0NPTExFQ1RJT05fVFlQRSkpOwotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCksICIiICsgc3RvcmUuZ2V0Qm9vbGVhbihKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfT05FX1RPX01BTllfT0xEX1NUWUxFKSk7CS8vJE5PTi1OTFMtMSQ7Ci0JCQotCQkKLQkJcmV0dXJuIGVkaXRvckRlZmF1bHRQcm9wczsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgZGVmYXVsdFByb3BzID0gY3JlYXRlRGVmYXVsdFByb3BzKCk7Ci0JCWVkaXRvclByb3BzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdFByb3BzKTsKLQkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpZ2V0RWxlbWVudCgpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChQUk9KRUNUX1NFVFRJTkdTX1BBVEgpOwotCQlJRmlsZSBlZGl0b3JQcm9qZWN0UHJvcGVydGllcyA9IHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJCi0JCUZpbGUgcHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShlZGl0b3JQcm9qZWN0UHJvcGVydGllcy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCWlmIChwcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUpOwotCQkJCWVkaXRvclByb3BzLmxvYWQoaXMpOwkKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJUHJvcGVydGllcyBkZWZhdWx0UHJvcHMgPSBjcmVhdGVEZWZhdWx0UHJvcHMoc3RvcmUpOwotCQlQcm9wZXJ0aWVzIGVkaXRvclByb3BzID0gbmV3IFByb3BlcnRpZXMoZGVmYXVsdFByb3BzKTsKLQkJCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKFBST0pFQ1RfU0VUVElOR1NfUEFUSCk7Ci0JCUlGaWxlIGVkaXRvclByb2plY3RQcm9wZXJ0aWVzID0gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwotCQkKLQkJRmlsZSBwcm9wZXJ0aWVzRmlsZSA9IG5ldyBGaWxlKGVkaXRvclByb2plY3RQcm9wZXJ0aWVzLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJaWYgKHByb3BlcnRpZXNGaWxlLmV4aXN0cygpKSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZSk7Ci0JCQkJZWRpdG9yUHJvcHMubG9hZChpcyk7CQotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVkaXRvclByb3BzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2UoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1BBQ0tBR0UuZ2V0TG9jYWxOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVQcmVmaXhOYW1lKElQcm9qZWN0IHByb2plY3QsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9UQUJMRV9OQU1FX1BSRUZJWC5nZXRMb2NhbE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzRGlyZWN0ZUVkaXRpbmdBZmZlY3RDbGFzc05hbWVCeURlZmF1bHQoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ESVJFQ1RfRURJVF9BRkZFQ1RTX0NMQVNTLmdldExvY2FsTmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjY2Vzc0ZpZWxkQmFzZWQoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQUNDRVNTX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoImZpZWxkIik7CS8vJE5PTi1OTFMtMSQ7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uVHlwZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoImNvbGxlY3Rpb24iKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGlzdFR5cGUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJcmV0dXJuIGFjY2Vzc1R5cGUuZXF1YWxzKCJsaXN0Iik7CS8vJE5PTi1OTFMtMSQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NldFR5cGUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJcmV0dXJuIGFjY2Vzc1R5cGUuZXF1YWxzKCJzZXQiKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTM2YWIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5dGVzdGVyL0pwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0RmFjZXRWZXJzaW9uUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcnsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImpwdC5qcGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElEKTsKLQotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsCi0JCQlPYmplY3QgdmFsdWUpIHsKLQkJCi0JCVN0cmluZ1tdIHN1YlZhbHVlcyA9ICgoU3RyaW5nKSB2YWx1ZSkuc3BsaXQoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVjZWl2ZXJJZCA9IHN1YlZhbHVlc1swXTsKLQkJU3RyaW5nIHJlY2VpdmVyVmVyc2lvbiA9IHN1YlZhbHVlc1sxXTsKLQotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKcGFOb2RlKSB7Ci0JCQlKcGFQcm9qZWN0IHByb2plY3QgPSAoKEpwYU5vZGUpcmVjZWl2ZXIpLmdldEpwYVByb2plY3QoKTsKLQkJCXRyeSB7Ci0JCQkJSUZhY2V0ZWRQcm9qZWN0IGZwcm9qID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJCQlpZihyZWNlaXZlcklkLmVxdWFscyhJRCkgJiYgcmVjZWl2ZXJWZXJzaW9uLmVxdWFscyhmcHJvai5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKEZBQ0VUKS5nZXRWZXJzaW9uU3RyaW5nKCkpKXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQWRkRW50aXR5Q29udGV4dC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0FkZEVudGl0eUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk3NGQ5YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQWRkRW50aXR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBZGRFbnRpdHlDb250ZXh0IGV4dGVuZHMgQWRkQ29udGV4dCBpbXBsZW1lbnRzIElBZGRFbnRpdHlDb250ZXh0ewotCXByaXZhdGUgYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkOwotCXByaXZhdGUgYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZDsKLQlwcml2YXRlIGJvb2xlYW4gYmFzaWNDb2xsYXBzZWQ7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5Q29sbGFwc2VkKCkgewotCQlyZXR1cm4gcHJpbWFyeUNvbGxhcHNlZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UHJpbWFyeUNvbGxhcHNlZChib29sZWFuIHByaW1hcnlDb2xsYXBzZWQpIHsKLQkJdGhpcy5wcmltYXJ5Q29sbGFwc2VkID0gcHJpbWFyeUNvbGxhcHNlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uQ29sbGFwc2VkKCkgewotCQlyZXR1cm4gcmVsYXRpb25Db2xsYXBzZWQ7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFJlbGF0aW9uQ29sbGFwc2VkKGJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQpIHsKLQkJdGhpcy5yZWxhdGlvbkNvbGxhcHNlZCA9IHJlbGF0aW9uQ29sbGFwc2VkOwotCX0KLQotCXB1YmxpYyBBZGRFbnRpdHlDb250ZXh0KGJvb2xlYW4gcHJpbWFyeUNvbGxhcHNlZCwKLQkJCWJvb2xlYW4gcmVsYXRpb25Db2xsYXBzZWQsIGJvb2xlYW4gYmFzaWNDb2xsYXBzZWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcmltYXJ5Q29sbGFwc2VkID0gcHJpbWFyeUNvbGxhcHNlZDsKLQkJdGhpcy5yZWxhdGlvbkNvbGxhcHNlZCA9IHJlbGF0aW9uQ29sbGFwc2VkOwotCQl0aGlzLmJhc2ljQ29sbGFwc2VkID0gYmFzaWNDb2xsYXBzZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQmFzaWNDb2xsYXBzZWQoKSB7Ci0JCXJldHVybiBiYXNpY0NvbGxhcHNlZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QmFzaWNDb2xsYXBzZWQoYm9vbGVhbiBiYXNpY0NvbGxhcHNlZCkgewotCQl0aGlzLmJhc2ljQ29sbGFwc2VkID0gYmFzaWNDb2xsYXBzZWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lBZGRFbnRpdHlDb250ZXh0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUFkZEVudGl0eUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkMTdjNS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUFkZEVudGl0eUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFBldHlhIFNhYmV2YSAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotcHVibGljIGludGVyZmFjZSBJQWRkRW50aXR5Q29udGV4dCB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ByaW1hcnlDb2xsYXBzZWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVsYXRpb25Db2xsYXBzZWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzQmFzaWNDb2xsYXBzZWQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDhkMzAwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSURlbGV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLklNb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsRGlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklHcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBleHRlbmRzIElGZWF0dXJlUHJvdmlkZXJ7Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0V2l0aE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIFN0cmluZyBnZXRLZXlGb3JCdXNpbmVzc09iamVjdChPYmplY3QgYm8pOwotCi0JcHVibGljIE9iamVjdCByZW1vdmUoU3RyaW5nIGtleSk7Ci0JCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoU3RyaW5nIGtleSwgYm9vbGVhbiBzYXZlKTsJCi0KLQlwdWJsaWMgSVJlbGF0aW9uIGdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSk7Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyKTsKLQotCXB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoU3RyaW5nIGtleSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRKUFRGb3JVcGRhdGUoU3RyaW5nIGpwdE5hbWUpOwotCi0gICAgcHVibGljIGJvb2xlYW4gZG9lc1JlbGF0aW9uRXhpc3QoSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQlSZWxUeXBlIHJlbFR5cGUsIAotCQkJUmVsRGlyIHJlbERpcik7Ci0gICAgCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVJZ25vcmUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0TmFtZSk7Ci0JCi0JcHVibGljIHZvaWQgYWRkQWRkSWdub3JlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdE5hbWUpOwotCQotICAgIHB1YmxpYyB2b2lkIHB1dEtleVRvQnVzaW5lc3NPYmplY3QoU3RyaW5nIGtleSwgT2JqZWN0IGJvKTsKLSAgICAKLQlwdWJsaWMgaW50IGdldEF0dHJpYnNOdW0oU2hhcGUgc2gpOyAgICAKLSAgICAKLQlwdWJsaWMgaW50IGluY3JlYXNlQXR0cmlic051bShTaGFwZSBzaCk7Ci0JCi0JcHVibGljIGludCBkZWNyZWFzZUF0dHJpYnNOdW0oU2hhcGUgc2gpOwotCQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkQXQsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0KTsKLSAgICAJCi0JcHVibGljIHZvaWQgcmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSk7Ci0KLQlwdWJsaWMgSVBlU2VydmljZVV0aWwgZ2V0UGVVdGlsKCk7Ci0JCi0JcHVibGljIElKUEFFZGl0b3JVdGlsIGdldEpQQUVkaXRvclV0aWwoKTsKLQotCXB1YmxpYyBJRGVsZXRlRmVhdHVyZSBnZXREZWxldGVGZWF0dXJlKElEZWxldGVDb250ZXh0IGNvbnRleHQpOwotCQotCXB1YmxpYyBJQ3VzdG9tRmVhdHVyZSBnZXRBZGRBbGxFbnRpdGllc0ZlYXR1cmUoKTsKLQkKLQlwdWJsaWMgSU1vZGVsSW50ZWdyYXRpb25VdGlsIGdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKTsKLQkKLQlwdWJsaWMgSUdyYXBoaWNzVXBkYXRlciBnZXRHcmFwaGljc1VwZGF0ZXIoKTsKLQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KTsKLQkKLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUpQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWFkMGM4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQUVkaXRvckltYWdlQ3JlYXRvciB7Ci0JCi0Jc3RhdGljIHB1YmxpYyBlbnVtIFJlbEVuZERpciB7Ci0JCVVQLAotCQlMRUZULAotCQlSSUdIVCwKLQkJRE9XTgotCX0KLQotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVDb25uZWN0aW9uTGluZShEaWFncmFtIGQsIENvbm5lY3Rpb24gY29ubmVjdGlvbik7Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVUZXh0Q29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyB0ZXh0LCBkb3VibGUgbG9jYXRpb24pOwotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKTsKLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZU1hbnlFbmRXaXRoQXJyb3dEZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pOwotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKTsKLQkKLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVNYW55RW5kRGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKTsKLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUljb25Db25uZWN0aW9uRGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RyaW5nIGljb25JZCwgZG91YmxlIGxvY2F0aW9uKTsKLQkKLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTVmOWIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuY29uZmlnLklDb25maWd1cmF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIERpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyIHsKLQlwdWJsaWMgSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlcihFZGl0UGFydFZpZXdlciB2aWV3ZXIsIAotCQkJCQkJCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCAKLQkJCQkJCQkJCQlJQ29uZmlndXJhdGlvblByb3ZpZGVyIGNvbmZpZ3VyYXRpb25Qcm92aWRlcikgewotCQlzdXBlcih2aWV3ZXIsIHJlZ2lzdHJ5LCBjb25maWd1cmF0aW9uUHJvdmlkZXIpOwotCX0KLQkJCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0TWVudUdyb3VwRWRpdChJTWVudU1hbmFnZXIgbWFuYWdlciwgUG9pbnQgbWVudUxvY2F0aW9uKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvblRvTWVudUlmQXZhaWxhYmxlKElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgYWN0aW9uSWQsIFN0cmluZyBtZW51R3JvdXApIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscygicHJlZGVmaW5lZCByZW1vdmUgYWN0aW9uIikgfHwJLy8kTk9OLU5MUy0xJAotCQkJYWN0aW9uSWQuZXF1YWxzKCJwcmVkZWZpbmVkIHVwZGF0ZSBhY3Rpb24iKSkgCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJc3VwZXIuYWRkQWN0aW9uVG9NZW51SWZBdmFpbGFibGUobWFuYWdlciwgYWN0aW9uSWQsIG1lbnVHcm91cCk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNjFmNTAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5BYnN0cmFjdERpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5JVG9vbEJlaGF2aW9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mYWNhZGUuRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEFsbEVudGl0aWVzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFDaGVja1N1bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLlNpemVQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbVR5cGVQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBJVG9vbEJlaGF2aW9yUHJvdmlkZXJbXSB0b29sQmVoYXZpb3JQcm92aWRlcnM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBib29sZWFuIGlzRGlzcG9zZWQgPSBmYWxzZTsKLSAgICBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JCi0gICAgcHVibGljIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIoKSB7Ci0gICAgCUlGZWF0dXJlUHJvdmlkZXIgZnAgPSBuZXcgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKHRoaXMsIG5ldyBKUEFTb2x2ZXIoKSk7Ci0gICAgICAgIHNldEZlYXR1cmVQcm92aWRlcihmcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChEaWFncmFtIGRpYWdyYW0sIElEaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IpIHsKLSAgICAJc3VwZXIuaW5pdChkaWFncmFtLCBkaWFncmFtRWRpdG9yKTsKLSAgICAJaWYgKGdldFRhcmdldEpQQVByb2plY3QoKSA9PSBudWxsKQotICAgIAkJY2xvc2VFZGl0b3IoKTsKLSAgICAJSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBwcm92aWRlciA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb3ZpZGVyQnlEaWFncmFtKGRpYWdyYW0pOwotICAgIAlpZiAoKHByb3ZpZGVyICE9IG51bGwpICYmIHByb3ZpZGVyLmlzQWxpdmUoKSkgCi0gICAgCQlwcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5jbG9zZUVkaXRvcihwcm92aWRlci5nZXREaWFncmFtRWRpdG9yKCksIHRydWUpOwotICAgIAlNb2RlbEludGVncmF0aW9uVXRpbC5tYXBEaWFncmFtVG9Qcm92aWRlcihnZXREaWFncmFtKCksIHRoaXMpOwotCX0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVRvb2xCZWhhdmlvclByb3ZpZGVyW10gZ2V0QXZhaWxhYmxlVG9vbEJlaGF2aW9yUHJvdmlkZXJzKCkgewotICAgICAgICBpZiAodG9vbEJlaGF2aW9yUHJvdmlkZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRvb2xCZWhhdmlvclByb3ZpZGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IElUb29sQmVoYXZpb3JQcm92aWRlcltdIHsgbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKHRoaXMsIEVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UpIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvb2xCZWhhdmlvclByb3ZpZGVyczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0gICAgCXJldHVybiAoSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgYm9vbGVhbiBoYXNUb0FkZCgpIHsKLQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgdW5pdCA9IHByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnBlcnNpc3RlbmNlVW5pdHMoKS5uZXh0KCk7Ci0JCQotCQlmb3IgKEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSB1bml0LmNsYXNzUmVmcygpOyBjbGFzc1JlZnMuaGFzTmV4dCgpOykgewotCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQkJaWYgKGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsgCi0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJCQlpZiAoanB0LmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWlmIChwZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgCXZvaWQgcG9zdEluaXQoKSB7Ci0gICAgCWZpbmFsIFN0cmluZyBqcHROYW1lID0gZ2V0RGlhZ3JhbUVkaXRvcigpLmdldFBhcnRQcm9wZXJ0eShKUEFFZGl0b3JDb25zdGFudHMuT1BFTl9XSE9MRV9QRVJTSVNURU5DRV9VTklUX0VESVRPUl9QUk9QRVJUWSk7Ci0JCWlmIChqcHROYW1lICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaGFzVG9BZGQgPSBoYXNUb0FkZCgpOyAKLQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBvcGVuUGVyc2lzdGVkRGlhZ3JhbShoYXNUb0FkZCk7Ci0JCQlpZiAoaGFzVG9BZGQgJiYgIXJlYWRPbmx5KQotCQkJYWRkUmVtYWluaW5nRW50aXRpZXMoKTsKLQkJfSBlbHNlCi0JCQl0cnkgewotCQkJCW9wZW5QZXJzaXN0ZWREaWFncmFtKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRSZW1haW5pbmdFbnRpdGllcygpIHsKLQkJZmluYWwgQWRkQWxsRW50aXRpZXNGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQWRkQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJZmluYWwgQ3VzdG9tQ29udGV4dCBjb250ZXh0ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oZmVhdHVyZS5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlmZWF0dXJlLmV4ZWN1dGUoY29udGV4dCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZUVkaXRvcigpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkJCQkKLQkJCQlwYWdlLmNsb3NlRWRpdG9yKGdldERpYWdyYW1FZGl0b3IoKSwgZmFsc2UpOwotCQkJfQotCQl9KTsgICAgCQotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gb3BlblBlcnNpc3RlZERpYWdyYW0oYm9vbGVhbiBoYXNUb0FkZCkgewkJCi0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJZmluYWwgSnBhUHJvamVjdCBwcm9qID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvai5nZXRQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChwcm9qKTsKLQkJU3RyaW5nIGRpYWdyYW1OYW1lID0gcHUuZ2V0TmFtZSgpOwotCSAgICBJUGF0aCBwYXRoID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0RGlhZ3JhbXNGb2xkZXJQYXRoKHByb2plY3QpLmFwcGVuZChkaWFncmFtTmFtZSkuYWRkRmlsZUV4dGVuc2lvbihNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX0ZJTEVfRVhURU5TSU9OKTsKLQkJZmluYWwgSUZpbGUgZiA9IHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJYm9vbGVhbiByZWFkT25seSA9IChmICE9IG51bGwpICYmIGYuZXhpc3RzKCkgJiYgZi5pc1JlYWRPbmx5KCk7Ci0JCWlmIChyZWFkT25seSkgewotCQkJaWYgKEpQQUNoZWNrU3VtLklOU1RBTkNFKCkuaXNNb2RlbERpZmZlcmVudEZyb21EaWFncmFtKGRpYWdyYW0sIHByb2opIHx8IGhhc1RvQWRkKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBoYXNUb0FkZCA/IEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5SGFzVG9BZGRNc2cgOiAKLQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlNc2c7Ci0JCQkJTWVzc2FnZURpYWxvZyBkaWFsb2cgPSBuZXcgTWVzc2FnZURpYWxvZyhQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seVRpdGxlLCBudWxsLCBtZXNzYWdlLAotCQkJCQkJTWVzc2FnZURpYWxvZy5JTkZPUk1BVElPTiwgbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0ssIEpQQUVkaXRvck1lc3NhZ2VzLkJUTl9DQU5DRUx9LCAwKSB7Ci0JCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJCXJldHVybiBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0JCQkJCQkJfCBTV1QuQVBQTElDQVRJT05fTU9EQUwKLQkJCQkJCQl8IGdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSAxKSB7Ci0JCQkJCWNsb3NlRWRpdG9yKCk7CQkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0YXR1cyBzdGF0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXXtmfSwgbnVsbCk7Ci0JCQkJCWlmICghc3RhdC5pc09LKCkpIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlTXNnLCAKLQkJCQkJCQkJc3RhdC5nZXRNZXNzYWdlKCkpOzsKLQkJCQkJCWRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9jYW50TWFrZURpYWdyYW1Xcml0YWJsZVRpdGxlLCBudWxsLCBtZXNzYWdlLAotCQkJCQkJCQlNZXNzYWdlRGlhbG9nLkNBTkNFTCwgbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0t9LCAwKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotCQkJCQkJCQlyZXR1cm4gU1dULkNMT1NFIHwgU1dULlRJVExFIHwgU1dULkJPUkRFUgotCQkJCQkJCQkJfCBTV1QuQVBQTElDQVRJT05fTU9EQUwKLQkJCQkJCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCQljbG9zZUVkaXRvcigpOwkJCQkJCQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZWFkT25seSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcmVhZE9ubHk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0JCQotCQlmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBTaXplUG9zaXRpb24+IG1hcmtzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNpemVQb3NpdGlvbj4oKTsgCi0JCUxpc3Q8U2hhcGU+IHBpY3RzID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlpZiAocGljdHMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gcmVhZE9ubHk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHBpY3RzLml0ZXJhdG9yKCk7Ci0JCUhhc2hTZXQ8U2hhcGU+IHRvRGVsZXRlID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0JCS8vIGNvbGxlY3RpbmcgZGF0YSBmcm9tIHRoZSBzYXZlZCBwaWN0b2dyYW1zCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHBpY3QgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfRU5USVRZX0NMQVNTX05BTUUpOyAKLQkJCVNpemVQb3NpdGlvbiByZWN0U1AgPSBsb2FkU2l6ZUFuZFBvc2l0aW9uKHBpY3QpOwotCQkJbWFya3MucHV0KG5hbWUsIHJlY3RTUCk7Ci0JCQl0b0RlbGV0ZS5hZGQocGljdCk7Ci0JCX0KLQkJZmluYWwgSXRlcmF0b3I8U2hhcGU+IGl0ZXIgPSB0b0RlbGV0ZS5pdGVyYXRvcigpOwotCQkKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkKLQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChpdGVyLm5leHQoKSk7Ci0JCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uPiBjbnMgPSBkaWFncmFtLmdldENvbm5lY3Rpb25zKCk7Ci0JCQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXRlcmEgPSBjbnMuaXRlcmF0b3IoKTsKLQkJCQlTZXQ8Q29ubmVjdGlvbj4gdG9EZWwgPSBuZXcgSGFzaFNldDxDb25uZWN0aW9uPigpOwotCQkJCXdoaWxlIChpdGVyYS5oYXNOZXh0KCkpIAotCQkJCQl0b0RlbC5hZGQoaXRlcmEubmV4dCgpKTsKLQkJCQlpdGVyYSA9IHRvRGVsLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhLmhhc05leHQoKSkKLQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChpdGVyYS5uZXh0KCkpOwkJCi0JCQkJCi0JCQkJRW51bWVyYXRpb248U3RyaW5nPiBpdHIgPSBtYXJrcy5rZXlzKCk7Ci0JCQkJCi0JCQkJLy8gY3JlYXRlIG5ldyBwaWN0b2dyYW1zCi0JCQkJd2hpbGUgKGl0ci5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IGl0ci5uZXh0RWxlbWVudCgpOwotCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKHByb2osIGVudGl0eU5hbWUpOwotCQkJCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCQkJCVNpemVQb3NpdGlvbiBzcCA9IG1hcmtzLmdldChlbnRpdHlOYW1lKTsKLQkJCQkJCUFkZENvbnRleHQgY3R4ID0gbmV3IEFkZEVudGl0eUNvbnRleHQoc3AucHJpbWFyeUNvbGxhcHNlZCwKLQkJCQkJCQkJc3AucmVsYXRpb25Db2xsYXBzZWQsIHNwLmJhc2ljQ29sbGFwc2VkKTsKLQkJCQkJCWN0eC5zZXROZXdPYmplY3QoanB0KTsKLQkJCQkJCWN0eC5zZXRUYXJnZXRDb250YWluZXIoZ2V0RGlhZ3JhbSgpKTsKLQkJCQkJCWN0eC5zZXRXaWR0aChzcC5nZXRXaWR0aCgpKTsKLQkJCQkJCWN0eC5zZXRIZWlnaHQoc3AuZ2V0SGVpZ2h0KCkpOwotCQkJCQkJY3R4LnNldFgoc3AuZ2V0WCgpKTsKLQkJCQkJCWN0eC5zZXRZKHNwLmdldFkoKSk7Ci0JCQkJCQlBZGRKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCQkJZnQuYWRkKGN0eCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0pOwotCQlnZXREaWFncmFtRWRpdG9yKCkuc2F2ZVdpdGhvdXRFbnRpdGllcyhuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkvLyBkZWxldGUgb2xkIHBpY3RvZ3JhbXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU2l6ZVBvc2l0aW9uIGxvYWRTaXplQW5kUG9zaXRpb24oU2hhcGUgcGljdCkgewotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3QgPSAoUm91bmRlZFJlY3RhbmdsZSlwaWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCVNpemVQb3NpdGlvbiByZWN0U1AgPSBuZXcgU2l6ZVBvc2l0aW9uKHJlY3QuZ2V0V2lkdGgoKSwgcmVjdC5nZXRIZWlnaHQoKSwgCi0JCQkJCQkJCQkJCSAgIHJlY3QuZ2V0WCgpLCByZWN0LmdldFkoKSk7IAotCQkKLQkJcmVjdFNQLnByaW1hcnlDb2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1BUllfQ09MTEFQU0VEKSk7Ci0JCXJlY3RTUC5yZWxhdGlvbkNvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQ09MTEFQU0VEKSk7Ci0JCXJlY3RTUC5iYXNpY0NvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuQkFTSUNfQ09MTEFQU0VEKSk7Ci0JCXJldHVybiByZWN0U1A7Ci0JfQotICAgIAotCXByaXZhdGUgdm9pZCByZW1vdmVDb25uZWN0aW9ucygpIHsKLQkJQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24+IGNvbnMgPSBnZXREaWFncmFtKCkuZ2V0Q29ubmVjdGlvbnMoKTsKLQkJSXRlcmF0b3I8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uPiBjb25zSXQgPSBjb25zLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb248b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uPiBhbGxDb25zID0gbmV3IEhhc2hTZXQ8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uPigpOwotCQl3aGlsZSAoY29uc0l0Lmhhc05leHQoKSkgewotCQkJb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uIGNvbiA9IGNvbnNJdC5uZXh0KCk7Ci0JCQlhbGxDb25zLmFkZChjb24pOwotCQl9Ci0JCWNvbnNJdCA9IGFsbENvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbnNJdC5oYXNOZXh0KCkpIHsKLQkJCW9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbiBjb24gPSBjb25zSXQubmV4dCgpOwotCSAgICAJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChjb24pOwotCSAgICAJUmVtb3ZlUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZVJlbGF0aW9uRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JICAgIAlmdC5yZW1vdmUoY3R4KTsJCQkKLQkJfQkJCi0JfQotCQotCXB1YmxpYyBKUEFEaWFncmFtRWRpdG9yIGdldERpYWdyYW1FZGl0b3IoKSB7Ci0JCXJldHVybiAoSlBBRGlhZ3JhbUVkaXRvcilzdXBlci5nZXREaWFncmFtRWRpdG9yKCk7Ci0JfSAgICAKLSAgICAKLQlwcml2YXRlIEpwYVByb2plY3QgZ2V0VGFyZ2V0SlBBUHJvamVjdCgpIHsKLQkJcmV0dXJuIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLQkJcmV0dXJuICFpc0Rpc3Bvc2VkOwotCX0KLQkgICAgICAgICAgIAotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJc2V0RmVhdHVyZVByb3ZpZGVyKG51bGwpOwotCQlpc0Rpc3Bvc2VkID0gdHJ1ZTsKLQl9Ci0gICAgICAgIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlMWU5NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklDcmVhdGVDb25uZWN0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQ3JlYXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGlyZWN0RWRpdGluZ0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUxheW91dEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JTW92ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JUmVhc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZXNpemVTaGFwZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGlyZWN0RWRpdGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTGF5b3V0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTW92ZVNoYXBlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlc2l6ZVNoYXBlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuUmVhc29uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmludGVybmFsLnNlcnZpY2VzLkdyYXBoaXRpSW50ZXJuYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmZlYXR1cmVzLkRlZmF1bHRGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEFsbEVudGl0aWVzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZEF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRlbGV0ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTGF5b3V0SlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLk1vdmVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTW92ZUVudGl0eVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVzaXplQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlc2l6ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLklNb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsRGlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSnBhU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVBlU2VydmljZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFTb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5QZVNlcnZpY2VVdGlsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdEZlYXR1cmVQcm92aWRlciBpbXBsZW1lbnRzIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgewotCQotCXByaXZhdGUgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGNsaWNrQWRkQXR0QnRuRmVhdCA9IG51bGw7Ci0JcHJpdmF0ZSBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgY2xpY2tSZW1vdmVBdHRCdG5GZWF0ID0gbnVsbDsKLQlwcml2YXRlIElQZVNlcnZpY2VVdGlsIHBlVXRpbCA9IG5ldyBQZVNlcnZpY2VVdGlsSW1wbCgpOwotCXByaXZhdGUgSUpQQUVkaXRvclV0aWwganBhRWRpdG9yVXRpbCA9IG5ldyBKUEFFZGl0b3JVdGlsSW1wbCgpOwotCXByaXZhdGUgSU1vZGVsSW50ZWdyYXRpb25VdGlsIG1vaW5JbnRlZ3JhdGlvblV0aWwgPSBuZXcgTW9kZWxJbnRlZ3JhdGlvblV0aWxJbXBsKCk7IAotCXByaXZhdGUgSUdyYXBoaWNzVXBkYXRlciBncmFwaGljc1VwZGF0ZXIgPSBuZXcgR3JhcGhpY3NVcGRhdGVySW1wbCgpOyAKLQkKLSAgICBwdWJsaWMgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKElEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCwgSUpwYVNvbHZlciBpcykgewotICAgICAgICBzdXBlcihkdHApOwotICAgICAgICBpcy5zZXRGZWF0dXJlUHJvdmlkZXIodGhpcyk7Ci0gICAgICAgIHRoaXMuc2V0SW5kZXBlbmRlbmNlU29sdmVyKGlzKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc3RvcFRocmVhZCgpIHsKLSAgICAJaWYgKGdldEluZGVwZW5kZW5jZVNvbHZlcigpICE9IG51bGwpCi0gICAgCQkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuc3RvcFRocmVhZCgpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCBhZGRKUFRGb3JVcGRhdGUoU3RyaW5nIGpwdE5hbWUpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmFkZEpQVEZvclVwZGF0ZShqcHROYW1lKTsKLQl9Ci0KLSAgICAJCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlSWdub3JlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdE5hbWUpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmFkZFJlbW92ZUlnbm9yZShqcHQuZ2V0TmFtZSgpICsgIi4iICsgYXROYW1lKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQWRkSWdub3JlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdE5hbWUpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmFkZEFkZElnbm9yZShqcHQuZ2V0TmFtZSgpICsgIi4iICsgYXROYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSGFzaFNldDxTdHJpbmc+IGdldEFkZElnbm9yZSgpIHsKLQkJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5nZXRBZGRJZ25vcmUoKTsgCi0JfQotCi0JCi0JcHVibGljIHZvaWQgYWRkQXR0cmliRm9yVXBkYXRlKFBlcnNpc3RlbmNlVW5pdCBwdSwgU3RyaW5nIGVudEF0TWFwcGVkQnkpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmFkZEF0dHJpYkZvclVwZGF0ZShwdSwgZW50QXRNYXBwZWRCeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyKSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZXhpc3RzUmVsYXRpb24oanB0MSwganB0Mik7Ci0JfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQWRkRmVhdHVyZSBnZXRBZGRGZWF0dXJlKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJT2JqZWN0IG5ld09iaiA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7IAotICAgICAgICBpZiAobmV3T2JqIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGlvbikgewotICAgICAgICAJIHJldHVybiBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsgCi0gICAgICAgIAlpZiAoRGlhZ3JhbS5jbGFzcy5pc0luc3RhbmNlKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkpKSB7ICAgICAJCQkKLSAgICAgICAgCQlyZXR1cm4gbnVsbDsKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJcmV0dXJuIG5ldyBBZGRBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgICAgICAJfQotICAgICAgICB9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIENvbXBpbGF0aW9uVW5pdCkgewotICAgICAgICAJQ29tcGlsYXRpb25Vbml0IGN1ID0gKENvbXBpbGF0aW9uVW5pdCluZXdPYmo7Ci0gICAgICAgIAlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotICAgICAgICAJaWYgKGpwdCAhPSBudWxsKSByZXR1cm4gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKG5ld09iaiBpbnN0YW5jZW9mIEpwYU5vZGUpKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IEFkZEFsbEVudGl0aWVzRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBTb3VyY2VUeXBlKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldEFkZEZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ3JlYXRlRmVhdHVyZVtdIGdldENyZWF0ZUZlYXR1cmVzKCkgewotICAgIAlyZXR1cm4gbmV3IElDcmVhdGVGZWF0dXJlW10geyBuZXcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSh0aGlzKSwgbmV3IENyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZSh0aGlzKSB9OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgSURlbGV0ZUZlYXR1cmUgZ2V0RGVsZXRlRmVhdHVyZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgCQlyZXR1cm4gbmV3IERlbGV0ZUpQQUVudGl0eUZlYXR1cmUodGhpcyk7CQotICAgIAl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGlvbikgewotICAgIAkJcmV0dXJuIG5ldyBEZWxldGVSZWxhdGlvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotICAgIAkJcmV0dXJuIG5ldyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLQkJcmV0dXJuIG51bGw7Ci0JfSAgICAKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJQ3VzdG9tRmVhdHVyZVtdIGdldEN1c3RvbUZlYXR1cmVzKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSUN1c3RvbUZlYXR1cmVbXSByZXQgPSBzdXBlci5nZXRDdXN0b21GZWF0dXJlcyhjb250ZXh0KTsKLQkJTGlzdDxJQ3VzdG9tRmVhdHVyZT4gcmV0TGlzdCA9IG5ldyBBcnJheUxpc3Q8SUN1c3RvbUZlYXR1cmU+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmV0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXRMaXN0LmFkZChyZXRbaV0pOwotCQl9Ci0JCQotCQlyZXRMaXN0LmFkZChuZXcgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUodGhpcykpOwotCi0JCXJldExpc3QuYWRkKG5ldyBDb2xsYXBzZUVudGl0eUZlYXR1cmUodGhpcykpOwotCQlyZXRMaXN0LmFkZChuZXcgRXhwYW5kRW50aXR5RmVhdHVyZSh0aGlzKSk7Ci0JCi0JCXJldExpc3QuYWRkKG5ldyBDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlKHRoaXMpKTsKLQkJcmV0TGlzdC5hZGQobmV3IEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKHRoaXMpKTsKLQkJCi0JCXJldCA9IHJldExpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlc2l6ZVNoYXBlRmVhdHVyZSBnZXRSZXNpemVTaGFwZUZlYXR1cmUoSVJlc2l6ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJaWYgKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgUmVzaXplSlBBRW50aXR5RmVhdHVyZSh0aGlzKTsKLQkJfQotICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgCWlmIChnYSA9PSBudWxsKSAKLSAgICAJCXJldHVybiBzdXBlci5nZXRSZXNpemVTaGFwZUZlYXR1cmUoY29udGV4dCk7Ci0gICAgCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGNoID0gZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotICAgIAlpZiAoKGNoICE9IG51bGwpICYmIChjaC5zaXplKCkgPiAwKSAmJiAoY2guZ2V0KDApIGluc3RhbmNlb2YgVGV4dCkpIHsKLSAgICAJCXJldHVybiBuZXcgUmVzaXplQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFJlc2l6ZVNoYXBlRmVhdHVyZShjb250ZXh0KTsKLSAgICB9Ci0gICAgICAKLSAgICAKLSAgIAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTGF5b3V0RmVhdHVyZSBnZXRMYXlvdXRGZWF0dXJlKElMYXlvdXRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUGljdG9ncmFtRWxlbWVudCBwaWN0b2dyYW1FbGVtZW50ID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIE9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwaWN0b2dyYW1FbGVtZW50KTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IExheW91dEpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldExheW91dEZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUmVtb3ZlRmVhdHVyZSBnZXRSZW1vdmVGZWF0dXJlKElSZW1vdmVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOyAgIAotICAgICAgICBpZiAoYm8gPT0gbnVsbCkKLSAgICAgICAgCXN1cGVyLmdldFJlbW92ZUZlYXR1cmUoY29udGV4dCk7Ci0gICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJcmV0dXJuIG5ldyBSZW1vdmVKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwkKLSAgICAJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsgCi0gICAgCQlyZXR1cm4gbmV3IFJlbW92ZVJlbGF0aW9uRmVhdHVyZSh0aGlzKTsKLSAgICAJfQotICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgCWlmIChnYSA9PSBudWxsKSAKLSAgICAJCXJldHVybiBzdXBlci5nZXRSZW1vdmVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJaWYgKChjaCAhPSBudWxsKSAmJiAoY2guc2l6ZSgpID4gMCkgJiYgKGNoLmdldCgwKSBpbnN0YW5jZW9mIFRleHQpKSB7Ci0gICAgCQlyZXR1cm4gbmV3IFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHN1cGVyLmdldFJlbW92ZUZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgICAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlW10gZ2V0Q3JlYXRlQ29ubmVjdGlvbkZlYXR1cmVzKCkgewotICAgICAgICByZXR1cm4gbmV3IElDcmVhdGVDb25uZWN0aW9uRmVhdHVyZVtdIHsKLSAgICAgICAgCW5ldyBDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwKLSAgICAgICAgICAgIG5ldyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLCAgICAgICAgICAgCi0gICAgICAgIAluZXcgQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLCAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAluZXcgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLAotICAgICAgICAgICAgbmV3IENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLCAgICAgICAgICAgIAotICAgICAgICAJbmV3IENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUodGhpcyksCi0gICAgICAgICAgICBuZXcgQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpCi0gICAgICAgIH07Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUmVhc29uIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiBSZWFzb24uY3JlYXRlVHJ1ZVJlYXNvbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUN1c3RvbUZlYXR1cmUgZ2V0QWRkQWxsRW50aXRpZXNGZWF0dXJlKCkgewotICAgIAlyZXR1cm4gbmV3IEFkZEFsbEVudGl0aWVzRmVhdHVyZSh0aGlzKTsgCi0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTW92ZVNoYXBlRmVhdHVyZSBnZXRNb3ZlU2hhcGVGZWF0dXJlKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICBpZiAoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYm8pKSB7Ci0gICAgICAgIAlyZXR1cm4gbmV3IE1vdmVFbnRpdHlTaGFwZUZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoYm8gPT0gbnVsbCl7Ci0gICAgCQlyZXR1cm4gbmV3IE1vdmVBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgICAgICB9IAotICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgCWlmIChnYSA9PSBudWxsKSAKLSAgICAJCXJldHVybiBzdXBlci5nZXRNb3ZlU2hhcGVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJaWYgKChjaCAhPSBudWxsKSAmJiAoY2guc2l6ZSgpID4gMCkgJiYgKGNoLmdldCgwKSBpbnN0YW5jZW9mIFRleHQpKSB7Ci0gICAgCQlyZXR1cm4gbmV3IE1vdmVBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRNb3ZlU2hhcGVGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSURpcmVjdEVkaXRpbmdGZWF0dXJlIGdldERpcmVjdEVkaXRpbmdGZWF0dXJlKElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgICAgICBpZiAoIShnYSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkpIAotICAgICAgICAJcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRpbmdGZWF0dXJlKGNvbnRleHQpOwotICAgICAgICBMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKChjaCA9PSBudWxsKSB8fCAoY2guc2l6ZSgpID09IDApKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgZ2EgPSBjaC5nZXQoMCk7Ci0gICAgICAgIGlmICghKGdhIGluc3RhbmNlb2YgVGV4dCkpIAotICAgICAgICAJcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRpbmdGZWF0dXJlKGNvbnRleHQpOwotICAgICAgICBpZigoKFRleHQpZ2EpLmdldEZvbnQoKS5pc0l0YWxpYygpKQotICAgIAkJcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRpbmdGZWF0dXJlKGNvbnRleHQpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICBpZiAoYm8gIT0gbnVsbCkgewotICAgICAgICAJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLSAgICAgICAgCQlyZXR1cm4gbmV3IERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgICAgIGlmICghKHBlIGluc3RhbmNlb2YgU2hhcGUpKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgU2hhcGUgc2ggPSAoU2hhcGUpcGU7Ci0gICAgICAgIENvbnRhaW5lclNoYXBlIGNzaCA9IHNoLmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY3NoID09IG51bGwpIAotICAgICAgICAJcmV0dXJuIHN1cGVyLmdldERpcmVjdEVkaXRpbmdGZWF0dXJlKGNvbnRleHQpOyAKLSAgICAgICAgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3NoKTsKLSAgICAgICAgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKXsgCi0gICAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgYWRkTWlzc2luZ1JlbGF0aW9ucyhKYXZhUGVyc2lzdGVudFR5cGUgbmV3RW50aXR5LCBDb250YWluZXJTaGFwZSBuZXdTaGFwZSkgewotICAgICAgICBDb2xsZWN0aW9uPFBpY3RvZ3JhbUVsZW1lbnQ+IGFsbENvbnRhaW5lZFBpY3RvZ3JhbUVsZW1lbnRzID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkKLSAgICAgICAgLmdldEFsbENvbnRhaW5lZFBpY3RvZ3JhbUVsZW1lbnRzKGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotICAgICAgICAKLSAgICAgICAgZm9yIChQaWN0b2dyYW1FbGVtZW50IHBlIDogYWxsQ29udGFpbmVkUGljdG9ncmFtRWxlbWVudHMpIHsKLSAgICAgICAgCWlmICgocGUgIT0gbmV3U2hhcGUpICYmIChwZSBpbnN0YW5jZW9mIENvbnRhaW5lclNoYXBlKSkgewotICAgICAgICAJCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHkgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIAkJQWJzdHJhY3RSZWxhdGlvbiBuZXdSZWwgPSBwcm9kdWNlTmVjZXNzYXJ5UmVsYXRpb24obmV3RW50aXR5LCBlbnRpdHkpOwotICAgICAgICAJCWlmIChuZXdSZWwgIT0gbnVsbCkgewotICAgICAgICAJCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSBuZXdSZWwuZ2V0T3duZXIoKTsKLSAgICAgICAgCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSBuZXdSZWwuZ2V0SW52ZXJzZSgpOwotICAgICAgICAJCQlDb250YWluZXJTaGFwZSBvd25lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKWdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChvd25lcik7Ci0gICAgICAgIAkJCUNvbnRhaW5lclNoYXBlIGludmVyc2VTaGFwZSA9IChDb250YWluZXJTaGFwZSlnZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoaW52ZXJzZSk7Ci0gICAgICAgICAJCQlBZGRSZWxhdGlvbkZlYXR1cmUgZiA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUodGhpcyk7Ci0gICAgICAgIAkJCUFkZENvbm5lY3Rpb25Db250ZXh0IGN0eCA9IAotICAgICAgICAJCQkJbmV3IEFkZENvbm5lY3Rpb25Db250ZXh0KEpQQUVkaXRvclV0aWwuZ2V0QW5jaG9yKG93bmVyU2hhcGUpLCBKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihpbnZlcnNlU2hhcGUpKTsKLSAgICAgICAgCQkJZi5hZGQoY3R4KTsKLSAgICAgICAgCQl9Ci0gICAgICAgIAl9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgcmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkucmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKGpwYSk7Ci0JfQotICAgICAgICAKLSAgICBwcml2YXRlIEFic3RyYWN0UmVsYXRpb24gcHJvZHVjZU5lY2Vzc2FyeVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBlbnQxLCBKYXZhUGVyc2lzdGVudFR5cGUgZW50MikgewotICAgIAlyZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgCi0JcHVibGljIFN0cmluZyBwcm9kdWNlS2V5Rm9yUmVsKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkucHJvZHVjZUtleUZvclJlbChqcHQsIGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotICAgIAotICAgIHB1YmxpYyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZ2V0Q2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCkgewotICAgIAlpZiAoY2xpY2tBZGRBdHRCdG5GZWF0ID09IG51bGwpIHsKLSAgICAJCWNsaWNrQWRkQXR0QnRuRmVhdCA9IG5ldyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGNsaWNrQWRkQXR0QnRuRmVhdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBnZXRDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoKSB7Ci0gICAgCWlmIChjbGlja1JlbW92ZUF0dEJ0bkZlYXQgPT0gbnVsbCkgewotICAgIAkJY2xpY2tSZW1vdmVBdHRCdG5GZWF0ID0gbmV3IENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSh0aGlzKTsKLSAgICAJfQotICAgIAlyZXR1cm4gY2xpY2tSZW1vdmVBdHRCdG5GZWF0OwotICAgIH0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUgZ2V0TW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlKAotICAgIAkJSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAJIHJldHVybiBuZXcgSlBBTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoU3RyaW5nIGtleSkgewotICAgIAlyZXR1cm4gZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoa2V5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRLZXlGb3JCdXNpbmVzc09iamVjdChPYmplY3QgYm8pIHsKLSAgICAJcmV0dXJuIGdldEluZGVwZW5kZW5jZVNvbHZlcigpLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGJvKTsKLSAgICB9Ci0gICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHB1dEtleVRvQnVzaW5lc3NPYmplY3QoU3RyaW5nIGtleSwgT2JqZWN0IGJvKSB7Ci0gICAgCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRLZXlCdXNpbmVzc09iamVjdChrZXksIGJvKTsKLSAgICB9ICAKLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSB7Ci0gICAgCXJldHVybiByZW1vdmUoa2V5LCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKFN0cmluZyBrZXksIGJvb2xlYW4gc2F2ZSkgewotICAgIAlPYmplY3QgcmVzID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoa2V5KTsKLSAgICAJaWYgKHJlcyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJZmluYWwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcmVzOwotICAgIAkJaWYgKHNhdmUpCi0gICAgCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZm9yY2VTYXZlRW50aXR5Q2xhc3MoanB0LCB0aGlzKTsKLSAgICAJCWlmKCEoanB0LmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFFbnRpdHkpKXsKLSAgICAJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAJCQkgICAgICAgICAgcmVtb3ZlRnJvbURpYWdyYW1JZk5vdEVudGl0eShqcHQpOwotICAgIAkJCQl9fSk7Ci0gICAgCQl9Ci0KLSAgICAJfQotICAgIAlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnJlbW92ZShrZXkpOwotICAgIH0gICAgCi0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWxsQ29ubmVjdGlvbnMoU2hhcGUgc2hhcGUpIHsKLQkJZm9yIChJdGVyYXRvcjxBbmNob3I+IGl0ZXIgPSBzaGFwZS5nZXRBbmNob3JzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlBbmNob3IgYW5jaG9yID0gaXRlci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ZXJhdG9yID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWxsQ29ubmVjdGlvbnMoYW5jaG9yKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChHcmFwaGl0aUludGVybmFsLmdldEVtZlNlcnZpY2UoKS5pc09iamVjdEFsaXZlKGNvbm5lY3Rpb24pKSB7Ci0gCQkJCQlPYmplY3Qgb2IgPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29ubmVjdGlvbik7Ci0JCQkJCQlpZihvYiBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pewotCQkJCQkJCVN0cmluZyBrZXkgPSBnZXRLZXlGb3JCdXNpbmVzc09iamVjdChvYik7Ci0JCQkJCQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnJlbW92ZShrZXkpOwotCQkJCQkJfQotCQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNvbm5lY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotICAgIAotICAgIHByaXZhdGUgdm9pZCByZW1vdmVGcm9tRGlhZ3JhbUlmTm90RW50aXR5KGZpbmFsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBjcyA9IHRoaXMuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChjcyAhPSBudWxsKSB7Ci0JCQlmaW5hbCBTaGFwZSBzaGFwZSA9IChTaGFwZSkgY3M7Ci0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbih0aGlzCi0JCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQkJcmVtb3ZlQWxsQ29ubmVjdGlvbnMoc2hhcGUpOwotCQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNzKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0V2l0aE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5jb250YWluc0tleShuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZUF0dHJpYnV0ZShmaW5hbCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCwgZmluYWwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQpIHsKLSAgICAJZmluYWwgUGljdG9ncmFtRWxlbWVudCBwZSA9IHRoaXMuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KG9sZEF0KTsKLSAgICAJaWYgKHBlID09IG51bGwpIHsKLSAgICAJCS8vU3lzdGVtLmVyci5wcmludGxuKCJQaWN0b2dyYW1FbGVtZW50IGlzIG51bGxcbiIpOwotICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsgICAgCQkKLSAgICAJCS8vcmV0dXJuOwotICAgIAl9Ci0gICAgCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBlKTsKLSAgICAJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCSAgICAJSlBBU29sdmVyIHNvbHZlciA9IChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCk7IAotCQkgICAgCXNvbHZlci5yZW1vdmUoc29sdmVyLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KG9sZEF0KSk7Ci0JCSAgICAJc29sdmVyLmFkZEtleUJ1c2luZXNzT2JqZWN0KHNvbHZlci5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChuZXdBdCksIG5ld0F0KTsKLQkJICAgIAlpZiAobmV3QXQgPT0gbnVsbCkgewotCQkgICAgCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5ldyBhdHRyaWJ1dGUgaXMgbnVsbFxuIik7CS8vJE5PTi1OTFMtMSQKLQkJICAgIAkJbmV3IEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQkgICAgCQlyZXR1cm47Ci0JCSAgICAJfQotCQkgICAgCWxpbmsocGUsIG5ld0F0KTsKLQkJICAgIAlHcmFwaGljc0FsZ29yaXRobSBnYSA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCSAgICAJaWYgKGdhID09IG51bGwpCi0JCSAgICAJCXJldHVybjsKLQkJICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLQkJICAgIAkoKFRleHQpY2guZ2V0KDApKS5zZXRWYWx1ZShuZXdBdC5nZXROYW1lKCkpOwotCQkJfQotICAgIAl9KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZG9lc1JlbGF0aW9uRXhpc3QoSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQlSZWxUeXBlIHJlbFR5cGUsIAotCQkJUmVsRGlyIHJlbERpcikgewotICAgIAkKLSAgICAJU3RyaW5nIGlkID0gQWJzdHJhY3RSZWxhdGlvbi5nZW5lcmF0ZUlkKG93bmVyLCBpbnZlcnNlLCBvd25lckF0dHJpYnV0ZU5hbWUsIHJlbFR5cGUsIHJlbERpcik7Ci0gICAgCXJldHVybiAoZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoaWQpICE9IG51bGwpOwotICAgIH0gICAKLSAgICAKLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoanBhKTsKLQl9Ci0JCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCX0gICAgCi0JCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5yZXN0b3JlRW50aXR5KGpwdCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0QXR0cmlic051bShTaGFwZSBzaCkgewotCQlTdHJpbmcgcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0FUVFJJQlNfTlVNKTsKLQkJaW50IHJlcyA9IDA7Ci0JCWlmIChzID09IG51bGwpIHsKLQkJCXNldEF0dHJpYnNOdW0oMCwgc2gpOwotCQl9IGVsc2UgewotCQkJcmVzID0gSW50ZWdlci5wYXJzZUludChzKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgaW50IGluY3JlYXNlQXR0cmlic051bShTaGFwZSBzaCkgewotCQlpbnQgYXR0cmlic051bSA9IGdldEF0dHJpYnNOdW0oc2gpOwotCQlhdHRyaWJzTnVtKys7Ci0JCXNldEF0dHJpYnNOdW0oYXR0cmlic051bSwgc2gpOwotCQlyZXR1cm4gYXR0cmlic051bTsKLQl9Ci0JCi0JcHVibGljIGludCBkZWNyZWFzZUF0dHJpYnNOdW0oU2hhcGUgc2gpIHsKLQkJaW50IGF0dHJpYnNOdW0gPSBnZXRBdHRyaWJzTnVtKHNoKTsKLQkJYXR0cmlic051bS0tOwotCQlzZXRBdHRyaWJzTnVtKGF0dHJpYnNOdW0sIHNoKTsKLQkJcmV0dXJuIGF0dHJpYnNOdW07Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJzTnVtKGludCBuZXdBdHRyaWJzTnVtLCBTaGFwZSBzaCkgewotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9BVFRSSUJTX05VTSwgIiIgKyBuZXdBdHRyaWJzTnVtKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKgotCXB1YmxpYyBDb2xsZWN0aW9uPFJlc291cmNlT3BlcmF0aW9uPiBnZXRBZmZlY3RlZFBhcnRpdGlvbnNGb3JNb2RpZmljYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSGFzaFNldDxSZXNvdXJjZU9wZXJhdGlvbj4oKTsKLQl9Ci0JKi8KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN0b3BUaHJlYWQoKTsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmRpc3Bvc2UoKTsKLQkJc2V0SW5kZXBlbmRlbmNlU29sdmVyKG51bGwpOwotCX0KLQotCi0JcHVibGljIElQZVNlcnZpY2VVdGlsIGdldFBlVXRpbCgpIHsKLQkJcmV0dXJuIHBlVXRpbDsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JVdGlsIGdldEpQQUVkaXRvclV0aWwoKSB7Ci0JCXJldHVybiB0aGlzLmpwYUVkaXRvclV0aWw7Ci0JfQotCQotCXB1YmxpYyBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpIHsKLQkJcmV0dXJuIG1vaW5JbnRlZ3JhdGlvblV0aWw7Ci0JfQotCQotCXB1YmxpYyBJR3JhcGhpY3NVcGRhdGVyIGdldEdyYXBoaWNzVXBkYXRlcigpIHsKLQkJcmV0dXJuIGdyYXBoaWNzVXBkYXRlcjsKLQl9Ci0KLQlwdWJsaWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCXJldHVybiBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQl9Ci0JCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KE9iamVjdCBidXNpbmVzc09iamVjdCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gc3VwZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGJ1c2luZXNzT2JqZWN0KTsKLQkJLyoKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgocGUgPT0gbnVsbCkgJiYgKGNudCA8IDIwKSkgewotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb3AiKTsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb3A7IGhjOiIgKyBidXNpbmVzc09iamVjdC5oYXNoQ29kZSgpKTsKLQkJCXBlID0gc3VwZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGJ1c2luZXNzT2JqZWN0KTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmIChwZSA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZQIC0gUEUgaXMgbnVsbDsgaGM6IiArIGJ1c2luZXNzT2JqZWN0Lmhhc2hDb2RlKCkpOwotCQl9Ci0JCSovCi0JCXJldHVybiBwZTsKLQl9Ci0JCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmMxMTguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlBvbHlsaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51dGlsLklDb2xvckNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JJbWFnZUNyZWF0b3IgaW1wbGVtZW50cyBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIHsKLQotCXB1YmxpYyBQb2x5bGluZSBjcmVhdGVDb25uZWN0aW9uTGluZShEaWFncmFtIGQsIENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotCQlQb2x5bGluZSBwb2x5bGluZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKGNvbm5lY3Rpb24pOwotCQlwb2x5bGluZS5zZXRGb3JlZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGQsIEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfQ09MT1IpKTsKLQkJcG9seWxpbmUuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfV0lEVEgpOwotCQlyZXR1cm4gcG9seWxpbmU7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlVGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgdGV4dERlY29yYXRvciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgdHJ1ZSwgMC41LCB0cnVlKTsKLQkJVGV4dCB0eHQgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVEZWZhdWx0VGV4dCh0ZXh0RGVjb3JhdG9yKTsKLQkJdHh0LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJdHh0LnNldFZhbHVlKHRleHQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBJQ29sb3JDb25zdGFudC5CTEFDSyk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKHR4dCwgNSwgLTIwKTsKLQkJcmV0dXJuIHRleHREZWNvcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGMsIFN0cmluZyB0ZXh0LCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciB0ZXh0RGVjb3JhdG9yID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjLCB0cnVlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVRleHQgdHh0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlRGVmYXVsdFRleHQodGV4dERlY29yYXRvcik7Ci0JCXR4dC5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXR4dC5zZXRWYWx1ZSh0ZXh0KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoYy5nZXRQYXJlbnQoKSwgSUNvbG9yQ29uc3RhbnQuQkxBQ0spOwotCQlQb2ludCBwdCA9IEpQQUVkaXRvclV0aWwucmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKChGcmVlRm9ybUNvbm5lY3Rpb24pYywgdGV4dERlY29yYXRvcik7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKHR4dCwgcHQueCwgcHQueSwgZmFsc2UpOwotCQlyZXR1cm4gdGV4dERlY29yYXRvcjsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVBcnJvd0Nvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgZmFsc2UsIGxvY2F0aW9uLCB0cnVlKTsKLQkJUG9seWxpbmUgYXJyb3cgPSBudWxsOyAKLQkJCWFycm93ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY2QsIG5ldyBpbnRbXSB7IDExLCAzLCAwLCAwLCAxMSwgLTMsIDExLCAzfSk7Ci0JCWFycm93LnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoY29ubmVjdGlvbi5nZXRQYXJlbnQoKSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlhcnJvdy5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBjZDsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVNYW55RW5kV2l0aEFycm93RGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGZhbHNlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVBvbHlsaW5lIGFycm93ID0gbnVsbDsKLQkJYXJyb3cgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2x5bGluZShjZCwgbmV3IGludFtdIHsgLTIsIDcsIDYsIDAsIC0yLCAtNywgNiwgMCwgMjAsIDMsIDIwLCAtMywgNywgMH0pOwotCQlhcnJvdy5zZXRGb3JlZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGNvbm5lY3Rpb24uZ2V0UGFyZW50KCksIEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfQ09MT1IpKTsKLQkJYXJyb3cuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfV0lEVEgpOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueUVuZERlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGNkID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjb25uZWN0aW9uLCBmYWxzZSwgbG9jYXRpb24sIHRydWUpOwotCQlQb2x5bGluZSBhcnJvdyA9IG51bGw7Ci0JCWFycm93ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY2QsIG5ldyBpbnRbXSB7IDAsIDcsIAotCQkJCQkJCQkJCQkJCSA4LCAwLCAKLQkJCQkJCQkJCQkJCQkwLCAtNyB9KTsKLQkJYXJyb3cuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX0NPTE9SKSk7Ci0JCWFycm93LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJcmV0dXJuIGNkOwotCX0KLQkKLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVNYW55U3RhcnREZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgZmFsc2UsIGxvY2F0aW9uLCB0cnVlKTsKLQkJUG9seWxpbmUgYXJyb3cgPSBudWxsOwotCQlhcnJvdyA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKGNkLCBuZXcgaW50W10gezAsIDcsIAotCQkJCQkJCQkJCQkJCSAtOCwgMCwgCi0JCQkJCQkJCQkJCQkJMCwgLTcgfSk7CQkKLQkJYXJyb3cuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX0NPTE9SKSk7Ci0JCWFycm93LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJcmV0dXJuIGNkOwotCX0JCi0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVJY29uQ29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBpY29uSWQsIGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGljb25EZWNvcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIHRydWUsIGxvY2F0aW9uLCB0cnVlKTsKLQkJSW1hZ2UgaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGNvbm5lY3Rpb24sIGljb25JZCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGljb24sIDUsIC0yMCk7Ci0JCXJldHVybiBpY29uRGVjb3JhdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2OTA1YWUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLnBsYXRmb3JtLkFic3RyYWN0SW1hZ2VQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvckltYWdlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEltYWdlUHJvdmlkZXIgewotCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciI7CS8vJE5PTi1OTFMtMSQKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS4iOyAJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9FTlRJVFkgPSBQUkUgKyAiZW50aXR5IjsgCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0pQQV9FTlRJVFkgPSBQUkUgKyAiYWRkX2VudGl0eSI7IAkJCQkJCQkJLy8kTk9OLU5MUy0xJCAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfSU5IRVJJVEVEX0VOVElUWSA9IFBSRSArICJtYXBwZWRfc3VwZXJjbGFzcyI7ICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfS0VZID0gUFJFICsgInBrIjsgCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fQkFTSUMgPSBQUkUgKyAiZmllbGQiOyAJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9BVFRSSUJVVEUgPSBQUkUgKyAiYWRkX2F0dHJpYnV0ZSI7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQVRUUklCVVRFID0gUFJFICsgInJlbW92ZV9hdHRyaWJ1dGUiOyAJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fT05FX1RPX09ORSA9IFBSRSArICJvbmVfdG9fb25lX3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fT05FX1RPX01BTlkgPSBQUkUgKyAib25lX3RvX21hbnlfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NQU5ZX1RPX09ORSA9IFBSRSArICJtYW55X3RvX29uZV9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fTUFOWSA9IFBSRSArICJtYW55X3RvX21hbnlfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FTUJFRERFRF9JRCA9IFBSRSArICJlbWJlZGRlZF9pZCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1ZFUlNJT04gPSBQUkUgKyAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9UUkFOU0lFTlQgPSBQUkUgKyAidHJhbnNpZW50IjsgLy8kTk9OLU5MUy0xJCAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9FTUJFRERFRCA9IFBSRSArICJlbWJlZGRlZCI7IC8vJE5PTi1OTFMtMSQgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9VTk1BUFBFRCA9IFBSRSArICJ1bm1hcHBlZCI7IC8vJE5PTi1OTFMtMSQgIAotCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19PTkVfMV9ESVIgPSBQUkUgKyAib25lX3RvX29uZV8xX2Rpcl9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19NQU5ZXzFfRElSID0gUFJFICsgIm9uZV90b19tYW55XzFfZGlyX3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19PTkVfMV9ESVIgPSBQUkUgKyAibWFueV90b19vbmVfMV9kaXJfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19NQU5ZXzFfRElSID0gUFJFICsgIm1hbnlfdG9fbWFueV8xX2Rpcl9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fT05FX1RPX09ORV8yX0RJUiA9IFBSRSArICJvbmVfdG9fb25lXzJfZGlyX3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19PTkVfMl9ESVIgPSBQUkUgKyAibWFueV90b19vbmVfMl9kaXJfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19NQU5ZXzJfRElSID0gUFJFICsgIm1hbnlfdG9fbWFueV8yX2Rpcl9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NBVkUgPSBQUkUgKyAic2F2ZSI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1JFU1RPUkUgPSBQUkUgKyAicmVzdG9yZSI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX1NBVkVfQU5EX1JFTU9WRSA9IFBSRSArICJzYXZlX2FuZF9yZW1vdmUiOyAJCQkvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9GT0xERVJfRk9SX0lNRyA9ICJpY29ucy8iOyAvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgSlBBRWRpdG9ySW1hZ2VQcm92aWRlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBdmFpbGFibGVJbWFnZXMoKSB7ICAgICAgICAKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX0JBU0lDLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9iYXNpYy5naWYiKTsJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKEpQQV9FTlRJVFksIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2VudGl0eS5naWYiKTsJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChBRERfSlBBX0VOVElUWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvYWRkX2VudGl0eS5naWYiKTsJCQkJCS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKEFERF9JTkhFUklURURfRU5USVRZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYXBwZWQtc3VwZXJjbGFzcy5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKFBSSU1BUllfS0VZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9pZC5naWYiKTsJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoQUREX0FUVFJJQlVURSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvYWRkX2F0dHJpYnV0ZS5naWYiKTsJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoUkVNT1ZFX0FUVFJJQlVURSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvcmVtb3ZlX2F0dHJpYnV0ZS5naWYiKTsJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fT05FX1RPX09ORSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvb25lLXRvLW9uZS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX09ORV9UT19NQU5ZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tbWFueS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fT05FLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW9uZS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fTUFOWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbWFueS10by1tYW55LmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fRU1CRURERURfSUQsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2VtYmVkZGVkLWlkLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9WRVJTSU9OLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC92ZXJzaW9uLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9UUkFOU0lFTlQsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L3RyYW5zaWVudC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fRU1CRURERUQsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2VtYmVkZGVkLmdpZiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9VTk1BUFBFRCwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fT05FXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tb25lLTEtZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fT05FX1RPX01BTllfMV9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L29uZS10by1tYW55LTEtZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19PTkVfMV9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tb25lLTEtZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJCAgICAgICAgCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9NQU5ZX1RPX01BTllfMV9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tbWFueS0xLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fT05FXzJfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tb25lLTItZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19PTkVfMl9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tb25lLTItZGlyLmdpZiIpOwkJLy8kTk9OLU5MUy0xJCAgICAgICAgCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9NQU5ZX1RPX01BTllfMl9ESVIsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tbWFueS0yLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fU0FWRSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJzYXZlLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fUkVTVE9SRSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJyZXN0b3JlLmdpZiIpOwkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fU0FWRV9BTkRfUkVNT1ZFLCBST09UX0ZPTERFUl9GT1JfSU1HICsgInNhdmVfYW5kX3JlbW92ZS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTc4OThmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURvdWJsZUNsaWNrQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklQaWN0b2dyYW1FbGVtZW50Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3JlYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuZmVhdHVyZXMuY29udGV4dC5pbXBsLmJhc2UuUGljdG9ncmFtRWxlbWVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGFsZXR0ZS5JUGFsZXR0ZUNvbXBhcnRtZW50RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGFsZXR0ZS5JVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhbGV0dGUuaW1wbC5QYWxldHRlQ29tcGFydG1lbnRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JUGxhdGZvcm1JbWFnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5Db250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuQ29udGV4dEVudHJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLkNvbnRleHRNZW51RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuRGVmYXVsdFRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSUNvbnRleHRCdXR0b25QYWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0TWVudUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSW1hZ2VEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGVsZXRlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkV4cGFuZEVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Nb3ZlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLk9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVuYW1lRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlc3RvcmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlNhdmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlciBleHRlbmRzIERlZmF1bHRUb29sQmVoYXZpb3JQcm92aWRlciB7Ci0KLQlwcml2YXRlIElFY2xpcHNlRmFjYWRlIGZhY2FkZTsKLQotICAgIHB1YmxpYyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHApIHsKLSAgICAJdGhpcyhkdHAsIEVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAsIElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUpIHsKLSAgICAgICAgc3VwZXIoZHRwKTsKLSAgICAgICAgdGhpcy5mYWNhZGUgPSBlY2xpcHNlRmFjYWRlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbnRleHRCdXR0b25QYWREYXRhIGdldENvbnRleHRCdXR0b25QYWQoSVBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgSUNvbnRleHRCdXR0b25QYWREYXRhIGRhdGEgPSBzdXBlci5nZXRDb250ZXh0QnV0dG9uUGFkKGNvbnRleHQpOyAgICAgICAgCi0gICAgICAgIENvbnRhaW5lclNoYXBlIGNzID0gbnVsbDsKLSAgICAgICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSAoKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIAkgIE9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAJCWlmIChvYiA9PSBudWxsKXsKLSAgICAgIAkJCXJldHVybiBudWxsOwotICAgICAgICAgICB9Ci0gICAgICAgIAlpZiAocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkgewotICAgICAgICAgICAgCWNzID0gKENvbnRhaW5lclNoYXBlKXBlOwotICAgICAgICAgICAgCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gY3MuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAgICAgICAgIAlpZiAoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHsKLSAgICAgICAgICAgIAkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ2FzID0gKChSZWN0YW5nbGUpZ2EpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIAkJaWYgKChnYXMuc2l6ZSgpID4gMCkgJiYgKGdhcy5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKGRhdGEsIHBlLCAwKTsgICAgICAgICAgICAJCQkKLSAgICAgICAgICAgIAkJCUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0ID0gZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKQotCQkJCQkJCQkuZ2V0Q2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCk7Ci0gICAgICAgICAgICAJCQlEZWxldGVDb250ZXh0IGRlbEN0eCA9IG5ldyBEZWxldGVDb250ZXh0KGNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRCdXR0b25FbnRyeSBidG4gPSAgbmV3IENvbnRleHRCdXR0b25FbnRyeShmZWF0LCBkZWxDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGVsZXRlQXR0cmlidXRlQnV0dG9ubGFiZWwpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbik7IAotICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnNldEljb25JZChJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRURJVF9ERUxFVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXREb21haW5TcGVjaWZpY0NvbnRleHRCdXR0b25zKCkuYWRkKGJ0bik7ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7IAotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAJfSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJcmV0dXJuIGRhdGE7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLQkJc2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKGRhdGEsIHBlLCBDT05URVhUX0JVVFRPTl9ERUxFVEUKLQkJCQl8IENPTlRFWFRfQlVUVE9OX1JFTU9WRSk7Ci0JCUxpc3Q8SUNvbnRleHRCdXR0b25FbnRyeT4gYnV0dG9ucyA9IGRhdGEuZ2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKCk7Ci0JCUl0ZXJhdG9yPElDb250ZXh0QnV0dG9uRW50cnk+IGJ0bnNJdCA9IGJ1dHRvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJ0bnNJdC5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZXh0QnV0dG9uRW50cnkgYnV0dG9uID0gYnRuc0l0Lm5leHQoKTsKLQkJCWlmIChidXR0b24uZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSkgewotCQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uTGFiZWwpOwotCQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCX0gZWxzZSBpZiAoYnV0dG9uLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUpIHsKLQkJCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25MYWJlbCk7Ci0JCQkJYnV0dG9uLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCi0JCUNvbnRleHRCdXR0b25FbnRyeSBidXR0b24gPSBudWxsOwotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSB7Ci0KLQkJCUNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKS5nZXRDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoKTsKLQkJCUNyZWF0ZUNvbnRleHQgY3JlYXRlQ3R4ID0gbmV3IENyZWF0ZUNvbnRleHQoKTsKLQkJCWNyZWF0ZUN0eC5zZXRUYXJnZXRDb250YWluZXIoY3MpOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmZWF0dXJlLCBjcmVhdGVDdHgpOwotCQkJYnV0dG9uLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWwpOwotCQkJYnV0dG9uLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5BRERfQVRUUklCVVRFKTsKLQkJCWRhdGEuZ2V0RG9tYWluU3BlY2lmaWNDb250ZXh0QnV0dG9ucygpLmFkZChidXR0b24pOwotCi0JCQlQaWN0b2dyYW1FbGVtZW50Q29udGV4dCBjID0gKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSBjb250ZXh0OwotCQkJUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUgZnQyID0gbmV3IFJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCVJlbW92ZUNvbnRleHQgcmVtQ3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoYy5nZXRQaWN0b2dyYW1FbGVtZW50KCkpOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmdDIsIHJlbUN0eCk7Ci0JCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uVGV4dCk7Ci0JCQlidXR0b24uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1NBVkVfQU5EX1JFTU9WRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJU2F2ZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0UGljdG9ncmFtRWxlbWVudHMobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IGMuZ2V0UGljdG9ncmFtRWxlbWVudCgpIH0pOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmdCwgY3R4KTsKLQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25UZXh0KTsKLQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlQnV0dG9uRGVzY3JpcHRpb24pOwotCQkJYnV0dG9uLnNldEljb25JZChKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fU0FWRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJUmVzdG9yZUVudGl0eUZlYXR1cmUgZnQxID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCWN0eC5zZXRQaWN0b2dyYW1FbGVtZW50cyhuZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgYy5nZXRQaWN0b2dyYW1FbGVtZW50KCkgfSk7Ci0JCQlidXR0b24gPSBuZXcgQ29udGV4dEJ1dHRvbkVudHJ5KGZ0MSwgY3R4KTsKLQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25UZXh0KTsKLQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZXN0b3JlQnV0dG9uRGVzY3JpcHRpb24pOwotCQkJYnV0dG9uLnNldEljb25JZChKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fUkVTVE9SRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHBlIH0pOwotCQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJCUlDdXN0b21GZWF0dXJlW10gY3VzdG9tRmVhdHVyZXMgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0Q3VzdG9tRmVhdHVyZXMoY3R4KTsKLQkJCWludCBmZWF0dXJlQ291bnQgPSBjdXN0b21GZWF0dXJlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVDb3VudDsgaSsrKSB7Ci0JCQkJSUN1c3RvbUZlYXR1cmUgY3VzdG9tRmVhdHVyZSA9IGN1c3RvbUZlYXR1cmVzW2ldOwotCQkJCWlmIChjdXN0b21GZWF0dXJlLmlzQXZhaWxhYmxlKGN0eCkpIHsKLQkJCQkJaWYgKChjdXN0b21GZWF0dXJlIGluc3RhbmNlb2YgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKSkgewotCQkJCQkJSUNvbnRleHRCdXR0b25FbnRyeSBjb250ZXh0QnV0dG9uID0gQ29udGV4dEVudHJ5SGVscGVyCi0JCQkJCQkJCS5jcmVhdGVDb2xsYXBzZUNvbnRleHRCdXR0b24odHJ1ZSwgY3VzdG9tRmVhdHVyZSwgY3R4KTsKLQkJCQkJCWRhdGEuc2V0Q29sbGFwc2VDb250ZXh0QnV0dG9uKGNvbnRleHRCdXR0b24pOwotCQkJCQl9IGVsc2UgaWYgKChjdXN0b21GZWF0dXJlIGluc3RhbmNlb2YgRXhwYW5kRW50aXR5RmVhdHVyZSkpIHsKLQkJCQkJCUlDb250ZXh0QnV0dG9uRW50cnkgY29udGV4dEJ1dHRvbiA9IENvbnRleHRFbnRyeUhlbHBlcgotCQkJCQkJCQkuY3JlYXRlQ29sbGFwc2VDb250ZXh0QnV0dG9uKGZhbHNlLAljdXN0b21GZWF0dXJlLCBjdHgpOwotCQkJCQkJZGF0YS5zZXRDb2xsYXBzZUNvbnRleHRCdXR0b24oY29udGV4dEJ1dHRvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnlbXSBnZXRQYWxldHRlKCkgewotICAgICAgICBMaXN0PElQYWxldHRlQ29tcGFydG1lbnRFbnRyeT4gcmV0ID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5PigpOwotICAgICAgICBJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnlbXSBzdXBlckNvbXBhcnRtZW50cyA9Ci0gICAgICAgICAgICBzdXBlci5nZXRQYWxldHRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJDb21wYXJ0bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCVN0cmluZyBuZXdMYWJlbCA9IChzdXBlckNvbXBhcnRtZW50c1tpXS5nZXRMYWJlbCgpLmVxdWFscygiT2JqZWN0cyIpID8gLy8kTk9OLU5MUy0xJAotICAgICAgICAJCQlKUEFFZGl0b3JNZXNzYWdlcy5QYWxldHRlQ29tcGFydG1lbnRfT2JqZWN0cyA6IAotICAgICAgICAJCQkJSlBBRWRpdG9yTWVzc2FnZXMuUGFsZXR0ZUNvbXBhcnRtZW50X0Nvbm5lY3Rpb25zKTsgCi0gICAgICAgIAlQYWxldHRlQ29tcGFydG1lbnRFbnRyeSBlbnRyeSA9IG5ldyBQYWxldHRlQ29tcGFydG1lbnRFbnRyeShuZXdMYWJlbCwgc3VwZXJDb21wYXJ0bWVudHNbaV0uZ2V0SWNvbklkKCkpOyAgICAgICAKLSAgICAgICAgCUxpc3Q8SVRvb2xFbnRyeT4gbHN0ID0gc3VwZXJDb21wYXJ0bWVudHNbaV0uZ2V0VG9vbEVudHJpZXMoKTsKLSAgICAgICAgCUl0ZXJhdG9yPElUb29sRW50cnk+IGl0ID0gbHN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIAl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQllbnRyeS5hZGRUb29sRW50cnkoaXQubmV4dCgpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXJldC5hZGQoZW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIElQYWxldHRlQ29tcGFydG1lbnRFbnRyeSBlbiA9IHJldC5nZXQoMCk7Ci0gICAgICAgIHJldC5zZXQoMCwgcmV0LmdldCgxKSk7Ci0gICAgICAgIHJldC5zZXQoMSwgZW4pOwotICAgICAgICByZXR1cm4gcmV0LnRvQXJyYXkobmV3IElQYWxldHRlQ29tcGFydG1lbnRFbnRyeVtyZXQuc2l6ZSgpXSk7Ci0gICAgfQotICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElEZWNvcmF0b3JbXSBnZXREZWNvcmF0b3JzKFBpY3RvZ3JhbUVsZW1lbnQgcGUpIHsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJT2JqZWN0IGJvID0gZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0KLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBibzsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCk7Ci0JCQlpZighZmlsZS5leGlzdHMoKSl7Ci0JCQkJcmV0dXJuIG5ldyBJRGVjb3JhdG9yWzBdOwotCQkJfQotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBuZXcgSU1hcmtlclswXTsKLQkJCXRyeSB7Ci0JCQkJbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQlJRGVjb3JhdG9yW10gcmVzdWx0ID0gbmV3IElEZWNvcmF0b3JbMV07Ci0JCQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBzdXBlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJCQlJTWFya2VyIG1hcmtlciA9IGdldEhpZ2hlc3RQcmlvTWFya2VyKG1hcmtlcnMpOwotCQkJCUltYWdlRGVjb3JhdG9yIGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yID0gY3JlYXRlRGVjb3JhdG9yRnJvbU1hcmtlcihtYXJrZXIpOwotCQkJCWlmIChpbWFnZVJlbmRlcmluZ0RlY29yYXRvciAhPSBudWxsKSB7Ci0JCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldFgoNSAqIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCkgLyA2KSk7Ci0JCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldFkoNSAqIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpIC8gNikpOwotCQkJCQlyZXN1bHRbMF0gPSBpbWFnZVJlbmRlcmluZ0RlY29yYXRvcjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdFswXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWNvcmF0b3JzKHBlKTsKLQl9Ci0KLQlwcml2YXRlIElNYXJrZXIgZ2V0SGlnaGVzdFByaW9NYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMpIHsKLQkJSU1hcmtlciByZXN1bHQgPSBtYXJrZXJzWzBdOwotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBJbnRlZ2VyIHJlc3VsdFNldmVyaXR5ID0gKEludGVnZXIpIHJlc3VsdC5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQkJaWYgKHJlc3VsdFNldmVyaXR5ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChJTWFya2VyLlNFVkVSSVRZX0VSUk9SID09IHJlc3VsdFNldmVyaXR5KQotCQkJCQkvLyByZXR1cm4gdGhlIGZpcnN0IGVycm9yIG1hcmtlcgotCQkJCQlicmVhazsKLQkJCQlJbnRlZ2VyIG1hcmtlclNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQkJaWYgKChtYXJrZXJTZXZlcml0eSAhPSBudWxsKSAmJiAobWFya2VyU2V2ZXJpdHkgPiByZXN1bHRTZXZlcml0eSkpCi0JCQkJCXJlc3VsdCA9IG1hcmtlcjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSW1hZ2VEZWNvcmF0b3IgY3JlYXRlRGVjb3JhdG9yRnJvbU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJSW50ZWdlciBzZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpOwotCQkJU3RyaW5nIGRlY29yYXRvclR5cGUgPSBJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRUNMSVBTRV9JTkZPUk1BVElPTl9UU0s7Ci0JCQlpZiAoc2V2ZXJpdHkgIT0gbnVsbCkgewotCQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWRlY29yYXRvclR5cGUgPSBJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRUNMSVBTRV9JTkZPUk1BVElPTl9UU0s7Ci0JCQkJY2FzZSAxOgotCQkJCQlkZWNvcmF0b3JUeXBlID0gSVBsYXRmb3JtSW1hZ2VDb25zdGFudHMuSU1HX0VDTElQU0VfV0FSTklOR19UU0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZGVjb3JhdG9yVHlwZSA9IElQbGF0Zm9ybUltYWdlQ29uc3RhbnRzLklNR19FQ0xJUFNFX0VSUk9SX1RTSzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUltYWdlRGVjb3JhdG9yIGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yID0gbmV3IEltYWdlRGVjb3JhdG9yKGRlY29yYXRvclR5cGUpOwotCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldE1lc3NhZ2UoKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLQkJCQlyZXR1cm4gaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXAoR3JhcGhpY3NBbGdvcml0aG0gZ2EpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdhLmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKChjaCA9PSBudWxsKSB8fCAoY2guc2l6ZSgpID09IDApKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBnYSA9IGNoLmdldCgwKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBUZXh0KSkgCi0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgaWYoKChUZXh0KWdhKS5nZXRGb250KCkuaXNJdGFsaWMoKSl7Ci0gICAgCQlyZXR1cm4gZ2V0VG9vbFRpcEZvckNvbXBhcnRtZW50U2hhcGUoZ2EpOwotICAgIAkgICAgfQotICAgICAgICAKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJaWYgKGJvICE9IG51bGwpIHsKLQkJCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJCVN0cmluZyBzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSA9IG51bGw7Ci0JCQkJaWYgKCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibykuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQkJc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUgPSAoKEphdmFQZXJzaXN0ZW50VHlwZSkgYm8pLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldFRvb2x0aXBUZXh0KChKYXZhUGVyc2lzdGVudFR5cGUpYm8sIHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0VG9vbHRpcFRleHQoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKWJvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgaWYgKCEocGUgaW5zdGFuY2VvZiBTaGFwZSkpIAotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIFNoYXBlIHNoID0gKFNoYXBlKXBlOwotICAgICAgICBDb250YWluZXJTaGFwZSBjc2ggPSBzaC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNzaCA9PSBudWxsKSAKLSAgICAgICAgCXJldHVybiBudWxsOyAKLSAgICAgICAgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3NoKTsKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlTdHJpbmcgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUgPSBudWxsOwotCQkJaWYgKCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibykuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsKLQkJCQlzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSA9ICgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibykKLQkJCQkJCS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0VG9vbHRpcFRleHQoKEphdmFQZXJzaXN0ZW50VHlwZSkgYm8sCi0JCQkJCXN1cGVyUGVyc2lzdGVudFR5cGVOYW1lKTsKLQkJfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUb29sVGlwRm9yQ29tcGFydG1lbnRTaGFwZShHcmFwaGljc0FsZ29yaXRobSBnYSkgewotCQlUZXh0IHR4dCA9IChUZXh0KSBnYTsKLQkJQ29udGFpbmVyU2hhcGUgc2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGdhKTsKLQkJCWlmKEdyYXBoaWNzVXBkYXRlci5pc0NvbGxhcHNlZChzaGFwZSkpCi0JCQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZENvbXBhcnRUb29sVGlwLCB0eHQuZ2V0VmFsdWUoKSk7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VDb21wYXJ0VG9vbFRpcCwgdHh0LmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwkJCi0JfQotCQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQ29udGV4dE1lbnVFbnRyeVtdIGdldENvbnRleHRNZW51KElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLSAgICAJSUN1c3RvbUNvbnRleHQgY3VzdG9tQ29udGV4dCA9IChJQ3VzdG9tQ29udGV4dCljb250ZXh0OwotICAgIAlQaWN0b2dyYW1FbGVtZW50W10gcGljdEVscyA9IGN1c3RvbUNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKTsKLSAgICAJCi0gICAgCUlDdXN0b21GZWF0dXJlIHNhdmVFbnRpdHlGZWF0dXJlID0gbmV3IFNhdmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSBzYXZlRW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShzYXZlRW50aXR5RmVhdHVyZSwgY29udGV4dCk7Ci0JCXNhdmVFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbSk7Ci0JCXNhdmVFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlTWVudUl0ZW1EZXNjcik7Ci0JCXNhdmVFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLQkJCi0JCUlDdXN0b21GZWF0dXJlIHJlc3RvcmVFbnRpdHlGZWF0dXJlID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSByZXN0b3JlRW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShyZXN0b3JlRW50aXR5RmVhdHVyZSwgY29udGV4dCk7Ci0JCXJlc3RvcmVFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW0pOwotCQlyZXN0b3JlRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbURlc2NyKTsKLQkJcmVzdG9yZUVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwkJCi0gICAgCQotCQlJQ3VzdG9tRmVhdHVyZSBjb2xsYXBzZUZlYXR1cmUgPSBuZXcgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSBjb2xsYXBzZUVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY29sbGFwc2VGZWF0dXJlLCBjb250ZXh0KTsKLQkJY29sbGFwc2VFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW0pOwotCQljb2xsYXBzZUVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW1EZXNjcik7Ci0JCWNvbGxhcHNlRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0JCQotCQlJQ3VzdG9tRmVhdHVyZSBjb2xsYXBzZUFsbEZlYXR1cmUgPSBuZXcgQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IGNvbGxhcHNlQWxsTWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjb2xsYXBzZUFsbEZlYXR1cmUsIGNvbnRleHQpOwotCQljb2xsYXBzZUFsbE1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtKTsKLQkJY29sbGFwc2VBbGxNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcik7Ci0JCWNvbGxhcHNlQWxsTWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7CQkKLQotCQlJQ3VzdG9tRmVhdHVyZSBleHBhbmRGZWF0dXJlID0gbmV3IEV4cGFuZEVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IGV4cGFuZEVudGl0eU1lbnVJdGVtPSBuZXcgQ29udGV4dE1lbnVFbnRyeShleHBhbmRGZWF0dXJlLCBjb250ZXh0KTsKLQkJZXhwYW5kRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHlNZW51SXRlbSk7Ci0JCWV4cGFuZEVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eW1lbnVJdGVtRGVzY3IpOwotCQlleHBhbmRFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLQkJCi0JCUlDdXN0b21GZWF0dXJlIGV4cGFuZEFsbEZlYXR1cmUgPSBuZXcgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJQ29udGV4dE1lbnVFbnRyeSBleHBhbmRBbGxNZW51SXRlbT0gbmV3IENvbnRleHRNZW51RW50cnkoZXhwYW5kQWxsRmVhdHVyZSwgY29udGV4dCk7Ci0JCWV4cGFuZEFsbE1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbSk7Ci0JCWV4cGFuZEFsbE1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcik7Ci0JCWV4cGFuZEFsbE1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwkJCi0KLSAgICAgICAgSUN1c3RvbUZlYXR1cmUgb3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZSA9IG5ldyBPcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KG9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5KUEFEZXRhaWxzVmlldyk7Ci0gICAgICAgIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5KUEFEZXRhaWxzVmlld0Rlc2MpOwotICAgICAgICBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIElDdXN0b21GZWF0dXJlIG9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZSA9IG5ldyBPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgICAgICBDb250ZXh0TWVudUVudHJ5IG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShvcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXcpOwotICAgICAgICBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3RGVzYyk7Ci0gICAgICAgIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGlzRW1wdHkgPSB0cnVlOwotICAgICAgICBDb250ZXh0TWVudUVudHJ5IHJlbW92ZUFsbEVudGl0aWVzU3VibWVudSA9IG51bGw7Ci0gICAgICAgIGlmKGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKS5zaXplKCkhPTApewotICAgICAgICBpc0VtcHR5ID0gZmFsc2U7Ci0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KG51bGwsIG51bGwpOwotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnUpOwotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUuc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQWxsRW50aXRpZXNNZW51KTsKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LnNldFN1Ym1lbnUodHJ1ZSk7Ci0JCQotICAgICAgICBJQ3VzdG9tRmVhdHVyZSBjdXN0b21GZWF0dXJlID0gbmV3IFNhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCi0gICAgICAgIENvbnRleHRNZW51RW50cnkgc2F2ZUFuZFJlbW92RW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgc2F2ZUFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNBY3Rpb24pOwotICAgICAgICBzYXZlQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNBY3Rpb24pOwotICAgICAgICBzYXZlQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgCi0JCWN1c3RvbUZlYXR1cmUgPSBuZXcgRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkKLSAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBkaXNjYXJkQW5kUmVtb3ZFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICBkaXNjYXJkQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0FjdGlvbik7Ci0gICAgICAgIGRpc2NhcmRBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0FjdGlvbik7Ci0gICAgICAgIGRpc2NhcmRBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LmFkZChzYXZlQW5kUmVtb3ZFbnRpdHlNZW51SXRlbSk7Ci0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudS5hZGQoZGlzY2FyZEFuZFJlbW92RW50aXR5TWVudUl0ZW0pOwotICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAgICAgICAgIAotCi0gICAgCWlmICgocGljdEVscyA9PSBudWxsKSB8fCAocGljdEVscy5sZW5ndGggPT0gMCkpIAotICAgIAkJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0gfTsKLSAgICAJaWYgKHBpY3RFbHNbMF0gaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkgewotICAgIAkJT2JqZWN0IG9iID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBpY3RFbHNbMF0pOwotICAgICAgICAgICAgaWYgKHBpY3RFbHNbMF0gaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0gICAgICAgICAgICAJSUN1c3RvbUZlYXR1cmUgY3VzdG9tRmVhdHVyZSA9IG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCi0gICAgICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBzaG93QWxsRW50c01lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgc2hvd0FsbEVudHNNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllcyk7Ci0gICAgICAgICAgICAgICAgc2hvd0FsbEVudHNNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXNEZXNjKTsKLSAgICAgICAgICAgICAgICBzaG93QWxsRW50c01lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmKGlzRW1wdHkpewotICAgICAgICAgICAgICAgIAlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyBzaG93QWxsRW50c01lbnVJdGVtLAotICAgICAgICAgICAgICAgIAkJCSBjb2xsYXBzZUFsbE1lbnVJdGVtLAotICAgICAgICAgICAgICAgIAkJCSBleHBhbmRBbGxNZW51SXRlbSwKLQkJCQkJCQkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0sCi0JCQkJCQkJIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW19OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgc2hvd0FsbEVudHNNZW51SXRlbSwgCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LAotICAgICAgICAgICAgICAgIAkJCQkJCQkJIGNvbGxhcHNlQWxsTWVudUl0ZW0sCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgZXhwYW5kQWxsTWVudUl0ZW0sCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0sCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbX07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAJfSAgICAKLSAgICAgICAgICAgIGlmKChvYiA9PSBudWxsKSAmJiAocGljdEVsc1swXS5nZXRHcmFwaGljc0FsZ29yaXRobSgpIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSl7Ci0gICAgICAgICAgICAJSUN1c3RvbUZlYXR1cmUgY29sbGFwc2VDb21wYXJ0bWVudEZlYXR1cmUgPSBuZXcgQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIAkJQ29udGV4dE1lbnVFbnRyeSBjb2xsYXBzZUNvbXBhcnRtZW50TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjb2xsYXBzZUNvbXBhcnRtZW50RmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIAkJY29sbGFwc2VDb21wYXJ0bWVudE1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbSk7Ci0gICAgICAgIAkJY29sbGFwc2VDb21wYXJ0bWVudE1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW1EZXNjcik7Ci0gICAgICAgIAkJY29sbGFwc2VDb21wYXJ0bWVudE1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotCi0gICAgICAgIAkJSUN1c3RvbUZlYXR1cmUgZXhwYW5kQ29tcGFydG1lbnRGZWF0dXJlID0gbmV3IEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgCQlDb250ZXh0TWVudUVudHJ5IGV4cGFuZENvbXBhcnRtZW50TWVudUl0ZW09IG5ldyBDb250ZXh0TWVudUVudHJ5KGV4cGFuZENvbXBhcnRtZW50RmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIAkJZXhwYW5kQ29tcGFydG1lbnRNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEF0dHJNZW51SXRlbSk7Ci0gICAgICAgIAkJZXhwYW5kQ29tcGFydG1lbnRNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBdHRyTWVudUl0ZW1EZXNjcik7Ci0gICAgICAgIAkJZXhwYW5kQ29tcGFydG1lbnRNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgCQlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10ge2NvbGxhcHNlQ29tcGFydG1lbnRNZW51SXRlbSwgZXhwYW5kQ29tcGFydG1lbnRNZW51SXRlbX07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAvL0FwcGx5IFBhdHRlcm4gbWVudQotICAgICAgICAgICAgCi0gICAgICAgICAgICBJQ3VzdG9tRmVhdHVyZSBhcHBseVBhdHRlcm5GZWF0dXJlID0gbmV3IEFwcGx5UGF0dGVybkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBhcHBseVBhdHRlcm5NZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGFwcGx5UGF0dGVybkZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAgICAgYXBwbHlQYXR0ZXJuTWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9hcHBseVBhdHRlcm4pOwotICAgICAgICAgICAgYXBwbHlQYXR0ZXJuTWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfYXBwbHlQYXR0ZXJuRGVzYyk7Ci0gICAgICAgICAgICBhcHBseVBhdHRlcm5NZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgICAgIC8vQXBwbHkgUGF0dGVybiBtZW51Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSByZWZhY3RvckNsYXNzU3VibWVudSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KG51bGwsIG51bGwpOwotICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnUpOwotICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUuc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JTdWJNZW51KTsKLSAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LnNldFN1Ym1lbnUodHJ1ZSk7Ci0gICAgICAgICAgICAKLSAgICAJCQotICAgICAgICAgICAgSUN1c3RvbUZlYXR1cmUgY3VzdG9tRmVhdHVyZSA9IG5ldyBSZW5hbWVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSByZW5hbWVFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICAgICAgcmVuYW1lRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW5hbWVFbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICByZW5hbWVFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW5hbWVFbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICByZW5hbWVFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgIAkJY3VzdG9tRmVhdHVyZSA9IG5ldyBNb3ZlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkKLSAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgbW92ZUVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgICAgICBtb3ZlRW50aXR5TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9tb3ZlRW50aXR5Q2xhc3MpOwotICAgICAgICAgICAgbW92ZUVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX21vdmVFbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBtb3ZlRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LmFkZChyZW5hbWVFbnRpdHlNZW51SXRlbSk7Ci0gICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudS5hZGQobW92ZUVudGl0eU1lbnVJdGVtKTsgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgc2hhcGVUeXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0RWxzWzBdLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKChzaGFwZVR5cGUgPT0gbnVsbCkgfHwgIXNoYXBlVHlwZS5lcXVhbHMoU2hhcGVUeXBlLkFUVFJJQlVURS50b1N0cmluZygpKSkgCi0gICAgICAgICAgICAJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgc2F2ZUVudGl0eU1lbnVJdGVtLAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlRW50aXR5TWVudUl0ZW0sIAotICAgICAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlQWxsTWVudUl0ZW0sCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kRW50aXR5TWVudUl0ZW0sCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kQWxsTWVudUl0ZW0sCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdG9yZUVudGl0eU1lbnVJdGVtLAotICAgICAgICAgICAgCQkJCQkJCQkJIC8vYXBwbHlQYXR0ZXJuTWVudUl0ZW0sIAotICAgICAgICAgICAgCQkJCQkJCQkJIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudSwKLSAgICAgICAgICAgIAkJCQkJCQkJCSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSwKLSAgICAgICAgICAgIAkJCQkJCQkJCSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtfTsKLSAgICAgICAgICAgIAotICAgIAkJY3VzdG9tRmVhdHVyZSA9IG5ldyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgIAkJCi0gICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IHJlZmFjdG9yQXR0cmlidXRlVHlwZU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgICAgICByZWZhY3RvckF0dHJpYnV0ZVR5cGVNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yQXR0cmlidXRlVHlwZSk7Ci0gICAgICAgICAgICByZWZhY3RvckF0dHJpYnV0ZVR5cGVNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvckF0dHJpYnV0ZVR5cGVEZXNjKTsKLSAgICAgICAgICAgIHJlZmFjdG9yQXR0cmlidXRlVHlwZU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOyAgICAgICAgICAgICAgICAgICAKLQotICAgICAgICAJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgcmVmYWN0b3JDbGFzc1N1Ym1lbnUsIAotICAgICAgICAJCQkJCQkJCQkgcmVmYWN0b3JBdHRyaWJ1dGVUeXBlTWVudUl0ZW0sIAotICAgICAgICAJCQkJCQkJCQkgY29sbGFwc2VBbGxNZW51SXRlbSwKLSAgICAgICAgCQkJCQkJCQkJIGV4cGFuZEFsbE1lbnVJdGVtLAotICAgICAgICAJCQkJCQkJCQkgLy9hcHBseVBhdHRlcm5NZW51SXRlbSwgCi0gICAgICAgIAkJCQkJCQkJCSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSwKLSAgICAgICAgCQkJCQkJCQkJIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW19OwotICAgIAl9Ci0gICAgCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IHJlbW92ZUFsbEVudGl0aWVzU3VibWVudSwKLSAgICAJCQkJCQkJCQkgY29sbGFwc2VBbGxNZW51SXRlbSwKLSAgICAJCQkJCQkJCQkgZXhwYW5kQWxsTWVudUl0ZW0sIAotICAgIAkJCQkJCQkJCSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSwKLSAgICAJCQkJCQkJCQkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbX07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElDdXN0b21GZWF0dXJlIGdldERvdWJsZUNsaWNrRmVhdHVyZShJRG91YmxlQ2xpY2tDb250ZXh0IGNvbnRleHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXTsKLQkJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KAotCQkJCXBlKTsKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYm87Ci0JCQlJRmlsZSBmaWxlID0gKElGaWxlKSBqcGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXRyeSB7Ci0JCQkJZmlsZS5zZXRTZXNzaW9uUHJvcGVydHkobmV3IFF1YWxpZmllZE5hbWUobnVsbCwgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneS5ET1VCTEVfQ0xJQ0spLCAidHJ1ZSIpOwkvLyROT04tTkxTLTEkCQkJCi0JCQkJZmFjYWRlLmdldElERSgpLm9wZW5FZGl0b3IoZmlsZSk7Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgb3BlbiBlZGl0b3IiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CQkJCQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgb3BlbiBlZGl0b3IiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CQkJCQotCQkJfQotCQl9Ci0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkganB0LmdldFJlc291cmNlKCk7Ci0JCQl0cnkgewotCQkJCWZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuRE9VQkxFX0NMSUNLKSwgInRydWUiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWZhY2FkZS5nZXRJREUoKS5vcGVuRWRpdG9yKGZpbGUpOwotCQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IG9wZW4gZWRpdG9yIik7CS8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IG9wZW4gZWRpdG9yIik7CS8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkJCQkKLQkJCX0KLQkJfQotCQlpZiAoKGJvID09IG51bGwpICYmIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSkgewotCQkJSUN1c3RvbUNvbnRleHQgY29udCA9IG5ldyBDdXN0b21Db250ZXh0KAotCQkJCQluZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgcGUgfSk7Ci0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgcGU7Ci0JCQlpZiAoR3JhcGhpY3NVcGRhdGVyLmlzQ29sbGFwc2VkKGNvbnRhaW5lclNoYXBlKSkgewotCQkJCUV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlIGZlYXR1cmUgPSBuZXcgRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJZmVhdHVyZS5leGVjdXRlKGNvbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSgKLQkJCQkJCWdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQlmZWF0dXJlLmV4ZWN1dGUoY29udCk7Ci0JCQl9Ci0KLQkJfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RG91YmxlQ2xpY2tGZWF0dXJlKGNvbnRleHQpOwotCX0gICAJCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0Fic3RyYWN0UmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQWJzdHJhY3RSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWYxZjNlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQWJzdHJhY3RSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0UmVsYXRpb24gaW1wbGVtZW50cyBJUmVsYXRpb24gewotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICI7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXI7Ci0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlOwotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0KLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2h0YWJsZTxSZWxUeXBlLCBTdHJpbmc+IHJlbFR5cGVUb0lkUGFydCA9IG5ldyBIYXNodGFibGU8UmVsVHlwZSwgU3RyaW5nPigpOyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2h0YWJsZTxSZWxEaXIsIFN0cmluZz4gcmVsRGlyVG9JZFBhcnQgPSBuZXcgSGFzaHRhYmxlPFJlbERpciwgU3RyaW5nPigpOyAKLQkKLQlzdGF0aWMgewotCQlyZWxUeXBlVG9JZFBhcnQucHV0KFJlbFR5cGUuT05FX1RPX09ORSwgIjEtMSIpOyAvLyROT04tTkxTLTEkCi0JCXJlbFR5cGVUb0lkUGFydC5wdXQoUmVsVHlwZS5PTkVfVE9fTUFOWSwgIjEtTiIpOyAvLyROT04tTkxTLTEkCi0JCXJlbFR5cGVUb0lkUGFydC5wdXQoUmVsVHlwZS5NQU5ZX1RPX09ORSwgIk4tMSIpOyAvLyROT04tTkxTLTEkCi0JCXJlbFR5cGVUb0lkUGFydC5wdXQoUmVsVHlwZS5NQU5ZX1RPX01BTlksICJOLU4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcmVsRGlyVG9JZFBhcnQucHV0KFJlbERpci5VTkksICItPiIpOyAvLyROT04tTkxTLTEkCi0JCXJlbERpclRvSWRQYXJ0LnB1dChSZWxEaXIuQkksICI8LT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgQWJzdHJhY3RSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5pbnZlcnNlID0gaW52ZXJzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGdlbmVyYXRlSWQob3duZXIsIGludmVyc2UsIGdldE93bmVyQXR0cmlidXRlTmFtZSgpLCBnZXRSZWxUeXBlKCksIGdldFJlbERpcigpKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOyAKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJbnZlcnNlKCkgewotCQlyZXR1cm4gaW52ZXJzZTsgCi0JfQkKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5pbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckF0dHJpYnV0ZU5hbWUoU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSkgewotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRPd25lckF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlICE9IG51bGwpCi0JCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gb3duZXJBdHRyaWJ1dGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQXR0cmlidXRlTmFtZShTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5pbnZlcnNlQXR0cmlidXRlTmFtZSA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkgewotCQlpZiAodGhpcy5pbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlICE9IG51bGwpCi0JCQlyZXR1cm4gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCXJldHVybiBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldElkKCkuaGFzaENvZGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlclJlbCkgewotCQlpZiAoIUlSZWxhdGlvbi5jbGFzcy5pc0luc3RhbmNlKG90aGVyUmVsKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGdldElkKCkuZXF1YWxzKCgoSVJlbGF0aW9uKW90aGVyUmVsKS5nZXRJZCgpKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFJlbFR5cGUgZ2V0UmVsVHlwZSgpOyAKLQkKLQlwdWJsaWMgYWJzdHJhY3QgUmVsRGlyIGdldFJlbERpcigpOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlSWQoSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCQlSZWxUeXBlIHJlbFR5cGUsIAotCQkJCQkJCQkJUmVsRGlyIHJlbERpcikgewotCQlTdHJpbmcgaWQgPSBvd25lci5nZXROYW1lKCkgKyAiLSIgKyBpbnZlcnNlLmdldE5hbWUoKSArIFNFUEFSQVRPUiArICAvLyROT04tTkxTLTEkCi0JCQkJCXJlbFR5cGVUb0lkUGFydC5nZXQocmVsVHlwZSkgKyBTRVBBUkFUT1IgKwotCQkJCQlyZWxEaXJUb0lkUGFydC5nZXQocmVsRGlyKSArIFNFUEFSQVRPUiArIG93bmVyQXR0cmlidXRlTmFtZTsgCi0JCXJldHVybiBpZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0JpZGlyZWN0aW9uYWxSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmZiYzFmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotcHVibGljIGludGVyZmFjZSBCaWRpcmVjdGlvbmFsUmVsYXRpb24gZXh0ZW5kcyBJUmVsYXRpb24gewotCQotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSk7IAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9JUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvSVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTY4NDYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9JUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlbGF0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZW51bSBSZWxUeXBlIHsKLQkJT05FX1RPX09ORSwgT05FX1RPX01BTlksIE1BTllfVE9fT05FLCBNQU5ZX1RPX01BTlkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGVudW0gUmVsRGlyIHsKLQkJVU5JLCBCSQotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SWQoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0T3duZXIoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SW52ZXJzZSgpOwotCQotCXB1YmxpYyB2b2lkIHNldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKTsKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLQkJCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsKLQkJCQkKLQlwdWJsaWMgdm9pZCBzZXRPd25lckF0dHJpYnV0ZU5hbWUoU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSk7Ci0JCQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBdHRyaWJ1dGVOYW1lKFN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgUmVsVHlwZSBnZXRSZWxUeXBlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgUmVsRGlyIGdldFJlbERpcigpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55QmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55QmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjE2YWViLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueUJpRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbiBleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbiBpbXBsZW1lbnRzIEJpZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0JCi0JcHVibGljIE1hbnlUb01hbnlCaURpclJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLAotCQkJCQkJCQkgICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgICBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCAKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5pbnZlcnNlQXR0cmlidXRlTmFtZSA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwkJCi0JfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uI2dldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkKLQkgKi8KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uI2dldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKQotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLmludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3RJbnZlcnNlQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdEludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0SW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQkKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgdHJ1ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgaW52ZXJzZUNVKTsKLQkJCi0JCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KG93bmVyLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3RPd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihvd25lckF0dHJpYnV0ZU5hbWUpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE93bmVyQXR0cmlidXRlTmFtZSk7CQkJCQotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3RPd25lckF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCQotCQlpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBpbnZlcnNlLCBvd25lciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIHRydWUsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBvd25lckNVKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSwgaW52ZXJzZSwgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSk7CQkKLQl9IAkKLQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5CSTsKLQl9Ci0JCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgzM2I0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYW55VG9NYW55UmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uIHsKLQotCXB1YmxpYyBNYW55VG9NYW55UmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JfQotCQotCXB1YmxpYyBSZWxUeXBlIGdldFJlbFR5cGUoKSB7Ci0JCXJldHVybiBSZWxUeXBlLk1BTllfVE9fTUFOWTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmFkNmZiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gZXh0ZW5kcyBNYW55VG9NYW55UmVsYXRpb24gaW1wbGVtZW50cyBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHsKLQotCXB1YmxpYyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLAotCQkJCQkJCQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJCWJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJCUlDb21waWxhdGlvblVuaXQgb3duZXJDVSwKLQkJCQkJCQkJCUlDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7IAotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwkJCi0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCUlDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCVN0cmluZyBuYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJCi0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlTdHJpbmcgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIHRydWUsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG93bmVyQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb01hbnlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQkKLQl9IAotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzJjMmUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVCaURpclJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lQmlEaXJSZWxhdGlvbiAgZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbiBpbXBsZW1lbnRzIEJpZGlyZWN0aW9uYWxSZWxhdGlvbnsKLQotCXB1YmxpYyBNYW55VG9PbmVCaURpclJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJCQkJCQkgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5pbnZlcnNlQXR0cmlidXRlTmFtZSA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwotCQkKLQl9CQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGludmVyc2UuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdE5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQkKLQkJbmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3Qob3duZXIuZ2V0TmFtZSgpKTsKLQkJYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShvd25lcikpOwkKLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKTsJCQkJCi0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoaW52ZXJzZSkpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCQotCQlpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBpbnZlcnNlLCBvd25lciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIHRydWUsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBvd25lckNVKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb09uZUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlLCBpbnZlcnNlLCBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsJCQotCX0gCQotCQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5CSTsKLQl9Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGYxMzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgTWFueVRvT25lUmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uewotCi0JcHVibGljIE1hbnlUb09uZVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCX0KLQkKLQlwdWJsaWMgUmVsVHlwZSBnZXRSZWxUeXBlKCkgewotCQlyZXR1cm4gUmVsVHlwZS5NQU5ZX1RPX09ORTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lVW5pRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg3YzM5Zi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVVuaURpclJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbiBleHRlbmRzIE1hbnlUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgTWFueVRvT25lVW5pRGlyUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsCi0JCQkJCQkJCSAgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewkJCi0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9CQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBhbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGludmVyc2UuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdE5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcgk9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQkKLQkJLy9mcC5hZGRBZGRJZ25vcmUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKTsKLQkJCi0JfQotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9NYW55UmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM1ZTcxMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPbmVUb01hbnlSZWxhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVsYXRpb24gewotCQotCXB1YmxpYyBPbmVUb01hbnlSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQl9Ci0JCi0JcHVibGljIFJlbFR5cGUgZ2V0UmVsVHlwZSgpIHsKLQkJcmV0dXJuIFJlbFR5cGUuT05FX1RPX01BTlk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVVuaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTUxOTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55VW5pRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbiBpbXBsZW1lbnRzIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gewotCi0JcHVibGljIE9uZVRvTWFueVVuaURpclJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLAotCQkJCQkJCQkgICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgICBib29sZWFuIGNyZWF0ZUF0dHJpYnMsIAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9CQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0KLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJCi0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgdHJ1ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG93bmVyQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGludmVyc2VDVSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSk7Ci0JfSAKLQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5VTkk7Ci0JfQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZUJpRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTU0OTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZUJpRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBPbmVUb09uZUJpRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgQmlkaXJlY3Rpb25hbFJlbGF0aW9uewotCXB1YmxpYyBPbmVUb09uZUJpRGlyUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBib29sZWFuIGNyZWF0ZUF0dHJpYnMsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGludmVyc2UuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdE5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCi0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlTdHJpbmcgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJCi0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgZmFsc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQkKLQkJbmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3Qob3duZXIuZ2V0TmFtZSgpKTsKLQkJYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShvd25lcikpOwotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwkJCi0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoaW52ZXJzZSkpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3ROYW1lKTsKLQkJfQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBpbnZlcnNlLCBvd25lciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpbnZlcnNlQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSk7Ci0JCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlLCBpbnZlcnNlLCBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsJCQotCX0gCQotCQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5CSTsKLQl9CQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMTlmMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIE9uZVRvT25lUmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uIHsKLQkKLQlwdWJsaWMgT25lVG9PbmVSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQl9Ci0JCi0JcHVibGljIFJlbFR5cGUgZ2V0UmVsVHlwZSgpIHsKLQkJcmV0dXJuIFJlbFR5cGUuT05FX1RPX09ORTsKLQl9Ci0JCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZVVuaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM3YzllMy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE9uZVRvT25lVW5pRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgT25lVG9PbmVVbmlEaXJSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJICBTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywgCi0JCQkJCQkJCSAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkgIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7IAotCQlpZiAoY3JlYXRlQXR0cmlicykgCi0JCQljcmVhdGVSZWxhdGlvbihmcCwgb3duZXJDVSwgaW52ZXJzZUNVKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJCi0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgZmFsc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSk7Ci0JCQotCX0gCi0JCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQkKLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9VbmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL1VuaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmYjg1YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL1VuaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gZXh0ZW5kcyBJUmVsYXRpb24gewotCQotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpOwotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0VudGl0eUNoYW5nZUxpc3RlbmVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdHlDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjExNDkxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0VudGl0eUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgRW50aXR5Q2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBUaHJlYWQgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFBBVVNFX0RVUkFUSU9OID0gMjUwOwotCXByaXZhdGUgYm9vbGVhbiBnb09uID0gdHJ1ZTsKLQlwcml2YXRlIEpQQVNvbHZlciBzb2x2ZXI7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlwcml2YXRlIFNldDxTdHJpbmc+IGpwdHNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsgCi0JcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBQZXJzaXN0ZW5jZVVuaXQ+IGF0dHJpYnNUb1VwZGF0ZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBQZXJzaXN0ZW5jZVVuaXQ+KCk7IAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICI7IjsJCS8vJE5PTi1OTFMtMSQKLQkKLQlFbnRpdHlDaGFuZ2VMaXN0ZW5lcihKUEFTb2x2ZXIgc29sdmVyKSB7Ci0JCXRoaXMuc29sdmVyID0gc29sdmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlUHJvdmlkZXIoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIpIHsKLQkJdGhpcy5mZWF0dXJlUHJvdmlkZXIgPSBmZWF0dXJlUHJvdmlkZXI7Ci0JfQotCQkJCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJVXBkYXRlRnJvbU1vZGVsIHRhc2tDbGFzcyA9IG5ldyBVcGRhdGVGcm9tTW9kZWwoKTsKLQkJd2hpbGUgKGdvT24pIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRocmVhZCBzbGVlcCBpbnRlcnJ1cHJ0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWModGFza0NsYXNzKTsKLQkJfQotCQlzb2x2ZXIgPSBudWxsOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wVGhyZWFkKCkgewotCQlnb09uID0gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEpQVEZvclVwZGF0ZShTdHJpbmcganB0TmFtZSkgewotCQlzeW5jaHJvbml6ZWQgKGpwdHNUb1VwZGF0ZSkgewotCQkJanB0c1RvVXBkYXRlLmFkZChqcHROYW1lKTsKLQkJfQotCX0KLQkJCQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KSB7Ci0JCXN5bmNocm9uaXplZCAoYXR0cmlic1RvVXBkYXRlKSB7Ci0JCQlhdHRyaWJzVG9VcGRhdGUucHV0KGVudEF0TWFwcGVkQnksIHB1KTsKLQkJfQotCX0KLQkJCQotCXByaXZhdGUgY2xhc3MgVXBkYXRlRnJvbU1vZGVsIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlleGVjKCk7Ci0JCX0KLQotCQkKLQkJcHJpdmF0ZSB2b2lkIGV4ZWMoKSB7Ci0JCQl0cnkgewotCQkJCXN5bmNocm9uaXplZCAoanB0c1RvVXBkYXRlKSB7Ci0JCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRyID0ganB0c1RvVXBkYXRlLml0ZXJhdG9yKCk7Ci0JCQkJCWlmIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTdHJpbmcganB0TmFtZSA9IGl0ci5uZXh0KCk7Ci0JCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkoanB0TmFtZSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbWFrZVJlbGF0aW9ucyhmZWF0dXJlUHJvdmlkZXIsIG51bGwsIGpwdCk7Ci0JCQkJCQkJanB0c1RvVXBkYXRlLnJlbW92ZShqcHROYW1lKTsKLQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkge30gCi0JCQkJCX0KLQkJCQl9Ci0JCQkJQ29sbGVjdGlvbjxPYmplY3Q+IHZhbHMgPSBzb2x2ZXIuZ2V0VmlzdWFsaXplZE9iamVjdHMoKTsKLQkJCQlJdGVyYXRvcjxPYmplY3Q+IGl0ID0gdmFscy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlvOwotCQkJCQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChvKTsKLQkJCQkJCWlmIChlbnRTaGFwZSA9PSBudWxsKSAKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQkJCQkJUGVyc2lzdGVudFR5cGUgcHQgPSBwdS5nZXRQZXJzaXN0ZW50VHlwZShqcHQuZ2V0TmFtZSgpKTsKLQkJCQkJCQotCQkJCQkJaWYgKChwdCA9PSBudWxsKSB8fCAhSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaGFzRW50aXR5QW5ub3RhdGlvbihqcHQpKSB7Ci0JCQkJCQkJCi0JCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZm9yY2VTYXZlRW50aXR5Q2xhc3MoanB0LCBmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQkJCQotCQkJCQkJCWlmKGpwdC5nZXRNYXBwaW5nKCkgPT0gbnVsbCB8fCAoanB0LmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpKSB7Ci0JCQkJCQkJCWlmICghSnB0SnBhQ29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoanB0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJCQkJCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZVVucmVnaXN0ZXJFbnRpdHlGcm9tWE1MSm9iKGpwdC5nZXRKcGFQcm9qZWN0KCksIGpwdC5nZXROYW1lKCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoZW50U2hhcGUpOwotCQkJCQkJCVJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9IGVsc2UgewkKLQkJCQkJCQkKLQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCQkJCVN0cmluZyBlbnROYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCkpOyAKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBTdHJpbmcgbmV3SGVhZGVyID0gKGN1Lmhhc1Vuc2F2ZWRDaGFuZ2VzKCkgPyAiKiAiIDogIiIpICsgZW50TmFtZTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUhlYWRlcihlbnRTaGFwZSwgbmV3SGVhZGVyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJCQkJCQkKLQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBjaGVjayBjb21waWxhdGlvbiB1bml0IGZvciB1bnNhdmVkIGNoYW5nZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQkJCi0JCQkJc3luY2hyb25pemVkIChhdHRyaWJzVG9VcGRhdGUpIHsKLQkJCQkJU2V0PFN0cmluZz4gYXRTZXQgPSBhdHRyaWJzVG9VcGRhdGUua2V5U2V0KCk7Ci0JCQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGF0U2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGpwdEF0TUIgPSBpdGVyLm5leHQoKTsKLQkJCQkJCVN0cmluZ1tdIGpwdEFuZEF0dHJpYiA9IGpwdEF0TUIuc3BsaXQoU0VQQVJBVE9SKTsgCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBhdHRyaWJzVG9VcGRhdGUuZ2V0KGpwdEF0TUIpOwotCQkJCQkJU3RyaW5nIGVudGl0eU5hbWUgPSBqcHRBbmRBdHRyaWJbMF07Ci0JCQkJCQlTdHJpbmcgYXR0cmliTmFtZSA9IGpwdEFuZEF0dHJpYlsxXTsKLQkJCQkJCVN0cmluZyBtYXBwZWRCeSA9IGpwdEFuZEF0dHJpYlsyXTsKLQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXB1LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eU5hbWUpOwotCQkJCQkJaWYgKGpwdCAhPSBudWxsKSB7Ci0JCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYk5hbWUpOwotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBqcHQpOwotCQkJCQkJCWlmIChqcGEgIT0gbnVsbCkgewotCQkJCQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0ganBhLmdldE1hcHBpbmcoKTsKLQkJCQkJCQkJQW5ub3RhdGlvbiBhID0gbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJCQkJCQlpZihhID09IG51bGwpewotCQkJCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZlYXR1cmVQcm92aWRlciwganB0KTsKLQkJCQkJCQkJCW1hcHBpbmcgPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCQkJCQkJYSA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAoYSA9PSBudWxsKQotCQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCQlpZiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKSkgewotCQkJCQkJCQkJSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IChKYXZhUmVsYXRpb25zaGlwTWFwcGluZyltYXBwaW5nOyAKLQkJCQkJCQkJCU1hcHBlZEJ5UmVsYXRpb25zaGlwIG93bmFibGVSZWYgPSAoTWFwcGVkQnlSZWxhdGlvbnNoaXApcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCQkJCQkJCWlmICghb3duYWJsZVJlZi5zdHJhdGVneUlzTWFwcGVkQnkoKSkgewotCQkJCQkJCQkJICAgIG93bmFibGVSZWYuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlvd25hYmxlUmVmLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShtYXBwZWRCeSk7CQkJCQkJCQkJCi0JCQkJCQkJCQlhdHRyaWJzVG9VcGRhdGUucmVtb3ZlKGpwdEF0TUIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQgCi0JCQl9CQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTZhMWQ2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHMuU2hhcGVUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaGljc1VwZGF0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBSSU1BUllfU0hBUEVfSU5ERVggPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTl9TSEFQRV9DT05TVEFOVCA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0lDX1NIQVBFX0lOREVYID0gNTsKLQotCXB1YmxpYyBzdGF0aWMgaW50IGluY3JlYXNlQ29tcGFydG1lbnRIZWlndGgoQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCWZvcihTaGFwZSBzaGFwZSA6IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCkpewotCQkJSXRlcmF0b3I8R3JhcGhpY3NBbGdvcml0aG0+IGl0ZXJhdG9yID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSl7Ci0JCQkgICAgaWYoaXRlcmF0b3IubmV4dCgpIGluc3RhbmNlb2YgVGV4dCkKLQkJCSAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0ICsgSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhaW5lcihDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgCi0JCQlpbnQgY2hpbGRyZW5TaXplQmVmb3JlLCBpbnQgY29udGFpbmVySGVpZ2h0QmVmb3JlKXsKLQkJaW50IGNoaWxkcmVuU2l6ZUFmdGVyID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0JCWludCBjb250YWluZXJIZWlnaHRBZnRlciA9IDA7Ci0JCWlmKGNoaWxkcmVuU2l6ZUJlZm9yZSA9PSAyKXsKLQkJCQljb250YWluZXJIZWlnaHRCZWZvcmUgPSBKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfTUlOX0hFSUdIVCArIEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9CVVRUT01fT0ZGU0VUOwotCQl9Ci0JCWNvbnRhaW5lckhlaWdodEFmdGVyID0gY29udGFpbmVySGVpZ2h0QmVmb3JlICsgKCgoY2hpbGRyZW5TaXplQWZ0ZXIgLSBjaGlsZHJlblNpemVCZWZvcmUpLzIpKkpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQKTsKLQkJCi0JCWlmKCFpc0NvbGxhcHNlZChjb250YWluZXJTaGFwZSkpCi0JCQljb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldEhlaWdodChjb250YWluZXJIZWlnaHRBZnRlcik7Ci0JCWVsc2UgCi0JCQljb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfTUlOX0hFSUdIVCk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVFbnRpdHlTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSl7Ci0JCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSA9IGdldFByaW1hcnlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSBnZXRSZWxhdGlvblNoYXBlKGVudGl0eVNoYXBlKTsKLQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IGdldEJhc2ljU2hhcGUoZW50aXR5U2hhcGUpOwotCQkKLQkJcHJpbWFyeVNoYXBlLnNldFZpc2libGUoIWlzRW1wdHlDb21wYXJ0bWVudChwcmltYXJ5U2hhcGUpKTsKLQkJYmFzaWNTaGFwZS5zZXRWaXNpYmxlKCFpc0VtcHR5Q29tcGFydG1lbnQoYmFzaWNTaGFwZSkpOwotCQlyZWxhdGlvblNoYXBlLnNldFZpc2libGUoIWlzRW1wdHlDb21wYXJ0bWVudChyZWxhdGlvblNoYXBlKSk7Ci0KLSAgICAgICAgcmVsYXRpb25TaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldFkoZ2V0TmV4dENvbXBhcnRtZW50WShwcmltYXJ5U2hhcGUpKTsKLSAgICAgICAgYmFzaWNTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldFkoZ2V0TmV4dENvbXBhcnRtZW50WShyZWxhdGlvblNoYXBlKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5Q29tcGFydG1lbnQoQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlKSB7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCkgPD0gMjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUVudGl0eUhlaWd0aChDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSl7Ci0JCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpOwotCQlDb250YWluZXJTaGFwZSByZWxhdGlvblNoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldFJlbGF0aW9uU2hhcGUoZW50aXR5U2hhcGUpOwotCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoZW50aXR5U2hhcGUpOwotCQkKLSAgICAgICAgZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUICsgCi0gICAgICAgIAkJcHJpbWFyeVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKyByZWxhdGlvblNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkKLSAgICAgICAgCQkrIGJhc2ljU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIDIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGludCBnZXROZXh0Q29tcGFydG1lbnRZKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpewotCQlpZihpc0VtcHR5Q29tcGFydG1lbnQoY29tcGFydG1lbnRTaGFwZSkpCi0JCQlyZXR1cm4gY29tcGFydG1lbnRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJcmV0dXJuIGNvbXBhcnRtZW50U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCkgKyBjb21wYXJ0bWVudFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250YWluZXJTaGFwZSBnZXRQcmltYXJ5U2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpewotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGVudGl0eVNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWlmKGNoaWxkcmVuLnNpemUoKSA8IFBSSU1BUllfU0hBUEVfSU5ERVgrMSkKLQkJCXJldHVybiBudWxsOwotCQlHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBjaGlsZHJlbi5nZXQoUFJJTUFSWV9TSEFQRV9JTkRFWCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gKENvbnRhaW5lclNoYXBlKUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGFsZyk7Ci0JCXJldHVybiBwcmltYXJ5U2hhcGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29udGFpbmVyU2hhcGUgZ2V0Q29tcGFydG1lbnRTZXBhcmF0b3JTaGFwZShDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlKXsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpLmdldCgwKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2VwYXJhdG9yU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGFsZyk7Ci0JCXJldHVybiBwcmltYXJ5U2VwYXJhdG9yU2hhcGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29udGFpbmVyU2hhcGUgZ2V0UmVsYXRpb25TaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSl7Ci0JCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZW50aXR5U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYoY2hpbGRyZW4uc2l6ZSgpPFJFTEFUSU9OX1NIQVBFX0NPTlNUQU5UKzEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gY2hpbGRyZW4uZ2V0KFJFTEFUSU9OX1NIQVBFX0NPTlNUQU5UKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlDb250YWluZXJTaGFwZSByZWxhdGlvblNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBY3RpdmVDb250YWluZXJQZShhbGcpOwotCQlyZXR1cm4gcmVsYXRpb25TaGFwZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb250YWluZXJTaGFwZSBnZXRCYXNpY1NoYXBlKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKXsKLQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBlbnRpdHlTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlpZihjaGlsZHJlbi5zaXplKCkgPCBCQVNJQ19TSEFQRV9JTkRFWCsxKQotCQkJcmV0dXJuIG51bGw7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IGNoaWxkcmVuLmdldChCQVNJQ19TSEFQRV9JTkRFWCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoYWxnKTsKLQkJcmV0dXJuIGJhc2ljU2hhcGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbGxhcHNlZChDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlKSB7Ci0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lciA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0UHJpbWFyeVNoYXBlKGNvbnRhaW5lcikpKQotCQkJcmVzdWx0ID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5QUklNQVJZX0NPTExBUFNFRCk7Ci0JCWVsc2UgaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoY29udGFpbmVyKSkpCi0JCQlyZXN1bHQgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLkJBU0lDX0NPTExBUFNFRCk7Ci0JCWVsc2UgaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldFJlbGF0aW9uU2hhcGUoY29udGFpbmVyKSkpCi0JCQlyZXN1bHQgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0NPTExBUFNFRCk7Ci0JCWlmKEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkuZXF1YWxzKHJlc3VsdCkpIAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbXBhcnRtZW50U2hhcGUKLQkgKiBAcGFyYW0gY29sbGFwc2VkIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNldENvbGxhcHNlZChDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlLCBib29sZWFuIGNvbGxhcHNlZCkgewotCQlDb250YWluZXJTaGFwZSBjb250YWluZXIgPSBjb21wYXJ0bWVudFNoYXBlLmdldENvbnRhaW5lcigpOwotCQlpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0UHJpbWFyeVNoYXBlKGNvbnRhaW5lcikpKSB7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1BUllfQ09MTEFQU0VELCBCb29sZWFuLnRvU3RyaW5nKGNvbGxhcHNlZCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShjb250YWluZXIpKSkgewotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShjb250YWluZXIsIEpQQUVkaXRvckNvbnN0YW50cy5CQVNJQ19DT0xMQVBTRUQsIEJvb2xlYW4udG9TdHJpbmcoY29sbGFwc2VkKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGNvbnRhaW5lcikpKSB7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0NPTExBUFNFRCwgQm9vbGVhbi50b1N0cmluZyhjb2xsYXBzZWQpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUhlYWRlcihDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgZmluYWwgU3RyaW5nIG5ld0hlYWRlcikgewotCQlpZihlbnRpdHlTaGFwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdDxTaGFwZT4gc2hhcGVzID0gZW50aXR5U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3I8U2hhcGU+IHNoSXQgPSBzaGFwZXMuaXRlcmF0b3IoKTsKLQkJU2hhcGUgaGVhZGVyU2hhcGUgPSBudWxsOzsKLQkJd2hpbGUgKHNoSXQuaGFzTmV4dCgpKSB7Ci0JCQloZWFkZXJTaGFwZSA9IHNoSXQubmV4dCgpOwotCQkJU3RyaW5nIHNoYXBlVHlwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoaGVhZGVyU2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUpOwotCQkJaWYgKFNoYXBlVHlwZS5IRUFERVIudG9TdHJpbmcoKS5lcXVhbHMoc2hhcGVUeXBlKSkgCi0JCQkJYnJlYWs7Ci0JCQloZWFkZXJTaGFwZSA9IG51bGw7Ci0JCX0KLQkJaWYgKGhlYWRlclNoYXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gaGVhZGVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJaWYgKGdhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIFRleHQgdHh0ID0gKFRleHQpZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJaWYgKCF0eHQuZ2V0VmFsdWUoKS5lcXVhbHMobmV3SGVhZGVyKSkgewotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4odHh0KTsKLQkJCVJlY29yZGluZ0NvbW1hbmQgcmMgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCXR4dC5zZXRWYWx1ZShuZXdIZWFkZXIpOwkJCi0JCQkJfQkJCi0JCQl9OwkJCQotCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUocmMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVySW1wbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDc4OGE5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLQotcHVibGljIGNsYXNzIEdyYXBoaWNzVXBkYXRlckltcGwgaW1wbGVtZW50cyBJR3JhcGhpY3NVcGRhdGVyIHsKLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbnRpdHlIZWlndGgoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpIHsKLQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eUhlaWd0aChlbnRpdHlTaGFwZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSURpc3BsYXlGYWNhZGUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lEaXNwbGF5RmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWQ2ZGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSURpc3BsYXlGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURpc3BsYXlGYWNhZGUgewotCi0JcHVibGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lFY2xpcHNlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRWNsaXBzZUZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzU3MTY2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lFY2xpcHNlRmFjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLQotcHVibGljIGludGVyZmFjZSBJRWNsaXBzZUZhY2FkZSB7Ci0KLQlwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKTsKLQotCXB1YmxpYyBJSmF2YUNvcmVGYWNhZGUgZ2V0SmF2YUNvcmUoKTsKLQkKLQlwdWJsaWMgSURpc3BsYXlGYWNhZGUgZ2V0RGlzcGxheSgpOwotCQotCXB1YmxpYyBJU3RhdGljSURFIGdldElERSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUdyYXBoaWNzVXBkYXRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUdyYXBoaWNzVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I0ODQ0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lHcmFwaGljc1VwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLQotcHVibGljIGludGVyZmFjZSBJR3JhcGhpY3NVcGRhdGVyIHsKLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbnRpdHlIZWlndGgoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpOwotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNDA5YmIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElKUEFEaWFncmFtRWRpdG9ySW5wdXQgZXh0ZW5kcyBJRWRpdG9ySW5wdXQgewotCQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFFZGl0b3JVdGlsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQyNDc4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFFZGl0b3JVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvci5SZWxFbmREaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQUVkaXRvclV0aWwgewotCQotCXB1YmxpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCBib29sZWFuIHNlbGZSZWxhdGlvbik7Ci0JCi0JcHVibGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3QoRnJlZUZvcm1Db25uZWN0aW9uIGMsIGJvb2xlYW4gc2VsZlJlbGF0aW9uKTsKLQkKLQlwdWJsaWMgaW50IGNhbGNDb25uZWN0aW9uTGVuZ3RoKEZyZWVGb3JtQ29ubmVjdGlvbiBjKTsKLQkKLQlwdWJsaWMgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25TdGFydERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYyk7Ci0JCi0JcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKTsKLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEpQVHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KTsKLQkKLQlwdWJsaWMgdm9pZCBvcmdhbml6ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpOwotCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KTsKLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXRDb2RlKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJICBTdHJpbmcgcGFjaywgCi0JCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApOwotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsCi0JCQlTdHJpbmcgcGFjaywgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCk7Ci0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIAotCQkJCQkJCQkJICAgU3RyaW5nIGVudGl0eU5hbWUsIAotCQkJCQkJCQkJICAgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUsCi0JCQkJCQkJCQkgICBib29sZWFuIGlzTWFwcGVkU3VwZXJDbGFzc0NoaWxkLCAKLQkJCQkJCQkJCSAgIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgCi0JCQkJCQkJCQkgICBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIAotCQkJCQkJCQkJICAgYm9vbGVhbiBoYXNQcmltYXJ5S2V5KSB0aHJvd3MgRXhjZXB0aW9uOwotCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsIElQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlKSB0aHJvd3MgRXhjZXB0aW9uOwotCQotCXB1YmxpYyBib29sZWFuIGlzQ2FyZGluYWxpdHlEZWNvcmF0b3IoQ29ubmVjdGlvbkRlY29yYXRvciBjZCk7Ci0JCi0JcHVibGljIHZvaWQgZGlzY2FyZFdvcmtpbmdDb3B5T25jZShJQ29tcGlsYXRpb25Vbml0IGN1KTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKYXZhQ29yZUZhY2FkZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUphdmFDb3JlRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzE2OTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUphdmFDb3JlRmFjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLQotcHVibGljIGludGVyZmFjZSBJSmF2YUNvcmVGYWNhZGUgewotCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKcGFTb2x2ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKcGFTb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4ZDAxZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSnBhU29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuSUluZGVwZW5kZW5jZVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpwYVNvbHZlciBleHRlbmRzIElJbmRlcGVuZGVuY2VTb2x2ZXIgewotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVyKAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVBlU2VydmljZVV0aWwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lQZVNlcnZpY2VVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWEwYzkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVBlU2VydmljZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5Qcm9wZXJ0eUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBlU2VydmljZVV0aWwgewotCi0JcHVibGljIEZyZWVGb3JtQ29ubmVjdGlvbiBjcmVhdGVGcmVlRm9ybUNvbm5lY3Rpb24oRGlhZ3JhbSBkaWFncmFtKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXkpOwotCQotCXB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSk7Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUHJvcGVydHkoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXkpOyAKLQkJCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVN0YXRpY0lERS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVN0YXRpY0lERS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDRlZTBlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lTdGF0aWNJREUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0YXRpY0lERSB7Ci0KLQlwdWJsaWMgdm9pZCBvcGVuRWRpdG9yKElGaWxlIGZpbGUpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUNoZWNrU3VtLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFDaGVja1N1bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGQ3Y2E1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUNoZWNrU3VtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotCi1wdWJsaWMgY2xhc3MgSlBBQ2hlY2tTdW0gewotCQotCXByaXZhdGUgc3RhdGljIEpQQUNoZWNrU3VtIGluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1kNSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSlBBQ2hlY2tTdW0gSU5TVEFOQ0UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW1kNSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOwkvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ291bGRuJ3QgY3JlYXRlIGluc3RhbmNlIG9mIE1ENSIpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpbnN0YW5jZSA9IG5ldyBKUEFDaGVja1N1bSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsgCi0JfQotCQkKLQlwdWJsaWMgU3RyaW5nIGdldFNhdmVkU2hhcGVNRDUoU2hhcGUgc2gpIHsJCi0JCVN0cmluZyBjaGVja1N1bVN0cmluZyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0VOVElUWV9DSEVDS1NVTSk7Ci0JCWlmIChjaGVja1N1bVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JCXJldHVybiBjaGVja1N1bVN0cmluZzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYXNzaWduRW50aXR5U2hhcGVzTUQ1U3RyaW5ncyhEaWFncmFtIGQsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCUxpc3Q8U2hhcGU+IHBpY3RzID0gZC5nZXRDaGlsZHJlbigpOwotCQlpZiAocGljdHMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHBpY3RzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHBpY3QgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfRU5USVRZX0NMQVNTX05BTUUpOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpQVChuYW1lLCBwdSk7Ci0JCQlTdHJpbmcgaGFzaCA9ICIiOwkvLyROT04tTkxTLTEkCi0JCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSlBBRWRpdG9yVXRpbC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCQloYXNoID0gZ2VuZXJhdGVDb21waWxhdGlvblVuaXRNRDVTdHJpbmcoY3UpOwotCQkJfQotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0hFQ0tTVU0sIGhhc2gpOwotCQl9Ci0JfQotCi0JCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDb21waWxhdGlvblVuaXRNRDVTdHJpbmcoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlTdHJpbmcgc3JjID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNyYyA9IGN1LmdldFNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBnZXQgdGhlIHNvdXJjZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCIpOwkvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwkKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWJ5dGVbXSByZXMgPSBtZDUuZGlnZXN0KHNyYy5nZXRCeXRlcygpKTsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoYnl0ZSBiIDogcmVzKQotCQkJc2IuYXBwZW5kKEJ5dGUudG9TdHJpbmcoYikpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsJCQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eU1vZGVsQ2hhbmdlZChTaGFwZSBzaCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJU3RyaW5nIG5hbWUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKUFQobmFtZSwgcHUpOwotCQlTdHJpbmcgc2F2ZWRNRDUgPSBnZXRTYXZlZFNoYXBlTUQ1KHNoKTsJCi0JCVN0cmluZyBhY3R1YWxNRDUgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJYWN0dWFsTUQ1ID0gZ2VuZXJhdGVDb21waWxhdGlvblVuaXRNRDVTdHJpbmcoY3UpOwotCQl9Ci0JCXJldHVybiAhc2F2ZWRNRDUuZXF1YWxzKGFjdHVhbE1ENSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaWZmZXJlbnRGcm9tRGlhZ3JhbShEaWFncmFtIGQsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlMaXN0PFNoYXBlPiBwaWN0cyA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKHBpY3RzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSBwaWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBwaWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGlzRW50aXR5TW9kZWxDaGFuZ2VkKHBpY3QsIGpwYVByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JDb25zdGFudHMuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ4NTM3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5Db2xvckNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gQU5OT1RBVElPTl9OQU1FX1RPX0tFWSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBDQVJESU5BTElUWV9MQUJFTFMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MTEFQU0VfRkVBVFVSRVMgPSAiY29sbGFwc2VGZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IEVOVElUWV9URVhUX0ZPUkVHUk9VTkQgPQotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCgwLCAwLCA1MSk7Ci0JCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgRU5USVRZX0JBQ0tHUk9VTkQgPQotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCgyMTIsIDIzMSwgMjQ4KTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgQ09OTkVDVElPTl9MSU5FX0NPTE9SID0gCi0gICAgICAgIG5ldyBDb2xvckNvbnN0YW50KDk4LCAxMzEsMTY3KTsJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29sb3JDb25zdGFudCBFTlRJVFlfQk9SREVSX0NPTE9SID0gCi0gICAgICAgIG5ldyBDb2xvckNvbnN0YW50KDk4LCAxMzEsMTY3KTsJCQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRSVUVfU1RSSU5HID0gQm9vbGVhbi50b1N0cmluZyh0cnVlKTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05ORUNUSU9OX0xJTkVfV0lEVEggPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9CT1JERVJfV0lEVEggPSAyOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9DT1JORVJfV0lEVEggPSA2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9DT1JORVJfSEVJR0hUID0gNjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTUlOX0hFSUdIVCA9IDMwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9NSU5fV0lEVEggPSA1MDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfV0lEVEggPSAxMjA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5USVRZX0hFSUdIVCA9IDcwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURV9SRUNUX0hFSUdIVCA9IDMwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVNfVE9QX09GRlNFVCA9IDE1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVAgPSAyMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfVEVYVF9SRUNUX1ggPSAyMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIgPSAyMTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfTEVGVF9PRkZTRVQgPSAwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fSEVBREVSX1ggPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fSEVBREVSX1kgPSA3OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9JQ09OX1JFQ1RfV0lEVEggPSAyNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfSUNPTl9SRUNUX0hFSUdIVCA9IDI0OyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfVEVYVF9SRUNUX0hFSUdIVCA9IDIxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9URVhUX1JFQ1RfWCA9IDI1OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEhFQURFUl9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUiA9IDI1OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fWCA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9ZID0gNDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1dJRFRIID0gMTY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9IRUlHSFQgPSAxNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfV0lEVEggPSAyMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1JFQ1RfSEVJR0hUID0gMjA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU0VQQVJBVE9SX0hFSUdIVCA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09NUEFSVE1FTlRfTUlOX0hFSUdIVCA9IDEzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTVBBUlRNRU5UX0JVVFRPTV9PRkZTRVQgPSA1OwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fQkFTSUMgPSAiQmFzaWMiOyAJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0lEID0gIklkIjsgCQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fT05FX1RPX09ORSA9ICJPbmVUb09uZSI7IAkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX09ORV9UT19NQU5ZID0gIk9uZVRvTWFueSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fTUFOWV9UT19PTkUgPSAiTWFueVRvT25lIjsgCQkvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkgPSAiTWFueVRvTWFueSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fVkVSU0lPTiA9ICJWZXJzaW9uIjsgCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0VNQkVEREVEID0gIkVtYmVkZGVkIjsgCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fRU1CRURERURfSUQgPSAiRW1iZWRkZWRJZCI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fVFJBTlNJRU5UID0gIlRyYW5zaWVudCI7IAkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwgPSAyOwotCQotCXB1YmxpYyBzdGF0aWMgSGFzaFNldDxTdHJpbmc+IFJFTEFUSU9OX0FOTk9UQVRJT05TID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfRU5USVRZX0NMQVNTX05BTUUgPSAicHJvcF9lbnRpdHlfY2xhc3NfbmFtZSI7CS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX1NIQVBFX1RZUEUgPSAicHJvcF9zaGFwZV90eXBlIjsJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfQVRUUklCU19OVU0gPSAicHJvcF9hdHRyaWJzX251bSI7CQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX1NQRUNJRklFRF9OQU1FID0gInNwZWNpZmllZE5hbWUiOwkJLy8kTk9OLU5MUy0xJAotCQkKLQlwdWJsaWMgc3RhdGljIGVudW0gRGVjb3JhdG9yVHlwZSB7Ci0JCUNBUkRJTkFMSVRZLAotCQlBU1NPQ0lBVElPTgotCX0KLQotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9DT05fRElSX1NUQVJUID0gInByb3BfY29uX2Rpcl9zdGFydCI7CQkJLy8kTk9OLU5MUy0xJAotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9DT05fRElSX0VORCA9ICJwcm9wX2Nvbl9kaXJfZW5kIjsJCQkJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX1ZJRVdfSlBBX0RFVEFJTFMgPSAib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IjsJCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURfVklFV19NSU5JQVRVUkUgPSAib3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuZWRpdG9yLnRodW1ibmFpbHZpZXciOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FSRElOQUxJVFlfWkVST19PTkUgPSAiMC4uMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQVJESU5BTElUWV9PTkUgPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQVJESU5BTElUWV9aRVJPX04gPSAiMC4uTiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGVudW0gU2hhcGVUeXBlIHtJQ09OLCBIRUFERVIsIEFUVFJJQlVURSwgQ09NUEFSVE1FTlR9OwotCQotCXN0YXRpYyB7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fQkFTSUMsIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fSUQsIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fT05FX1RPX09ORSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX09ORV9UT19NQU5ZLCBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX01BTllfVE9fT05FLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX01BTllfVE9fTUFOWSwgTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUFOTk9UQVRJT05fTkFNRV9UT19LRVkucHV0KEFOTk9UQVRJT05fVkVSU0lPTiwgTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0VNQkVEREVELCBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0VNQkVEREVEX0lELCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX1RSQU5TSUVOVCwgTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlSRUxBVElPTl9BTk5PVEFUSU9OUy5hZGQoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSk7Ci0JCVJFTEFUSU9OX0FOTk9UQVRJT05TLmFkZChKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpOwkKLQkJCi0JCUNBUkRJTkFMSVRZX0xBQkVMUy5hZGQoQ0FSRElOQUxJVFlfWkVST19PTkUpOwotCQlDQVJESU5BTElUWV9MQUJFTFMuYWRkKENBUkRJTkFMSVRZX09ORSk7Ci0JCUNBUkRJTkFMSVRZX0xBQkVMUy5hZGQoQ0FSRElOQUxJVFlfWkVST19OKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTID0geyJpbnQiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJJbnRlZ2VyIiwgCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJsb25nIiwgCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAiTG9uZyIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAic2hvcnQiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJTaG9ydCIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiY2hhciIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkNoYXJhY3RlciIsCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImJvb2xlYW4iLCAJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkJvb2xlYW4iLCAJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiYnl0ZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkJ5dGUiLCAJCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImRvdWJsZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkRvdWJsZSIsIAkJCQkJCS8vJE5PTi1OTFMtMSQJCQkJCQkJCQkJCQkJCQkJIAotCQkJCQkJCQkJCQkJCQkJCSAiZmxvYXQiLAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkZsb2F0IiwJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJTdHJpbmcifTsJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsJCi0JCi0Jc3RhdGljIHsKLQkJZm9yIChTdHJpbmcgdHlwZSA6IFBSSU1JVElWRV9UWVBFU19BTkRfV1JBUFBFUlMpCi0JCQlQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTX1NFVC5hZGQodHlwZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BFTl9XSE9MRV9QRVJTSVNURU5DRV9VTklUX0VESVRPUl9QUk9QRVJUWSA9ICJKUEFEaWFncmFtRWRpdG9yX29wZW5XaG9sZVBlcnNpc3RlbmNlVW5pdCI7CS8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfQ09MTEFQU0VEID0gInByaW1hcnkgY29sbGFwc2VkIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX0NPTExBUFNFRCA9ICJiYXNpYyBjb2xsYXBzZWQiOy8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxBVElPTl9DT0xMQVBTRUQgPSAicmVsYXRpb24gY29sbGFwc2VkIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VOVElUWV9DSEVDS1NVTSA9ICJkaWFncmFtLmNoZWNrc3VtIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9TVVBQT1JUX0RJQUxPR19JRCA9ICJqcGFfc3VwcG9ydF93YXJuaW5nIjsJLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTIxZDQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUm91bmRlZFJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5Gb3JtYXRBbGxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuT3JnYW5pemVJbXBvcnRzQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mYWNhZGUuRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLlJlbEVuZERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclV0aWwgewotCQotCXByaXZhdGUgc3RhdGljIElQZVNlcnZpY2VVdGlsIHBlVXRpbCA9IG51bGw7Ci0JCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemVGaXJzdExldHRlcihTdHJpbmcgcykgewotCQlpZiAocy5sZW5ndGgoKSA9PSAwKSByZXR1cm4gczsKLQkJU3RyaW5nIHJlcyA9IHMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSArIHMuc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNhcGl0YWxpemVGaXJzdExldHRlcihTdHJpbmcgcykgewotCQlpZiAocy5sZW5ndGgoKSA9PSAwKSByZXR1cm4gczsKLQkJU3RyaW5nIHJlcyA9IHMuc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSArIHMuc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXZlcnRGaXJzdExldHRlckNhc2UoU3RyaW5nIHMpIHsKLQkJaWYgKChzID09IG51bGwpIHx8IChzLmxlbmd0aCgpID09IDApKQotCQkJcmV0dXJuIHM7Ci0JCXJldHVybiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHMuY2hhckF0KDApKSA/IAotCQkJCXMuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSA6Ci0JCQkJcy5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSArCi0JCQkJcy5zdWJzdHJpbmcoMSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgSVBlU2VydmljZVV0aWwgZ2V0UGVVdGlsKCkgewotCQlpZiAocGVVdGlsID09IG51bGwpCi0JCQlwZVV0aWwgPSBuZXcgUGVTZXJ2aWNlVXRpbEltcGwoKTsKLQkJcmV0dXJuIHBlVXRpbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlpZiAoKHMxID09IG51bGwpICYmIChzMiA9PSBudWxsKSkgCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKChzMSA9PSBudWxsKSB8fCAoczIgPT0gbnVsbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChzMS5sZW5ndGgoKSAhPSBzMi5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHMxLmxlbmd0aCgpID09IDApIAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzMS5zdWJzdHJpbmcoMCwgMSkuZXF1YWxzSWdub3JlQ2FzZShzMi5zdWJzdHJpbmcoMCwgMSkpICYmCi0JCQkJczEuc3Vic3RyaW5nKDEpLmVxdWFscyhzMi5zdWJzdHJpbmcoMSkpOwotCX0KLQkKLSAgICBwdWJsaWMgc3RhdGljIEFuY2hvciBnZXRBbmNob3IoQ29udGFpbmVyU2hhcGUgY3MpIHsgCi0gICAgCUNvbGxlY3Rpb248QW5jaG9yPiBhbmNob3JzICA9IGNzLmdldEFuY2hvcnMoKTsKLQkgICAgcmV0dXJuIGFuY2hvcnMuaXRlcmF0b3IoKS5uZXh0KCk7ICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBBbmNob3IgZ2V0QW5jaG9yKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotICAgIAlpZiAoKHBlID09IG51bGwpIHx8ICghKHBlIGluc3RhbmNlb2YgQ29udGFpbmVyU2hhcGUpKSkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlyZXR1cm4gZ2V0QW5jaG9yKChDb250YWluZXJTaGFwZSlwZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJcmV0dXJuIGF0LmdldE5hbWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0RnJvbUxhc3REb3QoU3RyaW5nIHMpIHsKLSAgICAJcmV0dXJuIHMuc3Vic3RyaW5nKHMubGFzdEluZGV4T2YoJy4nKSArIDEpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFF1b3RlcyhTdHJpbmcgcykgewotICAgIAlpZiAoKHMuc3RhcnRzV2l0aCgiXCIiKSkgJiYgKHMuZW5kc1dpdGgoIlwiIikpKSAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCQlyZXR1cm4gcy5zdWJzdHJpbmcoMSwgcy5sZW5ndGgoKSAtIDEpOwotICAgIAlyZXR1cm4gczsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCVN0cmluZyBzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSkgewotCQlTdHJpbmcgcmVzID0ganB0LmdldE5hbWUoKTsKLQkJaWYgKHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JVdGlsX2luaGVyaXRUeXBlVG9vbHRpcFRleHQsCi0JCQkJCW5ldyBPYmplY3RbXSB7IHJlcywgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUgfSk7Ci0JCX0KLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dCwKLQkJCQluZXcgT2JqZWN0W10geyByZXMgfSk7Ci0JfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZU5hbWUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGVOYW1lKGF0LmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJcmV0dXJuIGF0LmdldFR5cGVOYW1lKCk7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0QXR0cmlidXRlVHlwZVR5cGVOYW1lcyhKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGF0KSB7Ci0gICAgCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHR0ID0gYXQudHlwZVR5cGVBcmd1bWVudE5hbWVzKCk7Ci0gICAgCWlmICgodHQgPT0gbnVsbCkgfHwgIXR0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJTGlua2VkTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkgICAgd2hpbGUgKHR0Lmhhc05leHQoKSkgCi0JICAgIAlyZXMuYWRkKHR0Lm5leHQoKSk7IAotICAgIAlyZXR1cm4gcmVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlTmFtZVdpdGhHZW5lcmljcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoYXQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lV2l0aEdlbmVyaWNzKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRBdHRyaWJ1dGVUeXBlTmFtZShhdCkpOwotICAgIAlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdCA9IGF0LnR5cGVUeXBlQXJndW1lbnROYW1lcygpOwotICAgIAlpZiAoKGl0ICE9IG51bGwpICYmIGl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgnPCcpOwotCSAgICAJcmVzLmFwcGVuZChjcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZkZ1bGxUeXBlTmFtZXMoaXQpKTsKLQkgICAgCXJlcy5hcHBlbmQoJz4nKTsKLSAgICAJfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRHZW5lcmljc0VsZW1lbnRUeXBlcyhTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAJaWYgKHR5cGVOYW1lLmluZGV4T2YoIjwiKSA9PSAtMSkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nIHR5cGVzID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmluZGV4T2YoIjwiKSArIDEsIHR5cGVOYW1lLmxhc3RJbmRleE9mKCI+IikpOwkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLSAgICAJU3RyaW5nW10gdHlwZU5hbWVzID0gdHlwZXMuc3BsaXQoIiwiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCXR5cGVOYW1lc1tpXSA9IHR5cGVOYW1lc1tpXS50cmltKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHR5cGVOYW1lczsKLSAgICB9ICAgICAgICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAJaWYgKChzdHJpbmdzID09IG51bGwpIHx8IChzdHJpbmdzLmxlbmd0aCA9PSAwKSkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3Qoc3RyaW5nc1swXSkpOwotICAgIAlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAJCXJlcy5hcHBlbmQoIiwgIik7CQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIAkJcmVzLmFwcGVuZChKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KHN0cmluZ3NbaV0pKTsKLSAgICAJfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RySXQpIHsKLSAgICAJaWYgKChzdHJJdCA9PSBudWxsKSB8fCAhc3RySXQuaGFzTmV4dCgpKSAKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3Qoc3RySXQubmV4dCgpKSk7ICAgIAkKLQkgICAgd2hpbGUgKHN0ckl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JICAgIAlyZXMuYXBwZW5kKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3Qoc3RySXQubmV4dCgpKSk7Ci0JICAgIH0KLSAgICAJcmV0dXJuIHJlcy50b1N0cmluZygpOyAgICAJCi0gICAgfSAgICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZGdWxsVHlwZU5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0ckl0KSB7Ci0gICAgCWlmICgoc3RySXQgPT0gbnVsbCkgfHwgIXN0ckl0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJJdC5uZXh0KCkpOyAgICAJCi0JICAgIHdoaWxlIChzdHJJdC5oYXNOZXh0KCkpIHsKLQkgICAgCXJlcy5hcHBlbmQoIiAsIik7CQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCSAgICAJcmVzLmFwcGVuZChzdHJJdC5uZXh0KCkpOwotCSAgICB9Ci0gICAgCXJldHVybiByZXMudG9TdHJpbmcoKTsgICAgCQotICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRleHQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotICAgIAlyZXR1cm4gY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotICAgIAlTdHJpbmcgcmVzID0ganB0LmdldE5hbWUoKTsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dCwgbmV3IE9iamVjdFtdIHsgcmVzIH0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKUFR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotICAgIAlTdHJpbmcgbmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmICghbmFtZS5lbmRzV2l0aCgiLmphdmEiKSkJCQkJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0gICAgCUlUeXBlIHRwID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgCWlmICh0cCA9PSBudWxsKQotICAgIAkJcmV0dXJuIG51bGw7OwotICAgIAluYW1lID0gdHAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IGN1LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgCUpwYVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9qID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SnBhUHJvamVjdChqcC5nZXRQcm9qZWN0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IG9idGFpbiB0aGUgSlBBIHByb2plY3QuIik7CS8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7IAotCQl9Ci0JCWlmIChwcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLSAgICAJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KHByb2opOwotICAgIAlQZXJzaXN0ZW50VHlwZSBwdCA9IHB1LmdldFBlcnNpc3RlbnRUeXBlKG5hbWUpOwotCQlpZiAoKHB0ID09IG51bGwpIHx8ICghKHB0IGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSkpCi0JCQlyZXR1cm4gbnVsbDsKLSAgICAJcmV0dXJuCShKYXZhUGVyc2lzdGVudFR5cGUpcHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tU2hhcGUoU2hhcGUgc2gpIHsKLSAgICAJQ29udGFpbmVyU2hhcGUgY3NoID0gKENvbnRhaW5lclNoYXBlKXNoOwotICAgIAlMaXN0PFNoYXBlPiBzaGFwZXMgPSBjc2guZ2V0Q2hpbGRyZW4oKTsKLSAgICAJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzLml0ZXJhdG9yKCk7Ci0gICAgCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAJCVNoYXBlIHNoYXBlID0gaXQubmV4dCgpOwotICAgIAkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAkJaWYgKGdhIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKWdhOwotICAgIAkJCWlmIChyZWN0LmdldFkoKSA9PSAwKSB7Ci0gICAgCQkJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdhcyA9IHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotICAgIAkJCQlpZiAoZ2FzLnNpemUoKSA+IDApIHsgCi0gICAgCQkJCQlHcmFwaGljc0FsZ29yaXRobSBncmEgPSBnYXMuZ2V0KDApOwotICAgIAkJCQkJaWYgKGdyYSBpbnN0YW5jZW9mIFRleHQpCi0gICAgCQkJCQkJcmV0dXJuICgoVGV4dClncmEpLmdldFZhbHVlKCk7IAotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZU9mU2hhcGUoU2hhcGUgc2gsIFN0cmluZyBuYW1lKSB7Ci0gICAgCUNvbnRhaW5lclNoYXBlIGNzaCA9IChDb250YWluZXJTaGFwZSlzaDsKLSAgICAJTGlzdDxTaGFwZT4gc2hhcGVzID0gY3NoLmdldENoaWxkcmVuKCk7Ci0gICAgCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQlTaGFwZSBzaGFwZSA9IGl0Lm5leHQoKTsKLSAgICAJCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAJCWlmIChnYSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotICAgIAkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSlnYTsKLSAgICAJCQlpZiAocmVjdC5nZXRZKCkgPT0gMCkgewotICAgIAkJCQlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBnYXMgPSByZWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJCQkJaWYgKGdhcy5zaXplKCkgPiAwKSB7IAotICAgIAkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhID0gZ2FzLmdldCgwKTsKLSAgICAJCQkJCWlmIChncmEgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgCQkJCQkJKChUZXh0KWdyYSkuc2V0VmFsdWUobmFtZSk7Ci0gICAgCQkJCQkJcmV0dXJuOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SlBUTmFtZUluU2hhcGUoQ29udGFpbmVyU2hhcGUgY3MsIFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgCXNldEpQVE5hbWVJblNoYXBlKGNzLCBuZXdOYW1lLCBnZXRQZVV0aWwoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKUFROYW1lSW5TaGFwZShDb250YWluZXJTaGFwZSBjcywgU3RyaW5nIG5ld05hbWUsIElQZVNlcnZpY2VVdGlsIHBlVXRpbCkgewotICAgIAlMaXN0PFNoYXBlPiBzaGFwZXMgPSBjcy5nZXRDaGlsZHJlbigpOwotICAgIAlJdGVyYXRvcjxTaGFwZT4gaXQgPSBzaGFwZXMuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0gICAgCQlTdHJpbmcgcHJvcFNoYXBlVHlwZSA9IHBlVXRpbC5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKTsKLSAgICAJCWlmICghU2hhcGVUeXBlLkhFQURFUi50b1N0cmluZygpLmVxdWFscyhwcm9wU2hhcGVUeXBlKSkKLSAgICAJCQljb250aW51ZTsKLSAgICAJCVRleHQgdHh0ID0gKFRleHQpc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotICAgIAkJdHh0LnNldFZhbHVlKG5ld05hbWUpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSAKLQkJCXJldHVybiAiIjsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIAlpZiAobmFtZS5sZW5ndGgoKSA9PSAxKQotICAgIAkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgIAlTdHJpbmcgc2Vjb25kU3ltYm9sID0gbmFtZS5zdWJzdHJpbmcoMSwgMik7IAotICAgIAlpZiAoc2Vjb25kU3ltYm9sLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lcXVhbHMoc2Vjb25kU3ltYm9sLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkpCi0gICAgCQlyZXR1cm4gZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0gICAgCXJldHVybiAoaXNVcHBlckNhc2Uoc2Vjb25kU3ltYm9sKSkgPyAKLSAgICAJCQljYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSkgOiAKLSAgICAJCQkJZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQ2FzZShTdHJpbmcgcykgewotICAgIAlpZiAoKHMgPT0gbnVsbCkgfHwgKHMubGVuZ3RoKCkgPT0gMCkgfHwgKHMubGVuZ3RoKCkgPiAxKSkgCi0gICAgCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGdpdmVuIHN0cmluZyBoYXMgdG8gY29udGFpbiBvbmUgc3ltYm9sIGV4YWN0bHkiKTsJLy8kTk9OLU5MUy0xJAotICAgIAlyZXR1cm4gcy50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkuZXF1YWxzKHMpOwotICAgIH0KLSAgICAKLSAgICAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIGZpbmFsIFN0cmluZyBjbGFzc0ZRTikgewotCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXRzLmdldCgwKTsgLy8gTXVsdGlwbHkgcGVyc2lzdGVuY2UgdW5pdCBzdXBwb3J0Ci0JCQkJYm9vbGVhbiByZWdpc3RlcmVkID0gZmFsc2U7Ci0JCQkJSXRlcmF0b3I8WG1sSmF2YUNsYXNzUmVmPiBpdCA9IHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBpdC5uZXh0KCkuZ2V0SmF2YUNsYXNzKCk7Ci0JCQkJCWlmIChjbGFzc0ZRTi5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQkJcmVnaXN0ZXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlZ2lzdGVyZWQpIHsKLQkJCQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKGNsYXNzRlFOKTsKLQkJCSAgICAgCXBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotICAgIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIGZpbmFsIFN0cmluZyBjbGFzc0ZRTikgewotCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCi0JCXJlc291cmNlLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHJlc291cmNlLmdldFJvb3RPYmplY3QoKTsKLQkJCQlFTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXQ+IHBlcnNpc3RlbmNlVW5pdHMgPSB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQkJWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdHMuZ2V0KDApOy8vIE11bHRpcGx5IHBlcnNpc3RlbmNlIHVuaXQgc3VwcG9ydAotCQkJCUVMaXN0PFhtbEphdmFDbGFzc1JlZj4gY1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpOwotCQkJCWZvciAoWG1sSmF2YUNsYXNzUmVmIGNSZWYgOiBjUmVmcykKLQkJCQkJaWYgKGNSZWYuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKGNsYXNzRlFOKSkgewotCQkJCQkJY1JlZnMucmVtb3ZlKGNSZWYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVJbXBvcnRzKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyB0eXBlRlFOKSB7Ci0JCWlmICh0eXBlRlFOID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnRyaW0oKTsKLQkJU3RyaW5nW10gdHlwZUZRTnMgPSBnZXRBbGxUeXBlcyh0eXBlRlFOKTsKLQkJY3JlYXRlSW1wb3J0cyhjdSwgdHlwZUZRTnMpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxUeXBlcyhTdHJpbmcgdHlwZUZRTil7Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnJlcGxhY2UoJ1snLCAnLCcpOwotCQl0eXBlRlFOID0gdHlwZUZRTi5yZXBsYWNlKCddJywgJywnKTsKLQkJdHlwZUZRTiA9IHR5cGVGUU4ucmVwbGFjZSgnPCcsICcsJyk7Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnJlcGxhY2UoJz4nLCAnLCcpOwotCQlTdHJpbmdbXSByZXMgPSB0eXBlRlFOLnRyaW0oKS5zcGxpdCgiLCIpOwkvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKQotCQkJcmVzW2ldID0gcmVzW2ldLnRyaW0oKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nW10gdHlwZUZRTnMpIHsKLQkJTnVsbFByb2dyZXNzTW9uaXRvciBucG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlmb3IgKFN0cmluZyB0eXBlRlFOIDogdHlwZUZRTnMpIHsKLQkJCWlmICh0eXBlRlFOLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSB8fCAhdHlwZUZRTi5jb250YWlucygiLiIpKQkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCWN1LmNyZWF0ZUltcG9ydCh0eXBlRlFOLCBudWxsLCBucG0pOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGNyZWF0ZUF0dHJpYnV0ZUljb24oUmVjdGFuZ2xlIGljb25SZWN0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucykgewotCQlJbWFnZSBpY29uID0gbnVsbDsKLQkJaWYgKChhbm5vdGF0aW9ucyA9PSBudWxsKSB8fCAoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApIHx8IGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0JBU0lDKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fQkFTSUMpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLlBSSU1BUllfS0VZKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fT05FX1RPX09ORSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9PTkVfVE9fTUFOWSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9NQU5ZX1RPX09ORSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fTUFOWV9UT19NQU5ZKTsJCQotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0VNQkVEREVEX0lEKTsKLQkJfSBlbHNlIGlmKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX1ZFUlNJT04pKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1ZFUlNJT04pOwotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fVFJBTlNJRU5UKSl7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9UUkFOU0lFTlQpOwotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERUQpKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0VNQkVEREVEKTsKLQkJfSBlbHNlIHsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0JBU0lDKTsJCQkKLQkJfQkKLQkJcmV0dXJuIGljb247Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU2hhcGUgZ2V0SWNvblNoYXBlKFNoYXBlIGF0dHJpYnV0ZVNoYXBlKSB7Ci0JCWludCB5ID0gYXR0cmlidXRlU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gYXR0cmlidXRlU2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IGNzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2hwID0gaXQubmV4dCgpOwotCQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBzaHAuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsgCi0JCQlpZiAoKGdhICE9IG51bGwpICYmIChnYS5nZXRZKCkgPT0geSkgJiYgCi0JCQkJKFNoYXBlVHlwZS5JQ09OLnRvU3RyaW5nKCkuCi0JCQkJCQllcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShzaHAsIAotCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKSkpKSAKLQkJCQlyZXR1cm4gc2hwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Q29udGFpbmVyU2hhcGU+IGdldFJlbGF0ZWRTaGFwZXMoQ29udGFpbmVyU2hhcGUgY3MpIHsKLQkJQ29sbGVjdGlvbjxDb250YWluZXJTaGFwZT4gcmVzID0gbmV3IEhhc2hTZXQ8Q29udGFpbmVyU2hhcGU+KCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY29ucyA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7ICAKLQkJSXRlcmF0b3I8QW5jaG9yPiBhbnNJdCA9IGNzLmdldEFuY2hvcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5zSXQuaGFzTmV4dCgpKSB7Ci0JCQlBbmNob3IgYW4gPSBhbnNJdC5uZXh0KCk7Ci0JCQljb25zLmFkZEFsbChhbi5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpOwotCQkJY29ucy5hZGRBbGwoYW4uZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBjb25zSXQgPSBjb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uIGNvbiA9IGNvbnNJdC5uZXh0KCk7Ci0JCQlDb250YWluZXJTaGFwZSBjczEgPSAoQ29udGFpbmVyU2hhcGUpY29uLmdldFN0YXJ0KCkuZ2V0UGFyZW50KCk7IAotCQkJaWYgKGNzMSAhPSBjcykKLQkJCQlyZXMuYWRkKGNzMSk7Ci0JCQljczEgPSAoQ29udGFpbmVyU2hhcGUpY29uLmdldEVuZCgpLmdldFBhcmVudCgpOwotCQkJaWYgKGNzMSAhPSBjcykKLQkJCQlyZXMuYWRkKGNzMSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgaW50IGNhbGNDb25uZWN0aW9uTGVuZ3RoKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0cyA9IGMuZ2V0QmVuZHBvaW50cygpOwotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwdHMuc2l6ZSgpIC0gMTsgaSsrKSB7Ci0JCQlsZW4gPSBsZW4gKyAoKHB0cy5nZXQoaSkuZ2V0WCgpID09IHB0cy5nZXQoaSArIDEpLmdldFgoKSkgPwotCQkJCQlNYXRoLmFicyhwdHMuZ2V0KGkpLmdldFkoKSAtIHB0cy5nZXQoaSArIDEpLmdldFkoKSkgOgotCQkJCQlNYXRoLmFicyhwdHMuZ2V0KGkpLmdldFgoKSAtIHB0cy5nZXQoaSArIDEpLmdldFgoKSkpOwkKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJaW50IGNudCA9IGdldE51bWJlck9mQ29ubmVjdGlvbnNXaXRoU2FtZUVuZHNBcyhjKTsKLQkJcmV0dXJuIGNyZWF0ZUJlbmRQb2ludExpc3QoYywgY250IC0gMSwgY250LCBzZWxmUmVsYXRpb24pOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCAgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJcmV0dXJuIHNlbGZSZWxhdGlvbiA/IAotCQkJCWNyZWF0ZUJlbmRQb2ludExpc3RGb3JTZWxmUmVsYXRpb24oYywgY250LCBjb25uZWN0aW9uc051bSkgOgotCQkJCWNyZWF0ZUJlbmRQb2ludExpc3RGb3JOb25TZWxmUmVsYXRpb24oYywgY250LCBjb25uZWN0aW9uc051bSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3RGb3JTZWxmUmVsYXRpb24oRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0pIHsKLQkJZmluYWwgaW50IEFCU19TSElGVCA9IDE1OyAKLQkJCi0JCWludCBlbXB0aWVzdFF1YWRyYW50ID0gZ2V0RW1wdGllc3RRdWFkcmFudChjKTsKLQkJYm9vbGVhbiBldmVuUXVhZHJhbnQgPSAoZW1wdGllc3RRdWFkcmFudCA9PSAyKSB8fCAoZW1wdGllc3RRdWFkcmFudCA9PSA0KTsKLQkJCi0JCVJvdW5kZWRSZWN0YW5nbGUgcmVjdCA9IChSb3VuZGVkUmVjdGFuZ2xlKWMuZ2V0U3RhcnQoKS5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkKLQkJZmxvYXQgaGFsZldpZHRoID0gcmVjdC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgaGFsZkhlaWdodCA9IHJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmOwotCQkKLQkJaW50IGNlbnRlclggPSBNYXRoLnJvdW5kKGhhbGZXaWR0aCArIHJlY3QuZ2V0WCgpKTsKLQkJaW50IGNlbnRlclkgPSBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKyByZWN0LmdldFkoKSk7Ci0JCQotCQlib29sZWFuIHN0YXJ0SG9yaXpvbnRhbCA9IGZhbHNlOwotCQlib29sZWFuIGVuZEhvcml6b250YWwgPSAhc3RhcnRIb3Jpem9udGFsOwkKLQotCQkKLQkJaW50IHN0YXJ0RGlyZWN0aW9uID0gKChlbXB0aWVzdFF1YWRyYW50ID09IDIpIHx8IChlbXB0aWVzdFF1YWRyYW50ID09IDMpKSA/IDEgOiAtMTsgIC8vIDEgb3IgLTE7IDEgZm9yIFJJR0hUL0RPV047IC0xIGZvciBMRUZUL1VQCi0JCWludCBlbmREaXJlY3Rpb24gPSAoKGVtcHRpZXN0UXVhZHJhbnQgPT0gMSkgfHwgKGVtcHRpZXN0UXVhZHJhbnQgPT0gMikpID8gMSA6IC0xOwotCQkKLQkJaW50IHg7Ci0JCWludCB5OyAKLQkJCi0JCQotCQlpZiAoZW5kSG9yaXpvbnRhbCkgewotCQkJeCA9IGNlbnRlclggKyBNYXRoLnJvdW5kKGhhbGZXaWR0aCAqIGVuZERpcmVjdGlvbik7IAotCQkJeSA9IGNlbnRlclk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0gY2VudGVyWDsgCi0JCQl5ID0gY2VudGVyWSArIE1hdGgucm91bmQoaGFsZkhlaWdodCAqIGVuZERpcmVjdGlvbik7CQkJCi0JCX0KLQkJaW50IFNISUZUID0gZXZlblF1YWRyYW50ID8gLUFCU19TSElGVCAqIGVuZERpcmVjdGlvbiA6IEFCU19TSElGVCAqIGVuZERpcmVjdGlvbjsJCi0JCVBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KHggKyAoZW5kSG9yaXpvbnRhbCA/IDAgOiAoY250ICogU0hJRlQpKSwgeSArIChlbmRIb3Jpem9udGFsID8gKGNudCAqIFNISUZUKSA6IDApKTsKLQkJCi0JCQotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl4ID0gY2VudGVyWCArIE1hdGgucm91bmQoaGFsZldpZHRoICogc3RhcnREaXJlY3Rpb24pOyAKLQkJCXkgPSBjZW50ZXJZOwotCQl9IGVsc2UgewotCQkJeCA9IGNlbnRlclg7IAotCQkJeSA9IGNlbnRlclkgKyBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKiBzdGFydERpcmVjdGlvbik7CQkJCi0JCX0KLQkJU0hJRlQgPSBldmVuUXVhZHJhbnQgPyAtQUJTX1NISUZUICogc3RhcnREaXJlY3Rpb24gOiBBQlNfU0hJRlQgKiBzdGFydERpcmVjdGlvbjsJCQotCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyAoc3RhcnRIb3Jpem9udGFsID8gMCA6IChjbnQgKiBTSElGVCkpLCB5ICsgKHN0YXJ0SG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0JCQotCQkvLyBzZWNvbmQgcG9pbnQKLQkJTGlzdDxQb2ludD4gcmVzID0gbmV3IExpbmtlZExpc3Q8UG9pbnQ+KCk7Ci0JCXJlcy5hZGQoc3RhcnRQb2ludCk7Ci0JCWlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCXggPSBzdGFydFBvaW50LnggKyBzdGFydERpcmVjdGlvbiAqIDUwICsgKChldmVuUXVhZHJhbnQgPyAtIGNudCA6IGNudCkgKiBTSElGVCk7Ci0JCQl5ID0gc3RhcnRQb2ludC55OwotCQl9IGVsc2UgewotCQkJeCA9IHN0YXJ0UG9pbnQueDsKLQkJCXkgPSBzdGFydFBvaW50LnkgKyBzdGFydERpcmVjdGlvbiAqIDUwICsgKChldmVuUXVhZHJhbnQgPyAtIGNudCA6IGNudCkgKiBTSElGVCk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJLy8gbWlkZGxlIHBvaW50Ci0JCVNISUZUID0gQUJTX1NISUZUICogZW5kRGlyZWN0aW9uOwotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl5ID0geSArIE1hdGgucm91bmQoaGFsZkhlaWdodCArIDUwKSAqIGVuZERpcmVjdGlvbiArICgyICpjbnQgKiBTSElGVCk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0geCArIE1hdGgucm91bmQoaGFsZldpZHRoICsgNTApICogZW5kRGlyZWN0aW9uICsgKDIgKiBjbnQgKiBTSElGVCk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJLy8gZm91cnRoIHBvaW50Ci0JCWlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCXggPSBlbmRQb2ludC54OwotCQl9IGVsc2UgewotCQkJeSA9IGVuZFBvaW50Lnk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJCi0JCXJlcy5hZGQoZW5kUG9pbnQpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0JCQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RW1wdGllc3RRdWFkcmFudChGcmVlRm9ybUNvbm5lY3Rpb24gc2VsZlJlbCkgewotCQlBbmNob3IgYW5jaG9yID0gc2VsZlJlbC5nZXRTdGFydCgpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHByaW1SZWN0ID0gKFJvdW5kZWRSZWN0YW5nbGUpYW5jaG9yLmdldFBhcmVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY29ucyA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7Ci0JCWNvbnMuYWRkQWxsKGFuY2hvci5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpOwotCQljb25zLmFkZEFsbChhbmNob3IuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXQgPSBjb25zLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb248QW5jaG9yPiBhbmNob3JzID0gbmV3IEhhc2hTZXQ8QW5jaG9yPigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uIGMgPSBpdC5uZXh0KCk7Ci0JCQlBbmNob3IgYSA9IGMuZ2V0U3RhcnQoKTsKLQkJCWlmIChhICE9IGFuY2hvcikKLQkJCQlhbmNob3JzLmFkZChhKTsKLQkJCWEgPSBjLmdldEVuZCgpOwotCQkJaWYgKGEgIT0gYW5jaG9yKQotCQkJCWFuY2hvcnMuYWRkKGEpOwkJCQotCQl9Ci0JCUl0ZXJhdG9yPEFuY2hvcj4gaXRBbmNob3JzID0gYW5jaG9ycy5pdGVyYXRvcigpOwotCQlmbG9hdFtdIHF1YWRyYW50SGFiaXRhdCA9IG5ldyBmbG9hdFs1XTsKLQkJd2hpbGUgKGl0QW5jaG9ycy5oYXNOZXh0KCkpIHsKLQkJCUFuY2hvciBhID0gaXRBbmNob3JzLm5leHQoKTsKLQkJCVJvdW5kZWRSZWN0YW5nbGUgcmVjdCA9IChSb3VuZGVkUmVjdGFuZ2xlKWEuZ2V0UGFyZW50KCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCWludCBxID0gZ2V0UXVhZHJhbnQocHJpbVJlY3QsIHJlY3QpOwotCQkJcXVhZHJhbnRIYWJpdGF0W3FdICs9IDEuNWY7Ci0JCQlpZiAocSA9PSAxKSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0WzRdID0gcXVhZHJhbnRIYWJpdGF0WzRdICsgMC41ZjsKLQkJCX0gZWxzZSBpZiAocSA9PSA0KSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0WzFdICs9ICAwLjVmOwotCQkJfQotCQkJaWYgKHEgPCA0KSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0W3EgKyAxXSArPSAwLjVmOwotCQkJfQotCQkJaWYgKHEgPiAxKSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0W3EgLSAxXSArPSAwLjVmOwotCQkJfQkJCQotCQl9Ci0JCWZsb2F0IG1pbkhhYml0YXQgPSBGbG9hdC5NQVhfVkFMVUU7Ci0JCWludCBlbXB0aWVzdFF1YWRyYW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKLQkJCWlmIChxdWFkcmFudEhhYml0YXRbaV0gPCBtaW5IYWJpdGF0KSB7Ci0JCQkJZW1wdGllc3RRdWFkcmFudCA9IGk7Ci0JCQkJbWluSGFiaXRhdCA9IHF1YWRyYW50SGFiaXRhdFtpXTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVtcHRpZXN0UXVhZHJhbnQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBnZXRRdWFkcmFudChSb3VuZGVkUmVjdGFuZ2xlIHByaW1SZWN0LCBSb3VuZGVkUmVjdGFuZ2xlIHJlY3QpIHsKLQkJaW50IHByaW1DZW50ZXJYID0gcHJpbVJlY3QuZ2V0WCgpICsgTWF0aC5yb3VuZChwcmltUmVjdC5nZXRXaWR0aCgpIC8gMi4wZik7Ci0JCWludCBwcmltQ2VudGVyWSA9IHByaW1SZWN0LmdldFkoKSArIE1hdGgucm91bmQocHJpbVJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmKTsKLQkJaW50IGNlbnRlclggPSByZWN0LmdldFgoKSArIE1hdGgucm91bmQocmVjdC5nZXRXaWR0aCgpIC8gMi4wZik7Ci0JCWludCBjZW50ZXJZID0gcmVjdC5nZXRZKCkgKyBNYXRoLnJvdW5kKHJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmKTsKLQkJaWYgKHByaW1DZW50ZXJYIDwgY2VudGVyWCkgCi0JCQlpZiAocHJpbUNlbnRlclkgPiBjZW50ZXJZKQotCQkJCXJldHVybiAxOwotCQkJZWxzZSAKLQkJCQlyZXR1cm4gMjsKLQkJZWxzZSAKLQkJCWlmIChwcmltQ2VudGVyWSA+IGNlbnRlclkpCi0JCQkJcmV0dXJuIDQ7Ci0JCQllbHNlIAotCQkJCXJldHVybiAzOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdEZvck5vblNlbGZSZWxhdGlvbihGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSkgewotCQlmaW5hbCBpbnQgQUJTX1NISUZUID0gMTU7IAotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RTdGFydCA9IChSb3VuZGVkUmVjdGFuZ2xlKWMuZ2V0U3RhcnQoKS5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RFbmQgPSAoUm91bmRlZFJlY3RhbmdsZSljLmdldEVuZCgpLmdldFBhcmVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQotCQlmbG9hdCBzdGFydEhhbGZXaWR0aCA9IHJlY3RTdGFydC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgc3RhcnRIYWxmSGVpZ2h0ID0gcmVjdFN0YXJ0LmdldEhlaWdodCgpIC8gMi4wZjsKLQkJZmxvYXQgZW5kSGFsZldpZHRoID0gcmVjdEVuZC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgZW5kSGFsZkhlaWdodCA9IHJlY3RFbmQuZ2V0SGVpZ2h0KCkgLyAyLjBmOwotCi0JCQotCQlpbnQgc3RhcnRDZW50ZXJYID0gTWF0aC5yb3VuZChzdGFydEhhbGZXaWR0aCArIHJlY3RTdGFydC5nZXRYKCkpOwotCQlpbnQgc3RhcnRDZW50ZXJZID0gTWF0aC5yb3VuZChzdGFydEhhbGZIZWlnaHQgKyByZWN0U3RhcnQuZ2V0WSgpKTsKLQkJaW50IGVuZENlbnRlclggPSBNYXRoLnJvdW5kKGVuZEhhbGZXaWR0aCArIHJlY3RFbmQuZ2V0WCgpKTsKLQkJaW50IGVuZENlbnRlclkgPSBNYXRoLnJvdW5kKGVuZEhhbGZIZWlnaHQgKyByZWN0RW5kLmdldFkoKSk7Ci0JCWludCB4RGVsdGEgPSBlbmRDZW50ZXJYIC0gc3RhcnRDZW50ZXJYOwotCQlpbnQgeURlbHRhID0gZW5kQ2VudGVyWSAtIHN0YXJ0Q2VudGVyWTsKLQkJCi0JCWJvb2xlYW4gc3RhcnRIb3Jpem9udGFsID0gdHJ1ZTsKLQkJaW50IHg7Ci0JCWludCB5OyAKLQkJCi0JCWlmICh4RGVsdGEgIT0gMCkgewotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoc3RhcnRIYWxmV2lkdGggKiBNYXRoLnNpZ251bSh4RGVsdGEpKTsgCi0JCQl5ID0gc3RhcnRDZW50ZXJZICsgTWF0aC5yb3VuZChNYXRoLmFicyhzdGFydEhhbGZXaWR0aCAvIHhEZWx0YSkgKiB5RGVsdGEpOwotCQl9IGVsc2UgewotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoc3RhcnRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7IAotCQkJeSA9IHN0YXJ0Q2VudGVyWSArIE1hdGgucm91bmQoc3RhcnRIYWxmSGVpZ2h0ICogTWF0aC5zaWdudW0oeURlbHRhKSk7CQkJCi0JCX0KLQkJCi0JCWlmIChNYXRoLmFicyh5IC0gc3RhcnRDZW50ZXJZKSArIDAuMSA+IHN0YXJ0SGFsZkhlaWdodCkgewotCQkJc3RhcnRIb3Jpem9udGFsID0gZmFsc2U7OwotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoc3RhcnRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7CQkJCi0JCQl5ID0gc3RhcnRDZW50ZXJZICsgTWF0aC5yb3VuZChzdGFydEhhbGZIZWlnaHQgKiBNYXRoLnNpZ251bSh5RGVsdGEpKTsKLQkJfQotCQlpbnQgU0hJRlQ7Ci0JCSBpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQkgU0hJRlQgPSAoeSA8IHN0YXJ0Q2VudGVyWSkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfSBlbHNlIHsKLQkJCSBTSElGVCA9ICh4IDwgc3RhcnRDZW50ZXJYKSA/IEFCU19TSElGVCA6IC1BQlNfU0hJRlQ7Ci0JCSB9Ci0KLQkJCi0JCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIChzdGFydEhvcml6b250YWwgPyAwIDogKGNudCAqIFNISUZUKSksIHkgKyAoc3RhcnRIb3Jpem9udGFsID8gKGNudCAqIFNISUZUKSA6IDApKTsKLQkJTGlzdDxQb2ludD4gcmVzID0gbmV3IExpbmtlZExpc3Q8UG9pbnQ+KCk7Ci0JCQotCQl4RGVsdGEgPSBzdGFydENlbnRlclggLSBlbmRDZW50ZXJYOwotCQl5RGVsdGEgPSBzdGFydENlbnRlclkgLSBlbmRDZW50ZXJZOwotCQkKLQkJYm9vbGVhbiBzdHJhaWdodCA9ICh4RGVsdGEgPT0gMCkgfHwgKHlEZWx0YSA9PSAwKTsgCi0JCQotCQlyZXMuYWRkKHN0YXJ0UG9pbnQpOwotCQkKLQkJYm9vbGVhbiBlbmRIb3Jpem9udGFsID0gdHJ1ZTsJCi0JCQotCQlpZiAoeERlbHRhICE9IDApIHsKLQkJCXggPSBlbmRDZW50ZXJYICsgTWF0aC5yb3VuZChlbmRIYWxmV2lkdGggKiBNYXRoLnNpZ251bSh4RGVsdGEpKTsgCi0JCQl5ID0gZW5kQ2VudGVyWSArIE1hdGgucm91bmQoTWF0aC5hYnMoZW5kSGFsZldpZHRoIC8geERlbHRhKSAqIHlEZWx0YSk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0gZW5kQ2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoZW5kSGFsZkhlaWdodCAvIHlEZWx0YSkgKiB4RGVsdGEpOwotCQkJeSA9IGVuZENlbnRlclkgKyBNYXRoLnJvdW5kKGVuZEhhbGZIZWlnaHQgKiBNYXRoLnNpZ251bSh5RGVsdGEpKTsgCi0JCX0KLQkJaWYgKE1hdGguYWJzKHkgLSBlbmRDZW50ZXJZKSArIDAuMSA+IGVuZEhhbGZIZWlnaHQpIHsKLQkJCWVuZEhvcml6b250YWwgPSBmYWxzZTsKLQkJCXggPSBlbmRDZW50ZXJYICsgTWF0aC5yb3VuZChNYXRoLmFicyhlbmRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7CQkJCi0JCQl5ID0gZW5kQ2VudGVyWSArIE1hdGgucm91bmQoZW5kSGFsZkhlaWdodCAqIE1hdGguc2lnbnVtKHlEZWx0YSkpOwotCQl9Ci0JCQotCQkgaWYgKGVuZEhvcml6b250YWwpIHsKLQkJCSBTSElGVCA9ICh5IDwgZW5kQ2VudGVyWSkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfSBlbHNlIHsKLQkJCSBTSElGVCA9ICh4IDwgZW5kQ2VudGVyWCkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfQotCQlQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludCh4ICsgKGVuZEhvcml6b250YWwgPyAwIDogKGNudCAqIFNISUZUKSksIHkgKyAoZW5kSG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0KLQkJaWYgKCFzdHJhaWdodCkgewotCQkJaWYgKHN0YXJ0SG9yaXpvbnRhbCAmJiBlbmRIb3Jpem9udGFsKSB7Ci0JCQkJaWYgKHN0YXJ0UG9pbnQueSAhPSBlbmRQb2ludC55KSB7Ci0JCQkJCXggPSBzdGFydFBvaW50LnggKyBNYXRoLnJvdW5kKChlbmRQb2ludC54IC0gc3RhcnRQb2ludC54KSAvIDIuMGYpICsgY250ICogQUJTX1NISUZUOyAKLQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludCh4LCBzdGFydFBvaW50LnkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCQlwID0gbmV3IFBvaW50KHgsIGVuZFBvaW50LnkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXN0YXJ0SG9yaXpvbnRhbCAmJiAhZW5kSG9yaXpvbnRhbCkgewotCQkJCWlmIChzdGFydFBvaW50LnggIT0gZW5kUG9pbnQueCkgewotCQkJCQl5ID0gc3RhcnRQb2ludC55ICsgTWF0aC5yb3VuZCgoZW5kUG9pbnQueSAtIHN0YXJ0UG9pbnQueSkgLyAyLjBmKSArIGNudCAqIEFCU19TSElGVCAvKiogKGludClNYXRoLnNpZ251bSh5RGVsdGEpKi87IAotCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KHN0YXJ0UG9pbnQueCwgeSk7Ci0JCQkJCXJlcy5hZGQocCk7Ci0JCQkJCXAgPSBuZXcgUG9pbnQoZW5kUG9pbnQueCwgeSk7Ci0JCQkJCXJlcy5hZGQocCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCQlQb2ludCBwID0gbmV3IFBvaW50KGVuZFBvaW50LngsIHN0YXJ0UG9pbnQueSk7Ci0JCQkJcmVzLmFkZChwKTsKLQkJCX0gZWxzZSBpZiAoZW5kSG9yaXpvbnRhbCkgewotCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoc3RhcnRQb2ludC54LCBlbmRQb2ludC55KTsKLQkJCQlyZXMuYWRkKHApOwkJCQotCQkJfQotCQl9Ci0KLQkJcmVzLmFkZChlbmRQb2ludCk7CQkJCQotCQlyZXR1cm4gcmVzOwotCX0KLQkJCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGZpbmFsIENvbnRhaW5lclNoYXBlIGNzLCAKLQkJCQkJCQkJCQkJICAgZmluYWwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgCi0JCQkJCQkJCQkJCSAgIGZpbmFsIGJvb2xlYW4gc2VsZk9ubHkpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oY3MpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlMaXN0PEFuY2hvcj4gYW5jaG9yc0Zyb20gPSBnZXRBbmNob3JzKGNzKTsKLQkJCQlmb3IgKEFuY2hvciBhbmNob3JGcm9tIDogYW5jaG9yc0Zyb20pIHsKLQkJCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uPiBvdXRnb2luZ0Nvbm5lY3Rpb25zID0gYW5jaG9yRnJvbS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gaW5jb21pbmdDb25uZWN0aW9ucyA9IGFuY2hvckZyb20uZ2V0SW5jb21pbmdDb25uZWN0aW9ucygpOwotCQkJCQkKLQkJCQkJU2V0PFNldDxDb25uZWN0aW9uPj4gc2V0cyA9IG5ldyBIYXNoU2V0PFNldDxDb25uZWN0aW9uPj4oKTsKLQkJCQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXQgPSBvdXRnb2luZ0Nvbm5lY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIAotCQkJCQkJYWRkQ29ubmVjdGlvbihzZXRzLCBpdC5uZXh0KCksIHNlbGZPbmx5KTsKLQkJCQkJaXQgPSBpbmNvbWluZ0Nvbm5lY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIAotCQkJCQkJYWRkQ29ubmVjdGlvbihzZXRzLCBpdC5uZXh0KCksIHNlbGZPbmx5KTsKLQkJCQkJCi0JCQkJCUl0ZXJhdG9yPFNldDxDb25uZWN0aW9uPj4gc2V0c0l0ZXIgPSBzZXRzLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChzZXRzSXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCVNldDxDb25uZWN0aW9uPiBzZXQgPSBzZXRzSXRlci5uZXh0KCk7Ci0JCQkJCQlpbnQgY250ID0gMDsKLQkJCQkJCWludCBzZXRTaXplID0gc2V0LnNpemUoKTsKLQkJCQkJCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGNJdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoY0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJQ29ubmVjdGlvbiBjID0gY0l0ZXIubmV4dCgpOwotCQkJCQkJCUlSZWxhdGlvbiByZWwgPSAoSVJlbGF0aW9uKWZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjKTsKLQkJCQkJCQlyZWFycmFuZ2VDb25uZWN0aW9uKGMsIGNudCwgc2V0U2l6ZSwgIHJlbC5nZXRPd25lcigpID09IHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJCQkJCWNudCsrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQkJCQotCQl9KTsgIAotCX0KLQkKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gYXJlQ29ubmVjdGlvbnNXaXRoSWRlbnRpY2FsRW5kcyhDb25uZWN0aW9uIGMxLCBDb25uZWN0aW9uIGMyKSB7Ci0JCXJldHVybiAoKGMxLmdldFN0YXJ0KCkgPT0gYzIuZ2V0U3RhcnQoKSkgJiYgKGMxLmdldEVuZCgpID09IGMyLmdldEVuZCgpKSkgfHwKLQkJCSAgICgoYzEuZ2V0U3RhcnQoKSA9PSBjMi5nZXRFbmQoKSkgJiYgKGMxLmdldEVuZCgpID09IGMyLmdldFN0YXJ0KCkpKTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNvbm5lY3Rpb25CZWxvbmdzVG9TZXQoQ29ubmVjdGlvbiBjLCBTZXQ8Q29ubmVjdGlvbj4gcykgewotCQlpZiAocy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNvbm5lY3Rpb24gZXhhbXBsZSA9IHMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJldHVybiBhcmVDb25uZWN0aW9uc1dpdGhJZGVudGljYWxFbmRzKGMsIGV4YW1wbGUpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIGludCBnZXROdW1iZXJPZkNvbm5lY3Rpb25zV2l0aFNhbWVFbmRzQXMoQ29ubmVjdGlvbiBjKSB7Ci0JCUFuY2hvciBmcm9tID0gYy5nZXRTdGFydCgpOwotCQlBbmNob3IgdG8gPSBjLmdldEVuZCgpOwotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNzMSA9IGZyb20uZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNzMiA9IHRvLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJaW50IGNudCA9IDA7Ci0JCUl0ZXJhdG9yPENvbm5lY3Rpb24+IGl0ID0gY3MxLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29uID0gaXQubmV4dCgpOwotCQkJaWYgKGNvbi5nZXRFbmQoKSA9PSB0bykKLQkJCQljbnQrKzsKLQkJfQotCQlpZiAoZnJvbSA9PSB0bykKLQkJCXJldHVybiBjbnQ7Ci0JCWl0ID0gY3MyLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29uID0gaXQubmV4dCgpOwotCQkJaWYgKGNvbi5nZXRFbmQoKSA9PSBmcm9tKQotCQkJCWNudCsrOwotCQkJfQotCQlyZXR1cm4gY250OwotCX0KLQkKLQlzdGF0aWMgdm9pZCBhZGRDb25uZWN0aW9uKFNldDxTZXQ8Q29ubmVjdGlvbj4+IHNldHMsIENvbm5lY3Rpb24gYywgYm9vbGVhbiBzZWxmT25seSkgewotCQlpZiAoc2V0cyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCInc2V0cycgcGFyYW1ldGVyIHNob3VsZCBub3QgYmUgbnVsbCIpOwkvLyROT04tTkxTLTEkCi0JCWlmIChzZWxmT25seSAmJiAoYy5nZXRTdGFydCgpICE9IGMuZ2V0RW5kKCkpKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxTZXQ8Q29ubmVjdGlvbj4+IHNldHNJdGVyID0gc2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoc2V0c0l0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTZXQ8Q29ubmVjdGlvbj4gc2V0ID0gc2V0c0l0ZXIubmV4dCgpOwotCQkJaWYgKGNvbm5lY3Rpb25CZWxvbmdzVG9TZXQoYywgc2V0KSkgewotCQkJCXNldHMucmVtb3ZlKHNldCk7Ci0JCQkJc2V0LmFkZChjKTsKLQkJCQlzZXRzLmFkZChzZXQpOwotCQkJCXJldHVybjsKLQkJfQotCX0KLQkJU2V0PENvbm5lY3Rpb24+IG5ld1NldCA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7Ci0JCW5ld1NldC5hZGQoYyk7Ci0JCXNldHMuYWRkKG5ld1NldCk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCByZWFycmFuZ2VDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCBib29sZWFuIHNlbGZSZWxhdGlvbikgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gYyA9IChGcmVlRm9ybUNvbm5lY3Rpb24pY29ubmVjdGlvbjsKLQkJcmVhcnJhbmdlQ29ubmVjdGlvbkJlbmRQb2ludHMoYywgY250LCBjb25uZWN0aW9uc051bSwgc2VsZlJlbGF0aW9uKTsKLQkJcmVhcnJhbmdlQ29ubmVjdGlvbkRlY29yYXRvcnNMb2NhdGlvbihjLCAgY250LCBjb25uZWN0aW9uc051bSk7CQkJCQkJCQkJCQotCX0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgcmVhcnJhbmdlQ29ubmVjdGlvbkJlbmRQb2ludHMoRnJlZUZvcm1Db25uZWN0aW9uIGMsIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSwgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludD4gb2xkUHRzID0gYy5nZXRCZW5kcG9pbnRzKCk7Ci0JCUxpc3Q8b3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50PiBuZXdQdHMgPSBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgY250LCBjb25uZWN0aW9uc051bSwgIHNlbGZSZWxhdGlvbik7Ci0JCWlmIChuZXdQdHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IE1hdGgubWluKG9sZFB0cy5zaXplKCksIG5ld1B0cy5zaXplKCkpOyBpKyspIHsKLQkJCW9sZFB0cy5zZXQoaSwgR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9pbnQoLypjLCAqL25ld1B0cy5nZXQoaSkueCwgbmV3UHRzLmdldChpKS55KSk7Ci0JCX0KLQkJaW50IGRpZmYgPSBvbGRQdHMuc2l6ZSgpIC0gbmV3UHRzLnNpemUoKTsKLQkJaWYgKGRpZmYgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gb2xkUHRzLnNpemUoKSAtIDE7IGkgPj0gbmV3UHRzLnNpemUoKTsgaS0tKSAKLQkJCQlvbGRQdHMucmVtb3ZlKGkpOwotCQl9IGVsc2UgaWYgKGRpZmYgPCAwKSB7Ci0JCQlmb3IgKGludCBpID0gb2xkUHRzLnNpemUoKTsgaSA8IG5ld1B0cy5zaXplKCk7IGkrKykgCi0JCQkJb2xkUHRzLmFkZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2ludCgvKmMsICovbmV3UHRzLmdldChpKS54LCBuZXdQdHMuZ2V0KGkpLnkpKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgcHVibGljIHZvaWQgcmVhcnJhbmdlQ29ubmVjdGlvbkRlY29yYXRvcnNMb2NhdGlvbihGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSkgewotCQlDb2xsZWN0aW9uPENvbm5lY3Rpb25EZWNvcmF0b3I+IGRjcnMgPSBjLmdldENvbm5lY3Rpb25EZWNvcmF0b3JzKCk7Ci0JCQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7Ci0JCQkJZm9yIChDb25uZWN0aW9uRGVjb3JhdG9yIGRjciA6IGRjcnMpIHsKLQkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCQkJaWYgKGdhIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkJaWYgKE1hdGguYWJzKGRjci5nZXRMb2NhdGlvbigpIC0gMC41KSA8IDAuMDAwMSkgCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlQb2ludCBwdCA9IHJlY2FsY1RleHREZWNvcmF0b3JQb3NpdGlvbihjLCBkY3IpOwotCQkJCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZ2EsIHB0LngsIHB0LnksIGZhbHNlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChkY3IuZ2V0TG9jYXRpb24oKSA8IDAuNSkgewotCQkJCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZGNyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksIAotCQkJCQkJCQlNYXRoLnJvdW5kKGxlbiAvMTApICwgMCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSwgCi0JCQkJCQkJCU1hdGgucm91bmQoLWxlbiAvMTApICwgMCk7Ci0JCQkJCX0KLQkJCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgUG9pbnQgcmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAKLQkJCQkJCQkJCQkJIENvbm5lY3Rpb25EZWNvcmF0b3IgZGNyKSB7Ci0JCWludCBDT1JSID0gNTsKLQkJaW50IFRYVF9IRUlHSFQgPSA4OwotCQlkb3VibGUgbG9jYXRpb24gPSBkY3IuZ2V0TG9jYXRpb24oKTsKLQkJUmVsRW5kRGlyIHJlbEVuZERpciA9IChsb2NhdGlvbiA8IDAuNSkgPyAKLQkJCQlKUEFFZGl0b3JVdGlsLmdldENvbm5lY3Rpb25TdGFydERpcigoRnJlZUZvcm1Db25uZWN0aW9uKWMpIDoKLQkJCQkJSlBBRWRpdG9yVXRpbC5nZXRDb25uZWN0aW9uRW5kRGlyKChGcmVlRm9ybUNvbm5lY3Rpb24pYyk7Ci0JCVRleHQgdHh0ID0gKFRleHQpZGNyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCWludCBUWFRfV0lEVEggPSB0eHQuZ2V0VmFsdWUoKS5sZW5ndGgoKSAqIDY7Ci0JCWJvb2xlYW4gaXNDYXJkaW5hbGl0eSA9IEpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9MQUJFTFMuY29udGFpbnModHh0LmdldFZhbHVlKCkpOyAKLQkJaW50IHggPSAwOwotCQlpbnQgeSA9IDA7Ci0JCWlmIChyZWxFbmREaXIuZXF1YWxzKFJlbEVuZERpci5MRUZUKSkgewotCQkJeCA9IENPUlIgKyAoaXNDYXJkaW5hbGl0eSA/IDIgOiAxMik7Ci0JCQl5ID0gaXNDYXJkaW5hbGl0eSA/ICgtQ09SUiAtIDMgLSBUWFRfSEVJR0hUKSA6IENPUlIgLSAzOwotCQl9IGVsc2UgaWYgKHJlbEVuZERpci5lcXVhbHMoUmVsRW5kRGlyLlJJR0hUKSkgewotCQkJeCA9IC0gVFhUX1dJRFRIOwotCQkJeSA9IGlzQ2FyZGluYWxpdHkgPyAoLUNPUlIgLSAzIC0gVFhUX0hFSUdIVCkgOiBDT1JSIC0gMzsKLQkJfSBlbHNlIGlmIChyZWxFbmREaXIuZXF1YWxzKFJlbEVuZERpci5VUCkpIHsKLQkJCXggPSBpc0NhcmRpbmFsaXR5ID8gKC1DT1JSIC0gVFhUX1dJRFRIKSA6IENPUlI7Ci0JCQl5ID0gaXNDYXJkaW5hbGl0eSA/IENPUlIgOiBDT1JSICsgVFhUX0hFSUdIVCArIDI7Ci0JCX0gZWxzZSBpZiAocmVsRW5kRGlyLmVxdWFscyhSZWxFbmREaXIuRE9XTikpIHsKLQkJCXggPSBpc0NhcmRpbmFsaXR5ID8gKC1DT1JSIC0gVFhUX1dJRFRIKSA6IENPUlI7Ci0JCQl5ID0gLUNPUlIgLSAoaXNDYXJkaW5hbGl0eSA/IFRYVF9IRUlHSFQgOiAoVFhUX0hFSUdIVCArIDIpICogMik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQb2ludCh4LCB5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybVRhYmxlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7IAotCQlJUHJvamVjdCBwcm9qZWN0ID0ganB0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCSAgICBTdHJpbmcgdGFibGVOYW1lUHJlZml4ID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0VGFibGVQcmVmaXhOYW1lKHByb2plY3QsIHByb3BzKTsKLQkgICAgU3RyaW5nIHNob3J0RW50aXR5TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsgCi0JICAgIGlmICh0YWJsZU5hbWVQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLQkgICAgCXJldHVybiBzaG9ydEVudGl0eU5hbWU7Ci0JCXJldHVybiB0YWJsZU5hbWVQcmVmaXggKyBzaG9ydEVudGl0eU5hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCX0KLQkKLQlzdGF0aWMgcHJpdmF0ZSBMaXN0PEFuY2hvcj4gZ2V0QW5jaG9ycyhDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlMaXN0PEFuY2hvcj4gcmV0ID0gbmV3IEFycmF5TGlzdDxBbmNob3I+KCk7Ci0JCXJldC5hZGRBbGwoY29udGFpbmVyU2hhcGUuZ2V0QW5jaG9ycygpKTsKLQotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoU2hhcGUgc2hhcGUgOiBjaGlsZHJlbikgewotCQkJaWYgKHNoYXBlIGluc3RhbmNlb2YgQ29udGFpbmVyU2hhcGUpIHsKLQkJCQlyZXQuYWRkQWxsKGdldEFuY2hvcnMoKENvbnRhaW5lclNoYXBlKSBzaGFwZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXQuYWRkQWxsKHNoYXBlLmdldEFuY2hvcnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CQotCQotCXN0YXRpYyBwdWJsaWMgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25TdGFydERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlFTGlzdDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludD4gcHRzID0gYy5nZXRCZW5kcG9pbnRzKCk7Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uRW5kRGlyKHB0cy5nZXQoMCksIHB0cy5nZXQoMSkpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0cyA9IGMuZ2V0QmVuZHBvaW50cygpOwotCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkVuZERpcihwdHMuZ2V0KHB0cy5zaXplKCkgLSAxKSwgcHRzLmdldChwdHMuc2l6ZSgpIC0gMikpOwotCX0JCi0JCi0Jc3RhdGljIHByaXZhdGUgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25FbmREaXIob3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQgcHRFbmQsCi0JCQlvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludCBwdE5leHRUb0VuZCkgewotCQlpZiAocHRFbmQuZ2V0WCgpID09IHB0TmV4dFRvRW5kLmdldFgoKSkgewotCQkJcmV0dXJuIChwdE5leHRUb0VuZC5nZXRZKCkgPiBwdEVuZC5nZXRZKCkpID8gUmVsRW5kRGlyLlVQIDogUmVsRW5kRGlyLkRPV047Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHB0TmV4dFRvRW5kLmdldFgoKSA+IHB0RW5kLmdldFgoKSkgPyBSZWxFbmREaXIuTEVGVCA6IFJlbEVuZERpci5SSUdIVDsKLQkJfQkJCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCBvcmdhbml6ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpIHsKLQkJT3JnYW5pemVJbXBvcnRzQWN0aW9uIGFjdGlvbiA9IG5ldyBPcmdhbml6ZUltcG9ydHNBY3Rpb24od3MpOwotCQlhY3Rpb24ucnVuKGN1KTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGZvcm1hdENvZGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpIHsKLQkJRm9ybWF0QWxsQWN0aW9uIGFjdGlvbiA9IG5ldyBGb3JtYXRBbGxBY3Rpb24od3MpOwotCQlhY3Rpb24ucnVuKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1KSk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJCQkJCQkJCQkJICBTdHJpbmcgcGFjaywgCi0JCQkJCQkJCQkJCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAJU3RyaW5nIE5BTUUgPSBwYWNrICsgIi5FbnRpdHkiOyAvLyROT04tTkxTLTEkCi0gICAgCVN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAJCi0gICAgCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5TmFtZXMgPSBnZXRFbnRpdHlOYW1lcyhqcGFQcm9qZWN0KTsKLSAgICAgICAJSGFzaFNldDxTdHJpbmc+IEpQQVByb2plY3RFbnRpdHlTaW1wbGVOYW1lcyA9IGdldEVudGl0eVNpbXBsZU5hbWVzKGpwYVByb2plY3QpOwotICAgICAgIAkKLSAgICAJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDAwMDA7IGkrKykgewotICAgIAkJbmFtZSA9IE5BTUUgKyBpOwotICAgIAkJaWYgKCghZnAuaGFzT2JqZWN0V2l0aE5hbWUobmFtZSkpICYmCi0gICAgCQkJCSFKUEFQcm9qZWN0RW50aXR5TmFtZXMuY29udGFpbnMobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICYmIAotICAgIAkJCQkhSlBBUHJvamVjdEVudGl0eVNpbXBsZU5hbWVzLmNvbnRhaW5zKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QobmFtZSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSAmJgotICAgIAkJCQkhaXNKYXZhRmlsZUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmFtZSwgcGFjaykpIAotICAgIAkJCWJyZWFrOwotICAgIAl9Ci0gICAgCXJldHVybiBuYW1lOwotICAgIH0KLQkKLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKAotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgcGFjaywgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlTdHJpbmcgTkFNRSA9IHBhY2sgKyAiLk1hcHBlZFN1cGVyY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQotCQlIYXNoU2V0PFN0cmluZz4gSlBBUHJvamVjdEVudGl0eU5hbWVzID0gZ2V0RW50aXR5TmFtZXMoanBhUHJvamVjdCk7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5U2ltcGxlTmFtZXMgPSBnZXRFbnRpdHlTaW1wbGVOYW1lcyhqcGFQcm9qZWN0KTsKLQotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7Ci0JCQluYW1lID0gTkFNRSArIGk7Ci0JCQlpZiAoKCFmcC5oYXNPYmplY3RXaXRoTmFtZShuYW1lKSkgJiYgIUpQQVByb2plY3RFbnRpdHlOYW1lcy5jb250YWlucyhuYW1lCi0JCQkJCS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICYmICFKUEFQcm9qZWN0RW50aXR5U2ltcGxlTmFtZXMuY29udGFpbnMoSlBBRWRpdG9yVXRpbAotCQkJCQkuY3V0RnJvbUxhc3REb3QobmFtZSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKQotCQkJCQkmJiAhaXNKYXZhRmlsZUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmFtZSwgcGFjaykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQkJCQotCi0JCi0Jc3RhdGljIHB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBlbnRpdHlOYW1lLCBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgYm9vbGVhbiBoYXNQcmltYXJ5S2V5KQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gZ2V0UGFja2FnZUZvbGRlcihwcm9qZWN0KTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eShwcm9qZWN0LCBmb2xkZXIsIGVudGl0eU5hbWUsCi0JCQkJaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJCW1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBoYXNQcmltYXJ5S2V5KTsKLQl9Ci0KLQkJCQkKLQlzdGF0aWMgcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KAotCQkJSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFBhY2thZ2VGb2xkZXIocHJvamVjdCk7Ci0JCWNyZWF0ZU1hcHBlZFN1cGVyY2xhc3MocHJvamVjdCwgZm9sZGVyLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSk7Ci0JCXJldHVybiBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzKHByb2plY3QsIGZvbGRlciwgbWFwcGVkU3VwZXJjbGFzc05hbWUpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCXByaXZhdGUgc3RhdGljIElGb2xkZXIgZ2V0UGFja2FnZUZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CQkKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgOiBjbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQlpZiAoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aEVudHJ5KTsKLQkJCQlicmVhazsKLQkJCX0gIAkJCQotCQl9Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKSk7Ci0JCWlmKHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSA9PSBmYWxzZSkgewotCQkJcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShwcm9qZWN0LCBwcm9wcyksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIHBhY2thZ2VGcmFnbWVudC5nZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQotCX0KLQkKLQlzdGF0aWMgcHJpdmF0ZSBJRmlsZSBjcmVhdGVNYXBwZWRTdXBlcmNsYXNzKElQcm9qZWN0IHByb2plY3QsCi0JCQlJRm9sZGVyIGZvbGRlciwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSA9IG1hcHBlZFN1cGVyY2xhc3NOYW1lCi0JCQkJLnN1YnN0cmluZyhtYXBwZWRTdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShtYXBwZWRTdXBlcmNsYXNzU2hvcnROYW1lICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShwcm9qZWN0LCBwcm9wcykgKyAiO1xuXG4iIC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgIkBNYXBwZWRTdXBlcmNsYXNzIFxuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgInB1YmxpYyBjbGFzcyAiICsgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSArICIge1xuXG4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwKLQkJCQkJCXRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGlzSmF2YUZpbGVJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgCi0JCQkJCQkJCQkJCSAgU3RyaW5nIGVudGl0eU5hbWUsCi0JCQkJCQkJCQkJCSAgU3RyaW5nIGRlZmF1bHRFbnRpdHlQYWNha2FnZSkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7CQkKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IG5ldyBJUGFja2FnZUZyYWdtZW50Um9vdFswXTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoRW50cmllcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljbGFzc3BhdGhFbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBvYnRhaW4gdGhlIGNsYXNzcGF0aCIpOwkvLyROT04tTkxTLTEkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQkKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgOiBjbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQlpZiAoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aEVudHJ5KTsKLQkJCQlicmVhazsKLQkJCX0gIAkJCQotCQl9Ci0KLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKSk7Ci0JCWlmKCFwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlJRm9sZGVyIGZvbGRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb2xkZXIgPSAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgb2J0YWluIHRoZSBmb2xkZXIiKTsJLy8kTk9OLU5MUy0xJAkJCQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQkKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZQotCQkJCS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBwcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZUNhbmRpZGF0ZSkgewotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGU7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDAwMDAwOyBpKyspIHsKLQkJCWlmIChqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmFtZSkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCW5hbWUgPSBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlICsgIl8iICsgaTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBwcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgZm9yYmlkZGVuTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7Ci0JCQlpZiAoKGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChuYW1lKSA9PSBudWxsKSAmJiAhbmFtZS5lcXVhbHMoZm9yYmlkZGVuTmFtZSkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQluYW1lID0gYXR0cmlidXRlTmFtZUNhbmRpZGF0ZSArICJfIiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbnRpdHlPcGVuRWxzZXdoZXJlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIGJvb2xlYW4gY2hlY2tEaXJ0eSkgewotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRSZWZzID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVkUmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUVkaXRvclBhcnQgZWQgPSBlZFJlZnNbaV0uZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCWlmIChlZCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGNoZWNrRGlydHkgJiYgIWVkLmlzRGlydHkoKSkKLQkJCQljb250aW51ZTsKLQkJCUlFZGl0b3JJbnB1dCBlZElucCA9IGVkLmdldEVkaXRvcklucHV0KCk7Ci0JCQlpZiAoRmlsZUVkaXRvcklucHV0LmNsYXNzLmlzSW5zdGFuY2UoZWRJbnApKSB7Ci0JCQkJRmlsZUVkaXRvcklucHV0IGZlZElucHV0ID0gKEZpbGVFZGl0b3JJbnB1dCllZElucDsgCi0JCQkJaWYgKGZlZElucHV0LmdldEZpbGUoKS5lcXVhbHMoanB0LmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4gZ2V0Q29tcGlsYXRpb25Vbml0KChJRmlsZSkganB0LmdldFJlc291cmNlKCkpOwotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gRWNsaXBzZUZhY2FkZS5JTlNUQU5DRS5nZXRKYXZhQ29yZSgpLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBiZWNvbWVXb3JraW5nQ29weShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXRyeSB7Ci0JCQljdS5iZWNvbWVXb3JraW5nQ29weShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgZGlzY3JhZCB0aGUgd29ya2luZyBjb3B5Iik7CS8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7CQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzY2FyZFdvcmtpbmdDb3B5KElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJd2hpbGUgKGN1LmlzV29ya2luZ0NvcHkoKSkKLQkJCXRyeSB7Ci0JCQkJY3UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgZGlzY2FyZCB0aGUgd29ya2luZyBjb3B5Iik7CS8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwkKLQkJCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc2NhcmRXb3JraW5nQ29weU9uY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlpZiAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJdHJ5IHsKLQkJCQljdS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW4ndCBkaXNjYXJkIHRoZSB3b3JraW5nIGNvcHkiKTsJLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JfQotCQkKLQlzdGF0aWMgcHJpdmF0ZSBJRmlsZSBjcmVhdGVFbnRpdHkoSVByb2plY3QgcHJvamVjdCwgSUZvbGRlciBmb2xkZXIsIFN0cmluZyBlbnRpdHlOYW1lLCBib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCAKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHRocm93cyBFeGNlcHRpb24gewotCi0KLQkJCi0JCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsJCQotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCi0JCX0KLQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCVN0cmluZyB0YWJsZU5hbWVQcmVmaXggPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUocHJvamVjdCwgcHJvcHMpOwotCQlTdHJpbmcgdGFibGVOYW1lID0gKHRhYmxlTmFtZVByZWZpeC5sZW5ndGgoKSA+IDApID8gKHRhYmxlTmFtZVByZWZpeCArIGVudGl0eVNob3J0TmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkpIDogIiI7CS8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBmaWVsZEJhc2VkQWNjZXNzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc0FjY2Vzc0ZpZWxkQmFzZWQocHJvamVjdCwgcHJvcHMpOwotCQkKLQkJU3RyaW5nIGNsYXNzRGVjbGFyYXRpb25TdHJpbmdDb250ZW50ID0gbnVsbDsKLQkJaWYgKGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkKSB7Ci0JCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSA9IG1hcHBlZFN1cGVyY2xhc3NOYW1lLnN1YnN0cmluZyhtYXBwZWRTdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQljbGFzc0RlY2xhcmF0aW9uU3RyaW5nQ29udGVudCA9ICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIgZXh0ZW5kcyAiICsgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSArICIge1xuXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgewotCQkJY2xhc3NEZWNsYXJhdGlvblN0cmluZ0NvbnRlbnQgPSAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcblxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JCVN0cmluZyBwYWNrYWdlSW1wb3J0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlICE9IG51bGwKLQkJCQkmJiAhbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UuZXF1YWxzKCIiKSAmJiAhKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCwgcHJvcHMpLmVxdWFscyhtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhY2thZ2VJbXBvcnQgPSAiaW1wb3J0ICIgKyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSArICIuKjsiOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCVN0cmluZyBwcmltYXJ5S2V5RGVjbGFyYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWhhc1ByaW1hcnlLZXkpIHsKLQkJCXByaW1hcnlLZXlEZWNsYXJhdGlvbiA9IChmaWVsZEJhc2VkQWNjZXNzID8gIiAgQElkIFxuIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAiICBwcml2YXRlIGxvbmcgaWQ7XG5cbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIChmaWVsZEJhc2VkQWNjZXNzID8gIiIgOiAiICBASWQgXG4iKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAiICBwdWJsaWMgbG9uZyBnZXRJZCgpIHtcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgICAgcmV0dXJuIGlkO1xuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiAgfVxuXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICAgIHRoaXMuaWQgPSBpZDtcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgIH1cblxuIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJICBTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKSArICI7XG5cbiIgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCSsgImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qO1xuIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHBhY2thZ2VJbXBvcnQrIlxuXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiQEVudGl0eSBcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICgodGFibGVOYW1lLmxlbmd0aCgpID4gMCkgPyAoIkBUYWJsZShuYW1lPVwiIiArIHRhYmxlTmFtZSArICJcIilcbiIpIDogIiIpICAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJLy8kTk9OLU5MUy0zJAotCQkJCQkrIGNsYXNzRGVjbGFyYXRpb25TdHJpbmdDb250ZW50Ci0JCQkJCSsgcHJpbWFyeUtleURlY2xhcmF0aW9uCi0JCQkJCSsifSI7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQkJCi0JCi0Jc3RhdGljIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGdldEVudGl0eU5hbWVzKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCUxpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IGxpdCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS4KLQkJCQkJCQkJCQkJCWdldFBlcnNpc3RlbmNlKCkucGVyc2lzdGVuY2VVbml0cygpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBsaXQubmV4dCgpOwotCQlJdGVyYXRvcjxDbGFzc1JlZj4gbGkgPSBwdS5jbGFzc1JlZnMoKTsJCQkKLQkJd2hpbGUobGkuaGFzTmV4dCgpKSB7Ci0JCQlDbGFzc1JlZiBjZiA9IGxpLm5leHQoKTsKLQkJCW5hbWVzLmFkZChjZi5nZXRDbGFzc05hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlzdGF0aWMgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gZ2V0RW50aXR5U2ltcGxlTmFtZXMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gbGl0ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLgotCQkJCQkJCQkJCQkJZ2V0UGVyc2lzdGVuY2UoKS5wZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IGxpdC5uZXh0KCk7Ci0JCUl0ZXJhdG9yPENsYXNzUmVmPiBsaSA9IHB1LmNsYXNzUmVmcygpOwkJCQotCQl3aGlsZShsaS5oYXNOZXh0KCkpIHsKLQkJCUNsYXNzUmVmIGNmID0gbGkubmV4dCgpOwotCQkJbmFtZXMuYWRkKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoY2YuZ2V0Q2xhc3NOYW1lKCkpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NhcmRpbmFsaXR5RGVjb3JhdG9yKENvbm5lY3Rpb25EZWNvcmF0b3IgY2QpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBjZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlpZiAoIVRleHQuY2xhc3MuaXNJbnN0YW5jZShnYSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRleHQgdHh0ID0gKFRleHQpZ2E7Ci0JCXJldHVybiBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfTEFCRUxTLmNvbnRhaW5zKHR4dC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJU3RyaW5nIHJlcyA9IGdldEF0dHJpYnV0ZVR5cGVOYW1lKGF0KTsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0LCBuZXcgT2JqZWN0W10geyByZXMgfSk7IAotICAgIH0KLSAgICAKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2hlY2tKUEFGYWNldFZlcnNpb24oSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gY2hlY2tKUEFGYWNldFZlcnNpb24oanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIHZlcnNpb24pOwotCX0JCi0JCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNoZWNrSlBBRmFjZXRWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmcHJvaiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJU2V0PElQcm9qZWN0RmFjZXRWZXJzaW9uPiBwcm9qRmFjZXRzID0gZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpOwotCQlJdGVyYXRvcjxJUHJvamVjdEZhY2V0VmVyc2lvbj4gaXQgPSBwcm9qRmFjZXRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2ID0gaXQubmV4dCgpOwotCQkJaWYgKGZ2LmdldFByb2plY3RGYWNldCgpLmdldElkKCkuZXF1YWxzKCJqcHQuanBhIikpIAkvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZ2LmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHModmVyc2lvbik7CQkJCi0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsSW1wbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYWQwZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLlJlbEVuZERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclV0aWxJbXBsIGltcGxlbWVudHMgSUpQQUVkaXRvclV0aWwgewotCi0JcHVibGljIGludCBjYWxjQ29ubmVjdGlvbkxlbmd0aChGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSwgIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgIGNudCwgY29ubmVjdGlvbnNOdW0sIHNlbGZSZWxhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY3JlYXRlQmVuZFBvaW50TGlzdChjLCAgc2VsZlJlbGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uU3RhcnREaXIoRnJlZUZvcm1Db25uZWN0aW9uIGMpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0Q29ubmVjdGlvblN0YXJ0RGlyKGMpOwotCQkKLQl9Ci0JCi0JcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldENvbm5lY3Rpb25FbmREaXIoYyk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SlBUeXBlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgb3JnYW5pemVJbXBvcnRzKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKSB7Ci0JCUpQQUVkaXRvclV0aWwub3JnYW5pemVJbXBvcnRzKGN1LCB3cyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGZvcm1hdENvZGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpIHsKLQkJSlBBRWRpdG9yVXRpbC5mb3JtYXRDb2RlKGN1LCB3cyk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVVbmlxdWVFbnRpdHlOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCwgCi0JCQkgIFN0cmluZyBwYWNrLCAKLQkJCSAgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZW5lcmF0ZVVuaXF1ZUVudGl0eU5hbWUoanBhUHJvamVjdCwgcGFjaywgZnApOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlTWFwcGVkU3VwZXJjbGFzc05hbWUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgcGFjaywgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKGpwYVByb2plY3QsIHBhY2ssIGZwKTsKLQl9Ci0KLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBlbnRpdHlOYW1lLCBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jcmVhdGVFbnRpdHlJblByb2plY3QocHJvamVjdCwgZW50aXR5TmFtZSwganBhUHJlZmVyZW5jZVN0b3JlLCBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgCi0JCQkJbWFwcGVkU3VwZXJjbGFzc05hbWUsIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBoYXNQcmltYXJ5S2V5KTsKLSAJfQotCi0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQ2FyZGluYWxpdHlEZWNvcmF0b3IoQ29ubmVjdGlvbkRlY29yYXRvciBkYykgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5pc0NhcmRpbmFsaXR5RGVjb3JhdG9yKGRjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjYXJkV29ya2luZ0NvcHlPbmNlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJSlBBRWRpdG9yVXRpbC5kaXNjYXJkV29ya2luZ0NvcHlPbmNlKGN1KTsKLQl9Ci0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsIElQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QocHJvamVjdCwgbWFwcGVkU3VwZXJjbGFzc05hbWUsIGpwYVByZWZlcmVuY2VTdG9yZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQVNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDdjNGZiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQVNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3B0aW9uYWxNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlLkVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZVJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5CaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBU29sdmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElKcGFTb2x2ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU2V0PEpQQVNvbHZlcj4gc29sdmVyc1NldCA9IG5ldyBIYXNoU2V0PEpQQVNvbHZlcj4oKTsKLQotCXByaXZhdGUgc3RhdGljIFdvcmtpbmdDb3B5Q2hhbmdlTGlzdGVuZXIgd2Nsc25yID0gbnVsbDsKLQotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBrZXlUb0JPOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SnBhUHJvamVjdCwgV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+PiBwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lcjsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gZW50aXR5VG9Qcm9wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyOwkJCi0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXI7CQotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4+IGVudGl0eVRvQXRMaXN0ZW5lcjsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPj4gZW50aXR5VG9TdGF0ZUxpc3RlbmVyOwotCXByaXZhdGUgRW50aXR5Q2hhbmdlTGlzdGVuZXIgZW50aXR5TmFtZUxpc3RlbmVyOwotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gcmVtb3ZlSWdub3JlID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IHJlbW92ZVJlbElnbm9yZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGFkZElnbm9yZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIElSZWxhdGlvbj4gYXR0cmliVG9SZWwgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgSVJlbGF0aW9uPigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVBBUkFUT1IgPSAiLSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZTsKLQlwcml2YXRlIElKUEFFZGl0b3JVdGlsIHV0aWwgPSBudWxsOwotCi0JLyoqCi0JICogUHJvdmlkZXMgdGhlIHVuaXF1ZSBrZXkgZm9yIHRoZSBnaXZlbiBidXNpbmVzcyBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGJvCi0JICogICAgICAgICAgICB0aGUgZ2l2ZW4gYnVzaW5lc3Mgb2JqZWN0Ci0JICogCi0JICogQHJldHVybiB1bmlxdWUga2V5Ci0JICovCi0JcHVibGljIEpQQVNvbHZlcigpIHsKLQkJdGhpcyhFY2xpcHNlRmFjYWRlLklOU1RBTkNFLCBuZXcgSlBBRWRpdG9yVXRpbEltcGwoKSk7Ci0JCXN5bmNocm9uaXplZCAoSlBBU29sdmVyLmNsYXNzKSB7Ci0JCQlpZiAod2Nsc25yID09IG51bGwpIHsKLQkJCQl3Y2xzbnIgPSBuZXcgV29ya2luZ0NvcHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIod2Nsc25yLCBFbGVtZW50Q2hhbmdlZEV2ZW50LlBPU1RfQ0hBTkdFIHwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRSk7Ci0JCQl9Ci0JCX0KLQkJc29sdmVyc1NldC5hZGQodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBKUEFTb2x2ZXIoSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZSwgSUpQQUVkaXRvclV0aWwgdXRpbCkgewotCQl0aGlzLmVjbGlwc2VGYWNhZGUgPSBlY2xpcHNlRmFjYWRlOwotCQllY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCk7Ci0JCWtleVRvQk8gPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOwotCQlwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKcGFQcm9qZWN0LCBXZWFrUmVmZXJlbmNlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWVudGl0eVRvUHJvcExpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigpOyAKLQkJZW50aXR5VG9BdExpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+PigpOwotCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+PigpOwotCQllbnRpdHlOYW1lTGlzdGVuZXIgPSBuZXcgRW50aXR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zZXROYW1lKCJFbnRpdHkgTmFtZSBDaGFuZ2UgTGlzdGVuZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnV0aWwgPSB1dGlsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCi0JCWNsb3NlRGlhZ3JhbUVkaXRvcklmUHJvamVjdElzRGVsZXRlZChldmVudCk7Ci0JCQotCQl1bnJlZ2lzdGVyRGVsdGVkRW50aXR5KGV2ZW50KTsKLQkJCi0JCUlNYXJrZXJEZWx0YVtdIG1hcmtlckRlbHRhcyA9IGV2ZW50LmZpbmRNYXJrZXJEZWx0YXMobnVsbCwgdHJ1ZSk7Ci0JCVNldDxJRmlsZT4gZmlsZXNUb1VwZGF0ZSA9IG5ldyBIYXNoU2V0PElGaWxlPigpOwotCQlmb3IgKElNYXJrZXJEZWx0YSBkZWx0YSA6IG1hcmtlckRlbHRhcykgewotCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCWNvbnRpbnVlOwotCQkJZmlsZXNUb1VwZGF0ZS5hZGQoKElGaWxlKSBkZWx0YS5nZXRSZXNvdXJjZSgpKTsKLQkJfQotCQkKLQkJLy8gdXBkYXRlIGlzIG1hZGUgdG8gdGhlIHdob2xlIGVkaXRvci4gRmluZCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbiBwZQotCQkvLyB0byBiZSB1cGRhdGUgYW5kIGJyZWFrIHRoZSBpdGVyYXRpb24KLQkJYm9vbGVhbiB1cGRhdGVFZGl0b3IgPSBmYWxzZTsKLQkJRklMRTogZm9yIChJRmlsZSBmaWxlIDogZmlsZXNUb1VwZGF0ZSkgewotCQkJZm9yIChKYXZhUGVyc2lzdGVudFR5cGUganB0IDogZW50aXR5VG9Qcm9wTGlzdGVuZXIua2V5U2V0KCkpIHsKLQkJCQlpZiAoanB0LmdldFJlc291cmNlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgZWxlbWVudCA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCQkJCWJyZWFrOwotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZUVkaXRvciA9IHRydWU7Ci0JCQkJCQlicmVhayBGSUxFOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh1cGRhdGVFZGl0b3IpIHsKLQkJCWVjbGlwc2VGYWNhZGUuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmZWF0dXJlUHJvdmlkZXIuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW1FZGl0b3IoKS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJlbW92ZUlnbm9yZShTdHJpbmcgYXROYW1lKSB7Ci0JCXJlbW92ZUlnbm9yZS5hZGQoYXROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVSZWxJZ25vcmUoU3RyaW5nIGF0TmFtZSkgewotCQlyZW1vdmVSZWxJZ25vcmUuYWRkKGF0TmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBhZGRKUFRGb3JVcGRhdGUoU3RyaW5nIGpwdE5hbWUpIHsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLmFkZEpQVEZvclVwZGF0ZShqcHROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRBZGRJZ25vcmUoU3RyaW5nIGF0TmFtZSkgewotCQlhZGRJZ25vcmUuYWRkKGF0TmFtZSk7Ci0JfQotCQotCXB1YmxpYyBIYXNoU2V0PFN0cmluZz4gZ2V0QWRkSWdub3JlKCl7IAotIAkJcmV0dXJuIGFkZElnbm9yZTsgCi0gCX0gCi0KLQkKLQlwdWJsaWMgdm9pZCBzdG9wVGhyZWFkKCkgewotCQllbnRpdHlOYW1lTGlzdGVuZXIuc3RvcFRocmVhZCgpOwotCQllbnRpdHlOYW1lTGlzdGVuZXIgPSBudWxsOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgRW50aXR5Q2hhbmdlTGlzdGVuZXIgZ2V0TW9uaXRvcigpIHsKLQkJaWYgKGVudGl0eU5hbWVMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQllbnRpdHlOYW1lTGlzdGVuZXIgPSBuZXcgRW50aXR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQllbnRpdHlOYW1lTGlzdGVuZXIuc2V0TmFtZSgiRW50aXR5IE5hbWUgQ2hhbmdlIExpc3RlbmVyIik7IC8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCQlyZXR1cm4gZW50aXR5TmFtZUxpc3RlbmVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnV0aWwuSUpwYVNvbHZlciNzZXRGZWF0dXJlUHJvdmlkZXIob3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlUHJvdmlkZXIoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIpIHsKLQkJdGhpcy5mZWF0dXJlUHJvdmlkZXIgPSBmZWF0dXJlUHJvdmlkZXI7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zZXRGZWF0dXJlUHJvdmlkZXIoZmVhdHVyZVByb3ZpZGVyKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnNldERhZW1vbih0cnVlKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXlGb3JCdXNpbmVzc09iamVjdChPYmplY3QgYm8pIHsKLQkJaWYgKGJvID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgYm87Ci0JCQlTdHJpbmcgbmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLQkJCXJldHVybiAoKEFic3RyYWN0UmVsYXRpb24pIGJvKS5nZXRJZCgpOwotCQl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBibzsKLQkJCXJldHVybiAoKChQZXJzaXN0ZW50VHlwZSlhdC5nZXRQYXJlbnQoKSkuZ2V0TmFtZSgpICsgIi0iICsgYXQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBiby50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSBidXNpbmVzcyBvYmplY3QgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIHVuaXF1ZSBrZXkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBidXNpbmVzcyBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBrZXlUb0JPLmdldChrZXkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvZHVjZU93bmVyS2V5Rm9yUmVsKEFic3RyYWN0UmVsYXRpb24gcmVsKSB7Ci0JCXJldHVybiBwcm9kdWNlS2V5Rm9yUmVsKHJlbC5nZXRPd25lcigpLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcHJvZHVjZUludmVyc2VLZXlGb3JSZWwoQWJzdHJhY3RSZWxhdGlvbiByZWwpIHsKLQkJcmV0dXJuIHByb2R1Y2VLZXlGb3JSZWwocmVsLmdldEludmVyc2UoKSwgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcHJvZHVjZUtleUZvclJlbChKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4ganB0LmdldE5hbWUoKSArIFNFUEFSQVRPUiArIGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkS2V5QnVzaW5lc3NPYmplY3QoU3RyaW5nIGtleSwgT2JqZWN0IGJvKSB7Ci0JCWtleVRvQk8ucHV0KGtleSwgYm8pOwotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBibzsKLQkJCUpwYVByb2plY3QgcHJvaiA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQlhZGRMaXN0ZW5lcnNUb1Byb2plY3QocHJvaik7Ci0JCQlhZGRMaXN0ZW5lcnNUb0VudGl0eShqcHQpOwotCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUocGUsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0VOVElUWV9DTEFTU19OQU1FLCBqcHQuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLQkJCUFic3RyYWN0UmVsYXRpb24gcmVsID0gKEFic3RyYWN0UmVsYXRpb24pIGJvOwotCQkJYXR0cmliVG9SZWwucHV0KHByb2R1Y2VPd25lcktleUZvclJlbChyZWwpLCByZWwpOwotCQkJaWYgKHJlbCBpbnN0YW5jZW9mIEJpZGlyZWN0aW9uYWxSZWxhdGlvbikgewotCQkJCWF0dHJpYlRvUmVsLnB1dChwcm9kdWNlSW52ZXJzZUtleUZvclJlbChyZWwpLCByZWwpOwotCQkJfQotCQl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCWFkZFByb3BlcnRpZXNMaXN0ZW5lclRvQXR0cmlidXRlKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlibyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgbyA9IGtleVRvQk8ucmVtb3ZlKGtleSk7Ci0JCWlmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgbzsKLQkJCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cyA9IGpwdC5hdHRyaWJ1dGVzKCk7Ci0JCQl3aGlsZSAoYXR0cy5oYXNOZXh0KCkpIHsKLQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGF0dHMubmV4dCgpOwotCQkJCVN0cmluZyBrID0gZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCQkJCXJlbW92ZShrKTsKLQkJCX0KLQkJCQotCQkJcmVtb3ZlTGlzdGVuZXJzRnJvbUVudGl0eShqcHQpOwotCQkJRGlhZ3JhbSBkID0gZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCQlpZiAoZC5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHJlZiA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLnJlbW92ZShqcHQuZ2V0SnBhUHJvamVjdCgpKTsKLQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNoID0gcmVmLmdldCgpOwotCQkJCQlpZiAoY2ggIT0gbnVsbCkgCi0JCQkJCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBjaCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCQlKUEFFZGl0b3JVdGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IChBYnN0cmFjdFJlbGF0aW9uKSBvOwotCQkJYXR0cmliVG9SZWwucmVtb3ZlKHByb2R1Y2VPd25lcktleUZvclJlbChyZWwpKTsKLQkJCWlmIChyZWwgaW5zdGFuY2VvZiBCaWRpcmVjdGlvbmFsUmVsYXRpb24pIAotCQkJCWF0dHJpYlRvUmVsLnJlbW92ZShwcm9kdWNlSW52ZXJzZUtleUZvclJlbChyZWwpKTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJlbW92ZUxpc3RlbmVyc0Zyb21BdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKW8pOwotCQl9Ci0JCXJldHVybiBvOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiB1dGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVN0cmluZyBrZXkgPSBwcm9kdWNlS2V5Rm9yUmVsKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGF0dHJpYlRvUmVsLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJU3RyaW5nIGtleSA9IHByb2R1Y2VLZXlGb3JSZWwoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCkpOwotCQlyZXR1cm4gYXR0cmliVG9SZWwuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIFNldDxJUmVsYXRpb24+IGdldFJlbGF0aW9uc1JlbGF0ZWRUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSBqcHQuYXR0cmlidXRlcygpOwotCQlIYXNoU2V0PElSZWxhdGlvbj4gcmVzID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGl0Lm5leHQoKTsKLQkJCUlSZWxhdGlvbiByZWwgPSBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShhdCk7Ci0JCQlpZiAocmVsICE9IG51bGwpCi0JCQkJcmVzLmFkZChyZWwpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCi0JCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyKSB7Ci0JCVNldDxJUmVsYXRpb24+IHJlbHMgPSBnZXRSZWxhdGlvbnNSZWxhdGVkVG9FbnRpdHkoanB0MSk7Ci0JCWlmIChleGlzdHNSZWxhdGlvbihqcHQxLCBqcHQyLCByZWxzKSkKLQkJCXJldHVybiB0cnVlOwkJCi0JCXJlbHMgPSBnZXRSZWxhdGlvbnNSZWxhdGVkVG9FbnRpdHkoanB0Mik7Ci0JCXJldHVybiBleGlzdHNSZWxhdGlvbihqcHQxLCBqcHQyLCByZWxzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIAotCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCSAgU2V0PElSZWxhdGlvbj4gcmVscykgewotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJaWYgKChqcHQxLmVxdWFscyhyZWwuZ2V0T3duZXIoKSkgJiYganB0Mi5lcXVhbHMocmVsLmdldEludmVyc2UoKSkpIHx8Ci0JCQkJKChqcHQyLmVxdWFscyhyZWwuZ2V0T3duZXIoKSkgJiYganB0MS5lcXVhbHMocmVsLmdldEludmVyc2UoKSkpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uPE9iamVjdD4gZ2V0VmlzdWFsaXplZE9iamVjdHMoKSB7Ci0JCXJldHVybiBrZXlUb0JPLnZhbHVlcygpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgcmVuZXdBdHRyaWJ1dGVNYXBwaW5nUHJvcExpc3RlbmVyKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoanBhKTsKLQkJcmVuZXdBdHRyaWJ1dGVNYXBwaW5nT3B0UHJvcExpc3RlbmVyKGpwYSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc24gPSBudWxsOwotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7Ci0JCQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJaWYgKHJyID09IG51bGwpCi0JCQlyZXR1cm47CQkJCi0JCVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpzID0gcnIuZ2V0U3RyYXRlZ3koKTsKLQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJbHNuID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJanMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCXJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZU1hcHBpbmdPcHRQcm9wTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IG51bGw7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7CQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoamFtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghTWFueVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkgJiYgIU9uZVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQlpZiAobHNuICE9IG51bGwpIAotCQkJamFtLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlsc24gPSBuZXcgQXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJamFtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJcmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyc1RvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChwcm9qKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lci5nZXQocHJvaik7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQkvKgotCQkJaWYgKCFwcm9qLmdldFVwZGF0ZXIoKS5nZXRDbGFzcygpLmlzSW5zdGFuY2UoU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5jbGFzcykpCi0JCQkJcHJvai5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKHByb2opKTsKLQkJCSovCi0JCQlsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcigpOwotCQkJcHJvai5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCXByb2plY3RUb0VudGl0eUxpc3RlbmVyLnB1dChwcm9qLCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnNUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWFkZEF0TGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoanB0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXRMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+KGxzbnIpOwotCQkJZW50aXR5VG9BdExpc3RlbmVyLnB1dChqcHQsIGxzbnJSZWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gZW50aXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuZ2V0TWFwcGluZygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koanBhKTsJCQotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb1JlbGF0aW9uc2hpcFJlZmVyZW5jZShqcGEpOwotCQlhZGRPcHRQcm9wTGlzdGVuZXJUb0F0dHJpYnV0ZU1hcHBpbmcoanBhKTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvQXR0cmlidXRlSXRzZWxmKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCWpwYS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdFByb3BMaXN0ZW5lclRvQXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKGphbSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSmF2YU1hbnlUb09uZU1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pICYmCi0JCQkJCSFKYXZhT25lVG9PbmVNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQlyZXR1cm47Ci0JCQlqYW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25hbE1hcHBpbmcuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCQotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJcmV0dXJuOwotCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJaWYgKHJyID09IG51bGwpCi0JCQkJcmV0dXJuOwkJCQotCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCQlyZXR1cm47Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCQkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCUF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCXJldHVybjsKLQkJCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCWlmIChyciA9PSBudWxsKQotCQkJCXJldHVybjsJCQotCQkJcnIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSwgbHNucik7Ci0JCQlyci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG5ldyBBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIGxzbnJSZWYpOwotCQl9Ci0JCQotCX0KLQkKLQotCQotCXByaXZhdGUgdm9pZCBhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWVudGl0eVRvU3RhdGVMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnNGcm9tRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoanB0KTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCQlyZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzRnJvbUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZShqcGEpOwotCX0JCi0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvQXRMaXN0ZW5lci5nZXQoanB0KTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvQXRMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCWpwdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvUHJvcExpc3RlbmVyLmdldChqcHQpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcHQpOwotCQkJdHJ5IHsKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCXJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUpvaW5pbmdTdHJhdGVneShqcGEpOwotCQlyZW1vdmVQcm9wTGlzdGVuZXJGcm9tUmVsYXRpb25zaGlwUmVmZXJlbmNlKGpwYSk7Ci0JCXJlbW92ZU9wdFByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVNYXBwaW5nKGpwYSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZUl0c2VsZihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewotCQkJCWpwYS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwkJCi0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewkJCQotCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCQlyZXR1cm47Ci0JCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJCWlmIChyciA9PSBudWxsKQotCQkJCQlyZXR1cm47CQkJCi0JCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJCWlmICgoanMgPT0gbnVsbCkgfHwgIU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuY2xhc3MuaXNJbnN0YW5jZShqcykpCi0JCQkJCXJldHVybjsKLQkJCQlqcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNucik7CQkJCQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsJCQotCQlsc25yUmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCWxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQkJdHJ5IHsJCQkKLQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCWlmICgoamFtID09IG51bGwpIHx8ICFSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQkJcmV0dXJuOwotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbnIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JfQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7CQkKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCXRyeSB7CQkJCi0JCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamFtID0ganBhLmdldE1hcHBpbmcoKTsKLQkJCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJCXJldHVybjsKLQkJCQlSZWxhdGlvbnNoaXAgcnIgPSAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGphbSkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQkJaWYgKHJyID09IG51bGwpCi0JCQkJCXJldHVybjsJCQkKLQkJCQlyci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFJlYWRPbmx5UmVsYXRpb25zaGlwLlNUUkFURUdZX1BST1BFUlRZLCBsc25yKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQkJCi0JCX0JCQkJCi0JfQotCQkKLQotCXByaXZhdGUgdm9pZCByZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvU3RhdGVMaXN0ZW5lci5nZXQoanB0KTsKLQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlqcHQucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsJCQkKLQkJfQotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudFR5cGU+IGl0ID0gZW50aXR5VG9TdGF0ZUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKYXZhUGVyc2lzdGVudFR5cGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanB0LnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobHNuKTsKLQkJfQotCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIuY2xlYXIoKTsKLQkJZW50aXR5VG9TdGF0ZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVByb3BDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIAotCQkJcy5hZGQoaXQubmV4dCgpKTsKLQkJaXQgPSBzLml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNuKTsKLQkJfQotCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQllbnRpdHlUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVBdHRyaWJ1dGVQcm9wQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQl0cnkgewotCQkJCQlqcGEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFksIGxzbik7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcENoYW5nZUxpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsJCQotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJdHJ5IHsKLQkJCQkJanBhLmdldE1hcHBpbmcoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNuKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQl9Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmNsZWFyKCk7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyID0gbnVsbDsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlpZiAocmVmID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJY29udGludWU7CQkJCi0JCQl0cnkgewotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lciA9IG51bGw7CQkKLQl9CQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb0F0TGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4gcyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8TGlzdENoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbik7Ci0JCX0KLQkJZW50aXR5VG9BdExpc3RlbmVyLmNsZWFyKCk7Ci0JCWVudGl0eVRvQXRMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvamVjdExpc3RlbmVycygpIHsJCQotCQlJdGVyYXRvcjxKcGFQcm9qZWN0PiBpdCA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKcGFQcm9qZWN0PiBzID0gbmV3IEhhc2hTZXQ8SnBhUHJvamVjdD4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHJlZiA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLnJlbW92ZShwcm9qZWN0KTsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc24gPSByZWYuZ2V0KCk7Ci0JCQlpZiAobHNuICE9IG51bGwpIAotCQkJCXByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGxzbik7Ci0JCX0KLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIuY2xlYXIoKTsKLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCkgewotCQlyZW1vdmVPcHRQcm9wTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlQXR0cmlidXRlUHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwkKLQkJcmVtb3ZlRW50aXR5UHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlUHJvamVjdExpc3RlbmVycygpOwotCQllY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXQgPSBrZXlUb0JPLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBibyA9IGl0Lm5leHQoKTsKLQkJCWlmICghSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYm8pKQotCQkJCWNvbnRpbnVlOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KCgoSmF2YVBlcnNpc3RlbnRUeXBlKWJvKSk7Ci0JCQl1dGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCQl9Ci0JCQotCQl1dGlsID0gbnVsbDsKLQkJa2V5VG9CTy5jbGVhcigpOwotCQlhdHRyaWJUb1JlbC5jbGVhcigpOwotCQlrZXlUb0JPID0gbnVsbDsKLQkJYXR0cmliVG9SZWwgPSBudWxsOwkKLQkJcmVtb3ZlQWxsTGlzdGVuZXJzKCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoSlBBU29sdmVyLmNsYXNzKSB7Ci0JCQlzb2x2ZXJzU2V0LnJlbW92ZSh0aGlzKTsKLQkJCWlmIChzb2x2ZXJzU2V0LmlzRW1wdHkoKSkgewotCQkJCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIod2Nsc25yKTsKLQkJCQl3Y2xzbnIgPSBudWxsOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrZXlUb0JPLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5T25jZShjdSk7Ci0JCUpQQUVkaXRvclV0aWwuYmVjb21lV29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZ25vcmVFdmVudHMgPSBmYWxzZTsgCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBXb3JraW5nQ29weUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIUlKYXZhRWxlbWVudERlbHRhLmNsYXNzLmlzSW5zdGFuY2UobykpCi0JCQkJcmV0dXJuOwotCi0JCQlJSmF2YUVsZW1lbnREZWx0YSBqZWQgPSAoSUphdmFFbGVtZW50RGVsdGEpbzsKLQkJCVNldDxJQ29tcGlsYXRpb25Vbml0PiBhZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMgPSBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoamVkKTsKLQkJCQotCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogYWZmZWN0ZWRDb21waWxhdGlvblVuaXRzKSB7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCQlmb3IgKEpQQVNvbHZlciBzb2x2ZXIgOiBzb2x2ZXJzU2V0KSB7Ci0JCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGNzID0gKENvbnRhaW5lclNoYXBlKXNvbHZlci5mZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWlmIChjcyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgZW50TmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChqcHQpOwotCQkJCQl0cnkgewotCQkJCQkJZmluYWwgU3RyaW5nIG5ld0hlYWRlciA9IChjdS5oYXNVbnNhdmVkQ2hhbmdlcygpID8gIiogIiA6ICIiKSArIGVudE5hbWU7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVIZWFkZXIoY3MsIG5ld0hlYWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBjaGVjayBjb21waWxhdGlvbiB1bml0IGZvciB1bnNhdmVkIGNoYW5nZXMiKTsJLy8kTk9OLU5MUy0xJAotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsJCQkgCi0JCQkJCX0JCi0JCQkJfQotCQkJCQotCQkJfQkJCQotCQl9Ci0JCQotCQlwcml2YXRlIFNldDxJQ29tcGlsYXRpb25Vbml0PiBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsgCi0JCQlTZXQ8SUNvbXBpbGF0aW9uVW5pdD4gcmVzID0gbmV3IEhhc2hTZXQ8SUNvbXBpbGF0aW9uVW5pdD4oKTsKLQkJCUlKYXZhRWxlbWVudCBlbCA9IGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChJQ29tcGlsYXRpb25Vbml0LmNsYXNzLmlzSW5zdGFuY2UoZWwpKQotCQkJCXJlcy5hZGQoKElDb21waWxhdGlvblVuaXQpZWwpOwotCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldENoYW5nZWRDaGlsZHJlbigpOwotCQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQkJU2V0PElDb21waWxhdGlvblVuaXQ+IGN1cyA9IGdldEFmZmVjdGVkQ29tcGlsYXRpb25Vbml0cyhjaGlsZCk7Ci0JCQkJcmVzLmFkZEFsbChjdXMpOwotCQkJfQotCQkJcmV0dXJuIHJlczsKLQkJfQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgSlBBUHJvamVjdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsJCQkJCi0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChpZ25vcmVFdmVudHMpCi0JCQkJcmV0dXJuOwotCi0JCQlJdGVyYXRvcjw/PiBpdCA9IGV2ZW50LmdldEl0ZW1zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgbyA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIShvIGluc3RhbmNlb2YgSnBhRmlsZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZpbmFsIEpwYUZpbGUganBhRmlsZSA9IChKcGFGaWxlKW87Ci0JCQkJSnB0UmVzb3VyY2VNb2RlbCBqcm0gPSAoKEpwYUZpbGUpbykuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJCWlmICghSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmNsYXNzLmlzSW5zdGFuY2UoanJtKSkKLQkJCQkJY29udGludWU7Ci0JCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KWpybTsKLQkJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0ganJjdS5wZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBqcnB0LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkKLQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBqcGFGaWxlLmdldEpwYVByb2plY3QoKTsKLQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCQkJaWYocHUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCQkJZmluYWwgQ29udGFpbmVyU2hhcGUgY3MgPSAoQ29udGFpbmVyU2hhcGUpZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCWlmIChjcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJZmluYWwgUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChjcyk7Ci0JCQkJZmluYWwgSVJlbW92ZUZlYXR1cmUgZnQgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UmVtb3ZlRmVhdHVyZShjdHgpOzsKLQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjcyk7Ci0JCQkJCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQkJCX0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7fQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7fQotCX07Ci0KLQlwdWJsaWMgY2xhc3MgRW50aXR5U3RhdGVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJQWRkRW50aXR5QXR0cmlidXRlcyB0YXNrID0gbmV3IEFkZEVudGl0eUF0dHJpYnV0ZXMoZXZlbnQpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2spOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJUmVtb3ZlRW50aXR5QXR0cmlidXRlcyB0YXNrID0gbmV3IFJlbW92ZUVudGl0eUF0dHJpYnV0ZXMoZXZlbnQpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2spOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHt9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgYXJnMCkge30KLQl9OwotCi0JcHVibGljIGNsYXNzIEVudGl0eVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCWlmIChwcm9wTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU1BFQ0lGSUVEX05BTUUpKSB7CQotCQkJCWZpbmFsIEphdmFFbnRpdHkgamUgPSAoSmF2YUVudGl0eSlldmVudC5nZXRTb3VyY2UoKTsKLQkJCQlSdW5uYWJsZSBqb2IgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IGZlYXR1cmVQcm92aWRlci5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpOwotCQkJCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gamUuZ2V0UGVyc2lzdGVudFR5cGUoKTsgCi0JCQkJCQkJCXVwZGF0ZUpQVE5hbWUoanB0KTsKLQkJCQkJCQkgICAgU3RyaW5nIHRhYmxlTmFtZSA9IEpQQUVkaXRvclV0aWwuZm9ybVRhYmxlTmFtZShqcHQpOwotCQkJCQkJCSAgICBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5zZXRUYWJsZU5hbWUoanB0LCB0YWJsZU5hbWUpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhqb2IpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQotCQkJTW9kZWwgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzLmlzSW5zdGFuY2Uoc291cmNlKSkKLQkJCQlyZXR1cm47Ci0JCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZmVhdHVyZVByb3ZpZGVyCi0JCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc291cmNlKQotCQkJCQkJCS5nZXRQYXJlbnQoKSk7CQkJCi0JCQlmaW5hbCBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoCi0JCQkJCWZlYXR1cmVQcm92aWRlcik7Ci0JCQlmaW5hbCBDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmdC5leGVjdXRlKGN0eCk7CQkJCQkKLQkJCQl9Ci0JCQl9OwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJaWYgKHByb3BOYW1lLmVxdWFscyhQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFkpKSB7Ci0JCQkJcmVuZXdBdHRyaWJ1dGVNYXBwaW5nUHJvcExpc3RlbmVyKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc291cmNlKTsKLQkJCX0KLQkJfQotCX0JCi0KLQkvKiAKLQkgKiBUaGlzIGxpc3RlbmVyIGxpc3RlbnMgd2hlbiBtYXBwZWRCeSBoYXMgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCi0JCQlNb2RlbCBtID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuY2xhc3MuaXNJbnN0YW5jZShtKSkKLQkJCQlyZXR1cm47Ci0JCQlNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpzID0gKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kpbTsKLQkJCUpwYU5vZGUgbmQgPSBqcy5nZXRQYXJlbnQoKTsKLQkJCWlmIChuZCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW5kID0gbmQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAobmQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQluZCA9IG5kLmdldFBhcmVudCgpOwotCQkJaWYgKChuZCA9PSBudWxsKSB8fCAhSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MuaXNJbnN0YW5jZShuZCkpCi0JCQkJcmV0dXJuOwkJCQotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpbmQ7Ci0JCQlpZiAoIWF0LmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFJlc291cmNlKCkuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQuZ2V0UGFyZW50KCkpOwotCQkJZmluYWwgVXBkYXRlQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7IAotCQkJZmluYWwgQ3VzdG9tQ29udGV4dCBjdHggPSBuZXcgQ3VzdG9tQ29udGV4dCgpOwotCQkJY3R4LnNldElubmVyUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZ0LmV4ZWN1dGUoY3R4KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9Ci0JfQkJCi0JCi0JCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewkJCi0JCQlSZWxhdGlvbnNoaXAgcnIgPSAoUmVsYXRpb25zaGlwKWV2ZW50LmdldFNvdXJjZSgpOwotCQkJSnBhTm9kZSBwID0gcnIuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXAgPSBwLmdldFBhcmVudCgpOwotCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzLmlzSW5zdGFuY2UocCkpCi0JCQkJcmV0dXJuOwotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKXA7Ci0JCQlyZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoanBhKTsKLQkJCWlmICghanBhLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFJlc291cmNlKCkuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanBhLmdldFBhcmVudCgpKTsKLQkJCWZpbmFsIFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOyAKLQkJCWZpbmFsIEN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCWN0eC5zZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmdC5leGVjdXRlKGN0eCk7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsJCQotCQl9Ci0JfQkJCi0JCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlCb29sZWFuIG9wdGlvbmFsID0gKEJvb2xlYW4pZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCWJvb2xlYW4gaXNPcHRpb25hbCA9IChvcHRpb25hbCA9PSBudWxsKSA/IHRydWUgOiBvcHRpb25hbC5ib29sZWFuVmFsdWUoKTsKLQkJCU9wdGlvbmFsTWFwcGluZyBubSA9IChPcHRpb25hbE1hcHBpbmcpZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpbm0uZ2V0UGFyZW50KCk7Ci0JCQlJUmVsYXRpb24gcmVsID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKGpwYSk7Ci0JCQlib29sZWFuIGF0QmVnaW5uaW5nID0gIXJlbC5nZXRPd25lcigpLmVxdWFscyhqcGEuZ2V0UGFyZW50KCkpIHx8IAotCQkJCQkJCQkgICFyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkuZXF1YWxzKGpwYS5nZXROYW1lKCkpOwotCQkJZmluYWwgQ29ubmVjdGlvbiBjID0gKENvbm5lY3Rpb24pZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwpOwotCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uRGVjb3JhdG9yPiBjb25EZWNzID0gYy5nZXRDb25uZWN0aW9uRGVjb3JhdG9ycygpOwotCQkJSXRlcmF0b3I8Q29ubmVjdGlvbkRlY29yYXRvcj4gaXQgPSBjb25EZWNzLml0ZXJhdG9yKCk7Ci0JCQlmaW5hbCBTdHJpbmcgbmV3TGFiZWxUZXh0ID0gaXNPcHRpb25hbCA/IAotCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9aRVJPX09ORSA6IAotCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5DQVJESU5BTElUWV9PTkU7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWwgQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IGl0Lm5leHQoKTsKLQkJCQlpZiAoIUpQQUVkaXRvclV0aWwuaXNDYXJkaW5hbGl0eURlY29yYXRvcihjZCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWRvdWJsZSBkID0gY2QuZ2V0TG9jYXRpb24oKTsKLQkJCQlpZiAoKGF0QmVnaW5uaW5nICYmIGQgPiAwLjUpIHx8ICghYXRCZWdpbm5pbmcgJiYgZCA8PSAwLjUpKQotCQkJCQljb250aW51ZTsKLQkJCQkKLQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjZCk7Ci0JCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQkJCVRleHQgdHh0ID0gKFRleHQpY2QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCQkJCXR4dC5zZXRWYWx1ZShuZXdMYWJlbFRleHQpOwotCQkJCQkJCi0JCQkJCQlQb2ludCBwdCA9IEpQQUVkaXRvclV0aWwucmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKChGcmVlRm9ybUNvbm5lY3Rpb24pYywgY2QpOwotCQkJCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24odHh0LCBwdC54LCBwdC55LCBmYWxzZSk7CQkJCQkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0JCi0KLQlwdWJsaWMgY2xhc3MgUmVtb3ZlRW50aXR5QXR0cmlidXRlcyBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJTGlzdFJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlwdWJsaWMgUmVtb3ZlRW50aXR5QXR0cmlidXRlcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IChBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPikgZXZlbnQuZ2V0SXRlbXMoKS5pdGVyYXRvcigpOwotCQkJCVNldDxTaGFwZT4gc2hhcGVzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxTaGFwZT4oKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCQkJCQkvKgotCQkJCQlTdHJpbmcga2V5ID0gZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCQkJCQlyZW1vdmUoa2V5KTsKLQkJCQkJKi8KLQkJCQkJaWYgKHJlbW92ZUlnbm9yZS5yZW1vdmUoKChQZXJzaXN0ZW50VHlwZSlhdC5nZXRQYXJlbnQoKSkuZ2V0TmFtZSgpICsgIi4iICsgYXQuZ2V0TmFtZSgpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGludWU7Ci0JCQkJCVNoYXBlIGF0U2hhcGUgPSAoU2hhcGUpIGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCQkJCQlpZiAoYXRTaGFwZSA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCQotCQkJCQkKLQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChuZXdBdCAhPSBudWxsKSB7Ci0JCQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyLCB0cnVlLCB0cnVlKTsKLQkJCQkJCVJlbW92ZUNvbnRleHQgYyA9IG5ldyBSZW1vdmVDb250ZXh0KGF0U2hhcGUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmdC5yZW1vdmUoYyk7Ci0JCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZWUpIHsKLQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlBZGRBdHRyaWJ1dGVGZWF0dXJlIGZ0MSA9IG5ldyBBZGRBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCQlBZGRDb250ZXh0IGMxID0gbmV3IEFkZENvbnRleHQoKTsKLQkJCQkJCWMxLnNldE5ld09iamVjdChuZXdBdCk7Ci0JCQkJCQlmdDEuYWRkKGMxKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCXNoYXBlc1RvUmVtb3ZlLmFkZChhdFNoYXBlKTsKLQkJCQkJSVJlbGF0aW9uIHJlbCA9ICgoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgZmVhdHVyZVByb3ZpZGVyKS5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShhdCk7Ci0JCQkJCWlmIChyZWwgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlDb25uZWN0aW9uIGNvbm4gPSAoQ29ubmVjdGlvbikgZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwpOwotCQkJCQl3aGlsZSAoY29ubiAhPSBudWxsKSB7Ci0JCQkJCQlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbm4pOwotCQkJCQkJUmVtb3ZlUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZVJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCQkJCQljb25uID0gKENvbm5lY3Rpb24pIGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlJdGVyYXRvcjxTaGFwZT4gaXRyID0gc2hhcGVzVG9SZW1vdmUuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQlTaGFwZSBhdFNoYXBlID0gaXRyLm5leHQoKTsKLQkJCQkJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChhdFNoYXBlKTsKLQkJCQkJUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlciwgdHJ1ZSwgdHJ1ZSk7Ci0JCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVscyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnByb2R1Y2VBbGxSZWxhdGlvbnMoCi0JCQkJCQkoSmF2YVBlcnNpc3RlbnRUeXBlKSBldmVudC5nZXRTb3VyY2UoKSwgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdGVyID0gcmVscy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlJUmVsYXRpb24gcmVsID0gaXRlci5uZXh0KCk7Ci0JCQkJCUNvbnRhaW5lclNoYXBlIG93bmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGZlYXR1cmVQcm92aWRlcgotCQkJCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldE93bmVyKCkpOwotCQkJCQlDb250YWluZXJTaGFwZSBpbnZlcnNlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGZlYXR1cmVQcm92aWRlcgotCQkJCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQkJCUFkZENvbm5lY3Rpb25Db250ZXh0IGNudHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoSlBBRWRpdG9yVXRpbC5nZXRBbmNob3Iob3duZXJTaGFwZSksCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5nZXRBbmNob3IoaW52ZXJzZVNoYXBlKSk7Ci0JCQkJCWNudHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCQkJCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJZnQuYWRkKGNudHgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQWRkRW50aXR5QXR0cmlidXRlcyBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJTGlzdEFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQotCQlwdWJsaWMgQWRkRW50aXR5QXR0cmlidXRlcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuZXZlbnQgPSBldmVudDsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgZW50U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQotCQkJCS8vIHJlbW92ZSBpbnZhbGlkYXRlZCByZWxhdGlvbnMgKGlmIGFueSkKLQkJCQlBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IChBcnJheUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPikgZXZlbnQuZ2V0SXRlbXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBpdC5uZXh0KCk7Ci0JCQkJCS8vU2hhcGUgYXRTaGFwZSA9IChTaGFwZSkgZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdCk7Ci0JCQkJCS8vaWYgKGF0U2hhcGUgIT0gbnVsbCkKLQkJCQkJLy8JY29udGludWU7Ci0JCQkJCWlmIChhZGRJZ25vcmUucmVtb3ZlKCgoUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSArICIuIiArIGF0LmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlBZGRDb250ZXh0IGN0eCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCQkJCWN0eC5zZXROZXdPYmplY3QoYXQpOwotCQkJCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGVudFNoYXBlKTsKLQkJCQkJQWRkQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBBZGRBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCWZ0LmFkZChjdHgpOwotCQkJCX0KLQkJCQkvL0pwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbWFrZVJlbGF0aW9ucygoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilmZWF0dXJlUHJvdmlkZXIsIGVudFNoYXBlLCBqcHQpOwotCQkJCWZlYXR1cmVQcm92aWRlci5hZGRKUFRGb3JVcGRhdGUoanB0LmdldE5hbWUoKSk7Ci0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KSB7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5hZGRBdHRyaWJGb3JVcGRhdGUocHUsIGVudEF0TWFwcGVkQnkpOwotCX0KLQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVKUFROYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJU3RyaW5nIGVudE5hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCk7Ci0JCWVudE5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGVudE5hbWUpOwotCQlDb250YWluZXJTaGFwZSBlbnRTaGFwZSA9IChDb250YWluZXJTaGFwZSlmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCUpQQUVkaXRvclV0aWwuc2V0SlBUTmFtZUluU2hhcGUoZW50U2hhcGUsIGVudE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ySWZQcm9qZWN0SXNEZWxldGVkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlSZXNvdXJjZURlbHRhIGNoYW5nZWREZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gY2hhbmdlZERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChJUmVzb3VyY2VEZWx0YSBkZWx0YSA6IGRlbHRhcykgewotCQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCSAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlmaW5hbCBJRGlhZ3JhbVR5cGVQcm92aWRlciBwcm92aWRlciA9IGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7Ci0JCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpIHsKLQkJCQkJCWZpbmFsIEpQQURpYWdyYW1FZGl0b3IgZGlhZ3JhbUJ5U2VsZWN0ZWRQcm9qZWN0ID0gKChKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyKSBwcm92aWRlcikuZ2V0RGlhZ3JhbUVkaXRvcigpOwotCQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQkJCQkJaWYgKGRpYWdyYW1CeVNlbGVjdGVkUHJvamVjdC5nZXRQYXJ0TmFtZSgpLmVxdWFscyhyZXNvdXJjZS5nZXROYW1lKCkpKSB7Ci0JCQkJCQkJCQkJCXBhZ2UuY2xvc2VFZGl0b3IoZGlhZ3JhbUJ5U2VsZWN0ZWRQcm9qZWN0LCBmYWxzZSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRGVsdGVkRW50aXR5KElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUlSZXNvdXJjZURlbHRhIGNoYW5nZWREZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gY2hhbmdlZERlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJZm9yIChJUmVzb3VyY2VEZWx0YSBkZWx0YSA6IGRlbHRhcykgewotCQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQlmb3IgKElSZXNvdXJjZURlbHRhIGRlbHRhUmVzb3VyY2UgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQkJCUxpc3Q8SVJlc291cmNlRGVsdGE+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlRGVsdGE+KCk7Ci0JCQkJCQlyZXNvdXJjZXMgPSBmaW5kRGVsZXRlZFJlc291cmNlKGRlbHRhUmVzb3VyY2UsIHJlc291cmNlcyk7Ci0JCQkJCQlmb3IgKElSZXNvdXJjZURlbHRhIHJlc291cmNlRGVsdGEgOiByZXNvdXJjZXMpIHsKLQkJCQkJCQlpZiAocmVzb3VyY2VEZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgRmlsZSkgewotCQkJCQkJCQlJRmlsZSBmaWxlID0gdGhpcy5lY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKCgoRmlsZSkgcmVzb3VyY2VEZWx0YS5nZXRSZXNvdXJjZSgpKS5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpICYmIGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQkJCQkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCQkJCQkJCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBmcmFnbWVudFJvb3QgOiBmcmFnbWVudFJvb3RzKSB7Ci0JCQkJCQkJCQkJCQkJaWYgKChmcmFnbWVudFJvb3QgaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnRSb290KSAmJiBmcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IFBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJCQkJCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIGZyYWdtZW50Um9vdDsKLQkJCQkJCQkJCQkJCQkJU3RyaW5nIHNvdXJjZWZvbGRlciA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7Ci0JCQkJCQkJCQkJCQkJCVN0cmluZ1tdIGZxID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3BsaXQoc291cmNlZm9sZGVyKTsKLQkJCQkJCQkJCQkJCQkJU3RyaW5nIGZxTmFtZSA9IGZxWzFdLnJlcGxhY2UoIi8iLCAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQkJZnFOYW1lID0gZnFOYW1lLnJlcGxhY2VGaXJzdCgiLiIsICIiKS5yZXBsYWNlKCIuamF2YSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJCQkJCQkJCQkvL0pQQUVkaXRvclV0aWwuY3JlYXRlVW5yZWdpc3RlckVudGl0eUZyb21YTUxKb2IoanBhUHJvamVjdCwgZnFOYW1lKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0PElSZXNvdXJjZURlbHRhPiBmaW5kRGVsZXRlZFJlc291cmNlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBMaXN0PElSZXNvdXJjZURlbHRhPiByZXNvdXJjZXMpewotCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgZGVsIDogZGVsdGFzKSB7Ci0JCQkJZmluZERlbGV0ZWRSZXNvdXJjZShkZWwsIHJlc291cmNlcyk7Ci0JCQkJaWYoZGVsLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGg9PTApCi0JCQkJICAgIHJlc291cmNlcy5hZGQoZGVsKTsKLQkJCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pwYUFydGlmYWN0RmFjdG9yeS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODY2OGMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuVXBkYXRlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkJpZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55QmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuVW5pZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSnBhQXJ0aWZhY3RGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYUFydGlmYWN0RmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBKcGFBcnRpZmFjdEZhY3RvcnkoKTsJCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUyA9IDI1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQQVVTRV9EVVJBVElPTiA9IDIwMDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9UWVBFID0gImphdmEudXRpbC5Db2xsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1RZUEUgPSAiamF2YS51dGlsLkxpc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVF9UWVBFID0gImphdmEudXRpbC5TZXQiOyAvLyROT04tTkxTLTEkCi0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIEpwYUFydGlmYWN0RmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlhZGRPbmVUb09uZVJlbGF0aW9uKGZwLCBqcHQsIGF0dHJpYnV0ZSwgbnVsbCwgbnVsbCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uIChJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMikgewotCQkKLQkJYWRkT25lVG9PbmVSZWxhdGlvbihmcCwganB0MSwgYXR0cmlidXRlMSwganB0MiwgYXR0cmlidXRlMiwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9PbmVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXJKUFQsIAotCQkJCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdHRpYnV0ZSwgCi0JCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVmZXJlbmNlZEpQVCwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZWZlcmVuY2VkQXR0cmlidXRlLCBpbnQgZGlyZWN0aW9uKSB7Ci0JCQotCQlpZihvd25lckpQVC5nZXRBdHRyaWJ1dGVOYW1lZChvd25lckF0dGlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIG93bmVySlBUKTsKLQkJfQotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3duZXJKUFQKLQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShvd25lckF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCWF0dHIuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuc2V0UHJpbWFyeUFubm90YXRpb24oImphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lIiwgbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oKSk7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKGRpcmVjdGlvbiA9PSBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVmZXJlbmNlZEpQVCk7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyMiA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgcmVmZXJlbmNlZEpQVC5yZXNvbHZlQXR0cmlidXRlKHJlZmVyZW5jZWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCWF0dHIyLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJYXR0cjIuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpLnVwZGF0ZSgpOwotCQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGF0dHIyLmdldE1hcHBpbmcoKTsKLQkJCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlZmVyZW5jZWRKUFQpOwotCQkJCWFubm90YXRpb24gPSAoKEphdmFPbmVUb09uZU1hcHBpbmcpIGF0dHIyLmdldE1hcHBpbmcoKSkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCX0KLQkJCWFubm90YXRpb24uc2V0TWFwcGVkQnkob3duZXJBdHRpYnV0ZS5nZXROYW1lKCkpOwotCQl9CQkKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCi0JCWFkZE9uZVRvTWFueVJlbGF0aW9uKGZwLCBqcHQsIGF0dHJpYnV0ZSwgbnVsbCwgbnVsbCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMikgewotCQkKLQkJYWRkT25lVG9NYW55UmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb09uZUJpZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMikgewotCQkKLQkJYWRkTWFueVRvT25lUmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvTWFueVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBzaW5nbGVTaWRlSlBULCAKLQkJCQkJCQkJCSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBzaW5nbGVTaWRlQXR0aWJ1dGUsIAotCQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50VHlwZSBtYW55U2lkZUpQVCwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBtYW55U2lkZUF0dHJpYnV0ZSwgaW50IGRpcmVjdGlvbikgewotCQkKLQkJLy9pZihzaW5nbGVTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKHNpbmdsZVNpZGVBdHRpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBzaW5nbGVTaWRlSlBUKTsKLQkJLy99Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHNpbmdsZVNpZGVKUFQKLQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShzaW5nbGVTaWRlQXR0aWJ1dGUuZ2V0TmFtZSgpKTsKLQkJcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlCi0JCQkJLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJaWYgKGRpcmVjdGlvbiA9PSBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKSB7Ci0JCQlyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpCi0JCQkJCS51cGRhdGUoKTsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBzaW5nbGVTaWRlSlBUKTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSByZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUKLQkJCQkJLmdldE1hcHBpbmcoKTsKLQkJCWlmICghbWFwcGluZy5nZXRDbGFzcygpLmlzSW5zdGFuY2UoSmF2YU9uZVRvTWFueU1hcHBpbmcuY2xhc3MpKSAKLQkJCQlyZXR1cm47Ci0JCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoKEphdmFPbmVUb01hbnlNYXBwaW5nKW1hcHBpbmcpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHNpbmdsZVNpZGVKUFQpOwotCQkJCW1hcHBpbmcgPSByZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJCWFubm90YXRpb24gPSAoKEphdmFPbmVUb01hbnlNYXBwaW5nKW1hcHBpbmcpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGFubm90YXRpb24gPT0gbnVsbCl7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHNpbmdsZVNpZGVKUFQpOwotCQkJCWFubm90YXRpb24gPSAoKEphdmFPbmVUb01hbnlNYXBwaW5nKXJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZQotCQkJCQkuZ2V0TWFwcGluZygpKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJfQotCQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwkJCQkJCQotCQkJCi0JCX0KLQkJaWYgKGRpcmVjdGlvbiA9PSBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKSB7Ci0JCQlpZihtYW55U2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwgbWFueVNpZGVKUFQpOwotCQkJfQotCQkJCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZE1hbnlTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBtYW55U2lkZUpQVAotCQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJcmVzb2x2ZWRNYW55U2lkZUF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9PbmVVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJCQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQotCQlhZGRNYW55VG9PbmVSZWxhdGlvbihmcCwganB0LCBhdHRyaWJ1dGUsIG51bGwsIG51bGwsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfVU5JRElSRUNUSU9OQUwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9PbmVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgbWFueVNpZGVKUFQsIAotCQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1hbnlTaWRlQXR0cmlidXRlLCAKLQkJCQkJCQkJCSBKYXZhUGVyc2lzdGVudFR5cGUgc2luZ2xlU2lkZUpQVCwgCi0JCQkJCQkJCQkgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2luZ2xlU2lkZUF0dGlidXRlLCAKLQkJCQkJCQkJCSBpbnQgZGlyZWN0aW9uKSB7Ci0JCQotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIG1hbnlTaWRlSlBUKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVkTWFueVNpZGVBdHRyaWJ1dGUgPSBtYW55U2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXNvbHZlZE1hbnlTaWRlQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfVU5JRElSRUNUSU9OQUwpIAotCQkJcmV0dXJuOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlID0gc2luZ2xlU2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChzaW5nbGVTaWRlQXR0aWJ1dGUuZ2V0TmFtZSgpKTsKLQkJcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBzaW5nbGVTaWRlSlBUKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZylyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChhID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlhLnNldE1hcHBlZEJ5KG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsCi0JCQkJCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUyKSB7Ci0JCQotCQlhZGRNYW55VG9NYW55UmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb01hbnlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBhbm5vdGF0ZWRKUFQsCi0JCQkJCQkJCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCQotCQlhZGRNYW55VG9NYW55UmVsYXRpb24oZnAsIGFubm90YXRlZEpQVCwgYW5ub3RhdGVkQXR0cmlidXRlLCBudWxsLCBudWxsLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWFueVRvTWFueVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lclNpZGVKUFQsIAotCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lclNpZGVBdHRyaWJ1dGUsIAotCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZVNpZGVKUFQsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVNpZGVBdHRpYnV0ZSwgaW50IGRpcmVjdGlvbikgewotCQkKLQkJaWYob3duZXJTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKG93bmVyU2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBvd25lclNpZGVKUFQpOwotCQl9Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZE93bmVyU2lkZUF0dHJpYnV0ZSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3duZXJTaWRlSlBUCi0JCQkJLnJlc29sdmVBdHRyaWJ1dGUob3duZXJTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXJlc29sdmVkT3duZXJTaWRlQXR0cmlidXRlCi0JCQkJLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGludmVyc2VTaWRlSlBUKTsKLQkJCS8qCi0JCQlpZihpbnZlcnNlU2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChpbnZlcnNlU2lkZUF0dGlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBpbnZlcnNlU2lkZUpQVCk7Ci0JCQl9Ci0JCQkqLwotCQkJCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBpbnZlcnNlU2lkZUpQVAotCQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShpbnZlcnNlU2lkZUF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCQlyZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlCi0JCQkJCS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkKLQkJCQkJLnVwZGF0ZSgpOwotCQkJCi0JCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIHJlc29sdmVkSW52ZXJzZVNpZGVBdHRyaWJ1dGUKLQkJCQkJLmdldE1hcHBpbmcoKTsKLQkJCU1hbnlUb01hbnlBbm5vdGF0aW9uIGEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQlpZihtYXBwaW5nID09IG51bGwgfHwgYSA9PSBudWxsKXsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgaW52ZXJzZVNpZGVKUFQpOwotCQkJCW1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSByZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlCi0JCQkJCS5nZXRNYXBwaW5nKCk7Ci0JCQkJYSA9IG1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCX0KLQkJCWlmIChhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYS5zZXRNYXBwZWRCeShvd25lclNpZGVBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsJCQkJCQkKLQkJfQkJCi0JCQotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eUNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCWZwLnJlc3RvcmVFbnRpdHkoanB0KTsKLQl9ICAgIAkKLQkKLQlwdWJsaWMgdm9pZCBmb3JjZVNhdmVFbnRpdHlDbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJCQkJCQkJIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwkJCQotCQlpZiAoIWN1LmlzV29ya2luZ0NvcHkoKSkgCi0JCQlKUEFFZGl0b3JVdGlsLmJlY29tZVdvcmtpbmdDb3B5KGN1KTsKLQkJdHJ5IHsKLQkJCWN1LmNvbW1pdFdvcmtpbmdDb3B5KHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJY3Uuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9Ci0JfSAgICAKLQkKLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVFbnRpdHlDbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJdHJ5IHsKLQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQlqcGFQcm9qZWN0LnVwZGF0ZUFuZFdhaXQoKTsKLQkJCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5KGN1KTsKLQkJCWN1LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiB0cnVlOwkJCQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgZGVsZXRlIHRoZSBKUEEgZW50aXR5IGNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9IAotCSAgIAotCXB1YmxpYyB2b2lkIGRlbGV0ZVBlcnNpc3RlbmNlVHlwZVJlc291cmNlKFBlcnNpc3RlbnRUeXBlIHR5cGUpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUpwYVByb2plY3QgcHJvaiA9IHR5cGUuZ2V0SnBhUHJvamVjdCgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLQkJSVJlc291cmNlIGVudGl0eVJlc291cmNlID0gdHlwZS5nZXRSZXNvdXJjZSgpOwotCQkvL3R5cGUuZGlzcG9zZSgpOwotCQllbnRpdHlSZXNvdXJjZS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQotCQlpbnQgY250ID0gMDsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGdldENvbnRleHRQZXJzaXN0ZW50VHlwZShwcm9qLCB0eXBlTmFtZSk7Ci0JCXdoaWxlICgoanB0ICE9IG51bGwpICYmIChjbnQgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJTbGVlcCBpbnRlcnJ1cHRlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWNudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCAKLQkJCQkJCQkJCQkJCQkgICBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgewotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCUl0ZXJhdG9yPENsYXNzUmVmPiBpdCA9IHVuaXQuY2xhc3NSZWZzKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUNsYXNzUmVmIHJlZiA9IGl0Lm5leHQoKTsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQkJaWYgKChqcHQgIT0gbnVsbCkgJiYganB0LmdldE5hbWUoKS5lcXVhbHMoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gbmFtZSBvZiB0aGUgZW50aXR5IGZyb20gQEVudGl0eShuYW1lPSIuLi4iKS4KLQkgKiBJZiB0aGVyZSBpcyBubyBzdWNoIGFubm90YXRpb24sIHJldHVybnMgdGhlIAotCSAqIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gY29udmVydEpQVFRvSlJQVChqcHQpOwotCQlpZiAoanJwdCA9PSBudWxsKSAKLQkJCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCQkKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlKYXZhVHlwZU1hcHBpbmcgbWFwcGluZyA9IGpwdC5nZXRNYXBwaW5nKCk7Ci0JCWlmICgobWFwcGluZyAhPSBudWxsKSAmJiBKYXZhRW50aXR5LmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZykpCi0JCQluYW1lID0gKChKYXZhRW50aXR5KW1hcHBpbmcpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQkJfQotCQkJCQkJCQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOYW1lQW5ub3RhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IGNvbnZlcnRKUFRUb0pSUFQoanB0KTsKLQkJaWYgKGpycHQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSmF2YUVudGl0eSBtYXBwaW5nID0gKEphdmFFbnRpdHkpIGpwdC5nZXRNYXBwaW5nKCk7Ci0JCWlmIChtYXBwaW5nICE9IG51bGwpCi0JCQlyZXR1cm4gKG1hcHBpbmcuZ2V0U3BlY2lmaWVkTmFtZSgpICE9IG51bGwpOwotCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQotCS8qCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IGpwYS5nZXRKcGFQcm9qZWN0KCkKLQkJCQkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoanBhLmdldE5hbWUoKSk7Ci0JCUFTVE5vZGUgbmQgPSBqcnB0LmdldE1lbWJlcigpLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oKS5nZXREZWNsYXJhdGlvbigpOwotCQlpZiAobmQgaW5zdGFuY2VvZiBUeXBlRGVjbGFyYXRpb24pIHsKLQkJCUxpc3RJdGVyYXRvcjw/PiBtb2RmcyA9ICgoVHlwZURlY2xhcmF0aW9uKSBuZCkubW9kaWZpZXJzKCkKLQkJCQkJLmxpc3RJdGVyYXRvcigpOwotCQkJd2hpbGUgKG1vZGZzLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBtb2RmID0gbW9kZnMubmV4dCgpOwotCQkJCWlmIChtb2RmIGluc3RhbmNlb2YgTm9ybWFsQW5ub3RhdGlvbikgewotCQkJCQlOb3JtYWxBbm5vdGF0aW9uIGFuID0gKE5vcm1hbEFubm90YXRpb24pbW9kZjsKLQkJCQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWxzID0gYW4udmFsdWVzKCk7Ci0JCQkJCQlpZiAodmFscyAhPSBudWxsKSB7Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWxzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJCU1lbWJlclZhbHVlUGFpciBtdnAgPSB2YWxzLmdldChpKTsKLQkJCQkJCQkJaWYgKG12cC5nZXROYW1lKCkudG9TdHJpbmcoKS5lcXVhbHMoIm5hbWUiKSkgOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuc3RyaXBRdW90ZXMobXZwLmdldFZhbHVlKCkKLQkJCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCX0gCQkJCi0JCQl9Ci0JCX0JCQotCQlyZXR1cm4ganBhLmdldE5hbWUoKTsKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNFbnRpdHlBbm5vdGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIChqcHQuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVudGl0eSk7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEVudGl0eU5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCl7Ci0JCUphdmFFbnRpdHkgZ2plID0gKEphdmFFbnRpdHkpIGpwdC5nZXRNYXBwaW5nKCk7Ci0JCXJldHVybiBnamUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5hbWVFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSmF2YUVudGl0eSBnamUgPSAoSmF2YUVudGl0eSlqcHQuZ2V0TWFwcGluZygpOwotCQlnamUuc2V0U3BlY2lmaWVkTmFtZShuZXdOYW1lKTsJCi0JfQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRBdHRyaWJ1dGUoSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbiBpc0NvbGxlY3Rpb24sIElDb21waWxhdGlvblVuaXQgY3UxLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIpIHsKLQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljdTEuY3JlYXRlSW1wb3J0KGN1Mi5nZXRUeXBlKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKQotCQkJCQkuZ2V0RWxlbWVudE5hbWUoKSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl0eXBlID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwkKLQkJCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJCWlmIChkb2VzQXR0cmlidXRlRXhpc3QoanB0LCBhY3ROYW1lKSkgewotCQkJCXJldHVybiAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGpwdAotCQkJCQkJLnJlc29sdmVBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCQl9Ci0JCQlpZiAoaXNDb2xsZWN0aW9uKSB7Ci0JCQkJSVByb2plY3QgcHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCi0JCQkJaWYoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc0NvbGxlY3Rpb25UeXBlKHByb2plY3QsIHByb3BzKSl7Ci0JCQkJCWNyZWF0ZUNvbnRlbnRUeXBlKGF0dHJpYnV0ZVR5cGUsIGFjdE5hbWUsIGN1MSwgdHlwZSwgQ09MTEVDVElPTl9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBDT0xMRUNUSU9OX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuU2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBDT0xMRUNUSU9OX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGVsc2UgaWYoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc0xpc3RUeXBlKHByb2plY3QsIHByb3BzKSl7Ci0JCQkJCWNyZWF0ZUNvbnRlbnRUeXBlKGF0dHJpYnV0ZVR5cGUsIGFjdE5hbWUsIGN1MSwgdHlwZSwgTElTVF9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBMSVNUX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuU2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBMSVNUX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGVsc2UgewotCQkJCQljcmVhdGVDb250ZW50VHlwZShhdHRyaWJ1dGVUeXBlLCBhY3ROYW1lLCBjdTEsIHR5cGUsIFNFVF9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBTRVRfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJcmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIAotCQkJCQkJCWFjdE5hbWUsIFNFVF9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXR5cGUKLQkJCQkJCS5jcmVhdGVGaWVsZCgKLQkJCQkJCQkJIiAgcHJpdmF0ZSAiICsgcmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSkgKyAiICIgKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjsiLCBudWxsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyQ29udGVudHMoYXR0cmlidXRlTmFtZSwKLQkJCQkJCXJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCBudWxsLAotCQkJCQkJYWN0TmFtZSwgbnVsbCwgaXNDb2xsZWN0aW9uKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJDb250ZW50cyhhdHRyaWJ1dGVOYW1lLAotCQkJCQkJcmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIG51bGwsCi0JCQkJCQlhY3ROYW1lLCBpc0NvbGxlY3Rpb24pLCBudWxsLCBmYWxzZSwKLQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ubm90IGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBuYW1lICIgKyBhdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJaWYoanB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0QXR0cmlidXRlRnJvbUVudGl0eShqcHQsIGFjdE5hbWUpOwkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcHJvcHJpYXRlSW1wbGVtZW50ZWRDb2xsZWN0aW9uVHlwZShTdHJpbmcgY29sbGVjdGlvblR5cGUpewotCQlpZihjb2xsZWN0aW9uVHlwZS5lcXVhbHMoQ09MTEVDVElPTl9UWVBFKSB8fCBjb2xsZWN0aW9uVHlwZS5lcXVhbHMoTElTVF9UWVBFKSl7Ci0JCQlyZXR1cm4gImphdmEudXRpbC5BcnJheUxpc3QiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZihjb2xsZWN0aW9uVHlwZS5lcXVhbHMoU0VUX1RZUEUpKXsKLQkJCXJldHVybiAiamF2YS51dGlsLkhhc2hTZXQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50VHlwZShKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwKLQkJCVN0cmluZyBhY3ROYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1MSwgSVR5cGUgdHlwZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWN1MS5jcmVhdGVJbXBvcnQoCi0JCQkJCQljb2xsZWN0aW9uVHlwZSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UxLmNyZWF0ZUltcG9ydCgKLQkJCQlnZXRBcHJvcHJpYXRlSW1wbGVtZW50ZWRDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uVHlwZSksIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkCi0JCXR5cGUuY3JlYXRlRmllbGQoCi0JCQkJIiAgcHJpdmF0ZSAiICsgSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChjb2xsZWN0aW9uVHlwZSkgKyAiPCIgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSsgcmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSkgKyAiPiAiICsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKSArICAvLyROT04tTkxTLTEkCi0JCQkJIiA9IG5ldyAiICsgSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChnZXRBcHJvcHJpYXRlSW1wbGVtZW50ZWRDb2xsZWN0aW9uVHlwZShjb2xsZWN0aW9uVHlwZSkpICsgIjwiICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkrIHJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpICsgIj4oKTsiLCBudWxsLCBmYWxzZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaEVudGl0eU1vZGVsKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJaWYoY29udmVydEpQVFRvSlJQVChqcHQpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmcCA9PSBudWxsKSB7Ci0JCQlqcHQudXBkYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2hhcGUgZWwgPSAoU2hhcGUpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlpZihKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmlzRW50aXR5TW9kZWxDaGFuZ2VkKGVsLCBqcHQuZ2V0SnBhUHJvamVjdCgpKSl7Ci0JCQl0cnkgewotCQkJCWpwdC51cGRhdGUoKTsKLQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIGF0dHJUeHQpIHsKLQkJT2JqZWN0IG9iID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGVudGl0eVNoYXBlKTsKLQkJaWYob2IgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG9iOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoanB0LmdldE5hbWUoKSkpOwotCQkJSUZpZWxkIGZpZWxkID0gdHlwZS5nZXRGaWVsZChhdHRyVHh0KTsKLQkJCWludCBjbnQgPSAwOwotCQkJd2hpbGUgKChjbnQgPCAyMCkgJiYgIWZpZWxkLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlNsZWVwIGludGVycnVwdGVkIik7CS8vJE5PTi1OTFMtMSQKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJZmllbGQgPSB0eXBlLmdldEZpZWxkKGF0dHJUeHQpOwotCQkJCWNudCsrOwotCQkJfQotCQkJaWYgKGZpZWxkLmV4aXN0cygpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmNvbnRhaW5zKCJMaXN0IikgfHwgZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmNvbnRhaW5zKCJTZXQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl8fCBmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkuY29udGFpbnMoIkNvbGxlY3Rpb24iKSB8fCBmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkuY29udGFpbnMoIk1hcCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCXx8IGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKS5lbmRzV2l0aCgiW10iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigKLQkJCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KcGFBcnRpZmFjdEZhY3RvcnlfQ2FuTm90Q2hlY2tSZXR1cm5UeXBlICsKLQkJCQkJCQkJCQkJCSIgIiArIGF0dHJUeHQgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0JCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR2V0dGVyTWV0aG9kUmV0dXJuVHlwZUNvbGxlY3Rpb24oCi0JCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwKLQkJCVN0cmluZyBhdHRyVHh0KSB7Ci0JCU9iamVjdCBvYiA9IGZwLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0JCWlmKG9iIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKXsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG9iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCQlJVHlwZSB0eXBlID0gY3UuZ2V0VHlwZShKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGpwdC5nZXROYW1lKCkpKTsKLQkJCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyID0gYXR0clR4dC5zdWJzdHJpbmcoMCwgMSkKLQkJCQkJLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCQkrIGF0dHJUeHQuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJnZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgIC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsKLQkJdHJ5IHsKLQkJCWlmKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuY29udGFpbnMoIkxpc3QiKSB8fCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmNvbnRhaW5zKCJTZXQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfHwgbWV0aG9kLmdldFJldHVyblR5cGUoKS5jb250YWlucygiQ29sbGVjdGlvbiIpIHx8IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuY29udGFpbnMoIk1hcCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl8fCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVuZHNXaXRoKCJbXSIpKSAvLyROT04tTkxTLTEkCi0JCQkgIHJldHVybiB0cnVlOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKEpQQUVkaXRvck1lc3NhZ2VzLkpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGUgKyAKLQkJCQkJCSIgIiArIGF0dHJUeHQgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGNyZWF0ZU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCWJvb2xlYW4gaXNDb2xsZWN0aW9uLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGlqbCA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlTdHJpbmcgYXR0clR5cGVOYW1lID0gImphdmEubGFuZy5TdHJpbmciOyAJCQkJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld0F0dHJOYW1lID0gZ2VuVW5pcXVlQXR0ck5hbWUoanB0LCBhdHRyVHlwZU5hbWUsIGZwKTsKLQkJcmV0dXJuIGFkZE5ld0F0dHJpYnV0ZShqcHQsIGlqbCwgbmV3QXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkiQEJhc2ljIiwgbmV3QXR0ck5hbWUsIGlzQ29sbGVjdGlvbiwgZnApOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JICogcHVibGljIFN0cmluZyBjcmVhdGVOZXdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0dHJOYW1lLAotCSAqIFN0cmluZyBhdHRyVHlwZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uLCBTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbgotCSAqIGlzQ29sbGVjdGlvbiwgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JICogCi0JICogSUNvbXBpbGF0aW9uVW5pdCBpamwgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsgcmV0dXJuCi0JICogYWRkTmV3QXR0cmlidXRlKGpwdCwgaWpsLCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLCBhbm5vdGF0aW9uLCBhY3ROYW1lLAotCSAqIGlzQ29sbGVjdGlvbiwgZnApOyB9Ci0JKi8KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY3JlYXRlQU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCVN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwgU3RyaW5nW10gYXR0clR5cGVFbGVtZW50TmFtZXMsCi0JCQlTdHJpbmcgYWN0TmFtZSwgTGlzdDxTdHJpbmc+IGFubm90YXRpb25zLCBib29sZWFuIGlzQ29sbGVjdGlvbiwKLQkJCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgaWpsID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCXJldHVybiBhZGRBTmV3QXR0cmlidXRlKGpwdCwgaWpsLCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCWF0dHJUeXBlRWxlbWVudE5hbWVzLCBhY3ROYW1lLCBhbm5vdGF0aW9ucywgaXNDb2xsZWN0aW9uLAotCQkJCWlzTWV0aG9kQW5ub3RhdGVkLCBmcCk7Ci0JfQotCQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFkZEFOZXdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZU5hbWUsCi0JCQlTdHJpbmdbXSBhdHRyVHlwZUVsZW1lbnROYW1lcywgU3RyaW5nIGFjdE5hbWUsCi0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLAotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhdHRyID0gbWFrZU5ld0F0dHJpYnV0ZShmcCwganB0LCBjdSwgYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkJYXR0clR5cGVFbGVtZW50TmFtZXMsIGFjdE5hbWUsIGFubm90YXRpb25zLCBpc0NvbGxlY3Rpb24sCi0JCQkJCWlzTWV0aG9kQW5ub3RhdGVkKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBuYW1lICIgKyBhdHRyTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGF0dHI7CQkJCQkJCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgYWRkTmV3QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIElDb21waWxhdGlvblVuaXQgY3UsCi0JCQlTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uLAotCQkJU3RyaW5nIGFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQl0cnkgewotCQkJTGlzdDxTdHJpbmc+IGFubm90YXRpb25zID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotCQkJYW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJCS5pc01ldGhvZEFubm90YXRlZChqcHQpOwotCQkJbWFrZU5ld0F0dHJpYnV0ZShmcCwganB0LCBjdSwgYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwgbnVsbCwgYWN0TmFtZSwKLQkJCQkJYW5ub3RhdGlvbnMsIGlzQ29sbGVjdGlvbiwgaXNNZXRob2RBbm5vdGF0ZWQpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSB3aXRoIG5hbWUgIiArIGF0dHJOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gYXR0ck5hbWU7CQkJCQotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFrZU5ld0F0dHJpYnV0ZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCUlDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwKLQkJCVN0cmluZ1tdIGF0dHJUeXBlcywgU3RyaW5nIGFjdE5hbWUsCi0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLAotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlJVHlwZSB0eXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIiOyAJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJaXNNZXRob2RBbm5vdGF0ZWQgPSAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCFhbm5vdGF0aW9ucy5pc0VtcHR5KCkpID8gaXNNZXRob2RBbm5vdGF0ZWQKLQkJCQk6IEpwYUFydGlmYWN0RmFjdG9yeS5JTlNUQU5DRS5pc01ldGhvZEFubm90YXRlZChqcHQpOwotCQkKLQkJaWYgKCFpc01ldGhvZEFubm90YXRlZCkgewotCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBhbiA9IGl0Lm5leHQoKTsKLQkJCQkJY29udGVudHMgKz0gIiAgICIgKyBhbiArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0JCQkJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCWlmKGFubm90YXRpb25zIT1udWxsICYmIGFubm90YXRpb25zLmNvbnRhaW5zKCJAQmFzaWMiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCFjdS5nZXRJbXBvcnQoImphdmF4LnBlcnNpc3RlbmNlLioiKS5leGlzdHMoKSAmJiAhY3UuZ2V0SW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYyIpLmV4aXN0cygpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnRzKGN1LCAiamF2YXgucGVyc2lzdGVuY2UuQmFzaWMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIHNob3VsZEFkZEltcG9ydCA9IHRydWU7Ci0JCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydERlY2xhcmF0aW9ucyA9IGN1LmdldEltcG9ydHMoKTsKLQkJU3RyaW5nIGF0dHJTaG9ydFR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhdHRyVHlwZU5hbWUpOwotCQlmb3IoSUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2wgOiBpbXBvcnREZWNsYXJhdGlvbnMpewotCQkJU3RyaW5nIGltcG9ydGVkRGVjbGFyYXRpb25GUU4gPSBpbXBvcnREZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCQlTdHJpbmcgaW1wb3J0ZWREZWNsYXJhdGlvblNob3J0TmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoaW1wb3J0ZWREZWNsYXJhdGlvbkZRTik7Ci0JCQlpZihhdHRyU2hvcnRUeXBlTmFtZS5lcXVhbHMoaW1wb3J0ZWREZWNsYXJhdGlvblNob3J0TmFtZSkgJiYgIWF0dHJUeXBlTmFtZS5lcXVhbHMoaW1wb3J0ZWREZWNsYXJhdGlvbkZRTikpCi0JCQkJc2hvdWxkQWRkSW1wb3J0ID0gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHNob3VsZEFkZEltcG9ydCl7Ci0JCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZUltcG9ydHMoY3UsIGF0dHJUeXBlTmFtZSk7Ci0JCSAgICBhdHRyVHlwZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGF0dHJUeXBlTmFtZSk7Ci0JCX0KLQkJaWYgKChhdHRyVHlwZXMgIT0gbnVsbCkgJiYgKGF0dHJUeXBlcy5sZW5ndGggPiAwKSkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnRzKGN1LCBhdHRyVHlwZXMpOwotCQl9Ci0JCQotCQljb250ZW50cyArPSAiICAgIHByaXZhdGUgIiArIGF0dHJUeXBlTmFtZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkoKGF0dHJUeXBlcyA9PSBudWxsKSA/ICIiIDogKCI8IiArIEpQQUVkaXRvclV0aWwuY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoYXR0clR5cGVzKSArICI+IikpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkiICIgKyBhdHRyTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkKLQotCQl0eXBlLmNyZWF0ZU1ldGhvZCgKLQkJCQlnZW5TZXR0ZXJDb250ZW50cyhhdHRyTmFtZSwgYXR0clR5cGVOYW1lLCBhdHRyVHlwZXMsCi0JCQkJCQlhY3ROYW1lLCBpc0NvbGxlY3Rpb24pLCBudWxsLCBmYWxzZSwKLQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQl0eXBlLmNyZWF0ZU1ldGhvZCgKLQkJCQkJZ2VuR2V0dGVyQ29udGVudHMoYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkJCQlhdHRyVHlwZXMsIGFjdE5hbWUsIGFubm90YXRpb25zLAotCQkJCQkJCWlzQ29sbGVjdGlvbiksIG51bGwsIGZhbHNlLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXR5cGUuY3JlYXRlRmllbGQoY29udGVudHMsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBlbHNlIHsKLQkJCXR5cGUuY3JlYXRlRmllbGQoY29udGVudHMsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXR5cGUuY3JlYXRlTWV0aG9kKAotCQkJCQlnZW5HZXR0ZXJDb250ZW50cyhhdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCQkJCWF0dHJUeXBlcywgYWN0TmFtZSwgbnVsbCwgaXNDb2xsZWN0aW9uKSwKLQkJCQkJbnVsbCwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9CQkKLQkJCi0JCWludCBjbnQgPSAwOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSk7Ci0JCXdoaWxlICgoanBhID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWpwYSA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSk7Ci0JCQljbnQrKzsKLQkJfQotCQkJCi0JCS8qCi0JCWlmKGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCX0KLQkJKi8KLQkJCi0JCXJldHVybiBnZXRBdHRyaWJ1dGVGcm9tRW50aXR5KGpwdCwgYXR0ck5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgZGVsZXRlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIDEpCi0JCQkJLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCSsgYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoMSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcFVuaXQgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsJCQotCQlJVHlwZSBqYXZhVHlwZSA9IGNvbXBVbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IG51bGw7Ci0JCVN0cmluZyBnZXR0ZXJQcmVmaXggPSAiZ2V0IjsgCQkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IAotCQlJTWV0aG9kIGdldEF0dHJpYnV0ZU1ldGhvZCA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLAotCQkJCW5ldyBTdHJpbmdbMF0pOwotCQlpZiAoIWdldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0ganBhLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JCQlpZiAoImJvb2xlYW4iLmVxdWFscyh0eXBlTmFtZSkpIHsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCWdldHRlclByZWZpeCA9ICJpcyI7CQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCW1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAJCQkJCi0JCQkJZ2V0QXR0cmlidXRlTWV0aG9kID0gamF2YVR5cGUuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsCi0JCQkJCQluZXcgU3RyaW5nWzBdKTsKLQkJCX0JCQotCQkJdHJ5IHsKLQkJCQlpZiAoKGdldEF0dHJpYnV0ZU1ldGhvZCAhPSBudWxsKSAmJiBnZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpOwotCQkJCQl0eXBlU2lnbmF0dXJlID0gZ2V0QXR0cmlidXRlTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2Fubm90IG9idGFpbiB0aGUgdHlwZSBvZiB0aGUgZ2V0dGVyIHdpdGggbmFtZSAiICsgbWV0aG9kTmFtZSArICIoKSIpOwkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQl9CQkJCi0JCX0KLQkJaWYgKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkKLQkJIAltZXRob2ROYW1lID0gbnVsbDsJCQotCQkKLQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCk7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkgewotCQkJdHJ5IHsKLQkJCQlJRmllbGQgYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChhdHRyaWJ1dGVOYW1lKTsKLQkJCQkKLQkJCQlpZiAoKGF0dHJpYnV0ZUZpZWxkICE9IG51bGwpICYmICFhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQkJYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChKUEFFZGl0b3JVdGlsLnJldmVydEZpcnN0TGV0dGVyQ2FzZShhdHRyaWJ1dGVOYW1lKSk7Ci0JCQkJaWYgKChhdHRyaWJ1dGVGaWVsZCAhPSBudWxsKSAmJiBhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkgCi0JCQkJCWF0dHJpYnV0ZUZpZWxkLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZmllbGQgd2l0aCBuYW1lICIgKyBhdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJfSAKLQkJCXRyeSB7Ci0JCQkJbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZ2V0QXR0cmlidXRlTWV0aG9kICE9IG51bGwpIHsKLQkJCQkJdHlwZVNpZ25hdHVyZSA9IGdldEF0dHJpYnV0ZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCWlmIChnZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpCi0JCQkJCQlnZXRBdHRyaWJ1dGVNZXRob2QuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5ub3QgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgZ2V0dGVyIHdpdGggbmFtZSAiICsgbWV0aG9kTmFtZSArICIoKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gCQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQltZXRob2ROYW1lID0gZ2V0dGVyUHJlZml4ICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChnZXRBdHRyaWJ1dGVNZXRob2QuZXhpc3RzKCkpIHsKLQkJCQkJdHlwZVNpZ25hdHVyZSA9IGdldEF0dHJpYnV0ZU1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQkJCWdldEF0dHJpYnV0ZU1ldGhvZC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBnZXR0ZXIgd2l0aCBuYW1lICIgKyBtZXRob2ROYW1lICsgIigpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfSAJCi0JCQl0cnkgewotCQkJCUlGaWVsZCBhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChhdHRyaWJ1dGVGaWVsZCAhPSBudWxsKQotCQkJCQlpZiAoIWF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKQotCQkJCQkJYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChKUEFFZGl0b3JVdGlsLnJldmVydEZpcnN0TGV0dGVyQ2FzZShhdHRyaWJ1dGVOYW1lKSk7CQkJCi0JCQkJaWYgKChhdHRyaWJ1dGVGaWVsZCAhPSBudWxsKSAmJiBhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQkJYXR0cmlidXRlRmllbGQuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmaWVsZCB3aXRoIG5hbWUgIiArIGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQl9IAkJCQotCQl9Ci0JCXRyeSB7Ci0JCQltZXRob2ROYW1lID0gInNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAvLyROT04tTkxTLTEkCi0JCQlJTWV0aG9kIHNldEF0dHJpYnV0ZU1ldGhvZCA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLAotCQkJCQluZXcgU3RyaW5nW10geyB0eXBlU2lnbmF0dXJlIH0pOwotCQkJaWYgKChzZXRBdHRyaWJ1dGVNZXRob2QgIT0gbnVsbCkgJiYgc2V0QXR0cmlidXRlTWV0aG9kLmV4aXN0cygpKQotCQkJCXNldEF0dHJpYnV0ZU1ldGhvZC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBzZXR0ZXIgd2l0aCBuYW1lICIgKyBtZXRob2ROYW1lICsgIiguLi4pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IAkJCi0JCQotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBqcHQucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKGF0ICE9IG51bGwpICYmIChjIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgeyAKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRocmVhZC5zbGVlcCgpIGludGVycnVwdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQkKLQkJCWF0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwkJCQotCQkJYysrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuVW5pcXVlQXR0ck5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQlTdHJpbmcgYXR0clR5cGVOYW1lLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGlqbCA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJdHlwZSA9IGlqbC5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGpwdC5hdHRyaWJ1dGVOYW1lcygpOwotCQlTZXQ8U3RyaW5nPiBhdHRyTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWF0dHJOYW1lcy5hZGQoaXQubmV4dCgpKTsKLQkJfQkJCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDAwMDsgaSsrKSB7Ci0JCQluYW1lID0gImF0dHJpYnV0ZSIgKyBpOyAgCS8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbAotCQkJCQkuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQkJU3RyaW5nIGdldHRlck5hbWUgPSAiZ2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFhdHRyTmFtZXMuY29udGFpbnMobmFtZSkpIHsKLQkJCQlJRmllbGQgZmxkID0gdHlwZS5nZXRGaWVsZChuYW1lKTsKLQkJCQlJTWV0aG9kIGdldHRlciA9IHR5cGUuZ2V0TWV0aG9kKGdldHRlck5hbWUsIG5ldyBTdHJpbmdbXSB7fSk7Ci0JCQkJSU1ldGhvZCBzZXR0ZXIxID0gdHlwZS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IGF0dHJUeXBlTmFtZSB9KTsKLQkJCQlJTWV0aG9kIHNldHRlcjIgPSB0eXBlLmdldE1ldGhvZChzZXR0ZXJOYW1lLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgIlFTZXQ8USIgKyBhdHRyVHlwZU5hbWUgKyAiOz47IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSU1ldGhvZCBzZXR0ZXIzID0gdHlwZQotCQkJCQkJLmdldE1ldGhvZCgKLQkJCQkJCQkJc2V0dGVyTmFtZSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgIlFDb2xsZWN0aW9uPFEiICsgYXR0clR5cGVOYW1lICsgIjs+OyIgfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlNZXRob2Qgc2V0dGVyNCA9IHR5cGUuZ2V0TWV0aG9kKHNldHRlck5hbWUsCi0JCQkJCQluZXcgU3RyaW5nW10geyAiUVNldDsiIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJSU1ldGhvZCBzZXR0ZXI1ID0gdHlwZS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7ICJRQ29sbGVjdGlvbjsiIH0pOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFmbGQuZXhpc3RzKCkgJiYgIWdldHRlci5leGlzdHMoKSAmJiAhc2V0dGVyMS5leGlzdHMoKQotCQkJCQkJJiYgIXNldHRlcjIuZXhpc3RzKCkgJiYgIXNldHRlcjMuZXhpc3RzKCkKLQkJCQkJCSYmICFzZXR0ZXI0LmV4aXN0cygpICYmICFzZXR0ZXI1LmV4aXN0cygpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSkgewkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnB0ID0gcGVyc2lzdGVudEF0dHJpYml0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJQW5ub3RhdGlvbltdIHJlcyA9IG5ldyBBbm5vdGF0aW9uW2pycHQuYW5ub3RhdGlvbnNTaXplKCldOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkgKyBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9uc1NpemUoKV07Ci0JCUl0ZXJhdG9yPEFubm90YXRpb24+IGl0ID0ganJwdC5hbm5vdGF0aW9ucygpOwotCQlpbnQgYyA9IDA7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlc1tjXSA9IGl0Lm5leHQoKTsKLQkJCWMrKzsKLQkJfQotCQkvKgotCQlpdCA9IGpycHQuc3VwcG9ydGluZ0Fubm90YXRpb25zKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXJlc1tjXSA9IGl0Lm5leHQoKTsKLQkJCWMrKzsKLQkJfQotCQkqLwotCQlyZXR1cm4gcmVzOwotCX0JCQotCQotCXB1YmxpYyBIYXNoU2V0PFN0cmluZz4gZ2V0QW5ub3RhdGlvbk5hbWVzKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSkgewotCQkKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnB0ID0gcGVyc2lzdGVudEF0dHJpYml0ZS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSGFzaFNldDxTdHJpbmc+IHJlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8QW5ub3RhdGlvbj4gaXQgPSBqcnB0LmFubm90YXRpb25zKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQlyZXMuYWRkKEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoaXQubmV4dCgpLmdldEFubm90YXRpb25OYW1lKCkpKTsKLQkJLyoKLQkJaXQgPSBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSAKLQkJCXJlcy5hZGQoSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChpdC5uZXh0KCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOwotCQkqLwotCQlyZXR1cm4gcmVzOwotCX0JCi0JCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uU3RyaW5ncygKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJpdGUpIHsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UGFyZW50KCk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBqZHRDVSA9IGpwdC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCk7Ci0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwdCA9IHBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPEFubm90YXRpb24+IGl0ID0ganJwdC5hbm5vdGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlBbm5vdGF0aW9uIGFuID0gaXQubmV4dCgpOwotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gamR0QW4gPSBhbi5nZXRBc3RBbm5vdGF0aW9uKGpkdENVKTsKLQkJCXJlcy5hZGQoamR0QW4udG9TdHJpbmcoKSk7Ci0JCX0KLQkJLyoKLQkJaXQgPSBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7IAotCQkJQW5ub3RhdGlvbiBhbiA9IGl0Lm5leHQoKTsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFuID0gYW4uZ2V0SmR0QW5ub3RhdGlvbihqZHRDVSk7Ci0JCQlyZXMuYWRkKGpkdEFuLnRvU3RyaW5nKCkpOwotCQl9Ci0JCSovCi0JCXJldHVybiByZXM7Ci0JfQkKLQkJCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9uT3duZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamFtID0gYXQuZ2V0TWFwcGluZygpOwotCQkvL2lmIChqYW0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKSA9PSBudWxsKSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgKEphdmFQZXJzaXN0ZW50VHlwZSlhdC5nZXRQYXJlbnQoKSk7Ci0JCQlqYW0gPSBhdC5nZXRNYXBwaW5nKCk7Ci0JCS8vfQotCQlpZiAoIShqYW0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBub20gPSAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWphbS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbm9tLmdldE1hcHBlZEJ5KCkgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIENvbGxlY3Rpb248SVJlbGF0aW9uPiBwcm9kdWNlQWxsUmVsYXRpb25zKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0pQVCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJQ29sbGVjdGlvbjxJUmVsYXRpb24+IHJlcyA9IHByb2R1Y2VSZWxhdGlvbnMobmV3SlBULCBmcCk7Ci0JCUl0ZXJhdG9yPElSZWxhdGlvbj4gaXQgPSByZXMuaXRlcmF0b3IoKTsKLQkJSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+IGNoZWNrZWRFbnRpdGllcyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4oKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IGl0Lm5leHQoKTsKLQkJCWNoZWNrZWRFbnRpdGllcy5hZGQocmVsLmdldE93bmVyKCkpOwotCQkJY2hlY2tlZEVudGl0aWVzLmFkZChyZWwuZ2V0SW52ZXJzZSgpKTsKLQkJfQotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSBmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpCi0JCQkJLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gc2hhcGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdGVyLm5leHQoKTsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBmcAotCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNoKTsKLQkJCWlmIChqcHQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vaWYgKCFjaGVja2VkRW50aXRpZXMuY29udGFpbnMoanB0KSkgewotCQkJCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gcHJvZHVjZVJlbGF0aW9ucyhqcHQsIG5ld0pQVCwgZnApOwotCQkJCXJlcy5hZGRBbGwocmVscyk7Ci0JCQkvL30KLQkJfQotCQlyZXR1cm4gcmVzOwotCSB9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElSZWxhdGlvbj4gcHJvZHVjZVJlbGF0aW9ucygKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBuZXdKUFQsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSBuZXdKUFQuYXR0cmlidXRlcygpOwotCQlIYXNoU2V0PElSZWxhdGlvbj4gcmVzID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGl0Lm5leHQoKTsKLQkJCUlSZWxhdGlvbiByZWwgPSBwcm9kdWNlUmVsYXRpb24oYXQsIGZwKTsKLQkJCWlmIChyZWwgIT0gbnVsbCkKLQkJCQlyZXMuYWRkKHJlbCk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbkFubm90YXRlZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJCi0JCUhhc2hTZXQ8U3RyaW5nPiBhbk5hbWVzID0gZ2V0QW5ub3RhdGlvbk5hbWVzKGpwYSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXQgPSBhbk5hbWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhbk5hbWUgPSBpdC5uZXh0KCk7Ci0JCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFuTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCQotCXB1YmxpYyBJUmVsYXRpb24gcHJvZHVjZVJlbGF0aW9uKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSwKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUganJwYSA9IHBlcnNpc3RlbnRBdHRyaWJpdGUKLQkJCQkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQotCQlJUmVsYXRpb24gcmVzID0gbnVsbDsKLQkJQW5ub3RhdGlvbltdIGFucyA9IGdldEFubm90YXRpb25zKHBlcnNpc3RlbnRBdHRyaWJpdGUpOwotCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKChSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhbiwganJwYSk7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JLZXkocmVsVHlwZU5hbWUpOwotCQkJCWlmIChyZWxKUFQgIT0gbnVsbCkgCi0JCQkJCXJlcyA9IHByb2R1Y2VSZWxhdGlvbihwZXJzaXN0ZW50QXR0cmliaXRlLCBhbiwgcmVsSlBULCBmcCk7Ci0JCQkJcmV0dXJuIHJlczsKLQkJCX0JCQkJCQkJCQkKLQkJfQotCQlyZXR1cm4gcmVzOwotCQkJCQotCX0KLQkJCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElSZWxhdGlvbj4gcHJvZHVjZVJlbGF0aW9ucyhKYXZhUGVyc2lzdGVudFR5cGUganB0MSwKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQyLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVzU2V0ID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0ganB0MS5hdHRyaWJ1dGVzKCk7Ci0JCUlSZWxhdGlvbiByZXMgPSBudWxsOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGl0Lm5leHQoKTsKLQkJCUlSZXNvdXJjZSByID0gYXQuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBhdC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCQlBbm5vdGF0aW9uW10gYW5zID0gdGhpcy5nZXRBbm5vdGF0aW9ucyhhdCk7Ci0JCQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5zKSB7Ci0JCQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZSgoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pYW4sIGpycGEpOwotCQkJCQkJaWYgKCFyZWxUeXBlTmFtZS5lcXVhbHMoanB0Mi5nZXROYW1lKCkpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGZwCi0JCQkJCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvcktleShqcHQyLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXMgPSBwcm9kdWNlUmVsYXRpb24oYXQsIGFuLCByZWxKUFQsIGZwKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJCQlyZXNTZXQuYWRkKHJlcyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzU2V0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGlvbiBhbm5vdGF0aW9uIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaWYgdGhlcmUgaXMgYW55LiBJZiBub3QgLSByZXR1cm5zIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gYXQKLQkgKiBAcmV0dXJuCi0JICovCi0JCi0JLyoKLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldFJlbGF0aW9uQW5ub3RhdGlvbihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBhdC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSUFubm90YXRhYmxlIG0gPSBnZXRBdHRyaWJ1dGVNZW1iZXIoYXQpOwotCQlJQW5ub3RhdGlvbltdIGFucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhbnMgPSBtLmdldEFubm90YXRpb25zKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cmFjZXIuZXJyb3IoIiIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChJQW5ub3RhdGlvbiBhbiA6IGFucykgewotCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUy5jb250YWlucyhKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGFuLmdldEVsZW1lbnROYW1lKCkpKSkgewotCQkJCXJldHVybiBhbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkKLQkvKgotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZWxhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUKSB7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IHJlbEpQVC5hdHRyaWJ1dGVzKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlbEVudGl0eUF0ID0gaXQubmV4dCgpOwotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhID0gcmVsRW50aXR5QXQKLQkJCQkJLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJQVNUTm9kZSBuZCA9IGpycGEuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpCi0JCQkJCS5nZXREZWNsYXJhdGlvbigpOwotCQkJaWYgKChuZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKQotCQkJCQl8fCAobmQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCUxpc3RJdGVyYXRvcjw/PiBtb2RmcyA9ICgoQm9keURlY2xhcmF0aW9uKSBuZCkubW9kaWZpZXJzKCkKLQkJCQkJCS5saXN0SXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBtb2RmID0gbW9kZnMubmV4dCgpOwotCQkJCQlpZiAobW9kZiBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLQkJCQkJCUFubm90YXRpb24gYW4gPSAoQW5ub3RhdGlvbikgbW9kZjsKLQkJCQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFuLmdldFR5cGVOYW1lKCkKLQkJCQkJCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQkJYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKGFubm90YXRpb25OYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQkJCVN0cmluZyBvd25lclR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoYW4sIGpycGEpOwotCQkJCQkJCWlmICghb3duZXJUeXBlTmFtZS5lcXVhbHMoanB0LmdldE5hbWUoKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCXJldHVybiByZWxFbnRpdHlBdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkqLwotCQotCQotCS8qCi0JICogSWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyByZWxhdGlvbiBhbm5vdGF0ZWQgYW5kIHBvaW50cyB0byBzb21lIGVudGl0eSwKLQkgKiB3aGljaCBpcyB2aXN1YWxpemVkIGluIHRoZSBkaWFncmFtIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBvaW50ZWQKLQkgKiBlbnRpdHkuIE90aGVyd2lzZSAtIG51bGwKLQkgKi8KLQkKLQkvKgotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UmVsYXRlZEVudGl0eShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEsIAotCQkJCQkJCQkJCQkgICBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBqcGEKLQkJCQkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUlUeXBlIHQgPSBqcnBhLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmdldENvbXBpbGF0aW9uVW5pdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJQW5ub3RhdGFibGUgbSA9IGdldEF0dHJpYnV0ZU1lbWJlcihqcGEpOwotCQlJQW5ub3RhdGlvbltdIGFucyA9IG0uZ2V0QW5ub3RhdGlvbnMoKTsKLQkJZm9yIChJQW5ub3RhdGlvbiBhbiA6IGFucykgewotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW4uZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhbm5vdGF0aW9uTmFtZSk7Ci0KLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKGFuLCBqcnBhKTsJCQkJCQkKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUID0gKEphdmFQZXJzaXN0ZW50VHlwZSkganBhCi0JCQkJCQkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKQotCQkJCQkJLmdldFBlcnNpc3RlbnRUeXBlKHJlbFR5cGVOYW1lKTsKLQkJCQlpZiAocmVsSlBUICE9IG51bGwpCi0JCQkJCWlmIChmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsSlBUKSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHJlbEpQVDsKLQkJCX0JCQkJCQkKLQkJCQotCQkJCi0JCX0KLQkJCi0JCWlmICgobmQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikKLQkJCQl8fCAobmQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSkgewotCQkJTGlzdEl0ZXJhdG9yPD8+IG1vZGZzID0gKChCb2R5RGVjbGFyYXRpb24pIG5kKS5tb2RpZmllcnMoKQotCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGYgPSBtb2Rmcy5uZXh0KCk7Ci0JCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJCUFubm90YXRpb24gYW4gPSAoQW5ub3RhdGlvbiltb2RmOwotCQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbi5nZXRUeXBlTmFtZSgpCi0JCQkJCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lLnN1YnN0cmluZyhhbm5vdGF0aW9uTmFtZQotCQkJCQkJCS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJCQkuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZShhbiwganJwYSk7CQkJCQkJCi0JCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUID0gKEphdmFQZXJzaXN0ZW50VHlwZSkganBhCi0JCQkJCQkJCS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpCi0JCQkJCQkJCS5nZXRQZXJzaXN0ZW50VHlwZShyZWxUeXBlTmFtZSk7Ci0JCQkJCQlpZiAocmVsSlBUICE9IG51bGwpCi0JCQkJCQkJaWYgKGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWxKUFQpICE9IG51bGwpCi0JCQkJCQkJCXJldHVybiByZWxKUFQ7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9CQkJCQkJCQkJCQkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkJCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKUFQoU3RyaW5nIG5hbWUsIFBlcnNpc3RlbmNlVW5pdCBwdSkgewotCQlwdS5nZXRKcGFQcm9qZWN0KCkudXBkYXRlQW5kV2FpdCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKGpwdCA9PSBudWxsKSAmJiAoY250IDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoUEFVU0VfRFVSQVRJT04pOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiU2xlZXAgaW50ZXJydXB0ZWQiKTsJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCQljbnQrKzsKLQkJfQkJCi0JCXJldHVybiBqcHQ7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGFsbCB0aGUgYXR0cmlidXRlcyBiZWxvbmdpbmcgdG8gYW5vdGhlciBlbnRpdGllcyBhbmQKLQkgKiBpbnZvbHZlZCBpbiBhIHJlbGF0aW9uIHdpdGggdGhlIGVudGl0eSBnaXZlbiBhcyBwYXJhbWV0ZXIKLQkgKi8KLQlwdWJsaWMgU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRSZWxhdGVkQXR0cmlidXRlcyhKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCUl0ZXJhdG9yPEpwYUZpbGU+IGl0ID0ganB0LmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlcygpLml0ZXJhdG9yKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5JTlNUQU5DRS5nZXRQZXJzaXN0ZW5jZVVuaXQoanB0LmdldEpwYVByb2plY3QoKSk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUpwYUZpbGUganBhRmlsZSA9IGl0Lm5leHQoKTsKLQkJCUpwdFJlc291cmNlTW9kZWwgcm0gPSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCWlmIChybSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuY2xhc3MuaXNJbnN0YW5jZShybSkpCi0JCQkJY29udGludWU7Ci0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA9IChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQpcm07Ci0JCQkvL0NTTiAjMTMwODU5IDIwMTAKLQkJCWlmKCFqcmN1LnBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSkKLQkJCQljb250aW51ZTsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSBqcmN1LnBlcnNpc3RlbnRUeXBlcygpLm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0ganJwdC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0MSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIHB1Ci0JCQkJCS5nZXRQZXJzaXN0ZW50VHlwZShuYW1lKTsKLQkJCWlmIChqcHQxID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlbEF0cyA9IGdldFJlbEF0dHJpYnV0ZXMoanB0LCBqcHQxKTsKLQkJCWlmIChyZWxBdHMgIT0gbnVsbCkKLQkJCQlyZXMuYWRkQWxsKHJlbEF0cyk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIChpZiB0aGVyZSBpcyBhbnkpIGJlbG9uZ2luZyB0byBqcHQxIGFuZAotCSAqIGludm9sdmVkIGluIGEgcmVsYXRpb24gd2l0aCBqcHQKLQkgKi8KLQkKLQlwcml2YXRlIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0UmVsQXR0cmlidXRlcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCkgewotCi0JCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0SXQgPSByZWxKUFQuYXR0cmlidXRlcygpOwotCQl3aGlsZSAoYXR0SXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGF0dEl0Lm5leHQoKTsKLQkJCUlSZXNvdXJjZSByID0gYXQuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJQW5ub3RhdGlvbltdIGFucyA9IGdldEFubm90YXRpb25zKGF0KTsJCQkKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCQlhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7IAotCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKChSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhbiwgYXQuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkJCQlpZiAoIXJlbFR5cGVOYW1lLmVxdWFscyhqcHQuZ2V0TmFtZSgpKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZXMuYWRkKGF0KTsKLQkJCQl9Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgcmVuYW1lRW50aXR5Q2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIG5ld0VudGl0eU5hbWUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJcmVuYW1lRW50aXR5Q2xhc3MoZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIG5ld0VudGl0eU5hbWUpOwotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUVudGl0eUNsYXNzKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUlUeXBlIGphdmFUeXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JCXJlbmFtZVR5cGUoamF2YVR5cGUsIG5ld05hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVuYW1lVHlwZShJVHlwZSB0eXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoIXR5cGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGROYW1lID0gdHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUodHlwZSwgbmV3TmFtZSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQlJV29ya2JlbmNoV2luZG93IHd3ID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJU2hlbGwgc2ggPSB3dy5nZXRTaGVsbCgpOwotCQkJcy5wZXJmb3JtKHNoLCB3dyk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSB0eXBlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCW9sZE5hbWUpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVuYW1lQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUsIFN0cmluZyBpbnZlcnNlRW50aXR5TmFtZSwKLQkJCQkJCQkJCSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCW5ld05hbWUgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5ld05hbWUpOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoanB0KSkgewkJCi0JCQluZXdOYW1lID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5ld05hbWUpOwotCQl9IAotCQluZXdOYW1lID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShqcHQsIG5ld05hbWUpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBudWxsOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChvbGROYW1lKTsKLQkJZnAuYWRkQWRkSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpb2xkQXQuZ2V0UGFyZW50KCksIG5ld05hbWUpOwotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBvbGRBdAotCQkJCS5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJZnAuYWRkUmVtb3ZlSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpb2xkQXQuZ2V0UGFyZW50KCksIGpycGEuZ2V0TmFtZSgpKTsKLQkJSVJlbGF0aW9uIHJlbCA9IGZwLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKG9sZEF0KTsKLQkJU3RyaW5nIGludmVyc2VKUEFOYW1lID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2VKUFQgPSBudWxsOwotCQlpZiAoQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UocmVsKSkgewotCQkJaW52ZXJzZUpQVCA9IHJlbC5nZXRJbnZlcnNlKCk7Ci0JCQlpZiAoaW52ZXJzZUpQVCAhPSBvbGRBdC5nZXRQYXJlbnQoKSkgewotCQkJCXB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5LklOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQkJCWludmVyc2VKUEFOYW1lID0gcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlyZW5hbWVBdHRyaWJ1dGUoY3UsIG9sZE5hbWUsIG5ld05hbWUsIGZwLCB0aGlzLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCkpOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG5ld05hbWUpOwotCQlpZiAobmV3QXQgPT0gbnVsbCkKLQkJCW5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKEpQQUVkaXRvclV0aWwKLQkJCQkJLnJldmVydEZpcnN0TGV0dGVyQ2FzZShuZXdOYW1lKSk7Ci0JCWludCBjID0gMDsKLQkJd2hpbGUgKChuZXdBdCA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCWMrKzsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCQluZXdBdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChuZXdOYW1lKTsKLQkJCQlpZiAobmV3QXQgPT0gbnVsbCkKLQkJCQkJbmV3QXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGpwdAotCQkJCQkJCS5yZXNvbHZlQXR0cmlidXRlKEpQQUVkaXRvclV0aWwKLQkJCQkJCQkJCS5yZXZlcnRGaXJzdExldHRlckNhc2UobmV3TmFtZSkpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVGhyZWFkLnNsZWVwKCkgaW50ZXJydXB0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChuZXdBdCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlRoZSBhdHRyaWJ1dGUgIiArIG5ld05hbWUgKyAiIGNvdWxkIG5vdCBiZSByZXNvbHZlZCIpOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCU51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJbnBlLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZwLmFkZFJlbW92ZUlnbm9yZShqcHQsIG9sZEF0LmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlmcC5yZXBsYWNlQXR0cmlidXRlKG9sZEF0LCBuZXdBdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3QXQ7Ci0JCX0KLQkJaWYgKGludmVyc2VKUEFOYW1lICE9IG51bGwpIHsKLQkJCWZwLmFkZEF0dHJpYkZvclVwZGF0ZShwdSwgaW52ZXJzZUVudGl0eU5hbWUKLQkJCQkJKyBFbnRpdHlDaGFuZ2VMaXN0ZW5lci5TRVBBUkFUT1IgKyBpbnZlcnNlSlBBTmFtZQotCQkJCQkrIEVudGl0eUNoYW5nZUxpc3RlbmVyLlNFUEFSQVRPUiArIG5ld0F0LmdldE5hbWUoKSk7Ci0JCQl0aGlzLnJlZnJlc2hFbnRpdHlNb2RlbChmcCwgaW52ZXJzZUpQVCk7Ci0JCQlBbm5vdGF0aW9uIGEgPSByZWwuZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5jbGFzcy5pc0luc3RhbmNlKGEpKSB7Ci0JCQkJYm9vbGVhbiBleGNlID0gdHJ1ZTsKLQkJCQlpbnQgY250ID0gMDsKLQkJCQkJd2hpbGUgKGV4Y2UgJiYgKGNudCA8IDI1KSkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQkJCQlhID0gcmVsLmdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCQkJCSgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWEpLnNldE1hcHBlZEJ5KG5ld0F0LmdldE5hbWUoKSk7Ci0JCQkJCQlleGNlID0gZmFsc2U7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJCQljbnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlbCAhPSBudWxsKQotCQkJdXBkYXRlUmVsYXRpb24oanB0LCBmcCwgcmVsKTsKLQkJCi0JCXJldHVybiBuZXdBdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElSZWxhdGlvbiByZWwpIHsKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZnApOwotCQlpZiAoanB0LmVxdWFscyhyZWwuZ2V0SW52ZXJzZSgpKSkgewotCQkJdXBkYXRlRmVhdHVyZS5yZWNvbm5lY3QocmVsLmdldE93bmVyKCkpOwotCQl9IGVsc2UgewotCQkJdXBkYXRlRmVhdHVyZS5yZWNvbm5lY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVuYW1lQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSwKLQkJCVN0cmluZyBuZXdOYW1lLCBTdHJpbmcgbmV3RW50aXR5TmFtZSwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlyZXR1cm4gcmVuYW1lQXR0cmlidXRlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpLCBuZXdOYW1lLAotCQkJCW5ld0VudGl0eU5hbWUsIGZwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVuYW1lQXR0cmlidXRlKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBvbGROYW1lLAotCQkJU3RyaW5nIG5ld05hbWUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIGJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQpIHsKLQkJSVR5cGUgamF2YVR5cGUgPSBjdS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlGaWVsZCBhdHRyaWJ1dGVGaWVsZCA9IG51bGw7Ci0JCVN0cmluZyB0eXBlU2lnbmF0dXJlID0gbnVsbDsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKG9sZE5hbWUpOwotCQkJaWYgKCFhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQlhdHRyaWJ1dGVGaWVsZCA9ICBqYXZhVHlwZS5nZXRGaWVsZChKUEFFZGl0b3JVdGlsLnJldmVydEZpcnN0TGV0dGVyQ2FzZShvbGROYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyaWJ1dGVGaWVsZCA9IGphdmFUeXBlLmdldEZpZWxkKG9sZE5hbWUpOwotCQl9Ci0JCVN0cmluZyBnZXR0ZXJQcmVmaXggPSAiZ2V0IjsJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIEpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG9sZE5hbWUpOyAJLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kIGdldHRlciA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsKLQkJaWYgKCFnZXR0ZXIuZXhpc3RzKCkpIHsKLQkJCWdldHRlclByZWZpeCA9ICJpcyI7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQltZXRob2ROYW1lID0gZ2V0dGVyUHJlZml4ICsgSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIob2xkTmFtZSk7IAkvLyROT04tTkxTLTEkCi0JCWdldHRlciA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsJCQotCQkKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQl0cnkgewotCQkJCXR5cGVTaWduYXR1cmUgPSBnZXR0ZXIuZ2V0UmV0dXJuVHlwZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3Qgb2J0YWluIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBnZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiIC8vJE5PTi1OTFMtMSQgCi0JCQkJCQkJCSsgb2xkTmFtZSk7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaWYgKCh0eXBlU2lnbmF0dXJlID09IG51bGwpIHx8IAotCQkJCQkoISJaIi5lcXVhbHModHlwZVNpZ25hdHVyZSkgJiYgIWdldHRlclByZWZpeC5lcXVhbHMoImdldCIpKSkgewkJLy8kTk9OLU5MUy0xJCAJLy8kTk9OLU5MUy0yJCAKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBvYnRhaW4gdHlwZSBzaWduYXR1cmUgb2YgdGhlIGdldHRlciBvZiB0aGUgYXR0cmlidXRlICIgLy8kTk9OLU5MUy0xJCAKLQkJCQkJCQkJKyBvbGROYW1lKTsKLQkJCQlOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCQlucGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQl0eXBlU2lnbmF0dXJlID0gYXR0cmlidXRlRmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4gKAotCQkJCQkJIkNhbm5vdCBvYnRhaW4gdHlwZSBzaWduYXR1cmUgb2YgdGhlIGZpZWxkIG9mIHRoZSBhdHRyaWJ1dGUgIiAvLyROT04tTkxTLTEkIAotCQkJCQkJCQkrIG9sZE5hbWUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQkJCQotCQl9Ci0KLQkJbWV0aG9kTmFtZSA9ICJzZXQiICsgSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIob2xkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZCBzZXR0ZXIgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwKLQkJCQluZXcgU3RyaW5nW10geyB0eXBlU2lnbmF0dXJlIH0pOwotCi0JCWlmIChzZXR0ZXIuZXhpc3RzKCkpCi0JCQlyZW5hbWVTZXR0ZXIoc2V0dGVyLCBuZXdOYW1lKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQlpZiAoYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJcmVuYW1lRmllbGQoYXR0cmlidXRlRmllbGQsIG5ld05hbWUsIGlzTWV0aG9kQW5ub3RhdGVkKTsJCQkKLQkJCWlmIChnZXR0ZXIuZXhpc3RzKCkpCi0JCQkJcmVuYW1lR2V0dGVyKGdldHRlciwgbmV3TmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0dGVyLmV4aXN0cygpKQotCQkJCXJlbmFtZUdldHRlcihnZXR0ZXIsIG5ld05hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKQotCQkJCXJlbmFtZUZpZWxkKGF0dHJpYnV0ZUZpZWxkLCBuZXdOYW1lLCBpc01ldGhvZEFubm90YXRlZCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVGaWVsZChJRmllbGQgZmllbGQsIFN0cmluZyBuZXdOYW1lLCBib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCWlmICghZmllbGQuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBvbGROYW1lID0gZmllbGQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoZmllbGQsIAotCQkJCQkJCQkJCQkJICAgaXNNZXRob2RBbm5vdGF0ZWQgPyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5ld05hbWUpIDogbmV3TmFtZSwKLQkJCQkJCQkJCQkJCSAgIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHd3ID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlTaGVsbCBzaCA9IHd3LmdldFNoZWxsKCk7Ci0JCQkJcy5wZXJmb3JtKHNoLCB3dyk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBmaWVsZCBvZiB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlvbGROYW1lKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBmaWVsZCBvZiB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlvbGROYW1lKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCByZW5hbWUgdGhlIGZpZWxkIG9mIHRoZSBhdHRyaWJ1dGUgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJb2xkTmFtZSk7Ci0JCQllMS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVHZXR0ZXIoSU1ldGhvZCBnZXR0ZXIsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICghZ2V0dGVyLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IGdldHRlci5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgZ2V0dGVyVHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXR0ZXJUeXBlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUyKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IG9idGFpbiBnZXR0ZXIgdHlwZSIpOwkvLyROT04tTkxTLTEkCi0JCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlTdHJpbmcgbmV3R2V0dGVyTmFtZSA9ICgiWiIuZXF1YWxzKGdldHRlclR5cGUpID8gImlzIiA6ICJnZXQiKSArCQkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJLy8kTk9OLU5MUy0zJAotCQkJSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIobmV3TmFtZSk7Ci0JCWlmIChvbGROYW1lLmVxdWFscyhuZXdHZXR0ZXJOYW1lKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCVJlbmFtZVN1cHBvcnQgcyA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKGdldHRlciwgbmV3R2V0dGVyTmFtZSwKLQkJCQkJUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd3cgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKQotCQkJCQkJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCVNoZWxsIHNoID0gd3cuZ2V0U2hlbGwoKTsKLQkJCQlzLnBlcmZvcm0oc2gsIHd3KTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCByZW5hbWUgdGhlIGdldHRlciBvZiB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlvbGROYW1lKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBnZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJb2xkTmFtZSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBnZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlvbGROYW1lKTsgIAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCByZW5hbWVTZXR0ZXIoSU1ldGhvZCBzZXR0ZXIsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICghc2V0dGVyLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IHNldHRlci5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3U2V0dGVyTmFtZSA9ICJzZXQiCQkJLy8kTk9OLU5MUy0xJAotCQkJKyBKUEFFZGl0b3JVdGlsLmNhcGl0YWxpemVGaXJzdExldHRlcihuZXdOYW1lKTsKLQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld1NldHRlck5hbWUpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoc2V0dGVyLCBuZXdTZXR0ZXJOYW1lLAotCQkJCQlSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU2hlbGwgc2ggPSB3dy5nZXRTaGVsbCgpOwotCQkJCXMucGVyZm9ybShzaCwgd3cpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCSBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCByZW5hbWUgdGhlIHNldHRlciBvZiB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlvbGROYW1lKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBzZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJb2xkTmFtZSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJDYW5ub3QgcmVuYW1lIHRoZSBzZXR0ZXIgb2YgdGhlIGF0dHJpYnV0ZSAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQlvbGROYW1lKTsgIAotCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSZWxhdGlvbiBwcm9kdWNlUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYml0ZSwgQW5ub3RhdGlvbiBhbiwKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSByZWxKUFQsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQotCQlIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+IGh0ID0gZ2V0UmVsQXR0cmlidXRlQW5ub3RhdGlvbigKLQkJCQlwZXJzaXN0ZW50QXR0cmliaXRlLCByZWxKUFQpOwotCQlpZiAoaHQgPT0gbnVsbCkgewotCQkJcmV0dXJuIHByb2R1Y2VVbmlEaXJSZWxhdGlvbigoSmF2YVBlcnNpc3RlbnRUeXBlKXBlcnNpc3RlbnRBdHRyaWJpdGUKLQkJCQkJLmdldFBhcmVudCgpLCBwZXJzaXN0ZW50QXR0cmliaXRlLCBhbiwgcmVsSlBULCBmcCk7Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZWxBdCA9IGh0LmtleXMoKS5uZXh0RWxlbWVudCgpOwotCQkJQW5ub3RhdGlvbiByZWxBbiA9IGh0LmdldChyZWxBdCk7Ci0JCQlyZXR1cm4gcHJvZHVjZUJpRGlyUmVsYXRpb24oKEphdmFQZXJzaXN0ZW50VHlwZSlwZXJzaXN0ZW50QXR0cmliaXRlCi0JCQkJCS5nZXRQYXJlbnQoKSwgcGVyc2lzdGVudEF0dHJpYml0ZSwgYW4sIHJlbEpQVCwKLQkJCQkJcmVsQXQsIHJlbEFuLCBmcCk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgSGFzaHRhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBBbm5vdGF0aW9uPiBnZXRSZWxBdHRyaWJ1dGVBbm5vdGF0aW9uKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhLCBKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUKSB7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBqcHQpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dEl0ID0gcmVsSlBULmF0dHJpYnV0ZXMoKTsKLQkJd2hpbGUgKGF0dEl0Lmhhc05leHQoKSkJewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsRW50QXQgPSBhdHRJdC5uZXh0KCk7Ci0JCQlJUmVzb3VyY2UgciA9IHJlbEVudEF0LmdldFBhcmVudCgpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoIXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsSlJQQSA9IHJlbEVudEF0LmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJQW5ub3RhdGlvbltdIGFucyA9IHRoaXMuZ2V0QW5ub3RhdGlvbnMocmVsRW50QXQpOwotCQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5zKSB7Ci0JCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJCQlpZiAoSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0FOTk9UQVRJT05TLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZSgoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pYW4sIHJlbEpSUEEpOwkJCQkJCi0JCQkJCWlmICghcmVsVHlwZU5hbWUuZXF1YWxzKGpwdC5nZXROYW1lKCkpKSAKLQkJCQkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQkJCi0JCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1wID0gcmVsRW50QXQuZ2V0TWFwcGluZygpOwotCQkJCQlpZihtcC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlbEVudEF0LmdldFBhcmVudCgpKTsKLQkJCQkJCW1wID0gcmVsRW50QXQuZ2V0TWFwcGluZygpOwotCQkJCQl9Ci0JCQkJCWlmICghT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJU3RyaW5nIG1hcHBlZEJ5ID0gKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pbXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0TWFwcGVkQnkoKTsKLQkJCQkJaWYgKCFqcGEuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRCeSkpIAotCQkJCQkJY29udGludWU7Ci0JCQkJCUhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4gaHQgPSBuZXcgSGFzaHRhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBBbm5vdGF0aW9uPigpOwotCQkJCQlodC5wdXQocmVsRW50QXQsIGFuKTsKLQkJCQkJcmV0dXJuIGh0OwkJCQkJCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQotCQkJCi0JCQkvKgotCQkJQVNUTm9kZSBuZCA9IGpycGEuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpCi0JCQkJCS5nZXREZWNsYXJhdGlvbigpOwotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gbnVsbDsKLQkJCWlmICgobmQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikKLQkJCQkJfHwgKG5kIGluc3RhbmNlb2YgRmllbGREZWNsYXJhdGlvbikpIHsKLQkJCQlMaXN0SXRlcmF0b3I8Pz4gbW9kZnMgPSAoKEJvZHlEZWNsYXJhdGlvbikgbmQpLm1vZGlmaWVycygpCi0JCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKG1vZGZzLmhhc05leHQoKSkgewotCQkJCQlPYmplY3QgbW9kZiA9IG1vZGZzLm5leHQoKTsKLQkJCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJCQlBbm5vdGF0aW9uIGFuID0gKEFubm90YXRpb24pbW9kZjsKLQkJCQkJCWFubm90YXRpb25OYW1lID0gYW4uZ2V0VHlwZU5hbWUoKQotCQkJCQkJCQkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJCQlhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lCi0JCQkJCQkJCS5zdWJzdHJpbmcoYW5ub3RhdGlvbk5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUwotCQkJCQkJCQkuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoYW4sIGpycGEpOwkJCQkJCi0JCQkJCQkJaWYgKCFyZWxUeXBlTmFtZS5lcXVhbHMoanB0LmdldE5hbWUoKSkpIAotCQkJCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJCQotCQkJCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1wID0gYXQuZ2V0U3BlY2lmaWVkTWFwcGluZygpOwotCQkJCQkJCWlmICghT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW1wLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCQkJaWYgKCFqcGEuZ2V0TmFtZSgpLmVxdWFscyhtYXBwZWRCeSkpIAotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+IGh0ID0gbmV3IEhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4oKTsKLQkJCQkJCQlodC5wdXQoYXQsIGFuKTsKLQkJCQkJCQlyZXR1cm4gaHQ7Ci0JCQkJCQl9Ci0JCQkJCX0gCQkJCi0JCQkJfQotCQkJfQotCQkJKi8JCQkKLQkKLQlwcml2YXRlIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gcHJvZHVjZVVuaURpclJlbGF0aW9uKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQsIEFubm90YXRpb24gYW4sCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBULCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlpZiAoaXNOb25Pd25lcihhdCkgfHwgIUpQQUVkaXRvclV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpIGF0LmdldFBhcmVudCgpKS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlcyA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0LmdldE5hbWUoKTsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIFJlbFR5cGUuT05FX1RPX09ORSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE9uZVRvT25lVW5pRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgZmFsc2UsCi0JCQkJCQlmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9uTmFtZQotCQkJCS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5PTkVfVE9fTUFOWSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIGZhbHNlLAotCQkJCQkJZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbk5hbWUKLQkJCQkuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIFJlbFR5cGUuTUFOWV9UT19PTkUsCi0JCQkJCVJlbERpci5VTkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIGF0dHJOYW1lLCBmYWxzZSwKLQkJCQkJCWZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25OYW1lCi0JCQkJLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5NQU5ZX1RPX01BTlksCi0JCQkJCVJlbERpci5VTkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBhdHRyTmFtZSwKLQkJCQkJCWZhbHNlLCBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfQotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXMuc2V0QW5ub3RhdGVkQXR0cmlidXRlKGF0KTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBCaWRpcmVjdGlvbmFsUmVsYXRpb24gcHJvZHVjZUJpRGlyUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0LCBBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsQXQsCi0JCQlBbm5vdGF0aW9uIHJlbEFuLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlbEF0LmdldFBhcmVudCgpKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJU3RyaW5nIHJlbEFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChyZWxBbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJaWYgKCFhbm5vdGF0aW9uTmFtZXNNYXRjaChhbm5vdGF0aW9uTmFtZSwgcmVsQW5ub3RhdGlvbk5hbWUpKSAKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19NQU5ZKSkgCi0JCQlyZXR1cm4gcHJvZHVjZUJpRGlyUmVsYXRpb24ocmVsSlBULCByZWxBdCwgcmVsQW4sIGpwdCwgYXQsIGFuLCBmcCk7Ci0JCWlmIChpc05vbk93bmVyKGF0KSAmJiBpc05vbk93bmVyKHJlbEF0KSkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkpIHsKLQkJCWlmIChpc05vbk93bmVyKGF0KSB8fCAhaXNOb25Pd25lcihyZWxBdCkpIAotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKSkgewotCQkJaWYgKCFpc05vbk93bmVyKGF0KSAmJiAhaXNOb25Pd25lcihyZWxBdCkpIAotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGlzTm9uT3duZXIoYXQpKSAKLQkJCQlyZXR1cm4gcHJvZHVjZUJpRGlyUmVsYXRpb24ocmVsSlBULCByZWxBdCwgcmVsQW4sIGpwdCwgYXQsIGFuLAotCQkJCQkJZnApOwotCQl9CQkKLQkJU3RyaW5nIG93bmVyQXR0ck5hbWUgPSBhdC5nZXROYW1lKCk7Ci0JCVN0cmluZyBpbnZlcnNlQXR0ck5hbWUgPSByZWxBdC5nZXROYW1lKCk7Ci0JCQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtID0gcmVsQXQuZ2V0TWFwcGluZygpOwotCQkKLQkJaWYgKChtICE9IG51bGwpKXsKLQkJCWlmIChtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk9PW51bGwpIHsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgKEphdmFQZXJzaXN0ZW50VHlwZSlyZWxBdC5nZXRQYXJlbnQoKSk7Ci0JCQkJbSA9IHJlbEF0LmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJCWlmKG0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKSBpbnN0YW5jZW9mIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbikgewotCQkKLQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKSkuZ2V0TWFwcGVkQnkoKTsKLQkJCWlmIChtYXBwZWRCeSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFtYXBwZWRCeS5lcXVhbHMob3duZXJBdHRyTmFtZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCUJpZGlyZWN0aW9uYWxSZWxhdGlvbiByZXMgPSBudWxsOwotCQlpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLCBSZWxUeXBlLk9ORV9UT19PTkUsCi0JCQkJCVJlbERpci5CSSkpCi0JCQkJcmVzID0gbmV3IE9uZVRvT25lQmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsCi0JCQkJCQlpbnZlcnNlQXR0ck5hbWUsIGZhbHNlLCBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9uTmFtZQotCQkJCS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLCBSZWxUeXBlLk1BTllfVE9fT05FLAotCQkJCQlSZWxEaXIuQkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9PbmVCaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwKLQkJCQkJCWludmVyc2VBdHRyTmFtZSwgZmFsc2UsIGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25OYW1lCi0JCQkJLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLCBSZWxUeXBlLk1BTllfVE9fTUFOWSwKLQkJCQkJUmVsRGlyLkJJKSkKLQkJCQlyZXMgPSBuZXcgTWFueVRvTWFueUJpRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLAotCQkJCQkJaW52ZXJzZUF0dHJOYW1lLCBmYWxzZSwgZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0KLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlyZXMuc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoYXQpOwotCQkJcmVzLnNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUocmVsQXQpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhbm5vdGF0aW9uTmFtZXNNYXRjaChTdHJpbmcgYW4xTmFtZSwgU3RyaW5nIGFuMk5hbWUpIHsKLQkJaWYgKGFuMU5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpCi0JCQkJJiYgYW4yTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGFuMU5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19NQU5ZKQotCQkJCSYmIGFuMk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoYW4xTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpCi0JCQkJJiYgYW4yTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhbjFOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpCi0JCQkJJiYgYW4yTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5HZXR0ZXJDb250ZW50cyhTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZSwKLQkJCVN0cmluZ1tdIGF0dHJUeXBlRWxlbWVudE5hbWVzLCBTdHJpbmcgYWN0TmFtZSwKLQkJCUxpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucywgYm9vbGVhbiBpc0NvbGxlY3Rpb24pIHsKLQkJCi0JCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsQSA9IGFjdE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCSsgYWN0TmFtZS5zdWJzdHJpbmcoMSk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgYW4gPSBpdC5uZXh0KCk7Ci0JCQkJY29udGVudHMgKz0gIiAgICIgKyBhbiArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCWlmIChpc0NvbGxlY3Rpb24pIHsKLQkJCWNvbnRlbnRzICs9ICIgICAgcHVibGljIENvbGxlY3Rpb248IisgYXR0clR5cGUgKyAiPiBnZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgKyAiKCkge1xuIiArICAJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgCi0JCQkJCSIgICAgICAgIHJldHVybiAiCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjtcbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAgIiAgICB9XG4iOyAgCQkJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQJCQkKLQkJfSBlbHNlIHsKLQkJCWNvbnRlbnRzICs9ICIgICAgcHVibGljICIrIGF0dHJUeXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCSgoYXR0clR5cGVFbGVtZW50TmFtZXMgPT0gbnVsbCk/IiI6KCI8IiArIEpQQUVkaXRvclV0aWwuY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoYXR0clR5cGVFbGVtZW50TmFtZXMpICsgIj4iKSkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCShhdHRyVHlwZS5lcXVhbHMoImJvb2xlYW4iKSA/ICIgaXMiIDogIiBnZXQiKSArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgIigpIHtcbiIgKyAgCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgCi0JCQkJCSIgICAgICAgIHJldHVybiAiCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjtcbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCSAgIiAgICB9XG4iOyAgCQkJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlblNldHRlckNvbnRlbnRzKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nW10gYXR0clR5cGVFbGVtZW50TmFtZXMsIFN0cmluZyBhY3ROYW1lLCBib29sZWFuIGlzQ29sbGVjdGlvbikgewotCQkKLQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxBID0gYWN0TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpCi0JCQkJKyBhY3ROYW1lLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzQ29sbGVjdGlvbikgewotCQkJY29udGVudHMgPSAiICAgIHB1YmxpYyB2b2lkIHNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoQ29sbGVjdGlvbjwiICsgYXR0clR5cGUgKyAiPiBwYXJhbSkge1xuIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkICAKLQkJCQkJIiAgICAgICAgdGhpcy4iCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpCi0JCQkJCSsgIiA9IHBhcmFtO1xuIiArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkgICIgICAgfVxuIjsgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWNvbnRlbnRzID0gIiAgICBwdWJsaWMgdm9pZCBzZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgKyAiKCIgKyBhdHRyVHlwZSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkoKGF0dHJUeXBlRWxlbWVudE5hbWVzID09IG51bGwpPyIiOigiPCIgKyBKUEFFZGl0b3JVdGlsLmNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKGF0dHJUeXBlRWxlbWVudE5hbWVzKSArICI+IikpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJIiBwYXJhbSkge1xuIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgCi0JCQkJCSIgICAgICAgIHRoaXMuIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKQotCQkJCQkrICIgPSBwYXJhbTtcbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJICAiICAgIH1cbiI7ICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nIGFjdE5hbWUsIFN0cmluZyB0eXBlKSB7Ci0KLQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxBID0gYWN0TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoCi0JCQkJTG9jYWxlLkVOR0xJU0gpCi0JCQkJKyBhY3ROYW1lLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gIiAgICBwdWJsaWMgIiArIEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QodHlwZSkgKyAiPCIgKyBhdHRyVHlwZSArICI+IGdldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoKSB7XG4iICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAKLQkJCQkiICAgICAgICByZXR1cm4gIiAvLyROT04tTkxTLTEkCi0JCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIjtcbiIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkiICAgIH1cbiI7IC8vJE5PTi1OTFMtMSQJCQkKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgU3RyaW5nIHR5cGUpIHsKLQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgPSBhY3ROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgKLQkJCQlMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGFjdE5hbWUuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgY29udGVudHMgPSAiICAgIHB1YmxpYyB2b2lkIHNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoIiArIEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QodHlwZSkgKyAiPCIgKyBhdHRyVHlwZSArICI+IHBhcmFtKSB7XG4iICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQkJIiAgICAgICAgdGhpcy4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkKLQkJCQkrICIgPSBwYXJhbTtcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJCSIgICAgfVxuIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIHJldHVyblNpbXBsZU5hbWUoU3RyaW5nIGlucHV0KSB7Ci0JCVN0cmluZyBuYW1lID0gaW5wdXQ7Ci0JCWlmIChuYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGcm9tRW50aXR5KAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwganB0KTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTs7Ci0JCWludCBjID0gMDsKLQkJd2hpbGUgKChhdCA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsJCQotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoUEFVU0VfRFVSQVRJT04pOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2Fubm90IGdldCB0aGUgYXR0cmlidXRlICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlhdHRyaWJ1dGVOYW1lICsgIiBmcm9tICIgKyBqcHQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IAotCQkJYXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCQljKys7Ci0JCX0KLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlhdDsJCQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZG9lc0F0dHJpYnV0ZUV4aXN0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBuYW1lKQotCQkJCQkJCQkJCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleGlzdHMgPSBmYWxzZTsKLQkJaWYgKGpwdC5yZXNvbHZlQXR0cmlidXRlKG5hbWUpICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBleGlzdHM7Ci0JfQotCQkKLQlwdWJsaWMgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgY29udmVydEpQVFRvSlJQVChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoanB0LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYUZpbGUganBhRmlsZSkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgID0ganBhRmlsZS5nZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsgCi0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYVByb2plY3QgcHJvamVjdCkgewotCQlpZihwcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkKLQkJCQkucGVyc2lzdGVuY2VVbml0cygpLm5leHQoKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4ganB0LmdldFBlcnNpc3RlbmNlVW5pdCgpOyAKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cikgewotCQlyZXR1cm4gIWF0dHIuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGaWVsZCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gbGkgPSBqcHQuYXR0cmlidXRlcygpOwotCQlpZiAoIWxpLmhhc05leHQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChpc01ldGhvZEFubm90YXRlZChsaS5uZXh0KCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtYWtlUmVsYXRpb25zKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlDb250YWluZXJTaGFwZSBjcywgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZiAoY3MgPT0gbnVsbCkgCi0JCQljcyA9IChDb250YWluZXJTaGFwZSlmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJaWYgKGNzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXJlbW92ZU9sZFJlbGF0aW9ucyhmcCwgY3MpOwotCQlhZGROZXdSZWxhdGlvbnMoZnAsIGpwdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJaWYgKGpwdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0gY29udmVydEpQVFRvSlJQVChqcHQpOwotCQlpZiAoanJwdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlUYWJsZUFubm90YXRpb24gdGFuID0gKFRhYmxlQW5ub3RhdGlvbilqcnB0LmdldEFubm90YXRpb24oImphdmF4LnBlcnNpc3RlbmNlLlRhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IG51bGw7Ci0JCWlmICh0YW4gPT0gbnVsbCkKLQkJCXRhYmxlTmFtZSA9IEpQQUVkaXRvclV0aWwuY3V0RnJvbUxhc3REb3QoanB0LmdldE5hbWUoKSk7Ci0JCXRhYmxlTmFtZSA9IHRhbi5nZXROYW1lKCk7CQkKLQkJaWYgKHRhYmxlTmFtZSA9PSBudWxsKQotCQkJdGFibGVOYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChqcHQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHRhYmxlTmFtZTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0VGFibGVOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJaWYgKGpwdCA9PSBudWxsKQotCQkJcmV0dXJuOyAKLQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IGNvbnZlcnRKUFRUb0pSUFQoanB0KTsKLQkJaWYgKGpycHQgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAKLQkJfQotCQlUYWJsZUFubm90YXRpb24gdGEgPSAoVGFibGVBbm5vdGF0aW9uKWpycHQuZ2V0QW5ub3RhdGlvbigiamF2YXgucGVyc2lzdGVuY2UuVGFibGUiKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAodGEgIT0gbnVsbCkgCi0JCQl0YS5zZXROYW1lKHRhYmxlTmFtZSk7CQkKLQl9Ci0JCi0JLyoKLQlwcml2YXRlIE9iamVjdCBleHRyYWN0QW5ub3RhdGlvbk1lbWJlclZhbHVlKEFubm90YXRpb24gYW4sIFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQotCQlhbi4KLQkJCi0JCUlNZW1iZXJWYWx1ZVBhaXJbXSBtdnBzOwotCQl0cnkgewotCQkJbXZwcyA9IGFuLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRyYWNlci5lcnJvcigiQ2FuJ3QgZ2V0IGFubm90YXRpb24gbWVtYmVycyIsIGUpOwkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKElNZW1iZXJWYWx1ZVBhaXIgbXZwIDogbXZwcykgewotCQkJaWYgKG12cC5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0JCQkJcmV0dXJuIG12cC5nZXRWYWx1ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkqLwkKLQotCXByaXZhdGUgdm9pZCByZW1vdmVPbGRSZWxhdGlvbnMoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwKLQkJCUNvbnRhaW5lclNoYXBlIGNzKSB7Ci0JCVNldDxJUmVtb3ZlQ29udGV4dD4gY3R4cyA9IG5ldyBIYXNoU2V0PElSZW1vdmVDb250ZXh0PigpOwotCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBpdGVyID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWxsQ29ubmVjdGlvbnMoY3MpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ29ubmVjdGlvbiBjb25uID0gaXRlci5uZXh0KCk7Ci0JCQlJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChjb25uKTsKLQkJCWN0eHMuYWRkKGN0eCk7Ci0JCX0KLQkJSXRlcmF0b3I8SVJlbW92ZUNvbnRleHQ+IGl0Q3R4ID0gY3R4cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRDdHguaGFzTmV4dCgpKSB7Ci0JCQlJUmVtb3ZlQ29udGV4dCBjdHggPSBpdEN0eC5uZXh0KCk7Ci0JCQlSZW1vdmVSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCWZ0LnJlbW92ZShjdHgpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1JlbGF0aW9ucyhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gc2VsZlJlbHMgPSBuZXcgSGFzaFNldDxJUmVsYXRpb24+KCk7IAotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gbmV3UmVscyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJLnByb2R1Y2VBbGxSZWxhdGlvbnMoanB0LCBmcCk7Ci0JCUl0ZXJhdG9yPElSZWxhdGlvbj4gcmVsc0l0ID0gbmV3UmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVsc0l0Lmhhc05leHQoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IHJlbHNJdC5uZXh0KCk7Ci0JCQlpZiAocmVsLmdldE93bmVyKCkgPT0gcmVsLmdldEludmVyc2UoKSkgewotCQkJCXNlbGZSZWxzLmFkZChyZWwpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYWRkTmV3UmVsYXRpb24oZnAsIHJlbCk7Ci0JCX0KLQkJcmVsc0l0ID0gc2VsZlJlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlbHNJdC5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSByZWxzSXQubmV4dCgpOwotCQkJYWRkTmV3UmVsYXRpb24oZnAsIHJlbCk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTmV3UmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSVJlbGF0aW9uIHJlbCkgewotCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoSlBBRWRpdG9yVXRpbAotCQkJCS5nZXRBbmNob3IocmVsLmdldE93bmVyKCksIGZwKSwgSlBBRWRpdG9yVXRpbC5nZXRBbmNob3IocmVsCi0JCQkJLmdldEludmVyc2UoKSwgZnApKTsKLQkJY3R4LnNldE5ld09iamVjdChyZWwpOwotCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCkpOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIHJlbC5nZXRPd25lcigpKTsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJQWRkUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IEFkZFJlbGF0aW9uRmVhdHVyZShmcCk7Ci0JCWZ0LmFkZChjdHgpOwkJCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFJlbFR5cGVOYW1lKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhKSB7Ci0JCVN0cmluZyByZWxUeXBlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWxUeXBlTmFtZSA9IGpycGEuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQlpZiAocmVsVHlwZU5hbWUgPT0gbnVsbCkgCi0JCQlyZWxUeXBlTmFtZSA9IGFuLmdldFRhcmdldEVudGl0eSgpOwkJCQkJCQkJCQkJCQotCQlpZiAocmVsVHlwZU5hbWUgPT0gbnVsbCkgCi0JCQlyZWxUeXBlTmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0QXR0cmlidXRlVHlwZU5hbWUoanJwYSk7CQkJCQkJCQotCQlyZXR1cm4gcmVsVHlwZU5hbWU7Ci0JfQotCQkKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9QZVNlcnZpY2VVdGlsSW1wbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvUGVTZXJ2aWNlVXRpbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkYzI5Yy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9QZVNlcnZpY2VVdGlsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLQotcHVibGljIGNsYXNzIFBlU2VydmljZVV0aWxJbXBsIGltcGxlbWVudHMgSVBlU2VydmljZVV0aWwgewotCi0JcHVibGljIEZyZWVGb3JtQ29ubmVjdGlvbiBjcmVhdGVGcmVlRm9ybUNvbm5lY3Rpb24oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCXJldHVybiBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVGcmVlRm9ybUNvbm5lY3Rpb24oZGlhZ3JhbSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eUNvbnRhaW5lciwga2V5KTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5KHByb3BlcnR5Q29udGFpbmVyLCBrZXkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9wZXJ0eShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkucmVtb3ZlUHJvcGVydHkocHJvcGVydHlDb250YWluZXIsIGtleSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoUHJvcGVydHlDb250YWluZXIgcHJvcGVydHlDb250YWluZXIsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewkKLQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuc2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eUNvbnRhaW5lciwga2V5LCB2YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9TaXplUG9zaXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1NpemVQb3NpdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTcwMTJjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1NpemVQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTaXplUG9zaXRpb24gewotCQotCXByaXZhdGUgaW50IHdpZHRoOwotCXByaXZhdGUgaW50IGhlaWdodDsKLQlwcml2YXRlIGludCB4OwotCXByaXZhdGUgaW50IHk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkOwotCXB1YmxpYyBib29sZWFuIGJhc2ljQ29sbGFwc2VkOwotCXB1YmxpYyBib29sZWFuIHJlbGF0aW9uQ29sbGFwc2VkOwotCQotCXB1YmxpYyBTaXplUG9zaXRpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpIHsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQkJdGhpcy54ID0geDsKLQkJdGhpcy55ID0geTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIHdpZHRoOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYKCkgewotCQlyZXR1cm4geDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRZKCkgewotCQlyZXR1cm4geTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1dycC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvV3JwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZmZlODEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvV3JwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotcHVibGljIGNsYXNzIFdycCB7Ci0JcHJpdmF0ZSBPYmplY3Qgb2JqOwotCQotCXB1YmxpYyBXcnAoKSB7fQotCQotCXB1YmxpYyB2b2lkIHNldE9iaihPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub2JqID0gb2JqOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGdldE9iaigpIHsKLQkJcmV0dXJuIG9iajsKLQl9Ci19Cg==